From 1321e35796f8cc5d83c3c11d1a7ad732f6116775 Mon Sep 17 00:00:00 2001 From: sunxiaolong Date: Tue, 9 Jul 2024 21:18:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=8D=A2=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/loginController.go | 22 +- static/admin/css/admin.css | 647 + static/admin/css/admin.dark.css | 360 + static/admin/css/other/analysis.css | 65 + static/admin/css/other/console.css | 81 + static/admin/css/other/exception.css | 28 + static/admin/css/other/login.css | 227 + static/admin/css/other/profile.css | 77 + static/admin/css/other/result.css | 46 + static/admin/css/reset.css | 138 + static/admin/css/variables.css | 9 + static/admin/data/menu.json | 313 + static/admin/data/message.json | 102 + static/admin/data/table.json | 303 + static/admin/images/avatar.jpg | Bin 0 -> 76158 bytes static/admin/images/background.svg | 115 + static/admin/images/banner.png | Bin 0 -> 10383068 bytes static/admin/images/blog.jpg | Bin 0 -> 201852 bytes static/admin/images/captcha.gif | Bin 0 -> 3952 bytes static/admin/images/logo.png | Bin 0 -> 14280 bytes static/component/layui/css/layui.css | 1 + static/component/layui/font/iconfont.eot | Bin 0 -> 54172 bytes static/component/layui/font/iconfont.svg | 790 + static/component/layui/font/iconfont.ttf | Bin 0 -> 53996 bytes static/component/layui/font/iconfont.woff | Bin 0 -> 34624 bytes static/component/layui/font/iconfont.woff2 | Bin 0 -> 29736 bytes static/component/layui/layui.js | 1 + static/component/pear/css/module/global.css | 977 + static/component/pear/css/module/menu.css | 277 + .../component/pear/css/module/menuSearch.css | 91 + .../pear/css/module/messageCenter.css | 39 + .../component/pear/css/module/nprogress.css | 82 + static/component/pear/css/module/page.css | 154 + static/component/pear/css/module/tabPage.css | 315 + static/component/pear/css/module/toast.css | 1929 + static/component/pear/css/pear.css | 10 + static/component/pear/font/iconfont.css | 579 + static/component/pear/font/iconfont.js | 1 + static/component/pear/font/iconfont.json | 996 + static/component/pear/font/iconfont.ttf | Bin 0 -> 33116 bytes static/component/pear/font/iconfont.woff | Bin 0 -> 16624 bytes static/component/pear/font/iconfont.woff2 | Bin 0 -> 13564 bytes static/component/pear/module/admin.js | 890 + static/component/pear/module/button.js | 60 + static/component/pear/module/extends/count.js | 38 + .../component/pear/module/extends/echarts.js | 96008 ++++++++++++++++ .../pear/module/extends/echartsTheme.js | 450 + .../pear/module/extends/nprogress.js | 508 + static/component/pear/module/extends/popup.js | 47 + static/component/pear/module/extends/toast.js | 1249 + static/component/pear/module/extends/yaml.js | 2072 + static/component/pear/module/fullscreen.js | 60 + static/component/pear/module/menu.js | 537 + static/component/pear/module/menuSearch.js | 233 + static/component/pear/module/messageCenter.js | 85 + static/component/pear/module/page.js | 119 + static/component/pear/module/tabPage.js | 661 + static/component/pear/module/tools.js | 40 + static/component/pear/pear.js | 29 + views/login.html | 258 +- views/login_bak.html | 129 + 61 files changed, 112123 insertions(+), 125 deletions(-) create mode 100644 static/admin/css/admin.css create mode 100644 static/admin/css/admin.dark.css create mode 100644 static/admin/css/other/analysis.css create mode 100644 static/admin/css/other/console.css create mode 100644 static/admin/css/other/exception.css create mode 100644 static/admin/css/other/login.css create mode 100644 static/admin/css/other/profile.css create mode 100644 static/admin/css/other/result.css create mode 100644 static/admin/css/reset.css create mode 100644 static/admin/css/variables.css create mode 100644 static/admin/data/menu.json create mode 100644 static/admin/data/message.json create mode 100644 static/admin/data/table.json create mode 100644 static/admin/images/avatar.jpg create mode 100644 static/admin/images/background.svg create mode 100644 static/admin/images/banner.png create mode 100644 static/admin/images/blog.jpg create mode 100644 static/admin/images/captcha.gif create mode 100644 static/admin/images/logo.png create mode 100644 static/component/layui/css/layui.css create mode 100644 static/component/layui/font/iconfont.eot create mode 100644 static/component/layui/font/iconfont.svg create mode 100644 static/component/layui/font/iconfont.ttf create mode 100644 static/component/layui/font/iconfont.woff create mode 100644 static/component/layui/font/iconfont.woff2 create mode 100644 static/component/layui/layui.js create mode 100644 static/component/pear/css/module/global.css create mode 100644 static/component/pear/css/module/menu.css create mode 100644 static/component/pear/css/module/menuSearch.css create mode 100644 static/component/pear/css/module/messageCenter.css create mode 100644 static/component/pear/css/module/nprogress.css create mode 100644 static/component/pear/css/module/page.css create mode 100644 static/component/pear/css/module/tabPage.css create mode 100644 static/component/pear/css/module/toast.css create mode 100644 static/component/pear/css/pear.css create mode 100644 static/component/pear/font/iconfont.css create mode 100644 static/component/pear/font/iconfont.js create mode 100644 static/component/pear/font/iconfont.json create mode 100644 static/component/pear/font/iconfont.ttf create mode 100644 static/component/pear/font/iconfont.woff create mode 100644 static/component/pear/font/iconfont.woff2 create mode 100644 static/component/pear/module/admin.js create mode 100644 static/component/pear/module/button.js create mode 100644 static/component/pear/module/extends/count.js create mode 100644 static/component/pear/module/extends/echarts.js create mode 100644 static/component/pear/module/extends/echartsTheme.js create mode 100644 static/component/pear/module/extends/nprogress.js create mode 100644 static/component/pear/module/extends/popup.js create mode 100644 static/component/pear/module/extends/toast.js create mode 100644 static/component/pear/module/extends/yaml.js create mode 100644 static/component/pear/module/fullscreen.js create mode 100644 static/component/pear/module/menu.js create mode 100644 static/component/pear/module/menuSearch.js create mode 100644 static/component/pear/module/messageCenter.js create mode 100644 static/component/pear/module/page.js create mode 100644 static/component/pear/module/tabPage.js create mode 100644 static/component/pear/module/tools.js create mode 100644 static/component/pear/pear.js create mode 100644 views/login_bak.html diff --git a/controllers/loginController.go b/controllers/loginController.go index 765adb1..04b295b 100644 --- a/controllers/loginController.go +++ b/controllers/loginController.go @@ -19,74 +19,75 @@ func (c *LoginController) Prepare() { } func (c *LoginController) Login() { - userID := c.GetString("userID") passWD := c.GetString("passwd") code := c.GetString("Code") totpCode := c.GetString("totpCode") - dataJSON := new(datas.KeyDataJSON) - valid := validation.Validation{} - if v := valid.Required(userID, "userID"); !v.Ok { dataJSON.Key = v.Error.Key + dataJSON.Code = -1 dataJSON.Msg = "手机号不能为空!" } else if v := valid.Required(passWD, "passWD"); !v.Ok { + dataJSON.Code = -1 dataJSON.Key = v.Error.Key dataJSON.Msg = "登录密码不能为空!" } else if v := valid.Length(code, common.VERIFY_CODE_LEN, "code"); !v.Ok { + dataJSON.Code = -1 dataJSON.Key = v.Error.Key dataJSON.Msg = "验证码不正确!" } - userInfo := user.GetUserInfoByUserID(userID) - if userInfo.UserId == "" { + dataJSON.Code = -1 dataJSON.Key = "userID" dataJSON.Msg = "用户不存在,请求联系管理员!" } else if userInfo.OtpSecret != "" && totpCode == "" { + dataJSON.Code = -1 dataJSON.Key = "userID" dataJSON.Msg = "需要输入二次验证!" } else { // 如果验证失败 if userInfo.OtpSecret != "" && !mfa.ValidCode(totpCode, userInfo.OtpSecret) { dataJSON.Key = "userID" + dataJSON.Code = -1 dataJSON.Msg = "二次验证不正确,请输入二次验证!" c.Data["json"] = dataJSON _ = c.ServeJSON() return } - codeInterface := c.GetSession("verifyCode") if userInfo.Passwd != utils.GetMD5Upper(passWD) { dataJSON.Key = "passWD" dataJSON.Msg = "密码不正确!" + dataJSON.Code = -1 } else if codeInterface == nil { dataJSON.Key = "code" dataJSON.Msg = "验证码失效!" + dataJSON.Code = -1 } else if code != codeInterface.(string) { dataJSON.Key = "code" + dataJSON.Code = -1 dataJSON.Msg = "验证码不正确!" } else if userInfo.Status == common.UNACTIVE { dataJSON.Key = common.UNACTIVE dataJSON.Msg = "用户已被冻结!" + dataJSON.Code = -1 } else if userInfo.Status == "del" { dataJSON.Key = "del" + dataJSON.Code = -1 dataJSON.Msg = "用户已被删除!" } } - go func() { userInfo.Ip = c.Ctx.Input.IP() user.UpdateUserInfoIP(userInfo) }() - if dataJSON.Key == "" { _ = c.SetSession("userID", userID) _ = c.DelSession("verifyCode") } - c.Data["json"] = dataJSON _ = c.ServeJSON() } @@ -113,7 +114,6 @@ func (c *LoginController) GetVerifyImg() { } else { _ = c.SetSession("verifyCode", verifyCode) } - logs.Info("验证码:", verifyCode) if Image == nil { logs.Error("生成验证码失败!") } else { diff --git a/static/admin/css/admin.css b/static/admin/css/admin.css new file mode 100644 index 0000000..1bca0a6 --- /dev/null +++ b/static/admin/css/admin.css @@ -0,0 +1,647 @@ +html, +body, +.layui-layout { + height: 100%; +} + +.pear-admin .layui-body, +.pear-admin .layui-logo, +.pear-admin .layui-side, +.pear-admin .layui-header, +.pear-admin .layui-header .layui-layout-left { + transition: all .3s; +} + +.pear-admin.banner-layout .layui-side { + top: 60px !important; +} + +.pear-admin.banner-layout .layui-side .layui-logo { + display: none; +} + +.pear-admin.banner-layout .layui-header .layui-logo { + display: inline-block; +} + +.pear-admin.banner-layout .layui-side .layui-side-scroll { + height: 100% !important; +} + +.pear-admin.banner-layout .layui-side .layui-side-scroll { + height: 100% !important; +} + +.pear-admin .layui-header.dark-theme .layui-layout-control .layui-this * { + background-color: rgba(0, 0, 0, .1) !important; +} + +.pear-admin .layui-header .layui-logo { + display: none; +} + +.pear-admin .layui-logo .title { + font-size: 20px; +} + +.pear-admin .layui-layout-right .layui-nav-child { + border: 1px solid whitesmoke; + border-radius: 4px; + width: auto; + left: auto; + right: -23px; +} + +.pear-admin .layui-header { + left: 230px; + width: calc(100% - 230px); + background-color: white; +} + +.pear-admin .layui-layout-control { + left: 140px; + position: absolute; +} + +.pear-admin .layui-layout-control .layui-nav { + padding: 0px; +} + +.pear-admin .layui-logo { + height: 60px; + line-height: 60px; + border-bottom: 1px solid rgba(0, 0, 0, .12); + box-sizing: border-box; + position: relative; + background-color: #28333E; + width: 230px; +} + +.pear-admin .layui-logo img { + width: 34px; + height: 34px; +} + +.pear-admin .layui-logo .title { + font-size: 21px; + font-weight: 550; + color: var(--global-primary-color); + position: relative; + top: 5px; + margin-left: 5px; +} + +.pear-admin .layui-logo .logo { + display: none; +} + +.pear-admin .layui-side { + top: 0px; + width: 230px; + box-shadow: 2px 0 6px rgba(0, 21, 41, .20); + z-index: 9999; +} + +.pear-admin .layui-side-scroll::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +.pear-admin .layui-side-scroll { + height: calc(100% - 60px) !important; + background-color: #28333E; + width: 247px; + +} + +.pear-admin .layui-header .layui-nav .layui-nav-item > a { + color: black; + font-size: 15px; +} + +.pear-admin .layui-body { + bottom: 0px; + padding-bottom: 0px; + background-color: whitesmoke; + height: calc(100% - 60px); + overflow-y: auto; + left: 230px; +} + +.pear-admin .layui-body > div { + height: 100%; +} + +.pear-admin .layui-layout-left { + left: 0px; +} + +.pear-admin .layui-footer { + position: absolute; + display: flex; + justify-content: space-between; + left: 230px; + background: #fff; + border-top: 1px solid #F2F2F2; + box-shadow: none; + -webkit-transition: left .3s; + transition: left .3s; + overflow: hidden; + color: #3c3c3cb3; + font-weight: 300; + font-size: 13.6px; +} + +.pear-admin .layui-footer.close { + display: none; +} + +/** 通栏布局 */ + +.pear-admin.banner-layout .layui-header { + left: 0px; + z-index: 99999; + width: 100%; +} + +.pear-admin.banner-layout .layui-header.light-theme { + border-bottom: 1px solid whitesmoke; +} + +.pear-admin.banner-layout .layui-header.auto-theme, +.pear-admin.banner-layout .layui-header.dark-theme { + box-shadow: 0 1px 4px rgba(0, 0, 0, .1); +} + +.pear-admin.banner-layout .layui-header .layui-layout-left { + left: 230px; +} + +.pear-admin.banner-layout .layui-header .layui-logo .title { + top: 2px; +} + +.pear-admin.banner-layout .layui-header .layui-layout-control { + display: inline-block; + left: 370px; +} + +/** 头部主题 */ +.pear-admin .auto-theme { + background-color: var(--global-primary-color); + color: white; +} + +.pear-admin .auto-theme .layui-logo { + background-color: var(--global-primary-color); + border: none; +} + +.pear-admin .auto-theme .layui-logo .title { + color: white; +} + +.pear-admin .auto-theme .layui-nav * { + color: white !important; +} + +.pear-admin .auto-theme .layui-nav.pear-nav-control .layui-this * { + color: black !important; +} + +.pear-admin .auto-theme .layui-nav .layui-nav-child a { + color: #5f5f5f !important; + color: rgba(0, 0, 0, .8) !important; +} + +/** 收缩布局 */ +.pear-mini .layui-side .layui-logo .title { + display: none; +} + +.pear-mini .layui-side .layui-logo .logo { + display: inline-block; +} + +.pear-mini .layui-side { + width: 60px; +} + +.pear-mini .layui-header { + left: 60px; + width: calc(100% - 60px); +} + +.pear-mini .layui-body { + left: 60px; +} + +.pear-mini .layui-side .layui-logo { + width: 60px; +} + +.pear-mini .layui-footer { + left: 60px; +} + +.pear-mini .layui-nav-tree .layui-nav-item span { + display: none; +} + +.pear-mini .layui-side-scroll { + height: calc(100% - 60px); +} + +.pear-admin .layui-header .layui-nav .layui-nav-bar { + top: 0px !important; + background-color: var(--global-primary-color); + height: 2px !important; +} + +.pear-admin .layui-header .layui-nav .layui-this:after { + display: none; +} + +.pear-admin .layui-header .layui-nav-more { + display: none; +} + +.pear-collapsed-pe { + right: 30px; + bottom: 30px; + z-index: 400000; + position: absolute; + background-color: var(--global-primary-color) !important; + box-shadow: 2px 0 6px rgba(0, 21, 41, .20); + text-align: center; + border-radius: 4px; + line-height: 50px; + display: none; + height: 50px; + width: 50px; +} + +.pear-collapsed-pe a { + color: white !important; +} + +@media screen and (min-width: 768px) { + .layui-hide-sm { + display: inline-block !important; + } +} + +@media screen and (min-width: 769px) { + .layui-hide-sm { + display: none !important; + } +} + +/** 新增兼容 */ +@media screen and (max-width: 768px) { + .collapse { + display: none !important; + } + + .pear-collapsed-pe { + display: inline-block !important; + } + + .layui-layout-control { + left: 45px !important; + } + + .layui-layout-left { + padding-left: 10px; + padding-right: 10px; + } + + .pear-mini .layui-side-scroll { + height: calc(100% - 62px); + } + + .pear-mini .layui-side { + width: 0px; + } + + .pear-mini .layui-header { + left: 0px; + width: 100%; + } + + .pear-mini .layui-body { + left: 0px; + } + + .pear-mini .layui-footer { + left: 0px; + } + + .pear-mini .layui-logo { + width: 0px; + } + + .pear-admin .layui-body { + left: 0px; + } + + .pear-admin .layui-header { + left: 0px; + width: 100%; + } + + .pear-admin .pear-cover { + width: 100%; + height: 100%; + background-color: #1E1E1E; + display: block; + position: absolute; + z-index: 1000; + opacity: 0; + margin-top: -60px; + } + + .pear-mini .pear-cover { + display: none; + } +} + +@-webkit-keyframes am-horizontal-roll_show { + 0% { + opacity: 1; + -webkit-transform: translateX(2000px); + transform: translateX(2000px) + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0) + } +} + +@keyframes am-horizontal-roll_show { + 0% { + opacity: 1; + -webkit-transform: translateX(800px); + -ms-transform: translateX(800px); + transform: translateX(800px) + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0) + } +} + +.layer-anim-right { + -webkit-animation: am-horizontal-roll_show .5s ease-out; + animation: am-horizontal-roll_show .5s ease-out; + +} + +/** 侧边主题 (亮) */ +.light-theme.layui-side { + box-shadow: 2px 0 8px 0 rgba(29, 35, 41, .05) !important; +} + +.light-theme.layui-side .layui-logo { + background-color: white !important; + color: black !important; + border-bottom: 1px whitesmoke solid; +} + +.light-theme.layui-side .layui-side-scroll { + background-color: white !important; + color: black !important; +} + +.dark-theme.layui-header { + border-bottom: none; + background-color: #28333E; + color: whitesmoke; +} + +.dark-theme.layui-header li > a { + color: whitesmoke !important; +} + +.dark-theme.layui-header .layui-logo { + box-shadow: none; + border: none; +} + +/** 顶部主题 (白) */ +.light-theme.layui-header .layui-logo { + background-color: white; + border: none; + box-shadow: none; +} + +/** 主题面板 */ +.pearone-color .set-text { + height: 42px; + line-height: 42px; +} + +.pearone-color .color-title { + padding: 15px 0 0px 20px; + margin-bottom: 4px; +} + +.pearone-color .color-content { + padding: 15px 10px 0 20px; +} + +.pearone-color .color-content ul { + list-style: none; + padding: 0px; +} + +.pearone-color .color-content ul li { + position: relative; + display: inline-block; + vertical-align: top; + width: 70px; + height: 50px; + margin: 0 20px 20px 0; + padding: 2px 2px 2px 2px; + background-color: #f2f2f2; + cursor: pointer; + font-size: 12px; + color: #666; +} + +.pearone-color .color-content li.layui-this:after, +.pearone-color .color-content li:hover:after { + width: 100%; + height: 100%; + padding: 4px; + top: -6px; + left: -6px; + border: var(--global-primary-color) 2px solid; + opacity: 1; + border-radius: 4px; +} + +.pearone-color .color-content li:after { + content: ''; + position: absolute; + z-index: 20; + top: 50%; + left: 50%; + width: 1px; + height: 0; + border: 2px solid #F2F2F2; + transition: all .3s; + -webkit-transition: all .3s; + opacity: 0; +} + +.select-color { + margin-bottom: 30px; +} + +.select-color .select-color-title { + padding: 15px 0 0px 20px; + margin-bottom: 4px; +} + +.select-color .select-color-content { + padding: 20px 0 0px 0px; + margin-bottom: 4px; +} + +.select-color .select-color-content .select-color-item { + width: 24px; + height: 24px; + color: white; + margin-left: 24px; + border-radius: 6px; + background-color: gray; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .15); + text-align: center; + line-height: 24px; + font-size: 12px; + float: left; +} + +.message .layui-tab-title li:not(:last-child) { + border-right: 1px solid #eee; +} + +/** 首屏加载 */ +.loader-wrapper { + position: fixed; + width: 100%; + height: 100%; + background-color: whitesmoke; + z-index: 9999999; +} + +.loader { + width: 50px; + height: 50px; + margin: 30px auto 40px; + margin-top: 20%; + position: relative; + z-index: 999999; + background-color: whitesmoke; +} + +.loader:before { + content: ""; + width: 50px; + height: 7px; + border-radius: 50%; + background: #000; + opacity: 0.1; + position: absolute; + top: 59px; + left: 0; + animation: shadow .5s linear infinite; +} + +.loader:after { + content: ""; + width: 50px; + height: 50px; + border-radius: 10px; + background-color: var(--global-primary-color); + position: absolute; + top: 0; + left: 0; + animation: loading .5s linear infinite; +} + +@-webkit-keyframes loading { + 17% { + border-bottom-right-radius: 3px; + } + + 25% { + transform: translateY(9px) rotate(22.5deg); + } + + 50% { + transform: translateY(18px) scale(1, 0.9) rotate(45deg); + border-bottom-right-radius: 40px; + } + + 75% { + transform: translateY(9px) rotate(67.5deg); + } + + 100% { + transform: translateY(0) rotate(90deg); + } +} + +@keyframes loading { + 17% { + border-bottom-right-radius: 3px; + } + + 25% { + transform: translateY(9px) rotate(22.5deg); + } + + 50% { + transform: translateY(18px) scale(1, 0.9) rotate(45deg); + border-bottom-right-radius: 40px; + } + + 75% { + transform: translateY(9px) rotate(67.5deg); + } + + 100% { + transform: translateY(0) rotate(90deg); + } +} + +@-webkit-keyframes shadow { + + 0%, + 100% { + transform: scale(1, 1); + } + + 50% { + transform: scale(1.2, 1); + } +} + +@keyframes shadow { + + 0%, + 100% { + transform: scale(1, 1); + } + + 50% { + transform: scale(1.2, 1); + } +} \ No newline at end of file diff --git a/static/admin/css/admin.dark.css b/static/admin/css/admin.dark.css new file mode 100644 index 0000000..9f1fbe8 --- /dev/null +++ b/static/admin/css/admin.dark.css @@ -0,0 +1,360 @@ +/** loader */ +.pear-admin-dark .loader-wrapper, +.pear-admin-dark .loader-wrapper .loader { + background-color: #141414; +} + +/** layout */ +.pear-admin-dark .layui-layout { + background-color: #141414; +} + +/** header */ +.pear-admin-dark .layui-header, +.pear-admin-dark .layui-header .layui-logo { + background-color: #141414 !important; + box-shadow: none !important; + border: none !important; +} + +.pear-admin-dark .layui-header.auto-theme, +.pear-admin-dark .layui-header.auto-theme .layui-logo { + background-color: var(--global-primary-color) !important; +} + +.pear-admin-dark .layui-header.auto-theme .layui-logo .title { + color: #ffffff !important; +} + +.pear-admin-dark .layui-header { + border: 1px solid rgba(0, 0, 0, .40) !important; +} + +.pear-admin-dark .layui-header .layui-nav * { + color: #ffffff !important; +} + +.pear-admin-dark .layui-header .layui-nav .layui-nav-child { + box-shadow: 0 3px 4px rgba(0, 0, 0, .6) !important; + background-color: #141414; + border-color: #141414; +} + +.pear-admin-dark .layui-header .layui-nav .layui-nav-child dd > a:hover { + background-color: #141414 !important; +} + +.pear-admin-dark .layui-header .pear-nav-control .layui-this a { + background-color: #0c0c0c !important; +} + +.pear-admin-dark .auto-theme .layui-logo .title { + color: var(--global-primary-color) !important; +} + +/** side */ +.pear-admin-dark .layui-side { + box-shadow: 0 3px 4px rgba(0, 0, 0, .6) !important; +} + +.pear-admin-dark .layui-logo { + border-color: rgba(0, 0, 0, .30) !important; +} + +.pear-admin-dark .layui-side .layui-logo, +.pear-admin-dark .layui-side .layui-side-scroll, +.pear-admin-dark .layui-side .layui-side-scroll .layui-nav-tree { + background-color: #141414 !important; +} + +.pear-admin-dark .layui-side .layui-side-scroll .layui-nav-tree .layui-nav-child { + background-color: rgba(0, 0, 0, .3) !important; +} + +.pear-admin-dark .layui-side .layui-side-scroll .layui-nav .layui-nav-item a, +.pear-admin-dark .layui-side .layui-side-scroll .layui-nav .layui-nav-item a > .layui-nav-more { + color: rgba(255, 255, 255, .7) !important; +} + +.pear-admin-dark .layui-side .layui-side-scroll .layui-nav .layui-nav-child dd.layui-this a, +.pear-admin-dark .layui-side .layui-side-scroll .layui-nav .layui-nav-itemed > a, +.pear-admin-dark .layui-side .layui-side-scroll .layui-nav .layui-nav-itemed > a > .layui-nav-more, +.pear-admin-dark .layui-side .layui-side-scroll .layui-nav .layui-nav-item > a:hover { + color: #ffffff !important; +} + +/** body */ +.pear-admin-dark .layui-body, +.pear-admin-dark .layui-body .pear-tab-page-loading, +.pear-admin-dark .layui-body .pear-page-loading { + background-color: #0a0a0a !important; +} + +.pear-admin-dark .layui-body .layui-tab .layui-tab-title, +.pear-admin-dark .layui-body .layui-tab .layui-tab-title li, +.pear-admin-dark .layui-body .layui-tab .layui-tab-control li { + background-color: #141414 !important; + border-color: rgba(0, 0, 0, .30) !important; + color: #ffffff; +} + +.pear-admin-dark .layui-body .layui-tab .layui-tab-title li > span:first-child { + background-color: #434343; +} + +.pear-admin-dark .layui-body .layui-tab .layui-nav-child.layui-anim { + border-color: #141414; + background-color: #141414 !important; +} + +.pear-admin-dark .layui-body .layui-tab .layui-nav-child.layui-anim a { + color: #ffffff; +} + +.pear-admin-dark .layui-body .layui-tab .layui-nav-child.layui-anim a:hover { + background-color: #0a0a0a; +} + +.pear-admin-dark .layui-body .layui-tab .layui-tab-close:hover { + border-radius: 50%; + background-color: #0a0a0a !important; +} + +.pear-admin-dark .pear-tab-page-menu ul li { + color: #ffffff !important; +} + +.pear-admin-dark .layui-footer { + background-color: #141414; + border-top: 1px solid #141414; +} + +/** theme */ +.pear-admin-dark .set-text, +.pear-admin-dark .select-color-title, +.pear-admin-dark .color-title { + color: #ffffff; +} + +/** search */ +.pear-admin-dark .menu-search-no-data { + color: #ffffff; +} + +.pear-admin-dark .menu-search-tips * { + color: #ffffff; +} + +.pear-admin-dark .menu-search-tips kbd { + border-color: rgba(0, 0, 0, .30) !important; +} + +.pear-admin-dark .menu-search-list li { + background-color: #141414; + box-shadow: 0 3px 4px rgba(0, 0, 0, .6) !important; + color: #ffffff; +} + +.pear-admin-dark .menu-search-list li:hover { + background-color: var(--global-primary-color) !important; +} + + +/** message center */ +.pear-admin-dark .pear-message-center .layui-tab-title, +.pear-admin-dark .pear-message-center .message-item { + border-color: rgba(0, 0, 0, .30) !important; + color: #ffffff; +} + +/** button */ +.pear-admin-dark .layui-btn { + color: #ffffff; + border-color: #4C4D4F; +} + +/** layer */ +.pear-admin-dark .layui-layer { + background-color: #141414; +} + +.pear-admin-dark .layui-layer-msg { + border-color: #141414; +} + +.pear-admin-dark .layui-layer-msg .layui-layer-content { + color: #E5EAF3; +} + +.pear-admin-dark .layui-layer .layui-layer-setwin > span, +.pear-admin-dark .layui-layer .layui-layer-title { + color: #ffffff; +} + +/** card */ +.pear-admin-dark .layui-card { + background-color: #1d1e1f !important; +} + +.pear-admin-dark .layui-card .layui-card-header { + border-bottom-color: #414243; + color: #ffffff; +} + +.pear-admin-dark .layui-card .layui-card-body { + color: #ffffff; +} + +/** input */ +.pear-admin-dark .layui-input { + background-color: transparent; + color: #ffffff; + border-color: rgba(0, 0, 0, .30) !important; +} + +/** switch */ +.pear-admin-dark .layui-form-switch { + border-color: #484849; + background-color: rgba(255, 255, 255, .08); +} + +/** table */ +.pear-admin-dark .layui-table { + background-color: transparent; +} + +.pear-admin-dark .layui-table tr:hover { + background-color: #141414 !important; +} + +.pear-admin-dark .layui-table td, +.pear-admin-dark .layui-table th, +.pear-admin-dark .layui-table-view, +.pear-admin-dark .layui-table-page, +.pear-admin-dark .layui-table-tool, +.pear-admin-dark .layui-table-header { + border-color: rgba(0, 0, 0, .40) !important; +} + +.pear-admin-dark .layui-table-tool-self > div { + border-color: rgba(0, 0, 0, .40) !important; + color: #ffffff !important; + background-color: transparent; +} + +.pear-admin-dark .layui-laypage select, +.pear-admin-dark .layui-laypage button { + border-color: rgba(0, 0, 0, .40) !important; + color: #ffffff !important; + background-color: transparent; +} + +.pear-admin-dark .layui-laypage a, +.pear-admin-dark .layui-laypage-spr, +.pear-admin-dark .layui-laypage-skip, +.pear-admin-dark .layui-laypage-count { + color: #ffffff; +} + +.pear-admin-dark .layui-laypage-limits option { + background-color: #141414 !important; + color: #ffffff; +} + +/** panel */ +.pear-admin-dark .layui-panel { + background-color: #1d1e1f !important; + border-color: #1d1e1f !important; +} + +/** menu */ +.pear-admin-dark .layui-menu { + background-color: #1d1e1f !important; +} + +.pear-admin-dark .layui-menu .layui-menu-body-title, +.pear-admin-dark .layui-menu .layui-menu-body-title:hover { + color: #ffffff; + background-color: #1d1e1f !important; +} + +/** timeline */ +.pear-admin-dark .layui-timeline-axis { + background-color: rgb(29, 30, 31) !important; +} + +.pear-admin-dark .layui-timeline-item:before { + background-color: #414243 !important; +} + + +/** toast */ +.pear-admin-dark .iziToast { + background-color: #1f1f1f !important; +} + +/** console */ + +.pear-admin-dark .deputy, +.pear-admin-dark .shortcut-menu { + background-color: #141414 !important; +} + +.pear-admin-dark .deputy:hover, +.pear-admin-dark .shortcut-menu:hover { + box-shadow: 0 3px 4px rgba(0, 0, 0, .6) !important; +} + +.pear-admin-dark .message-board li { + border-bottom: 1px solid rgba(0, 0, 0, .40) !important; +} + +/** analysis */ +.pear-admin-dark .top-panel-number { + color: #ffffff !important; + border-color: #414243; +} + + +.pear-admin-dark .dynamic-status dd { + border-color: #414243; +} + +/** success failure */ +.pear-admin-dark .pear-result .content { + background-color: rgba(153, 153, 153, 0.12); + color: #E5EAF3; +} + +.pear-admin-dark .pear-result .title { + color: #ffffff; +} + +.pear-admin-dark .pear-result .description { + color: #8D9095; +} + +/** 403 404 500*/ +.pear-admin-dark .pear-exception .title p { + color: #E5EAF3 !important; +} + +/** scroll */ +.pear-admin-dark *::-webkit-scrollbar-thumb { + background: #141414; + border-radius: 4px; +} + +.pear-admin-dark *::-webkit-scrollbar-thumb:hover { + background: #0a0a0a; +} + +/** profile */ +.pear-admin-dark .user-name, +.pear-admin-dark .user-desc { + color: whitesmoke; +} + +.pear-admin-dark .user-desc { + border-top: 1px solid #141414; +} \ No newline at end of file diff --git a/static/admin/css/other/analysis.css b/static/admin/css/other/analysis.css new file mode 100644 index 0000000..5cea18b --- /dev/null +++ b/static/admin/css/other/analysis.css @@ -0,0 +1,65 @@ +.top-panel { + border-radius: 4px; + text-align: center; +} + +.top-panel > .layui-card-body { + height: 60px; +} + +.top-panel-number { + line-height: 60px; + font-size: 29px; + border-right: 1px solid #eceff9; +} + +.top-panel-tips { + padding-left: 8px; + padding-top: 16px; + line-height: 30px; + font-size: 12px; +} + +.top-panel-tips i { + font-size: 33px; +} + +.top-panel-tips svg { + margin-top: -12px; + width: 50px; + height: 50px; +} + +.dynamic-status { + padding: 0 10px 10px; +} + +.dynamic-status dd { + padding: 15px 0; + border-bottom: 1px solid #EEE; + display: -webkit-flex; + display: flex; +} + +.dynamic-status dd div.dynamic-status-img { + width: 32px; + height: 32px; + border-radius: 50%; + margin-right: 15px; +} + +.dynamic-status dd div.dynamic-status-img a { + width: 100%; + height: 100%; + display: inline-block; + text-align: center; + line-height: 32px; +} + +.dynamic-status dd div span { + color: #BBB; +} + +.dynamic-status dd div a { + color: #01AAED; +} \ No newline at end of file diff --git a/static/admin/css/other/console.css b/static/admin/css/other/console.css new file mode 100644 index 0000000..1ef50fc --- /dev/null +++ b/static/admin/css/other/console.css @@ -0,0 +1,81 @@ + +.shortcut-menu { + width: 100%; + height: 66px; + background-color: #F8F8F8; + display: inline-block; + border-radius: 5px; + text-align: center; + margin-bottom: 3px; +} + +.shortcut-menu i { + font-size: 30px; + height: 66px; + line-height: 66px; +} + +.shortcut-menu:hover { + box-shadow: 2px 0 8px 0 lightgray !important; +} + +.shortcut-menu-label { + width: 100%; + display: inline-block; + text-align: center; +} + +.deputy { + width: 100%; + height: 90px; + background-color: #F8F8F8; + display: inline-block; + border-radius: 5px; + text-align: center; + margin-bottom: 3px; +} + +.deputy:hover { + box-shadow: 2px 0 8px 0 lightgray !important; +} + +.deputy .deputy-label { + color: gray; + margin-top: 14px; + font-size: 14px; +} + +.deputy .deputy-count { + margin-top: 12px; + color: var(--global-primary-color); + font-size: 30px; +} + +.message-board { + padding: 0 10px 10px; +} + +.message-board li { + position: relative; + padding: 10px 0; + border-bottom: 1px solid #EEE; +} + +.message-board li p { + padding-bottom: 10px; + padding-top: 3px; +} + +.message-board li > span { + color: #999; + height: 24px; + line-height: 24px; +} + +.message-board .message-board-reply { + position: absolute; + right: 20px; + bottom: 12px; + height: 24px; + line-height: 24px; +} \ No newline at end of file diff --git a/static/admin/css/other/exception.css b/static/admin/css/other/exception.css new file mode 100644 index 0000000..e7f2027 --- /dev/null +++ b/static/admin/css/other/exception.css @@ -0,0 +1,28 @@ +.pear-exception { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + text-align: center; + box-sizing: border-box; + padding: 70px 40px +} + +.pear-exception .title { + margin-top: 20px; +} + +.pear-exception .title p { + color: rgb(0, 0, 0); + font-size: 20px; +} + +.pear-exception .description { + margin-top: 10px; + color: #8D9095; + font-size: 14px; +} + +.pear-exception .extra { + margin: 30px; +} \ No newline at end of file diff --git a/static/admin/css/other/login.css b/static/admin/css/other/login.css new file mode 100644 index 0000000..936dcdf --- /dev/null +++ b/static/admin/css/other/login.css @@ -0,0 +1,227 @@ +html, +body { + height: 100%; +} + +.login-page { + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + display: flex; + justify-content: center; + align-items: center; +} + +.layui-row { + width: 1000px; + height: 600px; + box-shadow: 2px 0 6px rgba(0, 21, 41, .20); + border: 3px solid whitesmoke; + border-radius: 15px; +} + +.login-bg { + height: 100%; + box-sizing: border-box; + background-color: rgb(250, 250, 250); + display: flex; + align-items: center; + justify-content: center; + border-bottom-left-radius: 15px; + border-top-left-radius: 15px; +} + +.login-bg-img { + width: 90%; + display: inline-block; + margin: 0 auto; +} + +.login-form { + height: 100%; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + background-color: #fff; + border-bottom-right-radius: 15px; + border-top-right-radius: 15px; +} + +.form-center { + background: #fff; + box-sizing: border-box; + flex-flow: row wrap; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + text-align: center; +} + +.form-center-box { + width: 360px; +} + +.top-log-title { + align-items: center; + justify-content: center; + display: flex; + margin-bottom: 30px; +} + +.top-log { + width: 50px; + border-radius: 12px; + margin-right: 20px; + height: 50px; +} + +.top-log-title span { + font-size: 32px; + font-weight: 700; + color: var(--global-primary-color); +} + +.top-desc { + font-size: 14px; + color: #808695; + +} + +.tab-log-method { + width: 100%; + display: flex; + padding: 20px 0px; +} + +.tab-log-method-item { + flex: 1; + box-sizing: border-box; + padding: 5px 50px; + text-align: right; + color: #1f2225; + font-size: 16px; +} + +.tab-log-method-item:nth-child(2) { + text-align: left; +} + +.tab-log-method-item > span { + display: inline-block; + width: 40px; + text-align: center; + height: 30px; + border-bottom: 2px solid transparent; +} + +.tab-log-method-item > span:hover { + cursor: pointer; + color: #16baaa; + border-bottom: 2px solid #16baaa; +} + +.tab-log-verification { + width: 100%; + display: flex; +} + +.verification-text { + flex: 2; + box-sizing: border-box; + margin-right: 20px; +} + +.verification-img { + flex: 1; + box-sizing: border-box; + border: 1px solid #eeeeee; + border-radius: 4px; + height: 40px; + overflow: hidden; + text-align: center; +} + +.remember-passsword { + margin: 20px 0; + width: 100%; + display: flex; + box-sizing: border-box; +} + +.remember-cehcked { + flex: 1; + text-align: left; +} + +.greenText { + color: #16baaa; + cursor: pointer; +} + + +.login-btn { + width: 100%; + box-sizing: border-box; +} + +.login-btn > .layui-btn { + width: 100%; +} + +.other-login { + width: 100%; + box-sizing: border-box; + margin: 20px 0 0; + text-align: left; + display: flex; +} + +.other-login-methods { + display: inline-block; + flex: 1; +} + +.layui-input { + border-radius: 4px; + line-height: 40px; + height: 40px; +} + +.layui-btn { + border-radius: 4px; + background-color: var(--global-primary-color); +} + +@media (min-width: 992px) and (max-width: 1200px) { + .layui-row { + width: 900px; + } +} + +@media (min-width: 768px) and (max-width: 992px) { + .layui-row { + width: 90%; + } + + .form-center { + width: 90%; + } +} + +@media (max-width: 768px) { + .layui-row { + width: 90%; + } + + .login-form { + border-bottom-left-radius: 15px; + border-top-left-radius: 15px; + } + + .form-center-box { + width: 95%; + } +} \ No newline at end of file diff --git a/static/admin/css/other/profile.css b/static/admin/css/other/profile.css new file mode 100644 index 0000000..c06250f --- /dev/null +++ b/static/admin/css/other/profile.css @@ -0,0 +1,77 @@ +.text-center { + text-align: center; +} + +.user-info { + width: 110px; + height: 110px; + line-height: 110px; + position: relative; + display: inline-block; + border-radius: 50%; + overflow: hidden; + cursor: pointer; + margin: 0 auto; +} + +.user-name { + padding-top: 20px; + font-size: 20px !important; +} + +.user-home { + padding-top: 8px; + margin-top: 10px; + font-size: 13.5px; +} + +.user-desc { + height: 45px; + border-top: 1px whitesmoke solid; + text-align: center; + line-height: 45px; + font-size: 13.5px; +} + +.blog-title { + padding-left: 13.5px; +} + +.blog-content { + padding-left: 13px; + font-size: 13px; + color: dimgray; +} + +.layui-tab-title { + border-bottom: none; +} + +.message-board { + padding: 0 10px 10px; +} + +.message-board li { + position: relative; + padding: 10px 0; + border-bottom: 1px solid #EEE; +} + +.message-board li p { + padding-bottom: 10px; + padding-top: 3px; +} + +.message-board li > span { + color: #999; + height: 24px; + line-height: 24px; +} + +.message-board .message-board-reply { + position: absolute; + right: 20px; + bottom: 12px; + height: 24px; + line-height: 24px; +} \ No newline at end of file diff --git a/static/admin/css/other/result.css b/static/admin/css/other/result.css new file mode 100644 index 0000000..17b4637 --- /dev/null +++ b/static/admin/css/other/result.css @@ -0,0 +1,46 @@ +.pear-result { + text-align: center; + +} + +.pear-result .success svg { + color: #32C682; + text-align: center; + margin-top: 40px; + +} + +.pear-result .error svg { + color: #f56c6c; + text-align: center; + margin-top: 40px; + +} + +.pear-result .title { + margin-top: 25px; + +} + +.pear-result .description { + margin-top: 25px; + width: 60%; + margin-left: 20%; + color: rgba(0, 0, 0, .45); +} + +.pear-result .content { + margin-top: 20px; + width: 80%; + border-radius: 4px; + background-color: whitesmoke; + padding: 20px 32px; + margin-left: 10%; + margin-bottom: 30px; + text-align: left; +} + +.pear-result .extra { + padding-top: 10px; + margin-top: 25px; +} diff --git a/static/admin/css/reset.css b/static/admin/css/reset.css new file mode 100644 index 0000000..faf596f --- /dev/null +++ b/static/admin/css/reset.css @@ -0,0 +1,138 @@ +.layui-dropdown { + border-radius: var(--global-border-radius); +} + +.layui-input { + border-radius: var(--global-border-radius); +} + +.layui-form-onswitch { + background-color: var(--global-primary-color) !important; +} + +.layui-form-onswitch { + border-color: var(--global-primary-color); +} + +.layui-form-radio:hover > *, +.layui-form-radioed > i, +.layui-form-radioed { + color: var(--global-primary-color) !important; +} + +.layui-form-checked[lay-skin=primary] > i { + border-color: var(--global-primary-color) !important; + background-color: var(--global-primary-color); + color: #fff; +} + +.layui-form-checkbox[lay-skin=primary] > .layui-icon-indeterminate, +.layui-form-checkbox[lay-skin=primary] > .layui-icon-indeterminate:hover { + border-color: var(--global-primary-color); +} + +.layui-form-checkbox[lay-skin=primary] > .layui-icon-indeterminate:before { + background-color: var(--global-primary-color); +} + +.layui-btn { + background-color: var(--global-primary-color); +} + +.layui-btn.layui-btn-primary:hover { + border: 1px solid var(--global-primary-color); +} + +.layui-btn.layui-btn-normal { + background-color: #1e9fff !important; +} + +.layui-btn.layui-btn-danger { + background-color: #ff5722 !important; +} + +.layui-btn.layui-btn-warm { + background-color: #ffb800 !important; +} + +.layui-btn.layui-btn-primary { + background-color: transparent !important; + color: #5f5f5f !important; +} + +.layui-card { + border-radius: var(--global-border-radius); +} + +.layui-timeline-axis { + color: var(--global-primary-color); +} + +.layui-table-checked { + background-color: #f8f8f8; +} + +.layui-input:focus, .layui-textarea:focus { + border-color: var(--global-primary-color) !important; + box-shadow: 0 0 0 3px rgb(from var(--global-primary-color) r g b / 8%); +} + +.layui-form-select dl dd.layui-this { + color: var(--global-primary-color); +} + +.layui-input-wrap .layui-input:focus + .layui-input-split { + border-color: var(--global-primary-color) +} + +.layui-form-checked:hover > div, .layui-form-checked > div { + background-color: var(--global-primary-color); +} + +.layui-form-checked:hover > i, .layui-form-checked > i { + color: var(--global-primary-color); +} + +.layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: var(--global-primary-color); +} + +.layui-laypage input:active { + border-color: var(--global-primary-color); +} + +.layui-laypage a:hover { + color: var(--global-primary-color); +} + +.layui-laypage input:focus, .layui-laypage select:focus { + border-color: var(--global-primary-color) !important; +} + +.layui-laydate .layui-this, .layui-laydate .layui-this > div { + background-color: var(--global-primary-color) !important; +} + +.layui-laydate-header i:hover, .layui-laydate-header span:hover { + color: var(--global-primary-color); +} + +.layui-laydate-footer span:hover { + color: var(--global-primary-color); +} + +.layui-tab-brief > .layui-tab-title .layui-this { + color: var(--global-primary-color); +} + +.layui-tab-brief > .layui-tab-more li.layui-this:after, .layui-tab-brief > .layui-tab-title .layui-this:after { + border-bottom: 2px solid var(--global-primary-color); +} + +.layui-progress-bar { + background-color: var(--global-primary-color); +} + +.layui-form-checkbox[lay-skin=primary]:hover > i { + border-color: var(--global-primary-color); +} \ No newline at end of file diff --git a/static/admin/css/variables.css b/static/admin/css/variables.css new file mode 100644 index 0000000..5125b46 --- /dev/null +++ b/static/admin/css/variables.css @@ -0,0 +1,9 @@ +:root { + + /* 主题颜色 */ + --global-primary-color: #16baaa; + + /** 圆角度数 */ + --global-border-radius: 4px; + +} \ No newline at end of file diff --git a/static/admin/data/menu.json b/static/admin/data/menu.json new file mode 100644 index 0000000..984735f --- /dev/null +++ b/static/admin/data/menu.json @@ -0,0 +1,313 @@ +[ + { + "id": 1, + "title": "工作空间", + "icon": "layui-icon layui-icon-console", + "type": 0, + "children": [ + { + "id": "10", + "title": "分析页", + "icon": "layui-icon layui-icon-console", + "type": 1, + "openType": "_component", + "href": "view/analysis/index.html" + }, + { + "id": "11", + "title": "工作台", + "icon": "layui-icon layui-icon-console", + "type": 1, + "openType": "_component", + "href": "view/console/index.html" + } + ] + }, + { + "id": 9, + "title": "列表页面", + "icon": "layui-icon layui-icon-auz", + "type": 0, + "children": [ + { + "id": 91, + "title": "查询表格", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/listing/table.html" + } + ] + }, + { + "id": 2, + "title": "扩展组件", + "icon": "layui-icon layui-icon-auz", + "type": 0, + "children": [ + { + "id": 21, + "title": "核心方法", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/component/admin.html" + }, + { + "id": 23, + "title": "高级栅格", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/component/grid.html" + }, + { + "id": 24, + "title": "消息提示", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/component/toast.html" + }, + { + "id": 25, + "title": "路由过渡", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/component/nprogress.html" + } + ] + }, + { + "id": "result", + "title": "结果页面", + "icon": "layui-icon layui-icon-auz", + "type": 0, + "href": "", + "children": [ + { + "id": "success", + "title": "成功页面", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/result/success.html" + }, + { + "id": "failure", + "title": "失败页面", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_component", + "href": "view/result/error.html" + } + ] + }, + { + "id": "exception", + "title": "异常页面", + "icon": "layui-icon layui-icon-auz", + "type": 0, + "href": "", + "children": [ + { + "id": "403", + "title": "403", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/exception/403.html" + }, + { + "id": "404", + "title": "404", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_component", + "href": "view/exception/404.html" + }, + { + "id": "500", + "title": "500", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_component", + "href": "view/exception/500.html" + } + ] + }, + { + "id": "open", + "title": "菜单模式", + "icon": "layui-icon layui-icon-auz", + "type": 0, + "children": [ + { + "id": "a", + "title": "普通路由", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/result/success.html" + }, + { + "id": "b", + "title": "嵌套网页", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_iframe", + "href": "http://www.layui-vue.com" + }, + { + "id": "c", + "title": "新建标签", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_blank", + "href": "http://www.layui-vue.com" + }, + { + "id": "d", + "title": "弹窗网页", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_layer", + "href": "http://www.layui-vue.com" + } + ] + }, + { + "id": "deep", + "title": "深度测试", + "icon": "layui-icon layui-icon-auz", + "type": 0, + "href": "", + "children": [ + { + "id": "deep1-1", + "title": "二级菜单", + "icon": "layui-icon layui-icon-face-smile", + "type": 0, + "openType": "_component", + "href": "view/result/success.html", + "children": [ + { + "id": "deep1-1-1", + "title": "三级菜单", + "icon": "layui-icon layui-icon-face-smile", + "type": 0, + "openType": "_component", + "href": "view/result/success.html", + "children": [ + { + "id": "deep1-1-1-1", + "title": "四级菜单", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/result/success.html" + }, + { + "id": "deep1-1-1-2", + "title": "四级菜单", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_blank", + "href": "http://www.layui-vue.com" + } + ] + }, + { + "id": "deep1-1-2", + "title": "三级菜单", + "icon": "layui-icon layui-icon-face-cry", + "type": 0, + "openType": "_blank", + "href": "http://www.layui-vue.com", + "children": [ + { + "id": "deep1-1-2-1", + "title": "四级菜单", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/result/success.html" + }, + { + "id": "deep1-1-2-2", + "title": "四级菜单", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_blank", + "href": "http://www.layui-vue.com" + } + ] + } + ] + }, + { + "id": "deep1-2", + "title": "二级菜单", + "icon": "layui-icon layui-icon-face-cry", + "type": 0, + "openType": "_blank", + "href": "http://www.layui-vue.com", + "children": [ + { + "id": "deep1-2-1", + "title": "三级菜单", + "icon": "layui-icon layui-icon-face-smile", + "type": 0, + "openType": "_component", + "href": "view/result/success.html", + "children": [ + { + "id": "deep1-2-1-1", + "title": "四级菜单", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/result/success.html" + }, + { + "id": "deep1-2-1-2", + "title": "四级菜单", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_blank", + "href": "http://www.layui-vue.com" + } + ] + }, + { + "id": "deep1-2-2", + "title": "三级菜单", + "icon": "layui-icon layui-icon-face-cry", + "type": 0, + "openType": "_blank", + "href": "http://www.layui-vue.com", + "children": [ + { + "id": "deep1-2-2-1", + "title": "四级菜单", + "icon": "layui-icon layui-icon-face-smile", + "type": 1, + "openType": "_component", + "href": "view/result/success.html" + }, + { + "id": "deep1-2-2-2", + "title": "四级菜单", + "icon": "layui-icon layui-icon-face-cry", + "type": 1, + "openType": "_blank", + "href": "http://www.layui-vue.com" + } + ] + } + ] + } + ] + } +] \ No newline at end of file diff --git a/static/admin/data/message.json b/static/admin/data/message.json new file mode 100644 index 0000000..a2ed962 --- /dev/null +++ b/static/admin/data/message.json @@ -0,0 +1,102 @@ +{ + "code": 200, + "data": [ + { + "id": 1, + "title": "通知", + "children": [ + { + "id": 11, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png", + "title": "你收到了 14 份新周报", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + }, + { + "id": 12, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png", + "title": "曲妮妮 已通过第三轮面试", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + }, + { + "id": 11, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png", + "title": "可以区分多种通知类型", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + }, + { + "id": 12, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png", + "title": "左侧图标用于区分不同的类型", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + }, + { + "id": 11, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png", + "title": "内容不要超过两行字", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + } + ] + }, + { + "id": 2, + "title": "消息", + "children": [ + { + "id": 11, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png", + "title": "你收到了 14 份新周报", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + }, + { + "id": 12, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png", + "title": "曲妮妮 已通过第三轮面试", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + }, + { + "id": 11, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png", + "title": "可以区分多种通知类型", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + }, + { + "id": 12, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png", + "title": "左侧图标用于区分不同的类型", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + }, + { + "id": 11, + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png", + "title": "内容不要超过两行字", + "context": "这是消息内容。", + "form": "就眠仪式", + "time": "刚刚" + } + ] + }, + { + "id": 3, + "title": "代办", + "children": [] + } + ] +} \ No newline at end of file diff --git a/static/admin/data/table.json b/static/admin/data/table.json new file mode 100644 index 0000000..485a7de --- /dev/null +++ b/static/admin/data/table.json @@ -0,0 +1,303 @@ +{ + "code": 0, + "msg": "", + "count": 1000, + "totalRow": { + "era": { + "tang": "2", + "song": "2", + "xian": "20" + } + }, + "data": [ + { + "id": "10001", + "username": "就眠儀式", + "email": "test1@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10002", + "username": "杜甫", + "email": "test2@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "108", + "joinTime": "2016-10-14", + "LAY_CHECKED": true + }, + { + "id": "10003", + "username": "就眠儀式", + "email": "test3@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10004", + "username": "就眠儀式", + "email": "test4@email.com", + "sex": "女", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10005", + "username": "就眠儀式", + "email": "test5@email.com", + "sex": "女", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10006", + "username": "就眠儀式", + "email": "test6@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10007", + "username": "就眠儀式", + "email": "test7@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10008", + "username": "就眠儀式", + "email": "test8@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10009", + "username": "就眠儀式", + "email": "test9@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10010", + "username": "就眠儀式", + "email": "test10@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10011", + "username": "就眠儀式", + "email": "test11@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10012", + "username": "就眠儀式", + "email": "test12@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10013", + "username": "就眠儀式", + "email": "test13@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10014", + "username": "就眠儀式", + "email": "test14@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10015", + "username": "就眠儀式", + "email": "test15@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10016", + "username": "就眠儀式", + "email": "test16@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10017", + "username": "就眠儀式", + "email": "test17@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10018", + "username": "就眠儀式", + "email": "test18@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10019", + "username": "就眠儀式", + "email": "test19@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10020", + "username": "就眠儀式", + "email": "test20@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10021", + "username": "就眠儀式", + "email": "test21@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10022", + "username": "就眠儀式", + "email": "test22@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10023", + "username": "就眠儀式", + "email": "test23@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + }, + { + "id": "10024", + "username": "就眠儀式", + "email": "test24@email.com", + "sex": "男", + "city": "浙江杭州", + "sign": "花开堪折直须折,莫待无花空折枝.", + "experience": "100", + "ip": "192.168.0.8", + "checkin": "106", + "joinTime": "2016-10-14" + } + ] +} \ No newline at end of file diff --git a/static/admin/images/avatar.jpg b/static/admin/images/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..206a8b6c2def8679090c377e433a185dc92c501b GIT binary patch literal 76158 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�k15mMb6Svz^{+V77__@Due9K7wZ6BUok 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≤ zTzTXTdISYC(G8tK;Bu-$Sptxf|HUgVU;@(^s9s8U=i-3DX~Is>NPiXO$46`2qn#Mb zo>v^kL+gW%CNI!EPxUeM;4;C7utQ$=C7$d#T1l^x?TbiiQr8{)23B>+FPD%tv~FK7 z{dMh$+~A0qqOn(U^22jxjaC+dr%82ZHxY^3a<(9@uNxLg4S%}BRezEd`U7YOgV4+1 zKdjR=tIiMkaDf5qoVCPa3xFmj=Bv+vz?XfYpM0R*-{OEyZL!Z7ou672KF1DUKK@T; z;tLM{fBFpYh;in2PmcSWNGiXvj#1=@ww%b~E#L1Tsiwr%MbnkwasDc$kQz>F2|K<4 zF4$13s_B5(9D1y^;CnxXJ(k9qGe07Q?||2O>V5YO;*!p6cd53-D~p`8GRppuVV|G> z0SyfRd^uH+RVWdV7j87&l!tZ6mjE- z2yhoQ>id^{r|Y>p*HmiMqxu!*bhVm($g$I?k%B`nab1^a&kw9N^2OO^c7C5I-W%| zXtX<>_trzd)#$Wg!ygmZYxsqP@mzgpwucuJ=z6sUWTL;aCnL)Mks+_75DmUIs8QSQ z*Sy<=uj`SeAMS$Pm?d!hg_fK{n|2J1?C4vgDem%mC!uvdj`CBmJy#u@(5xRz1`o%l zKSgwuuqWj}euZL#En^`et~b<$rbK?(9){nE!^)1`;Wxjsd!v!7lc^(8yEUCy(?)LUX~&~D^}KQQ`uWS^3I(z8$?xh; zxwCl(;XGPa9!jy1D@WLLS-Lba~y5ZaEucQLu()I7F~ z?71>xZT=?%-prQI#s|ILerv|Hc<#X&l)YwzO8AZw+X z5$5#P8~V7-t-v;e#Z6A?Vu83N;Zpc$d_He0oNk37-o7fadWbwQ`C7j=YCgABPoq2| zN~LNW-O)X$sihkPlxF-&2>xrK`G0YpRwHNw1}ue04EA?vMgm`#cG~k7s&B8PpS@l$+t^HL^oy)Q1o9(dTd+(K z6OD?}RM)kB0YhM{Grq9U>87Yc5ie^oM##%`mk)BtD9dAZeP-%Tmy&OC$C4xO&D@4B zF6?$iqW4sDBpt3b4-#N))+JNH7Ctz|n8|j%wtFkVW>CnIT}jHwctn&MOdPmyhmj9| zt~EVOy^1+@4Oywh0Wa6t8o5t>+Qy z?vQqwkmjA8G1?8@KtZSc_s5i(st4a!CeXf*yu&OIcnzx}j~M3StxBA`TdYLD?FH{JpzBG+ zoEPBQ!3z#hx=Yj4I`QDk&bKO1XqGFYj8bA^X++jaJUg6Zg)Te@JNek6IWZusZ`X}M zM6gesE+PoFFI4OBEznEReHqnwIjjR&HAP?vz}JKipm_QdVP<>F3S)-*)my-?*Qdqf zj4PIworzUC3*Or0p~(cU9g&;hWWH13Y&wQqvS?{WJ>$0R1E|sN7iF1Bn2qD*Y!QRI zfk5S-^o)(dU7z3#mV6CluV8zOSl?TSy{@gm!9tYZhP>{}Tr9D5Tw(|YxN!GZbF#Z* zZ;dIzpIk7g*s2ajGkQeNw0dGP=1&LD%SR-dzGM3zNQ&%-N6y;Y!LPs1*!HEmHU6kr zBf3HXB`i+d3EZY@g56-<(@V#db0yjY)87p#tC6&T5%g_hCWMZH6+ZTTL7$sZhsZJ$kk{5YYH!lKCxiC6E~4&#iL zk89-y5oAq&Hfq8SV1Ic7`B8;(sy5IY|4aEs16oFn8-Wkv>I9bap|tDAJCv>}>T;W$ zv+SFQn!|C9O<)v6H==wmAP6?UU4c#$Uc&NQSCOT`hch3L7Cz=f>Apw3o?8{=MpyIY zUJ`|U;@0u}ci;L + + Group 21 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/admin/images/banner.png b/static/admin/images/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..a509ca6a55ac9b541d5f43d2a95117487fa5442e GIT binary patch literal 10383068 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 ~wusR=i znN}KOQ_1v-oEB!Rg2vkNHa8q#&-Q?8+IJo3JG-Go1x2vQX1>Kl{m1);8Z;!}L3d0F z7V3f-wE>6nZIx;{VBzUamcfwASwXS?F25o3ai=%@Lh`L7G9~9O-*+igZ6Hu9)tgk4 zppy#~o zVpLc5hv0z5B9p1^ne?5UPT`LH=X(7=ka=Pb(t?WyNKmW9oxKtBPYpx1L|`J{KP5|D zCNUQ;G_!gOvHZaxcHetJvp(kbfy6)$HLEP(oC7g+>+hhap@yAMEb_(CM7LODkJ=X; zoBGP5z-BlrcO}_CBnogngYA3c&DGg~-7*1k!vcISH>01u4MEQ+IzH-*6cc85O03xu zUY>sWmEg#gZ>GyCwew<{ven6J@YAh@yhw`yPG&|gtq_8$e%m>H&1(wdPJSA51V8yp zQE%SCA%BlP=q>^-QG~%U0SPihD!uzEb`SI+t=lm7v?T%I4ba4!i({NK=W8fe7KS!L zy&ofb6{tt+ji}c3cy&5>f|kgjDozBtJ>GEl*VUcrdlM6XQDAn|ZDa?X$RK(n19mE%k_mOw_cw%Tm4!Nbk1C+es5BgBlpGaLRc z2IUsbVYB`u8e+9@=dSK))Tt9*>S^R9=Js)mt+?VuRHO%`A{*?cMNbYfU-KBPEb+03 z4+K;5%!0gOQBfH<=p}CF6~d(}dK(46CdybgwQ9P|PyoXAL01zPpZd(Ra(uHlnd(h3 z;08}ZNK-2iK!eOuOVc%xm@qKo134lMWzm)2o9Rqad9Xv(}Bz@173G8^a_v4iQH*f*F6!oufUw;CvmpANkdS8tP$1W{3cc-?)TW_dp zzk;P%<}*9G1KyVxcP0a)mz2oaDrW0qL(u%Fw$8X{X9B-CY^6@uPX!t3kE{FRlz2jB zM&W4+q3Isrt$2~(1@{5lFOJ3>e7}lfbGq&%^9i5BVwu&-i?@_kgS(ee9R~rvnDaRf zC>;jCLKz`hf-5u9YK!B9<+Oh;Jb+uv9s5KC$HSN5n77^qzA;BF{XbI7OEim`4ZI<} zLA{@SFmfeGuW<5E->OsYoCe7UTOs8+z?#KG{!hdMdEJqJ2@fe>`Mzbvoa54oIzD?g zg>`q^4S-1?q=C9N5n6sd8kCY9CscQ$139{M+|UJC!;W5dT~sbX9LGuQ(8{w^)p4jv z#p4r&*$2l|WG|3ck7d*s@a_3$QR>r-EsGoYa4 z`16jkpg)gThQ11dVNXeACdM>MT$7>mR7H|ePy&DB7#;jl&UoZ}~)M6(|_=zdHyxgr9kNqlw~#W$@Nb({ifr6ZCJq zl0#{XD?RmsKL0wm?FKl0!f%B57OM7zQR%k>)W97Ta4Za5_8_OPd~@IRU~xl=dJx`{ zW2SuZMMyBFSetn_iz$#XGg+0o4lWmXrf{JV=Xl#l5*%KDy5RYIl5ZZXwb`6>15;*b z;VDSx@4>e7D;jTEUFx@nXFP66ZvkG`!OrG=O|>`*F{gX60T%^IlSMwdJvzwx zW9A*Pb8N%sl=o03%9ZAE_i}jn$KIhTII_*NhtQ- zhuTM=Y&V36jXLAh^t^~Q4fAcnZ4pR3XM+KL`r~Twt{C5iQrG_6_gO`r@^6;EZXQdF zeKiXaZcTSSSb4kvavuKBSfi^X_<`W$E;fL=v^Mr<4R2hwk<-sg{?1;w8~@gw22Yfq z7<+m>Yy~+~ZKGjqh)vvg(WfLpwYP3N!ha%3N*3jz!=4xLLQ6yE z0@+$99}O1nG3VD3V-JkVogC!BHbd;4ccEWI{LIW9^gkjy(2_gHL6xb7l4ew&X?Iqb z_>8TRm*Xepv&-oURDd*0bfMdco~^F!p)h$A|Gy*po!~MtmZftx2v9MzCK2be%32U{e{rGzyF zG;swlobz>T-t=fJfi_>H@=Svk20kyC@^O?0pM=YT#`OwT@r>RX2CqUyrWBR4-AA@A)8==}J5 z#|bB~nsZodvjHjj=b4_>5XpB7-a~yyTA$I~@{664z* z@bVIx$nZT|l47?7ii>;@Ozk~^C3P>z7fYYc=(-*Hf3CgDP$R#OOy3+DT_Axpw1O!T zo_ur38xMR))84QAvhqZHe?Bg&nN4R^dd{Yzn!tVbN0DC#UEM)CqILyHtCvB*V#Zcy zXVxBVeXy-`CHxZk-{B=@+RkMUeknF$2|3;(BKfF*TgH|&ke*3C5LCIqi$ad^%X-}G z1@uGcW2|@*fKHgDondTNRpFiN1%(LD%NuWxsh~APtvCzJNn~pHQ5nhkKpJ`GjoLT0 zH%wBry0n|+vM8SM)!h9lMO{o51%vH*Jl){hZojhUMU7u2@G`NR5X*HI=_dS2|8)7A z4Sg4fbdMr#t{9)1mdtl|!k_5UqQ$jT@E47@#5T}Dxqb{CWg&$L&I?uC`IqDrCfdd` z-z=PU(Q;!Lbh6WY)0yEPW)r>iTPpcRN(vn+QP_G0nCxzIC8eKducfsZ+d({pJK=2n zz4%pt(mS(dShM;BDjK_v%Qm0!BxWL_>WKxhTiWlu6RDA;FTUAZIkx#%3$(7 zI5epO3fT0(+YTRBU|3hAvz9>mQfXx(#gZ}8R9S)|w=Pf}JUoH7tqn}YVA}DUwYh}G zQK*HT0v_*W5mW6%`A(@rz>Hj-2Taxgm8ch~Lhf>hyG+3ngUA6F(JvvJqZ=vD2?muM zp7!KX>~BNw;Prw?yn^8^AIjr#UJ4>PjzyY(Y;w+<099s6f>-UMtUFl@RDtkQOOXu( zSfsASj`V%@{QHH;`QwVLg7Ji&zflgFg@HIpS*O3x(z9XP;ckIc2$76_Qv6R)ebk7> zgjGEXC>>Mchpzs7w4crH$nAjXn~erewv_voYK-+ky8vQI*je$dtLXx5ajgM}cx<^` zuo5s(j!PGgg{?C9tAqUy+%ET=z7u+$G*)5A2v-i)Rs;E?WR8$%J`t7J8G9h8-}7mt zT-6>z=m-OUB&j=qwFd(m7o9IORW<(ImZ=+RPPa#yV>CU6paV7A9c;CYH9<14QzBz- zFMomgd90r@QP{)Bn@xiU1rwo%K7BAIGn{`dmi6X{V}gA+bQYu*e)i>WP5Z-ZbLi+O zAB=JD2Gbrb_P#H<8+PcFMYZ5Q0AlYWC6AEVDO8eYgTgZ=Is?ANt9wqk%rBknzVm%jF6;4zRXMjMH71~K2|!i} zaK8m|hwb+%B@@v+*R$Mi_VKt^X}wJAWvI)4(=_jtWA`5gg2}SGr@>t8-aZF58=Vl{ z#Be3_@YNrm+X~mr`TQB`;&bQixfVnoTv0+JEV{(O&N!N(Bb|x>WlkA#2Rc2e1Ow^u zD+~Mc9f+C-;&5IHF>EiCDtqdA>;3zrpoi?YP$Q@y5W^lS(ySakvxcC#jrNZe6a0f*fgGTnFy) z&_%Rr(>1xaIczVADl##05g~^32=u%6DEX ziVF3nD`p!f1(u%}jaZ)QoGzt8Qm$DaIOi=*6OAN9uU2%#*kwZse`(;6ugx=jJoqQT z(PF+8t323--<#<|&tbZ()qQ^2|*UB?Zc6rl8bu6er zZENEMUCOS8*651A5y>*IA9KuzwwW3>p4`Dc=)EoYIyg<9s0XfTs$p5QO(od0L_Y0J zHtJujo|?mM#OXuvo!dz2a#~QwEz;P+i;8HqUQsWIYhpkS%R+46Ov>J#toWZi7C{xQ zK{@G~?xtk|xKRQws6xtYDbj&|MTze0z8kyI)Eb@=92_P%O_~?{b+Co^C2VMPB`I!o z(-du)F9#I#E7EEQbfs^;zNQr9M~iOUp|@lXN(^J!8U7scy4S!C+T>t;|5{Bz8FZRpNEg(sHw;cAD4w>Ywsa zU2G}QD_;c&2zGPoM@iw|M7)=;!9UTX@pkxc`6cHihXgL1+iM;8SJeg|@)ykwOpZq$ zmh_=)EoR{pRrKll;KoHJqk0I|mnTZ6)UKYxp^f^XeF)HWh#2E>ZXeWmsy`0yn~-yu0hQ zq8oWcF4ppr~lcL0MZfh#$+=XCPh41KQx7Y4NN|r zOqMWGO2e;3rJxZG5 ztt-YMie`G;OVJ5QLWvXxQG5mYYY4Y3tr)xODd@Jf|M%?9L8{BPlKgd-f4s1@XXT&I znI25umU<|zCtJW>=L((FdPTY+28{2!h4*r`1poRQS!kj^2`d5wc z7Ixm2h5Worffhjp6a&6mKMkBIhC<2lkg0T$qhGfH&l+W0Y*<*(NB(ZoR4L;5_o&#d zV^G0IptG&a+A~`KS|%`wJ4$)}Jr8<0w6XCcR!UuHdCxp}AYFCOwE0Hk>qa z$2EqR%uo=sx8D^2)2Z#IzF?MDsRp%){qimH@n&G?QgB&7c%n7D>%SmkvdewSl&r@| zFFM5`0(=K=dP)c#1V6 zFuYhX_3p)??))iZ61%thhH4FKIFtXTe$D@`e#mAxgt<3O$a3~zT9D~orVXI0Vs-xzJD`PFn16yXkMEccmQ zKA&ye?(A7Sha785=<&~(_Yi?io|4iVnM$S{G0}8sF&q}l7HzkECw5k_(r8dQ;siDS zzZvE~RJ%?MbxjfG@8(DSEqkD9^^bcE(XXNrMv84)bFc3}6&XF+diIF5wMRhQbm+Z0 z;6!7drdQnsjQJD6WL&_%t3!XyFE26MO#Hyf83qSAOC6~r3TNYhT zT`q4=9rU^?6bKhM6nrn436ZOc6j;T*6<##FxN8ExLp|vLNfD)?B6GrW(Uwl3{$RC;{XCz}A`-rIvn{lfTlSYzac&fgE#q}38 zyd|?GzLk4!%Z!C}aN%W!RZPVBdDE)eGVd?}-X&vuqr`04b`?OM4Jl$K#1Mcmp}yt* z2WRct7wbl&Ykm87*prSw9x%8!t)L0}5IWWl;JIMT+atSwa@R9nm&)*$AdomLL}tgL zFXvpznH6l%(-sGg+Q0)~i8-}(9wha)fV7Gnkkm&o zc2^o>4O`ZHck5H+t?&ix-wmfcQHJFF4p^&-(Q4eOX9SMI{oq<%o8(I`L)GuZt^(h9 z{*o8rz6)Y4=D4L}Bx8p8rXQN!L+J;^G(tseyd>w-it#Lt24~k&QYE(O;PA56;Fo!s z?a5&fome#reCGiJ(#o|fp4?n9ZT*aEkw#iQ_iYxTb&aa(hE}e^-O;Gn;LepP{Oe-v zUqbViYQ4cW5nYRr#bq$HH7U0{UluJ4Zc26quHXHqLjX-gNkyv+&s8X1p3vZ2-ndSg zy9rIq-1J<3@}-*BTYv;;9W!|Y^9XFrqxukWD7#saE4a~{cP}B6 z8uGD`dEqsvYd^65*+ig#Ce%C$+86Y4WIyAS+YVNbAFFYM7cqjVqBxHQa)1grftxZx zAl)wZ3{L|v zTXCi7m^sm{kd)F1TV^l5S9cI;2v%;b>OD5DB0TP*FPXQ-_<~MkmD$FVMfMfoq{>uX zx=zKt40Wo;Z<=c7r$b|IE`%o2ezDjxcn7DZlBMc?zMzk85IJYRQv+#rStK)9ZmQ=& zyv@f+9s4aOCy9sl_fVLz4b3tIC36`tgJXT&%+L$v#VYRakiiW9b^PT^FC5@}*0G_n=! z;CmG(O#C!0Cdt~6TsJMQ2=M=lxl3&4sYu$ts4CCf!TLnt`p_hYlRho%06~mtyq&h2g*T9LxJ7Cs($p-2J2qIx|VzC~k4SjO@3L0FC3op<0`p#W6}{bK@n z);i;j0yj=U-iVmf&ORukly~kCAJ$?Z-4JxpwLMNA<7iq1zzN5&@Xo0UHAisrsC5q;W(S=nLO@8=2&qG_8{{@wR zz8B3yRfa7=5Sw|~EkNH&K@WNzg=vybXJd2cRe(q2=Cx!lFF3^^sqyv9L5gMRurVcN z*NURuI`_z8(OF3B^PHlK24=uMbse*cr`I1ir+P1~UBA3oPs>rx?o9ujB`i@YJv-g| zk``Jn)Eos8vi;SVh+XXvbc4l8Xk#o~7%iE19i~_zz`mQh-upUuSLCDX*Rk>SdDkh` z+h6b22?N-(q%rU1mNOh<#jZn}p$J;rJ4t|yuVl@e)cYmdaX zFii$IdfE2Akgq~CUoOLtxQ>u>1=WI>%3()*@Iz=4;2Cu8v(u8*!&DM`a9~yR29(e- z?o!vD9AR*<fn+j1E0UiD(Y#Qz zu+LZ@`Vky@S>A0$7+db4n!{_OYXUbpUnx5@m?01}$M7ULR|PUWuI^lN9@=4H6QgP{ zpU^wrO%XWRJv>1~e=2zXH!1{Az(;~W*miLBF|2naJRTe8PlL4Vfhl91?H83%a9)zy z%@RBFZgu1hxb;L7YTmT%uv?6geezH}Oj7Vt5J^K1xqs5%8?D>Pk^cp^0bHGk@?3@M zURUr0py?Bn zlkZkES+R4_6`XFEKk#TH&`r@6YJciB2CsJVP-IoWTk5@&x558ZT0#O)Rz?8|8(28? zZpO8eksR;wZggAcMX_snsI82*w796sE!Uk6jGIbN-Ad>vffn-PMWrgLpfe%GWBxfT z8^3C-Gt8Zg3ZKH&>N2vc@kekFfVkH2@~DXU`$>ok3}}~i8M;uw&72j(HHADd1mlLw zn~hCKPpHNbZSGO3Gk)rVIbz@25xK82ts=jEh7RiNsZQS4 z<(6`VXg%@;myjt{xFNKDYrlKd@=*w(mam!+D(#))yCjXO7^0QlbK8}lcl*do`q znHTv(X1Hu=fQi6#MFTH#b8?r6k5yh~rbI3nEX`m*Wi|C&&NAP0q`pJ9svQ_u4ukwR z2QPMs$pfD#yI^}#nP)jdH*iS}8rK8qsr;zb3ESS#zKZl%xP(opbI4K!Ly;$#Oyu$UsK${T!S1w zGd}FQ4fb*Q6z#nq6YM#|VY-dFu6OjN_mivVlNL_ItAqsE8K8ssh9+b;ZBW8j5Uypq z!R?ZBg4EO*G#z;HOQqxReI^*l+z+-ms98l@&e;{}mVSz8f1h}G*02C}<$dv+h_e?- zLREYfE#=@Wjx7}iX80;fK-eh~!S6`s$IUFIP$$f~m`LzD8-!i6ftCAP@FyaU5Eguf;Ja*X{euiGZ76_ivl zO?)bhu#KI}{kwR@HQGnbStO>zP7L|1ju%KZb_by$YC z!6bO1&R0VjbIKRb=z#e0z&FNgpo#iLw4i}xSWCvBnmx;e*I#q|))&ZTn&1T&=AvJZ;(*Nm%F6{a~}gPR5~S(H5zY`!zo2 z%;0TYjhFB8o~I{D%I|9wuZ#R%B^LA!kI%Yibj;e|&I_MLWcSI~R40@|7ol%w^M;Nq zPKBrUK=<9>F~A_sBY95}>eiztnfW8p9J@eLmcC_9lw@Y^91l&PMz}yOpO2Hpi+EdU zi0o$ecAVJ0I)7IH-~|OU$hn=f_VhMErEb+2+PC@mguhF7=~}Q{C243+zZ~O`68_DL zZl(DKP@obJ!J*Toz#B?>8WZWF=j$jg)<<5pqx2-x7U!xYf)nG5|iMfhSqFCAsCtbbb-KoQns!h$X9sxt4;dI6LD6_EOR z4`7YKeZ=DVIcZ5eH)5h=1rMnbQ zW;QwBrb~8D*m^GNS4{B9HyL}V*bf{?f>$}c^3@}ed_UThHO7o+6K;z+j*i&y@rwKe zrN_v08&R){5lepIj0UX8Zte!Kd9pmZ35#e?AV(sz<_`v4E~NI)m_17=WU9a=rqHv6g)&?j@$}<05rU; z*3jXGxP1{B3^yCQ^ZIB6sF9sQ=V4e$;)ue7qjDk5!!D@@zhvyXGTl zXB@LYO4I}M6S{!KYce|+SN8m!2{^(^%g;Gdd=S5b$L}?VR(ZQ2EC)GzAN#AD3KKM4 zppqiK;Vky!lMGKyTYC?_d>;gxNCvR|Mk73YZCCf@95NuCWXd-xLn0MVQ8oPqR-q(F{+eIh0t$1fNUH?<;^!@Pr-a) z!rCx)PH%o%yR!3QTvMb8y}17>^_z;1M}BY!1V-NgEHIw1h$w5o-c=TE|9#4o;jH4? zldYg*#y;8RVAS@-bww*xwFGx_i&T{BpECUfz`7Up7IJtB8;64`lOH(KSBJ`_QGoeO ze1?ON&ZQB&zz3TCJ;<@ZuydeJ^$zoL>d~EtS&L}6EJm@EVZL5~#6gNeO)~FZf-8P@ zr&6=y1IsVU6a~KW4r7Iig4bqz&g30RL?4qXd|>-Vt&ERYhIp#9SVls0Dm^o-v+Plb z)z`pu^bin3>45MSXMVwJj*=xSF2|bxU8))=Mvm2?Cd?MfqnuA8gXNG4^kNJT7d$Gi z6ypP@wNpSp9%Fo5NSS(-o8FFsX?Sbn4x; z-(gm7(@svPhX|TGUXLeEkc1+4U62yr25z7G!So%-L}zxC?<d@0cl}AQ0c$DP?vcv7j&iX=GLWy zEeD!l{dA7vQWw>rS z&?;|Hj-wqm0WUW1GQ{fy1;vfMe~;74EP?Z$MlldC(6$kxiUfYfAcrr_byE~Zx zz5!S{nx_Jd%hlqMNj7N2O&-1YsX|AwTOavSLaVO4gXyz|I5c2zzdaERup?DqH&1$N zqixnos?=l^wXt-8#UKQ-7ET0*tpf5ULnMOO&rL`9o~#Yqy+83RHzo?5FQ(W2VM8}* zOyvnE$U^gPbKnSFF4E}Sga?AXN*?%iQz)4rl$i_?;z!t zVjx2dI)B`m>1_h+zh&icl9bi^g}18pSQc zxPJ1sf7szT)~XAR(a1&+HhXX}NbO~3XsP`#>{HsT+BTQ2n-KEa;LQ$UJU}w|x5U$o zqpfjV$3;uWCE^j88F_d%PJ(3PgOtT~s45h?8TLo;|Kl9faoggty$q|+wauWW&ss|( z-s#Pe|GvJscx=x{P*;Ma-@v&|T!ULLPF-jGM!E+m$C;UX3lqjZFzJ^LQ+HIRZWKPS zxw|af6vr*+tpXHUfCez--9dPj)x)davQN!j?V(Aw927Y}^;_Eyiv05N;#WHm^Z*j4 z^22}Fla*ExSv}>bZ;wC9@3WMbR0D_uc0ge(_FnYrorPec!=QGuLRVE1PQ^dikF%+d zd}ibTm)n)mde(Lut2k&QONuHU0t#8<#r!d&V?08p_UmCz8;bF@jxbTPh z!u=D~lCS!Pf-G>7jY9*Ymij~V4_kl#Y9Hcap#~XUpYK*tjXm_W-n_#mr&qkO!ad$A zJK$v$D7LP~PZ;;IDobu})Yt;-Ol0=SfNd?`3f^f@A{5lHzcxL;eiKvROZ~dvfyC&^$ts%alypR4veEh034SsP0lUH zB{nkNSDn6-Wwr5A4B+YuUXCjA>E+0(pO`I(b1%6Rf%Qebz4r;`Xmt1!u!-b82tsStrwLWzVf&Rk7kyq1R@n zx_)bC>F&yrE&zgb>0B$@V9`sBKF*Kd%K%LSahVD5CdEOG;@XbSVkvmD3F^{j7P8-o z?CalN^}uz;&S+icwxefd-6AO}+6run06#AEx(iCXpY@dr7=a^)B3>~Px)m8FYtvAZ z(0e;b{8dpX!CeeZw9N45z7NYU-vV(%9s3jR!az~OF3U~UnoL^qbvmHTsQI)m;MfQc z*fPR1e9L_>LiM}GhG^sA3u)d`3@pyUZ^jj+jy(lvHgvLW=qu`dG8j)5U}tu=)^9Sy zr5^8pE;vLYUu+X{sn60L&VelIogTGhHI-r|#krFAkODQ^QYIqwi_PUKYg73A^m5!- zp`0%))n^=GQte>1-a4;=X%(_N{K$Ml$Gf|M+mOz@Me==hP@~0cr45Yd<*t1vP!L}h z*Wy1UqFHIy&?-5<_$jwm0M=IWii6d`00#U~uB*I-)n_kzWhHU!(6n6J@x;iA8+)_% z(MHfID_PQT7)Rv%BO=#X?B9f~9bm4_@FE%Qd$otKX;s8-x&js)`@WTCwE;x>qs3fa zw#itCSZ7Mb3CDt+76sUJp`Rysdb{RV%{yf7G%htZQ6BrNp|O@%*2-<=52Tpr<_ov zY7=AKV4nAGHV#xe|G+^^=nHGY0e_b^?;LN{bjuI|esnPtAj)B?p-@X&Ctlz<^J^yJZKumeH2e*8=gz-e0A>;F&ovSzUeSq!ux;Egg9Q16ySXXp3 z?uLi(HW_*ky1axP1>{}li@Felf&fqUTpFq_ny(pSlB7BSfJ1#-hX(sPnQtM3YB;2$ z7jmD19fSM8)|+YYBTRCsfMd6>{nm1|q3XaR{t)MPhR{B+z~;8+b~MrB2VW+_W-RuP zF+up`9}Z+A?4*7hAL6Y;=a#I-Y}*5-0G2pUm1FPT@$*%!F7v+y)}L7<_BN9+lANk^ zIekUvfo~nqo%x;(@FYDE_2>*4(oqewr7aPAVJ(2jgAy_tJgVvDy8DQ8Xk*K+sXEEU zYwpXuoB!nnAR$HQ`l{(^5X2`8Q6dk5;`7HjXtc zu-Cu4vTX#~)xAYGO2$S_)Cer=DXufDqQh0G29maNQ%ELq$s`F$_Bt%3M?~yK$;KGa zMTJ&`s6Zx=TP+m?3GTNJ8%a$34b**B5=^2y@K&`#sP1`}r7?{#?=7 z<70h@ZWFRt8Q?2+DA=Ul1hxp&hJWSEk6MYaZh9T4z%!>&ob=8lJv&TmpZ=v7y% z-&ggPoG190QAE~2Sm(bUGX=zYkGH$cA|2It^QckdIq!icVW00LZgcWWrNQMJe0FDm zyus|}x;~DUcI?y30Aiaf$GLQLfrk13mq~xK0`u~Yj_+OLp3}grgDskK^r2?1O72n| z_5I>nQy?`aU%n`Jv@N8uDyligJMb-2U3o?=wga8@V`hH-22e39*1%0g=pmvK?U%h! za|H?kyHk0xLk14#18LgbGqt--(P**yoldB2ly`}@RrL&yXMvrhT~x9-j7{^34T2U}=)t%zMthS0d zQ2$`+skfBqqPn!$r=HL}6`1GHRBZEXoe3RM{EmH#IiRkb01yI7^A>DqX+7A-68F6A zIjnUR{uA1s)rZwM5;_SKF;wC|p{LrQI)$Rgk;u@vg@Nn0?HF}aPsS`Wb~L(%f;%rHpqqhGc8PEVjucOm3r089a(R&Fp!kMfOUg|uKT&P^o$qEtASWTA1!at}r072B zW<}>r?3!J0cQ2CaZb=HTFe#ZO#n9FzO>f9N*cVT&QMrjcP6+{c>BM{YOj)acXLd~o zID$1HhP7uLfC$B-aFYj@eQLUq1R>+0MO7jII1jGa@)V2@v*CMmG=o`~&-7Fuo{**E zuL_OC$CYSqr)T93{Ud+~`8}x%frox4F??v~FD-*|cwZMaY4xC{biZ(Z6S{eMW2VdP z$Q?%4PSjSW!*Fb4>v2n3q%9(vX;Q~_st&{imK|^L@hJ|5_A@@9ak{3N@5F}m;9~8R zY95U04k&N{6?&q{x-#<0n$OCY=cjKQ8iDNmQ28ek=u7WF$^=Afmu7E0^EFgF+R{|L zYNy!vlluerNZK3n>fh1cz7}UpPy;UFfom&QDJI|0=+07N~0{1Pn={Y4MiR;QeO313h^0FADYxbG5GBfalmrie7v)7EmDevV*GvoI5xiQ1(93~_xNi>WPn!c;@bO|N#bIJ?Wkkh-)E1h@#jYUbY1OqTSx@HoK{e}5_<7ye9^2~1W}zF*#j@iBLsHLHfD&11+!}11 zd62hbe7^Y(w?j9te*0ufNZQ_bB-}xEph%H()7imz22QAgKf%_?S|Ad{KDjzcf-Jawv^Oh{TE5m z|Fx+4=_WohnXcRJ#a~}7@=~>x&S8&He<3Lo0DOss8`JQHfPhF1MjxqkUUN5mVK3rs z#~~rHcjtr7Esx@Yxu9XDSGE@~=|wm2J0@jvL5o~;5d1(B*u;$;;nKK{r`*l>4rfn5 zK2;6v9|+v`Mkq!E<450&EIvQqCY~PCKRBQX zmv?&%$&_M!KY56R?JFL|_6dFpc}#x;c>tQmggWlA?Z7qECS7pa6i4(DS|I&eghD2p zC7;Dd()>VA$5pEj839Y%p!aScafj8}@ed+`ItI1~cZQKRa`Ja+k&;uEgm9a!6tPaU z;bf<$f`0@!Fi7KZXrN!kk;qDoqKGP-;vhR*)hA^BK_@r+QKTK7M|sY*;m!)Jwj%Ks ze>!Vkf1Z5%uhd3aqi<;Kt|=pDb}nzz!0&wS$@-=XvcfEh($ zknms_6;G!)#9(fDVBb`*VEmka^b%dVT_FY}xP1kJtejg~Y&B<2HhR-4U|aDe@8D>d;SiZ#ll;}mn|7dkzz5d0 zj7z5{eM`1&5v32*!@}(w2h!qoyC-9rP2PtGs3w<Dp{me52Z!T7)x)qyzbl^pYYS91G<6O48jL(Lv58vKY*)TM)iI&FbS;769&SN? zd)jpcS;v^d$X3g11Hi#%)U@)>L08-s+0|q9Gp>0T*Q|SvRt9xHCTH;Nzs1AUzV(hB zFI)f8BzVs*nG2}_fo)$5{f#FfOfX&t|F_NSqft_`S;#*SRb zt23U_!Lfr{5qmz$buHpQxN-Y$wUy7*x5<@}BsgWMY5t*c5(Fn#41HDRbX(fN(93_4 zeWF9N%wl7{Be3fb+W||mL=j_+SZG%YX7K;Y3*quGZQ``sQsO2d% zaz-XgA_FB)ft;N0ZH3HcphjIynZh4mZv2oN|L1_$YOpX-)hM^L zRfxHD_g-1@LqlU_hJ>`OiLA5UoS|Ysl#%CWxUI9`xiCDyi)U<&Cg@oUk~n z2R9NB!9u&Q=ud68?nE81&CE1W2zBU18APg?7oqarz?? z(Bt5XQTDLVcrUdPPY8F+_sh<-Z4aE#d_P5wc5GSGCeSAtmSsj7#yKRI1-*jqCqxno zKX`j8sdvZi;z%!JG}EA1Q+gdmQR7+kgFS)4n>4<0f?q3^BMVEgovcs`*2In6kWN@R zJI&coR#7&Q#An3L$dK?J^A9F&$;(D={_GfOIdd1)J}xyuk8>y2W4z^wQ;55MXPM;{ zcWUE^?=dW6^j#^+#smqVED{n2mA^9u3 zjWaQfVq%UE7gt$oTIg-jAPB0pwDrlDF}MG!#mm(6ayM%}pT3QgHlQX>=EpP^q@aHg zihSe!suG>;OYNQAuFM@e7`i2)*qRYLCam~x@38ePJ@2e3eChM@L|UQCemvoDH*tY^$wBbpTB+fxwN!;@vSsTtUfIR1e8>+y{4n%?Q_iy&kwqhq-z5=? z1y*&SRxupWZJK0`kM?ksu$ldM1h)T!$#$lyWcuxy_7h3j(4B3 zEth96Fa4s>K34toQP2TXPDn+lXM}XdW)~2uORMBFE~DiA&@W3HdV+0mK94o%Ysq$^bJ1x49<8v{DLHSXrcyomEVka&*tX z!DIu1>3FJ<)Hxw5_xA{z25BN8Ms{XlA&tVvTGZH60XI1sR)8*K-(RtWE29tf%DB%y z4_=j)*%WHirfN=7JytN`M*q~a)tNevz+C1ib}#V0N{iCnx+?pW&I8WlW96%_4***j@@r&e zN3k7tZ$$jmzKJVT#U<{E78~>J>;wt}8tMxWsXYk%J>x+65mVHHLYlxs4L-#( z%(t6~?uX>!D}sU4DdnfLNxS+$JKtU}wp5dm0ozDMaO908?4%Tmyb6d=_mm(nd&$b) zBB6@xPRiuv4JfW4-A)dou6t$R@83n;gPkk}s<&H0jT-uSj4evb;WBA<1)I&G=jG1g zB0T^&0hbx>p4LO$e+wqq!h{ zCwcETqVyQvLOYd(41dQcXtcpCkH&mLfN$WOOOw0-Q(Gq3Nwdcm@Luy7XTIN3lXqCZFRQmsf1Gg zXGx&jv?k#$R^pUkdbf>D05 zJ#GbVFD>=c>yW7jh50k)A|Oz|4ruxNtju=$uZn+IA{z9Zi57kE1)A1>ikziN6y{of zfziTS6b`o6Hz%S;2e1>dKRmx&WK9P=<*->kE&W$&U}pc1Ddg}w5B4B726`eOCqTcc-2m~Q0=Q_9wY(PqbMX>|@gCUcvT^a!h3-!g0+>dA&C zf($M7tPW+!IwfdU0kZ%DY3XHiIq?4axM@2q4g{vKY9a-AvuyYhWG z>yfouQJkHvy8}9n%Ljjx73M-{bR%aKZc!3JltNcX*}!Fe6^9AL#;}&NO7do6#b&&$ z)FZLEN|aJBrtoTS?y>i}Wy~o&81Ydjz46?y`c{&kjD4|QHb(i}c)4%s1vAr&7g{o9 ziTVzD=!KOozHIg>n0mbqq4*%D009+1?NOe@1c#(&6I4&@r_13OxXszuPDY_r;Mc0XK_0vVt%?;jgCcnc>ktLx|qsw2rXZ+6_6P@PcO;JmomgwzN z80&sw$Jr=v$Iw3wtP^;}Q_Gz*n@Y8j5T`nT!P2+S2S8!{-ulZ9nEGSxvrLXmX15Iv z|D2;NTbKH)odvJ&Dvl6ND}PLf8eS%zdHxMq_kf(+(#>8s);3L{>s8Y09I8G^MoH7c znTSi#$o$K}R8h48{sUI;6)>)dEQ|Wci*DLgMW(>4J7P5E2gL7yQw*&h3SS4$U+~2K zdua8p@$Nz1>P-4b0@AdX>i~?U1cJl$&l|f{xvG|Q)rEDO?NRG$8Br#-c-cz@e5gz@ zv4fE~QTk{dtyFfDY9}dM4hyqzV2L{(Cs#HW$!pPmf6BwH$iCn0=-5@yR8{}@$G&^m+R8w{MbN|p-R#>24R&pU=TeR;8#Oq(ZXk`ob$HvmO zpWn50=~hH5lDyqC?`z0700MRkX1X+5_eyDX!0d!iah$d-TLyp0x%4c>x<*&zx7hFK zf6R#`brj13%>>=JinD)vG^|mN#11ibm}**%RT|-j{@2-ALTTuKPNs0~5ZgrEhO3=o z=ZLvxzGX`*NV2YB733Ng3lWdP8$HZl1M#cEN6YTSU+U z3rK9@QtZ+$yNjWMoX@?zfyN>VqTiN@QI&JiSR14xEM-W(JGY6w4v9x4HqLsme@2Wu(6Z$OL9wln2X@0lc8F4!njo#KZ0i}d{8W4{n{M~9r=5~nk zb1W={-q%Y}Z>!!?(@rNY_KIX>J z;a7M$6%Cn#1JEfh&3-f${Cz1OWOpQNj7+vCvE37GJIUXzPn*YR2Qz8t(12a*cg;OQ zlsYf>wnE98NN=i*E4dNui&DKE<5&g5lAC%*>P52@6I-)qlwCRy1>4{bd!6@RmPv)J}#B6B-7w( z8LnbwJ-ElDsP}7c#5ATCH2Za?yMCN&o+GaGPqZA!t(4l0kOq5zsFV2Y^(KLLkhu~Q zku5t>0jS~9NNp=!;!~H;$cnQisPj75tFeI5DpY~8PhiH{X9L4-^ksLIEbc^Q<6&nZ z#r8-0)mkU>dl)@6wxwuQKDo(TgfoD^aJ`&hB~`+s^WdncaN*H zXE0mD5C~Uy4ufRQ!7T=P;1JU0o;O;kwR(D2QBS@IJG1R(Xh!}=93s%L z0zT#I%#I{g!DwRDlNHA6#5X?%9~US^0k8JDWqn59A^3)@Tem&rSvvLL6DFFJ;+)_$ zOtM8$8sP2cozLv$`n)A?V(`aF-CUb-iYnpS!9e~6Ir!EJB`KekuqjkYid;D|S^70);*oIpea=Ongc|I6utjlZ z59SUpottlvxC>(=-uaGufTf~vY8LuF|u-2_*$rhC%EL)~{DBGt)@;L$_=bhvzJ zc0G)D@P{b9{!qh_SSHV8DpHfHU?MW}0`BlV(|l$iKJIK<@UxyM+fBp6ngPL@i5#!6qb^AoyEynmp+dHV|xy}!&%yTV3;_mZFTL|%c0}81XuN{*|q7-&0%}0 zr=^_iOZ7nN;jlWLz~`|NB)a(Hm51MXK=?+^=i+yH0tnX@TNF>kV(s@+$fPMl3YI2f z0qVvE+(9!PSzOyNIvJnQD2?*`+DTehnjbO*3Wp+HlG!s8-%393|BQ!^(0kpbrFS2G z2q9EaTRL9tfYj8C;|UBFRv)e}N1_P)omfh0?fQXq8mK25R`NUScl`v)2_{`e4)9rY9Kfy5DNA z*p;@pf|f&aJw9t~m%ZV0OMaZK{(Fo%+@3uSUsfuT>X?B)#?(22<+NW{#T*hAp zP_5`R6S9g8hN}**FPwb4(rSHGN=D%KA83*hfBW9}ch$+FSj-8u!4ndBLENlXh z!q~^bPyOq$7i6O0bd3GLAGgu2B#bjQtT}VbfTzv;Ri;lmd^`4@q*un%y|r}wE-oFH z=@X;I>Fej7OEA7A$wGV+Cetw{bhH}=YUydzza z!R*w!2Q}Y&{w8nThsOyHH~KjuSlW@;Fu*Up4w*~x-O-rFAoVxdEfUpiy9`cY-vs>c z8e^l;wR4u)5N5vK{pzam*SH0}oKQQZq+J1G_Xa+dv-%u4#K-ii?hzc3ZudI-PiUq# zhwSclDmu%*$mDhJ6P_aMF&S+_7>B+dG4P)`l~;l`X2AIlZzd3tX%_%|6mqny#zcpu zS?;}~T3&eLeq^sa{LxxA0+m9>}-w1y?a0dZ?uqLElpsGlfX$i zVE-9~8YhJe85*{gE*BkUk(j1{$QZ9tVvnW+gezs)c@^siWOnNs(9vpX$fh&Xo^eRW z=UR$~f8$=6iee#&zGf?rgX-_J^f(u-^bAQi8R`Won?tX+kWn-j>B&y{1VLdzez06Q zN%Vz0paAUd9ZKXj4<>p9}%2*ie#3f^zDa~t9GI+V7rdIx2qN z*0aT@`RSUz-uFRhuJnX0cTZ>~z$)Aha@S%~9t^g(+Y9FCyC`6SePTSJF~RgZ;K~YH zOY;a@^wD?S(t(y^NcV&2Ao3)W4cFqvTP<6cRv#jQqWxu;`h7mOXD8 zEcpQZdzNw6Nh0ZDEQx#%^emGGVnHPF6rxO5^#a}U4{$Xm>qZwI9J)Q-_-o*}op;lDgea3qG{U#p&nxvm>Jl0T-?zTV$DdaNZ_v5dfphWB=#yN@~7D z&W=796Fe4Ni&TfVq8;8l4?lEHmo>7aT7B3GMQgK>=#t*(AUKX|t^IlY^qc1l?1tUB zE&t>HWdQnT{V$2MHL`ZZ6CpC6w)Q8FKWn!8dk|YHZnbc8BBQey01-6bFJ2N^VG@0!!a7vF&^HahD$3a!;=ZqFjY^-*OAHPT zMO_iR_d{R)S!siRYc|;?x3;-sY;gkXa>1yvIzQLVoi%pvN1o^8-6CVgv@&N2omQ%s ztuMLAzvK|xf~&CX#BgJ)=?K^{D*XAPo$GCJCL>~Kwq2!m^vE{EjUs5N<`n+;9#Kp> zXzIV5^4G{vr*9^9IrPm*Q)+eFf%N3)^MBU&EN{Lo?_I6&Hikm8&(rM=l$BT{vOkuA zaATuK($*%c>hqPhcnj@E??xEgR0!vca2|hI>BlE%aRKhZ!;tAtiSNwz^fwzJ~c-QZR?en$^t zJq^DiQKQ(*D=BYkzsFtmvgnep@apBw%|6(JUyDK9t=c9?Q|EGKpOIXQTGbkvB9Kjy zt(t=8X`y0!v1Ak`q0HN;uF7$|DgiY8WmajiaQ zEm~K}L%*;dK_&2Y0gdd#tXW*2$mqyFUPkAtq(z}8i^`awe6fK)rS@Dl_ zR~>%g?Nj{TVmXj5SZ5X}5fSgAJ##zdiMY+#zh%w%5crnme~vW}e039hnWK2u(fs+Y zf7JvW%t58}t|HNBq}pcYi$}F6hr1rPv6-7oqqc>bH8)PaX`80RA2UUnC1j#bYlu3^*~ zC6|~fG%*Oy&549l1Vak4O=KtZ?vM7Q_3ruYuN&34VHea$@+B8ME&dUwqBSn%JIl|@ zk{yagMJqAxJ=8T0xBA{gUc49Z7BtVD)^oun>!2sOG^=3gXb`{kZV~%pdR>A4h_|H~ zaN9X8l2dMaXnFbm5Mxwv1$EWQ4TeBFHJ59=^&nG}t~z97j9t@;lk%pa)H3+9EkoyG zXi`f1^G~I3IX8fgZi|M*lY`)-^|TG!fv%6sSb3kzp5RD#16l<#O9qAlFSYp)Or>PU zg_Z9TR)H*z>e&QpckEmr$F#uJ2gguaLxd$==Ai10UUP?jk4<59_gjxcBvTzO`YGq)e$_kL!Gd|zMTJLPt?+`3VUbVPa{={Vgggvc{QJ{`7Hn^{E+WxZe9LQ9!xvS%sfU=U? zr~kYm9D9Z5+027KE0!jah{|Auc;?Pe%|5{x&CcNAs}TkBGwQCC^Y|nibPYFUJ(pPt zKP*WrRrr`^-Yyo0O1Mn~s3hD9(>H-|YGG5GfSk7f(l)4pjZZbrUgNb3JTC;Ykh*u` zl=G4^A!L6ch<9xOFLvMlmp->ckl1rH<69FoG@l05h4tUd7#H)s<>VhM&(|!BOhHpb zrsS*SLn!;eVX!0lCSrNa3y18>L+c<`crYl?;~r)v!9Rml=LC}WBX9nr#KXfR#h21U znr)-!{$ScpzL(Ll36(2!V{pYVGQ9tIZP%BNk88OPZen+5kJd9036H(2l|H9<#wwk= zp4h3~NvE~%I;M9of=m;CxHg@2H(vNxxp8}A*rllP6?KwHDQIFx2H(#f-U(wlxuf>M zuwBf>vrpJ46E%#57uBazy)&<+j;|0U!zwSM|#&AHCd_$F)Taap%m{NNb(^`y)A zxgLT$25Y8YcgwPkQHTZwWh`GadjAVkYjb?0$kQ*-tSR^W5JjvxwP3KJUEdtPeQ8#Eg_R~x9Gs76|aSMIGKe7 z+T01+2UCrN5TpNEJ0ApW9J{-0LYA4yx~1$$+=$ZcQueCL((8`fxt%$*@?5u)cBWq> z@ttk4FVlCSiZ9#Xt4~?HrTji+5erF$xM5@?21n@`?J~3R2fA*!)){e|NQ+_2Zscv2 z)<^|7?3Sb|J6tF`6s5?T;;GZBztsK_oWTXg07E6Vjmge3p6Odvig{5}pE18K{T^OU zwAT27>7)Jq-g9{sj_&v6&#Wu>h`#4Z<_^w9cdu!s#ZN|5PuF=Z@+5)KHj)W-H;9qz z0lu`>mDH17hr8D}BDag#RRuFQEp`8zrd*}mW4*PUY(+GC2;a*I%gR7xM zpMR5aNbq{6T5+b%hAXruD?4V%cQZdK2+m9tl#ln<>VI_aE-p<4;#ZU%LQwZrEfml* z^l-SX=RIjJHSvzGO$?@mVxmd_gOq$bzRqn`O!Lk97wCX#?f3e%I)!o8epBXY>xw^K z+_y|rcGT7e`pr4-Ap;~;L;1cUVY7^@$X;1pd>wQ-H<^dLO7nFQ-JQ3t2qxfZi!a9> zsPbnwCFHE^w-_V{Hx@d!woc2Lt6_9Hw{~oxs%&4AvjaOI_EL+}U}Hdg>L04HcTmU? z*=0>dnfCHr^Ci1MA^BQR!2uyU1dkn2;WF;v@X!8*cB^+6X?C z)YGahC{CC1xp>Rq7#%G&widJ1Kql}hDu>V6Z6}1DN#XjrF<6G5Qn0cwL5w&LG#Wy< zXPK{?5?$B3qX|N2Fm1a@$B*zXQf8e4vd(uTv5^yD)G*J?5Mq!Jc zI(jn$iT=oN{&2Z-nSL)!p-H;?{$u=z;B+(p!1-hZh1i<=Cc&2B&bnT!-K}kfKxRWh z5~VX|qwMoTFN^61Kgx_bM~pRrq}-@)HNDSU_0lM{W@{4dN_QH#=ArX;ll^1SFaCWV|FiGk|MOD2A!mKU)zJR_Z?}-;f=Z`btYt~%5}dPfrxzD?2+9E*U~*R0d(@wo?I1RR4_Za%4i#_zIC zKOu-hbo{AV%w*tuB5#uA^rYZOLBOmxiZ*O-@>uycSMODF+;Fk|eSxJoz3&0u@5-7U z8R3~x+gTN%==DwV{Rop0rl+g{qXFBaik2TVj8bG=v*->)&}G!b3SVuLyMHZk4U7$s(WBB&U_Yp)(I`g}W;DPAs1GR#j1$0|!UMeS&bAzdha8clQOy{OXvRsH&H z89x^AaK#Z1_*wKx zm^v-9Uh(jl=}_|Riit~4@YS|-!f2WVm?m7a-{f-3q*6So{xT0M&*fTF`#FCQD8|%- zwphA~TSjrnarIhN_lR?+gbHL>*DsgLWZfw18sEH=5^EoIHim-DNE5|6U5DOe=9(O= z>mbU(mKpetg!kO@53zWYVLp*VFmC~Pryo{B&LJnz&h>j1&51|QeSJLj^z5DC zajwQ2q54R91`sO;39JpS{yyXJXj3U72UDRRHbYjN!re(=ZvGTYKFJK}L zolKhd4mp4fLb+l^^P~;4m6CQ(fJ(*i^P*UcZD48x9W{iaqaRc^>f6?BP!f?1I zCj)!AXK$MH^RC5br`zA`$&9(FO!;VsV4Ww><(*^hKOB*L-(Wa+o6Y8)t-%TDHcMpy#uq@Khm7(->$1)`xcCopZZKiR2eX^(Q4i`z+{fycXS<0~am7v~Co0oIlSrl*t= zBce3Kty~LS4mRgEdAt*A2t{4GHI^P`+9f-KY_JUQNufBAp1X6{YEiQr%*wv%~T>|fZ5=h?|SC6 zvcu)LGSJqzO05i81r@>YXZ!8?|5LR35UUaV5@;`QTK4ul_bQfdkrxRPlM)*s&eZPJ zLi0EN>`CT7#)in)y`(qd%i8AZG_iOoLg^zK>r|HB6gF>*dlL7yncM}74*8k651k*6 z@|@V@%7({GnT>v_Vsf9XOnWa z4d3vtkxpH^=C*}}erZ!*i+%&P%w?;uYwfH*7vssHWJ3_8^&@h1%B3USvSOc9dum^a zP8B?E`8gucpP$nm4)OcJ&<+1=BlESZ0gNa-`!@LEk0v#?xz?YIR*nlt*y|Qpk&eK$>Z>P=cjnUqY9C*G^Cou*?v4ep}na zKYWDkZIRUn!%K9jq76$75?Z0LFN`J6Ws({HD2$bNruDYR{1B2-k}}^^r}?Q$y>Ut* zo~3gXOu*~+_^9ncz~?CjyHmb_GgqTm#SUps`P5@Der3LEDzEqBcI0Gv(dt0Qsd#y0NU^ zMT$F7+l1UE@VHFEGutp$%=RV%bH;dD@TmZh#O#vpQt~}RaE-+30P=z43+J?NveIAe zhwC7hT)7UZkU*LO(Q6pZF%`L7zoF!EtL!KP~RRB^ZRhgR=KR|h}yJkKflgx(L$ z!D7K}pJ~3}Lr-VBT#i64Z^$zHV$fzE&ng(rwAH<92U!``UTj{xOlrMj**_4wk|w>- zQBFPGoQ$_!HhZ7RkH#dNHP8TVOT713vRzK=nzpG+?`POAL#r^GWHT6QFSYw&rO7VO zHTaLJtUY9sNj!gddnPm20A2jZ84e-)uB>xuaFu=mGJfp(cg2|EP255)>u`Oo5DVC9 z>ldL04qibrL=Ba+e3T6Gnz6ewd77@wTex5>Tu6;=qwmwhW?C7i6}wo{9$>`!S!IQ} ztaG-jUcG%}zSh~5a-oBH9;KLzNM);L4XCONB!%8AogtO@f@&3k)QeaR+~T(q%dv z3}#7{h~Vr~&;ul@K_3Q8XzTLgw$ewL{<9;d|Ka3X`Uc-V`ADhYk>QOq;F}-bR;fzn zN{zLWRLM>aqi2|FW=#?tOua2#qOAU-sUez!$OA=$Rfns81pMOL|7`jy^ual%Xe69H}qVIp#|b>Q~5&ris?*dtZOe^`rpQ1 z1ZdayPrsz6_3x!BlJ3C-wp?anLSm#^JL<|S@^d=VZD#%70Gw)R4);!7v40UdMLPgn zAs=oW#{NO{;6u+lVUj}Ml-}_>3|(R+Ap27e?GnI+-IGJ#-WzbS_hT!#%GTO(z#X?S zpG69l&_xu}NxVN^!(bnB-;YHub{K&MA@x}``Uit+-g7X#s)Ib?H&Dd-*(y_cYDG61 z3FG9OcETvuL!~os9k(dhh)417^Ea^0mEy*)h~J3x-Oq@e2-li3FkCw~X00|rpCe+e|xN-t2H5Ff8potA)e z(OT1t@vwWcuObE33GApyb}y1mut29V)>yMe|NR52Z~4Y#IpQ~KB=@iZnUZDE2=svJ zNfI>)Wu;Ca#aBw(%PG#%We8$eY0-Bx*>ETUjE;&Nm)7Tegt`T0*9w}O&lKmZS(k3q z4FAlcZ=d>OyS*AWZQ}nWOA!^V>L&E~387{Fh3b+IDbZJQTig>p<+_i9I+F;}*ZH<; zJpNRwjpKIY5l|DQ)&faASF$I)e}vy>O!Di#H|41^1K)C=$t;sxqm|sW1^zJCUk?&ifxHqur^=<(?)4zWu6w0Rq`>dfl)$*l)EAIqM!m zEA&L{yHfAcF)lgKzt zW1mFYZtO7hqI2LTul{oo3o7nrJ59NGTnmF>X3dn(UJPgU;=hd8<>g@zo4)YI~y3Ifnb zCT8RqbzY@&deb^9OsicYB@`Pu>eoAKjuDQy&Ffil9qfHh)?_lzU6Qh7t+R}WU7?{C za@?^B?lFN626qCDr$QMBQ|x+gAReumjD@>(Q21EPT3fs3TlLESZkTLu*aJUET3|3E zIH}O=VdVaIG?xiASTl(>b(vyU0&9O|MD`7(PyhVEO6zcCkyQf#G<~;)4Z}(n~!nU`>+;t2`H$hRAk3c*_N9sHWHZMTot7Y>{I{Y zL?!jpCO$C4V^o|D|GTW)#&gft;6(Ep_$e0$QdDa`R$K`TiEV#ONO6}Rjtc&7KjqU% zKs0skj)ZZiY_nB6Qb;Zc%@m!^fz^Y$K*@D7Uiw`P;pgR$$t^55*8X&%j!63Sc)UZmSNO2!8(&k8r?br+?Dte`c8#iD zo6Z;rPWjnAs%QIq^1(b9@lLWTqqfpvOr&_mQ=R8rvFr0C(_g{4!K~d}LtVbGUw)d3Brmx#QM4C0uFVFTmw0rYUT;rE!FAt)X zlaMUOjjLg8hp35#x%%hdkT))ABTj~mzuR)wE@>koBpE)D%sIXCTZiwYMqri(hv;aX32N!$aOBm-VvC;@*4y z0{l7Oteg}*_Rp(_A$lvN^(RHNX2uje>E=l?;m zcrJ;$A8Y%2H8LeMDPKKgpKW$e_BT!a=fZ@5T|#)$n{?rf@+(z&Vx!UvNtQ-2PKn?5 zvd`$X!KeI6nv}jSJf(pbvh_8~W*$b5Z6kdOd(c>V%b|}7DoLB;qTNC}b$<`1^Qd=( zTru1`4V|2+k9edZ29uY&@;h1DzWV!g;z7~0G0%Q?Wl z%R|phM*J|$x|nZ$`5_tQUNmiJDeBomw4mC4yrLI0Ro;VkM4E*Pll8_HDW!#Gn#QV#$vzXvFOKVbxrv*1^n4^kVDlJ^zFEJ|#8F!` z0G~MF{{N8IHMx4@9&pw=VE;Gi?k`iGAV@f#)_0pNC26O|WI^)6?Dz>iH$AsEnL_Z~ zO2LwEPY*gip@Tq*b9V*a@j zilXoKp}Yml0ebt1jx#F}naaHUi~G7?8O%)GeY&jN0~?lkZQU!}W{knz(s?*#cnLoD z+rzGp16|J%rN~UmyQReX?QyEo?Y)LYbNbCN#w&nJvVx8*l5X$Nia2LAo{AtZBPZiS zbyHK&W6@I}gSFBxZq(a{z!A6_SYs3K#n`((xv1GoS2P&E^+0b)&F7#F>r2|M^j{TP zpC(MgE?=FIXJv~s z5)@q>T83;FdP!d#3bO`?Q%l}eWOGQf#YeU(=Ci&5zTk7dmPLLC9h~i(e`GyncPxRM z;pD+y=#MmK9=vP9Z%gn!v8UQIByW^Q7${N9VmR)AXQMSK&%WsOoY3nk9(b&Cdd*g2QogJ|Oo%v{f<<14h;W5Z0qF3v zbuIh80|Y{Zhx9QW5F~!vOIyZ1GwD9w@7??wD_L~r5lZj2rD|t;psYOZuDkcxDlU#9 zqxQYXjTCyokz!MY6i2Aeybv?!3l$e7+6Ko91L6l!qA3{R8TT+PVCb@SlUW_0NmC~& zirkaQOS4W9Q*cBS#n(tvM4dJu^Nn8u4p8 z0x7|sB*#<_y|A7~>j3tw*2>Ctb3;y&&B`0r|DUGWsPPSvB(>3RD%mJl`pmnPe(3OT z_Dp4f1GBZmu<)IJ-sWz&QIq@~9nT}GJUOdJQ>Ln)HExKX{vJNkv*{{MqCCwLuTeeU zrk?Egk}eU5COm7n6q^jkPju`?88m!Sw_f*!-CjYzA=r_A9NaYIcYHOzQ{S9)#+%YPMyS~sO`OG(HYQDWTPA_IHsjW%%>5}A# z(vKC3NnhDt(9e56R+1mhz5u}Un#)f1so!AfzXF$Ojob}7+#(_J0e{%BMgLTdMu|eI zd6vLt<6`gLsbTE&#<;CZpJy~5^m~`y_qO9@R#_F1iIki0N6MZ800GkzC~pwcY^Lsn zAY1V?&~vFU7yPSq!?_R*MrsZw@Ce;iZiajc@Ia9Qv-QI(#{3h_G}A7j=WjgA#GPrk z&D2o}rUjqby6$v$FsU?U%kC*fjfHBz?;X8I@4AZaHTuG#5oniZ7kel$79vq1u&txewH49rQc43!Tji~gOazjU_ub7B z)+q(rjmVK0sHH+HLexMekj$i(r6@5VA_Ous=aiT57Lq_h67qf@_ZX-Dc63nVWafE( zzwh_+c|*gZOR55;nh0C|Q14oPqzy^z*ygcSNGg=my_R=qDhen`Q(!KM_vUg5c+77PoL2)EE-+Dy_COuGSn;8O`;_5n)Om5B zaLcP)bX}D9L&a~1#%x0JO(rK51nRYF!{cjUun2h$6C{4z4PjN za%|3B+5Xp7BQ{$f=3H9A@fn2%lJK0GD`^`uxH7TR*{zW?=VEhg3m~E)&@F z2kK&-cLtczE~2(mL`iF+MiA zn-d%pj2)q?Db89qIhTkLCW5`%B9a7#2;&pjUXiI-HygL0Ku5UPozc1q1>ohBd_t{A zHkNbZ^Sfvs6O<(?SBa1-fuCNZ)Bv~Al%kuvik5~JEL(00^U&^|R;XjQ=h4;OWcZc2gG7OAT?`Bz>k!FDJGhGyOaZXwLIxb&Fdr1VG$83~XqdXq zs!PLz)1}>%oea#S=#n3Ptxy+OzfN{Z5Q$#)!KoTPpX0^^qD#!b^c*}AP$L;C=CC9}`4WK1D>EanrqRqbE4nAOKq1PmLfEQX&MZ;~m0pkIp!OISz&B8CBt zJh9w2yttT{aIFOnL(yDm;h6Fp<Brw`^{lu-T}=-$8O~{T)VyezdOnLk_G2uhz@n zp?VXALJQ!!1>MD|MLp?EE86DYDui3ZcxV#$_mjp$_=lfzpy2X=$hsgcINC67pKjOAlWj}u0(%W^a67{gP z50NPn^iK5l#jW+1Q1psT0(g<4daoXzX%hl#H%JRgI?=mzw$nE04atO$R2E*RSaJ0% zM{*+A^Spnd+Be#*{L%@CFca>vr@t-N+1g382ombZ_#+YNcCEPN zp$}s#S!E;EB!IVL#`EVzMI2Xu4n8{ z;6=}n)GS;6upm{iDC)+Zj%kPL2buE4X{eB2K^3#wV%=%|rJ11GHhgyG9pI9gukZ?< zKP4uB_Irmd#VlFQyo z=qT*`4A-!msu(GhTw49Z5HVgRfWJks1_(+ub|NUlNGCf#u7u#^<`+LESh2 z)6zIQkLJ^mpG4=P)W<2!zA%lek74M}r&6ZSMvX2G)O=kl?T~L8sCJD;#5XfwyZr20A?00<++rZN*+az#^0^ekIY}LbuZ@g9R5FvOu^*_*Vdc@P+o{c z3fN2}J43&OJhIc%%bw{EP7x{!vD2+1s!&3l9g1%k*mTZsebD`ba*(1VeyJ6Yna5nc z*`FiW6|^>`MmK0$NBWt<1utbW403QpMEbFx{^&lE(QG-n1KopWU&_OP5KCYC>^McV9Q{g|y{APFKMawwIi0;HXal{rXU3%2;7oA2{jUG2 zU+W-msso%SCs7`D>!BrJsg?f8YCB|TdHq(()%^Xdl)9r#%EL!xNL_`uP?#4`%cDFV9A7iN7YGd%L+|$k9=>BTX@LWzafwl^0M?6$3!CJA@o}h*= zlX;hHt2v>W0q59-QS?^Wcn;vsiC>6=kqmQE%F9Lf$T9IL@Z_K^J!h1OLK#?9J*EX(U0%NG4Kx%6`y|2c(}-P9+yl`Ea3I&B#O1IeP#zIv8(&#>$V zwX+Y*rNFnl>;#`O**?E>^yLlTiyg}gHLDM-Bc@d&C^UKNxRL4=aD2xx-t?vv&J~t2 z(Q-4tbEv-QV!(j5o#7|V1vq60$AkA*&QDL(@vJBEG@l;}eN3|J^L4d;V~2poKU%gc zdINd@?p^u(q=?jElFbzY^; zY92b9A>(+g_6!K9FsL*Rp*%0Z!9(1}hqqo<_^T+Gh#+szmLvmZM#xF(P+g`qh%7HeB`$MEN;nDwqalS)Hr*yEp z37JrJ2-ST(t))kJfAqgvp1xf2fC_$S%J zQ~rOi-4m*S8h5l#)gU-3(zK@C_^$$#!fd-~AqvaZPY4H{n3>ob8=I{{D^3n04HXI3 zR%`&|89oESN?wP6LZL>&fiRg$^9?+?eA{e&b~|UJs8XC{YY><4j>G;LS*lcuR0RsJ z`~sijRLzCnW|#qd>On#oduMzygGk33DyEfGCS8H$^rhfIyoyXw!NH7UPYAMb5vt@h zckI6iUs$p=o(@#_i06H&AjPUWhDn>}R`M#+fZ|4qEy>kl0X>22WU4=S4tl&?mfwI>Zt z_k;5f3qt15Dj@2K5@m5|#$#X`yjwfu$>SZ zxKu-5nyZ<Mb7m_>^JTs9j25M;KJ+U*NNwg0~?0fL)82tkaCj#3gFS)nks`a4WHSm zQAuyxPAjYB{d-KW#=ob$+bKaP@a+Mz%&h)uZANz~IsYQ)y(kB7&9vFtWUUjBzMcQj=KM;Aw_DK1^ zY>~pWYkW@y$(cOXV9l&au|E7-JR%A7%Msy3BT+4r-N+Vr(eAgw*cXIDLNnL{q-P*q z6>TFAZ&>-I&|g8XB_Rl3Y*stsqcs&$THUD-t3C9okjuTAYLAr-htDRyhDxS&{;&v$B( zgB*+!LX|`F!kSDOClE%RBD@2OVTTrjihp+VdVsoMEsNT4tttN6A}H_pBp+qV-raBKnHw%f zc88<)bB#tU3$*D}70`>z?+MG(fU++b_)BO-lNkCHmo#&cNzq}=w2xDUbGFo1w$wc! z(+F!iXU`BA4{-sTi>VACB+md93}zd9k!~5=(6KirFJpp~r3vH+;AulsSm<8EgFjfLxQQ{P9%*S zM3V2O83fozGWVN#q1hKDYQvp?3Le0Oo+`-QbwZL@9%9(f_62xAfGz*?aCC1Z&6faX z5=#9$Q0LtS{6VmBVcE(qt~m-qDvRTYH5-~OgFp9NHr7-ttC84Ku~s4Vo&@}Ie!DZ? zq!uSmXUgxN6BR8fpw{4+1%cf7)|vYxT+`2-CpqaUn(6{L`L!&ae(3OL09>(s%0YhF z$>;~xAo4Y(p#7t}jc~T)IL-gZ(ANGCD~AA03uwqY!ngGfr5CKvhqGG=%h#a(L{2yv zJJV@)81X~N2aD=n)9O$g#hDB-ZAW}08TY`M=;(i}5lNn}hBQ#ARb69#i=&>~+R@DO zbKn%_{ujGB6LDsBN~=C^2$>v{`CiMNFuVIV>8+8iI-f;F-Dg!BZ=>q7w$Ok0bT}KH z(R@;Pwl8hG6+o~%b=`cfA5er6gwWjIFfL=`J8IBi?>l`zF9%PJhz@&EfBYzIXyf)% z`>rh)5PiSu5hIRYN6WYmZcLanQ8J=sy=J<_ZRhVkpru`Rz`} zKQtiSGGu-F`%@R}B&s;0QCNm^p4xpO^oP{o{hTsA4xKG@GkkBhHD6UV3|IJqD0u?~ zn$GG!>SJd}!8J4S=OMzHRMgo4v;T`QuM`PW6>>E|*wc z3ivQZ3301E!b=V*;T~7U#87_@?>=}Qs6igni#2?m!FVVes>^KtW_wS}Vo^6h+Ack` zHZ8|Yh)pI1AVE# z6eu?y5ETGFQ@`sDQei*4TM={qAEtT~b;ri${DTE{tZ|2{xetIpoSioNQCe>L=UaA~ZyR8@5Bf*~mRpfWE@?(U z8ZG{s{0-$0-)Yddth~)Cd2lZUP-(ZnO`P83@i~0U#zuAj^6KW8KLeGxUX_&rTEJqo zFOf>5a)ap`}3q4K?T(*4klf1KOdyF&~)L-yRt4 zxj0^ToLWT|cOJlcSE7ifi$)wqtXgKj7;v0)79lzhXUmTarnf!o5w9r>EsJma-jOOm z-Lo+rxHJpW=5ZEU#oq&(1aZjv(TR(c*6tX6yXy40z8m@s0RLp%m-I^9LeC*5-f zo{%PAgz~$8Ip2E|>cN*Oi?tp0<{Pp(ViTD|KhO!^&tjMNpIUjCQ|K2}u(9U3cV#J- zfm~rFrISvfXlz(WabHO82bi-)*fYM>V{4}_gLhb3uKU#~^ah@gMom-sj)DbsJV0!K zAm&wGdBuZH1}@1aeFXo(Jb#>u^vu-~D&(Nd7QlCUsQDdTN~ibeHSB0wmcmf&yfW-t zf7uh_b>Cq7-a($|IoiM4(4AOWjGMa6;o_zxCLFmyV!&#o`py5Gl$X2 z?8i;XpPDmsG*c?HYDXawP35xI})|QCIdH%B)KZStSMV*MG_AG zqCd@*OXx$T*-b08`f*p=haGtwtvf?bB=WO}qlKqHVr@)!IB9pC?_iAEnaqi>LGR9s$p zoLWt0D?pk_im5Ca7DSMZUSm?R zHjDuPl1H!IXJG)&hwQWfQj~Z-i|H33oYvhTMTj>#K5&Y(EeEqM{c=mmc-q}=<&`22 z$T+PV6V?NiiKfY&dwkvOwVpbypZ@$h$Mp{A z3YmW^-2MUyC+6^xz&2m|am1k09A&wUMqDdV=VkQeM=^?AacO@*>y%hwXPNjtmIc>0K-a|8GFsw>&6xH*fo?Gyhzx#vGGKkdEz zFks_F{ZH!Clm8U;!=s@;QuCS+#49WlkE=7X=2zDA{VIuR`>c;U7_5IYj zukA@UCc*dp2j{QVEY210lXbrV8us88g)qI3v7U5XAls{n^f&8I!&(pr&nMsXL+n0` zIs1dTEANj`_KJNYxJwq9ii=>lY{0dy-O~yd;TX>Qy&k(2 zsk-sg#*gXH(+k~ty=zbVo5%-Y4ygZ(U#CW?{Xm97 zS&7nqnQ{5JaGf`V3DW1At|v0z@uz^R3u(siD*xH(qCn_gnPZJr;-i`x~4 zhaZ6RhnHm9_-$F?T2IQclHa}pU=IM;1=zcMB<655V{<|GssiA5`M&n!jOTRDPJg!B zs(nFsLyCeg;EYP~LMtbrh|Mg;CHEo(QZ2DanDD@M zI+wT!*UU7}wgIu0URr5;XmRziuP8qW{HcS@*h>47Uy%g86*JPBkQ~b?vFwG|d_AVK zaC-db``X8g6GYqxHNj!Du}t_b&|?f%BHf*2Z#^BKzI_6+1ZRAG8#AlVNzc2YjNWPD z1~NB3K75NqHq0IyCZozhKVA~uicx&{F?R+qurLCwoYCD|b4ItQTODP&%C2WKK>Fo8 zefLF~0yct|&QL=$DsC?6&?t3Bh?~qnIAnX%RtWo}f&*JmOM@-GpZUZY`G`9+_Bx## zbQu@5d7nxIT%WToLJevFcP3F(bU25pi3RT%8OjcPt&bu=7yGst?T_W$vMiK~El>Um z7Kvm*!DB+KQ>61Wt_%*j#u0z*o5affwiRaKO5d|nopcg@$Qx%_yEww(5Ei@YVWnd? zmsU<;cl8mvPgu@KAb1liVHS_+Kay0Sl?$ z?>8;CXEV*JRvIAg=D0>ZK^ZX#lJT6w`O8}U)KC&qC<5jM<{(jl)>hd7zpbNMIU>`Y z()0%!zsm})f*lDJ9v~~!0exfC%Vtg!AsgPBF5AH>z`aZ$0%EG)NEkh$QIbkaf)=w*y;a7sj|8i@$c&>y3`tzj9aNenfc zyBV`Zgw+01-C+y(K%Ug~2UEQX?BX~cc>J=&mI}66Q5}WdDPh))88mQBN>d_hpQwC* z9Aiopou5p8iINduj&NAq!_MX%x5hbU`BY@^qwRvp;A6E${O11kVadwFLJ)gIwwVhx z>eggYs4jJG6@;B;@$Q78v> zfSf`%>#}E>RS<6jsI3MeC%W~+*EDWSs%-nHA+$CVajmBonn?XDXejB6NZF1uqE*$- z;vcesKE_5gqglSwpXv5!q8dzp3jLXG7$Y#Z3LSrw! z9SL~i*a^n`2p&0D2w*N={6B{APS9<;!46%g`}q1UFc8(p<*f``lH>zgaNp9L;)CWr zYkqYnBQiq7x(RG%*U_D^zryDj>{W>dAM_^w7?R(}`CIZRXw zh5W@9cb9qd3+E{xNvvUEj#`@`3S>RIap#P6xZcvj-?N?vN9|w#ZBmQ1&NOTRZ`{LJ zA1|{mw1(eMJJv0Pf!g6J361gOQRAp&TPi_8H@qMok!YL}5_9pY{gd2)P&{TGuX5I# zQp)*4+d?xT&gpAA-pe^AF5h10I2hVI7^t^q&8;83`M{{D{dnnB>;!z_Zcf0k;QND> zxtW}-M9kM$hBU}OgKA9)_`Z^zA+uN3$4*9khS9F9^a&25(G#E$g+~F1isein4pZMz z<7=dyt6n|LAd`>|eRyLPd=}hPb&o4$O%tObK&m?7M{XKaU`0(XC$4#QFCW?3bK;#f~o2jNKB_ zYjk@#CnL!RkUXY2u}0rPt4yM*%w0%|#rllpYv99Ph>zp>-qLO!myi9UeyUVNJa84< z5()*q;=dLYwu~VB~fFc#077+F;ydnY_zq$#sdao693yNwL$|_(h>*2m(PoA-{ z!HZ)@CgmlT+s0^Vy+;KEHh5eOGm?~tADo>L-g=giJIpWd@10sb3&akANvTg@PwHCbS#xabv^jwEF0f-^4Sw(Z{<`G8vVm;Rmbbe|nSYFSe~9@U z%%u5LkvV1iE25>7WxGA#7@M7kr-=X1i&^Z)SeRhbF!_yLCfNsejUqC@KBwr|H939~ z6E4?qOeh{n_o`jbHYS+IFcclYh)3-+6i>>gSP3 z7#^@>17Ei;ZbjtLLzDO4e?$36ti5MGVL~EsZ{K0n#XHuMxk><?>nAxYPZLt0|?e?a~A!u70- zzQ5aOHjEW6u_;^oIHt#rmZ@*CTT@l@u9ZH0ROI?Q5?R{Ky70OQy~Q5wUZL~c2271+ z@Iiuma~+IFz1y##sv9S$pZM)PVI8*f?d0mMj;kSms9pj0Xa+govc19E(|Q|4fbseZ z<8{^+l&=H2k?bX*i%fUcS@f zxJ3@>zr#0#hHEt)fUq?_G2WuwX0v`&opx>swwLcb4I6vqERPtJD|&L|BQn^-ntC;G zvgQHMi#UdMZ$+;V`1sbEvb6i};`JwQY3UfG=}u$nKR}K~h_~@%FksY;z2!-0&|Co^ zWk3kdX;*APoDb4T{80oz71J2t6>>9v@wz$AVUHJrWqi)vx|5_w*+%QO+YPt*GnAb^ zKxzcW=vzv9{xNC?lN7FS+XL4NwSiiUh!|Qob$FY7+prQrZrM0V4zh}pBeUg03}P3s zC>+iG`~<$n=WpTk54A}btsR$0+P9Y+{AtlBKY0V`jb2wU`Vmz zjS;|VmLCBEVmm&yJ<(}cIXQ$+8zKYVsg{;GvTzd!#wNS@SCk~=_DJ^#r*k}Ep-kd z8VE&O1A0Do-APJjU*ZpAeAC(|LZ!3TH-_FaKPA_Yl}FsK%s$uS9@rV6Jnnuv{N-Ul zv2`!`8Hl@Fa_?OllthSXg1=kKf+eLzN*O>wccbODn;+!|SvFPPeUjM6bg;kO5jCaF zYJ#+gd=9uq2FY!~SM{8ULV5r4FwEkTP(2n@yBni0>+~XWc4eyYuq=`%#}0s0Gv|zJ zZ0ZX+zdK^coHc~$=WW)O)}dkS;g^o-RSZdz0@WF!RI=RU4J%-wNQ1TYbm^q4!y1D` zsAk~|TLZxBj}qcVo!-itVl%hR$_gCk=Bfczi;|OFRJ2;71KO)c*cDEumCuKH4Z0`X?O~?j9`S=e=u|}&kM4+AX-zywdLnorM zc8RpBBi83-Lj_+10_~08?OTE~r#`f^JMg>D9!n>kB!JaLBN~DYdN;*zd#;YBWA^4B zYg0-qY#aU@~Y6lLe%ZOhAzI^O6psdqFc#VhXd<^Y)9@t>0N1l4;zu zvVEH51l{Au*^~z^UXFQJ+9rKSi$u z5_Q|}YCfpYB!Z&EMO0u78{g?&YO1v~)Lgy|5F@7PyU@=k-*bdhjEFqoWeR7U{U)LE`tI=ALbZjk`A9 zVcZiZ`ps%U!O~a**YgN-t?GcljG>8IFOvBIH zX@^x`AB7G^8{*ba?^-cWcRtOFY@=;WcaJbt-auGlzxCBwuq*mxZgR5$ech59P5o>< z`ld|n1Bs{m_YY5}bA6F>7^tXrM5cmpKo?c&`dw;iFpsCI2(`I|e$4QrW~~eXaEB!F z&--6Lj9>GpzUzzTA1`nL)GanYA_Jg9Sa*GR=)$l z+vCXBIQzXlIU2x%KPi_xy*sbQ&2Q6HLe*!?8rNF;GXcfX8T1jB2}?FmnUz;X$L}eq z2Ln;`Cjj2mF!LqWWiGJag8cZ8LGXfFeGBf+>= zS2Y_4vLv}XjPn|g6&a+tCB4~1F7$EQ&**xCcAvL-Wr!uJ)K=B(O6NAO#VF6!TB8p1 zijU9jNiR{_YKJTLa~6Fw=piC9KNtS!Zs^5Ea=qBT5jHmOyB>JcuMxBRcu4xN{py=P zl5P#b>F(~m;-cZY5q2?2^6<4i7f|5%JJrrD2#9u>3}K=!5ZW|LOJ!~Q4%j3_s5a-i zX#O@=b10|RFG-(!`h+nK&mCx5j$aRixyY;BH<(zyiv1Wq*Wt1&V>_p$%d5Kl;EYS{ z`<-oG6pf5;(TAhTtS>ei>THeF#G|2HYRp z{$>hGwKv?gZVS&z#h|J}j>zJYLAKObC@>VN%tS^+Y zBe68xg=o&TiZCB%kRIv1DhdZWloNQyjZ*+se+$eY>EcrPysgDCK0f5}`nsT(-Dc2+ zlJsQ5l)-^z)8$vw%~!DxSHdmHnWfC?!_KzRgrDagoD-HVPTPcAg}(9IQyYUm(w(PU z?jWc)xFu5Ql@T?A(^+<|us=IG`V43}WZD=xcvyM?C-eF~#)%YgM+!82u-o)rr1cCd z@-t{KT^+}BBql|q+$B;~Lxq;fr8Q7 zT6A(i+8Y!47~8`VDT^-g2IDOQo;ZCFXTryz6URQS+dgq~H@AGdkjyzr0We!Ee8%>; zJZi}ug*Rn#=r<;pL}o2&VbmL$AbTxW;-vT~p3v0pOvog>K90lc9? z1aDkW9%bC4ySElDBj>K&zaW!Z=rA)C>_$%r=O%leUeFARl>N*+OsmHRLBkXIvwIoD z?7X~I;v-uBIY#9T_0%)6_yH(E#2ZoX=GZ_DzZ1bQ_-@#29>;VzuxodpJT`O=- zZYyxrUd!(oCtG1;H1C!%4AUh|3G}i)@1|Dnw6n8uMO2xn6aj8JTijx=<{>h`VO-Dv zp3x~Y6Ih-eP6jRzdCR}Yo|5yEO0}i?KpPuFOn4+W5Sx=l7r8MRAni3q zA>>|Cc&iy|sX6Yur~WP#k9qmc1A=*M_PF{S`+Iok*-r3IAkKZ}zOqWwN!Cfq-RS&< z(*1S1Mb(LSmvjioZS(urkfX9x+v>mMswE&68f4?b`C@(1o->6<{}K9s&C%ewcerOv zoHn{eJTD}mdk)^oA`s^&`NY;Q_OO!`qf<6EfGnB-or&Sda3481S|=-WVk~VQS!R1x zGYItL4eaVi%ndLhNv#faxyF#}sjJg;!)+J@@vaOzCbzIFBd-f>lUJRaSToQc79EYW ze+ghrOs3Dd`BU7{_ORLG;!ASy9TNCs&=!rW*OCp;#YWfIbV8_KQ;BT3Ubi5mL083G z>rAj^k^t=5j+`)A_nv}X5)}52_sb5V{1qNK+dY2Ojyl>w%nktl2Kmr)vH>mL1Lj0r z*!g1~VB%oUOc&5OUNzzAojJqxQKKiw?V8E9UQnv5_PAcbdBVum)Ce!ghcDGjY<%!I z$&nw@pY+t~M|Q8oGDQWFlF-C#dgw{syEX$es?{vKVjyn^m&)jdfrBBcOsSmemG*S! z^m^7G)Fgf)@L`8wj&t~Z_}u=WS-g4O_v3qI`(&At%CS7&G%6vL7wWJ#sX}ztud~6Wo)+OqPm@leEr~&*LCaWvl-u+*Jc&ghPs?% zd=A98&#fkXv)I&zsW`q)M=~(*00K%+HsR@*nb3gGy+=({Lj7Bgv49L?OO_y2Vlt4{ zf;(z`>SpZnb z1%Yz&^+?rD)jGmN1;3O^01}%_F>)A8*^MpZ_shXrSHjJ{bP)u$an8-BNmQDQt9<=T3Dd(F|eAv(X@JYG6OJw8ZW_jPIC1|t+7oaB32 z8Xa9mOD>l!U*dUb8=v zvH+_i3O`^0wO{O$*Q;(>y5~gXoVN3+m2dX%K|0@vsULBbkesV2m9}(zj|tAMTh#1W zhh_em%k#iWws_L}YJ7U6;63C?&0-kAp(OT8yR|@&>zD+&jkzY?N z{Zgn)z&74Poe5{AxR_iw!q4%&`7B*;`$-7wyE=@-XiB5o)H#6|j{{S8@VX8SiZ5}nJojs4Y%t2tl$Aas%YrlIFaN@bN z*KD(xgD*`Mn!BLb$C-3LR)eB!OHbnnv%&QO`DY?8)p)UTdNoPu-E2XJ(Q&n9>&wc- zPEY6CtUkaK=^^zm1Ew=Qu$}^XuFizO3m0TT9EeYn!3k$fF0EoCTuT{{dCanH7p!qj{T7%+KC|A`xainJSR)QCBX z-gI%vBF&L;DZ>fZrdZ_c(p_%q((4$RkJ-3;l!Q}7{2c50k(_9;$A{n+uTTcic~!3l zVyOG|%^%VPZddQ&;dH|*=Mj#l^T_%5^tJN)j&IUM|kQ`N9<}h3R9jRXE`o$H)1p zl4ut_3?6XL>b_K??|B@@&Uf2}c{P-0Z zybV>s49)E!yPiamb7V^Ce9%Rza9XB2*KEo;W{X*sl-7R?-pA-XtpriahR_d|Kdant zl{{Jp(#P4W$ww~u*5b9*+e?|eUe*a|>?Bg)jzDdC~( z@E(&p%Uugr|B=;eynDHVvpM^ivSBq7fcAQa80xd*7oj{5Q+0wWK!ZLDJnT2=OCU;J zodU4&`8#pv#e=@zy^b09JK)RU*o#wM#~yr|dDp9HE`!{Y{%Hb@l#@y46m8`32I|rN zdG&+Nt@nH3_%Q27k?SW??xwvPcqGvr4PzH2`2>bjt&5toeTS%wYNrmX30Cpw5@#LE zF(vdOJsM&au!#lC4tQB)5sXa9@E%f zCWNjd0;T*?Y2}SQtZGZ6LU?S4tlqdvb+}elfe&nUu5wYaUqbM8f^}{Fjn)~C6L!5Y z`Dv?hL74AeqJw+UtiYSYE|uMMTNF9jp)t#u!zTX32az=X@nQ~B^=WIJLUYSM&>35a z#J*9W?9Q=?=h;!*vnKOu{{}@pP`c@&xosS%op$P zr}2)cj;h@F!pIf}@1^>e<_rhO#QnpOwMhGz@InSD!cLgKC6jggo{R`U4TX z4dkUR(=K<1>e;lfYp%HO-GK9PFsouao2t=mG~n1Q0AlJUzep9_qdQw+2T}*F=5tRH z){{?_S{E#vB}fU#3eJH!=C07kbFa-$50rZUzy(VS=2go$aMvP&OURX5%xt~eFc-9L z?pDq(JHBSO# z53Q#w#s4~*?tPH_1&h^gz1olId*k;Y4$?+@7GeRH6E(5*alS|B#+ZK%F-A$l-_!c% zp2ale+_Vakc~hbPC+I0!xxD&--+k;g6RK$VVCchx`_Tvy)=@?A>8zV~=2S`C+0#dO z_XS0xpp75=OQ->cSu`GT%>w;&!cz*B@<(^wZGy@af{IFCB}@n^A5c-ui@j*oRM?%{ zcjf^-L+@6&hL!K1M2n;CoF>hEkHx}&U^f9NBZa7%iv`fdrb z)M1=S&>jw*?~)917{4J0>G=whZob3Me8TOd9Z`}@l7Xj{wmxOrK2W+Pz|6;DUx(s5 zM~Tlgw4rBLn;oMBIq>n^Ls3G02CXse32L~leK|5e;CU*~HF}16o{FZ}6ZuA}YLcvZ zK%GLpW#9lnnIge_R*WOg{i~Sk`r@$Yjs0WKkO5$a!>1Ra?S1`!U~FM*o_KvDIBotw z^LLwZ^|&$M&D#E{v4J;0JG0)A(Xn=;$#PoWx)OKjjkWUadCkMZ;9E24*xd_}b;&E%mFtyS+ehLRzIMaP z0-;SZxao60Ny!p@zl&>m8A}M;t#EIS*o-iky%0S@-A;U3mjg>HNFZ};?443dOb@2x z)7oT8OOqJmm4k(bqGz5*a`yGzZO}YqGfq-u%9LQ3kNERkEL|AdjFNDt!PtneH%r4{Mk6a>@6$sGHgCbpK!c{#gB)Kt=8#W&2@0IYC}& z)hl@l9(+CofE0=q&Y*d}rb;SpsT&bv6GBLGI*ig&3fP0nBQYRD z1uKRqFWH1-C$$t1FhPhA!%lWY3<1JUAR!5Pe=g6n?mwViix&2EUBBP=`}u4fqR|Uk zYJ;9P6O-5T#mu?GgpP-tYB+c)^k;v|_P_F9M}>Oqe>V(>egV8IpJ_I1n*N9U?^|;$ zRFYsi(tatqhIlsk@j>c( ztV;8rol5U={0|--91^ZowwGqOY?Abbhq@hK1Fz@u^7Jn?)&FAj%yN$%sR7VP)5Wl@ z>E4exre1c#IlUei8bsIwecW|^C%zTXX^OhrkG-ZpFlNafQl+V+V^0#3Ic1O}1NA_A zQg=|}pZPf1Vw+tf_?fT2Iw(UimwwD{MSpH~^c~A8NReft_bz1EuBck4HF6E1o^-J0 zaP7kmf)%?F_(}Kis~QF%FT`$i?4>hwDz`xmeu%{deDuv=M8~})0$Ks}ft)($VvF%h zhv8D6e2-v$q$f69u@;MgASP4ynfLQh5asE6y(clGa zyT+E5+0NMy0%z618+RuwSDHeKBQz$iim3yrS({Ap_*`%>|;l^vpF=kyU(??Ib_aog3jnF#%P_dMFB+AVOt zCvrQf+*~!q@GHzR^gm zL;ndm_jXt&zfAb*q5x8kCn};$OVyyFQn0Rjv6@E>ODeF zWsX?`#!vt(dP~#@P?lhvSn!O7i1ON>-f2!I@;Z;z(klxK-F+MCS(B&L%K8JVSsP6m zQwiX=*jg33kF?q)4YSC4mt?14fHF%dQ7raEKxWw$+P#^9-=(i5aW16HC&O=fuBBBM z`EgYMZQ8&VYuwcj4GrYt9{<$l8{`Y*ZZmi+3ufoI?7v3A=FA6~FRl^LSh2?rQCW1! zh2DLcmXk6QS+a<2AQf0kSri+0xnHW5m`rjH(AJ>6)Sw`mO-ZqSg9KzQwH0S@bGw0~ zp_fLlj77dklS&g+SD#kF6xsy%m3GW+yOIOzlUBHDhd~$vWU%PeJtKnj)%YIVzmOPO z+`_EH259@_zd-L9q3wmblxx)ep_`~~($+-CE=)V`9q)KP1O8&67gzkn4FxiyC{V6D zett3DEe^fhHT`abzY#QF1<-||a)NzX<(}i~LqT#-DGUVW6Y=WSdoOVm<%dE3& zvp8SNTG(8!QfOZr5%g%g@;)8-H+QWU#Cd|Y{|K+IaV6B|XKGtNW;S58o*kqLbkV8O z%O)|AIZoMrY~+#a7a9@iL1)L*=Fi*ZUPx#aK%5U8oirm zm3g&pUY9$Zdrw(b+g37!tMbCdO*AU(i|MN{Z7g)*F?mcMFtNE8e@-K4wIbZYpIUt) zPwCj!4f{nnM~PnrB!oHQ;tfEMTEH24AtpfozPv2X8`(G+SO?yejX_o!1qeZ5G57rY zAojh~V$sTS#~EeE&VL~?s7yHB7*6wSS@MV~Fd-o7Jbk_i&y2fdE7>k1C(ytY{U1+X z)}CGwB)ZoZjJFueq|nbF_LBBBProU2jk4>4)hDF0Qvw~;&725#H-Z0eka7SLifDpE z=M9QKJLYyupP8KnkqefEmGTq-n^&eCJ#vd-jS%m<(6z5HYHGOCKfYzwEQ6-MXnHGA zPiT=I@?x92u2-Oo`(SqsP3YBvfbxK*b_hDpBPAxFFzD@U3~2()zT52)AOOsDuYwfB zUH+oNC2rJ`I{L{yZ2uK4)b%dnn7hyE1sVw>;K>_1!jCAjhDlZ&y(5#ct4w!3+iGzG zs)$8a3H`EmgOwSZOu<_iV(2A7))gjpSJyn0B^`2K@ii7mV7H!7SSOJNaG)Dss$8k7 ze3A8KncEeZN_OLox@)uXudx5d4dLE6zeLwpVnha+SBc8hw7^-Wa-I^)G@s3mv10S| zf*SE>NKP#W6c?0__;qq1=bV~4?!k8MC|7o{m(oNf$wZ#OhR#B^%{ys(xvc6^7RO?J z@bsi-eSRwL0-T}-JyBOa^?lG>xPo17Um#N72YN4~)~8}OFgt%Z0Of)v(g=OGLN1ay z6K+4PRn4t-lpZr$b@EE#V_bPCTJ{E5@H$bfJl^*O*qYhriwN`|5+Zw-RLv{JZ)mV= zzqU{0H8Ef7IV@J2R{F3l8+MUYP)>8gDWwbS?jnBTk1E`v`1mk4VZQ340jF#IbFD?a zP<@&YDHth(ASo{|WqlOK!5K4w^(|l1#(04XJ?6DiZBHb!A=ikMBx8Bz`|=3KcGeMl z4MA41wNg*xV%10u%mu9b+rLo;SPsQ0z#Fa;gT>xf*l zMOWL4hRB+NPz+3*7&Zsg&oatX z%jj4G@BlRy6j!i^D-1u!L6Eskq{Vt=2g{$iidz$*9L3JZU95b`LJ6Bcyd5I7d**^@@olX zgz79${Q}yF%aa_1>wjsqA zSc~&5YmNL-tL|e-;_eCA&cX`DXXZClyL&%3g2+&TE%zv)zb>#0%pGcRwr0(!VTSU5Gs ztpI}?J?zAi9>!4jVlqV3%;J(6HkYK6NaTGzv=rR<_mSGFy;JG~w5+Dk$7jU|lTN!g zS`mdjI-K$v{fBHK)O~osqgQ&o*lXm!!2Ex8;GZ%>QOaF?-<+B{9m8zt2H2J&@taWC zs*K~jzxHlDtpl%-tj~VLT5FXIyeT4WD4EP|B4!0_X-X@!{EkGcU$xq2y-wcN3VpT` zIBf1O6RJueK7+4%_Pw9+ss*JDA&x1@!9A(9?p1tgWQRGt~wI!6^b@ewTa+0Q{cv%p;PE^_`gAN4(#9#i&UE7(muuP;-8PRJhK0vT{;Z(gl= zCFnX_rz{0}0~UCVehey3&Z~0Y6{RXGG{vABxvlUcbeZduCHGcA4&Z=M{@0tng0w00 z9*ZcLFzFMo53m42GWe0${VSqXt!?Kl+$^c0KFaNRpV4y!a~Y1YIMv{X1lUt%NA;QXYC}-)=aK2*$GI*NFGX;pR1|#gUK|lf6q@;aGLu*=x+>b4ZSw zS6pw*%{tWb(%^e57QLL{@G|F^wigxi(tf~AVWFsrD5J+DAKD%(d^IQLTr zK|i)+Wt>X{%2WI57|wpjj{I{kibn6L_9$mBCNtqTQx0Q!tpO7Nk9vyFnvJM9uqNx) zalXHXtmH}egN=;HTa`my`PJ|vP`!`jmQ^bY;NaqIeeVPqW}Jk3*P@6vddC7Fv7@}I zn7xs)+daP%=!7|NP+c7cKm_1|+6J25FWyf30`sqkbBWACtJkDjWVB1l+&lAIKs)0W zshnTSlD{`eDh){#rB#Th>hl;qi}B>ZdSgLYGMQgNd|ux*1KVPq=}z)VrtL`v&k@xj z-fVHgswN`m&zT;tkhj>votE70Z83iwxo^mx!bE)~B(-QRj{973yYaQpdme9F3L)=>v23w5B;@eNF(U(jRO@h z*TrgC{3%-&$OxRTEnJLNgtqUqGCF2_S8K|}zM=R?ycQH#YwCB=0k@mi(jgKK%%E`X z8Rj8*YFm@+R!+NKz2SD@!gZ73#sP(2&QJ=E(a&Xo|p&3+U)@BWL|_9vZekzk>=SCjNGpenpAVd?5h$_k4(67(iqb*VQb7` zD&o&ZLy%)~d*ClV)q&qt0lf>TXanf3Ie|B2vHDj#2EBqAeBj?${LDbXDxoSLn1UYY zcaG3{QnIM;&2?I#8rAA(F&JyP^ZZxD7!QT^Nl^a+yHaUtp^7~WaC6{KP125}@>|o} z=${sg+oQj%z`?!PJHOrF{|C{1@}Phgy?BxS_%df&r2H|Go=l8Eq?dP2dWySZ(zpcU zV5>0*ff!&QLi*Us5VF2LoXZD}2dw~Y?TqxIRLFCA=ZV>KV3ZpWFoJUN-OzYH>Pu66GO+N!7@|CqgF8V&AKM)$he_h#X&5Zp`%({QLumds^_XvwGa5!3# zg%&_w7L(hhAYw7W!=x(YGxqoR)}bh9gfZrt$U=VYUt znO&k!>+zS%Dl@jT97G|egFAB*!Bw~{sa4`oZN4;pJ{neL*bS6H(e9FG0GH=#v7H16 zC_!Qeh){wC1;NJz-{<7jYsP5IddNY*go+G!$ptK|?!3VK{GRL3dx^<1pJ8WZl6us} zwrCD$gynfp1SmPJjl+6PyG6DQRje6SIVKrs85n-$J5bb!1g@5_ibiA^A@p|b)=-ua z8Y1O3B`6c3Q{w(l7GMiB!$8Dx5`{FK;D+lL%@@=9+Jbkh!s_2#**tp60LWdDn-^k4 z0a0US{Q4gzIwI|^Jj2S}H9*yf2X?*bxSTFc3D;pV^$E`H#l$vEQK`lH4L?k{Ywa2D zQLdFBsk4AJJ-EWd737-|fS-#AXUrUkjGK`SBd_2DW1ozG{Y~|f+)+4<41m#!WL$RI z1?CS0XIw3ok9Q0<_gx?&y zM@a6D&YjqW5E669nT#&cN`4w!RehoBZMpxlYROpYZPC4m$x#P-27|K{dq)fTx+NKh zhh?swnY!fsRjYUB3b>gLPH2F2tBrTi#02s*97;G98vOcH4;=Ga`n4=+aMGU)lVoOV zfi&$pE6T|nS9L_FE$Wq|(|q&&>0b+q9s*uFxQbOAiEOeG@VN;im`r{l5ZJK{4i4dR6X^q0b6gcMZALPwRgAT4^q=*kS&G)u_j=_YhIz z2VlQoJh#A0X7yEJ9&5%%rOCS;u1p(BSYIbAuKKh@| zQbZ`-CTFsiHCZ_u+NNCn-xi@_UCL%_7JH0l_{Sw96&uEEo4k> z>h1lN(sgHF3@x*p@;^SVFz(J3isn)1Eder&*9<;xa3c*CyiXru|H2g)g3 z&~3eQEy~o_bo;X(!`QwUZgGVsbd8^6N*X-=zJ75v$P^1*ubE;`&9-RPjj8h>i~QL* zFGJxSOU#0+P4|)h?McvvIl+#Ge-Pv(PW^S%`MpZHZRns#z>?^p@G`zk022uTQWoug z=?o+){}QIQf_WwcW!bKX@m5BUZHe5Y?8%e!eDmNw?^f*1k-XR+fp+Ds3b&YMRP-UJ zc)F|$JEgWf;A#cu?)LY~w$FxCRpM;^?gSe{jH0bAWz)L5L|FQuFT2XW&YNPLRgZ%N zlK}8QebrkzFGIoEwLAqkX8R^#ZfW(1UMKvq&MwY%#!q*o^2@P(3xuYW4_rkl^#_N#D1N$Y5jHe7Oyl9i=k)en z`S~Xkm5eWC0+zBCLjPtcYR*AfoZ%mcYXth#+VPPXu6yT%4q56G7rIT8x>5@+2o~j> zgm>)VnQ1Kz{3%bumEw~n8}BtQpfP)AV(H5!R9G;KS(D?=zUCCV z*YFZmxa?*@pz|`+=ykaP#7!OzDhnSHV`5p;qsm#?-7x&!H~yR|h86q%E!!f#H~Meg~|N!^|YS842a2CxC@?qz@!r}vN! zSE+n|m%GY_4{krM*?CFi(N{M&{ypU<3&0azd($1;#dqL1Box}XRkYx0Kwo;yeAF# z+-`(z>b(Kiq3!xH6O{z6#MXrg&$S4ecjwI$vX#4rUGDqR$#_!DGWPqi*6t8R&q?lS z9xbkL3)t-Kf_hGvodf&+BGyKa2(j|IZLsLjgUAF_=&zXxIuy)i9XhYf>aQL@|R>?OzZajs?kT~s$h1W-Q0{3;&VGkp#{ z?}kVubNHo5aAOlc$Sy0S!K@LQ$h+cWh;5%knOAM?pQQ&cMM02HzRs++KK87V&2eR+ zrW(%j2r|U6;^YZ@%BxBY%=hxPPFW~mE=pl(-GZ+VlE{%E&@rRuaY5Rj7Txwk!fRS} z{>Entd0;&>eHG+vb8OW1m<`*0ak`#%(8b0NP4qY!_0+5|`}Zc2d!!dudi25WI%p#X zJC@Z9m(|h$upd352(K$REn-Y5y*RJG1s|16u?)&91T0FL$DMR?Q7 zjDX-7iys)0_Bgx%1luTC<+MbY1ZX?xboFW7h&(088tNZQdG zlTI1qOQPHA>Qf0H#Z&kktVQZKTAw^-EP)C9)~*Rzu$tgLXS2Jm&X|QAmUNqeo6l5- zI}_wdU34J*VCL%y7XB-Z?{zbr4mfYE3kUX6J(tT*i4!S5vRoqxmEJ$ zMeCCvnv|!>z=W+@4n$+@s&(Q3(Iug7t)t&+vpN1KtNZmTQnpHbQ+OZTU1WH0HA7(c zwd;e$t|>?fi%#{D6~Gr5@c3SM4#|cR?Bfhfr59?i>*||{H@;K3dAqcR(-sekeRqycWL+DfNGJ}KN z38|X$E_HnYL9+Bt5t5-i{od5JuvJ0=W0}D^Xz=XyJ@~6G4;ZDO(i9SGvv4^i&Kf@L zX5}h`Kzl=fkN!zJp{5?#5A^(+Bs{RdsX~=WhxSEg0@f>F&~p2=2m+{z8q~nGgo9t! z{;pZTJylK~Qc8Je#?jJBX~8AcRu$DfFLJ#ySO`YmsEe~)w}bUriGPhZ2CIEJ<0L0L z*)qG$T*#wMG(Ekmx%kow5S5uX6=f`zg6DRtEsP!t#`cIe7HC`_4}4d}fcP*@hRXYs z=GUFX$>&CW;4QX~4j5V$^FW<5T_qSZ^?inTD_@9aR{`T$K3pM325iEL3=dX)Cc?gg z8E@#0vIb1aCVj{0*z9v1yZ8f|AKFvV4r{^dm!{cWW}xW{9dYxurmBheuJf1Fpn%Jy zed+9_gloSAJX>bz9_|RoSD|e&)^JFnkEb=dC$==vd9W7*|7GY=9&OX@r(m|pwP?V5 z5CW`r_o9hAs-t(yW6~7L%TYbyE(_s^5h?S}`tw*rOIj9q&_Q4FGY968&y~57FZf5q zwZ*`?I2yVt##R;fS^WvQBJDb$cFa^j4`|R%ZEH?l`Xs*)R@eJM<4Uvry}w{Hef7m% zY}EAqs6j;@&2PZ3TS~H86Uf(fV7}g1(}f~OBAFAro)uz!%e9aIl@>c_VNTa|x| zo^lvk6A!-mz__7OmYd#?_FXe;>$10$V{MeIdAE(2IJoL8y+mtLJdy?_!U|%StgN5h zt^lEEh=T~w+HxOMSTo(^s_EL3r<-p1I2r7Huu<5Rxf3@LzW_F+wZ_F@6$$_trTa+3 zzWHi`vv*nksv2cw*hYwp1Ve1NB1Q7G4}aFH!@zaVkTb$4a~lTgMj6XvD?nDIl%faV z41sU4SNx$YHSnjt3ta}gSKK5Ad09+kKx0BJK-J6zd?1hZ-;`bI{SHk2?Zo8JT6nv`!lO@rLg2S(qxDE} z&Pkg_RhNSOV-!>{>S;s-8#<%(Pc<>~PdZ=@DG|Uf_fULTjn8@2@l^mQR;&@h$=0o# z9M<~u9}@Y{28F*J#1BZk9?a@ocZr-wGDq?O!`o<1ReV_l3<{0Js@^m>Ac_Y@Fwx}plX)YQ{D~%1xS^=(` z|Mq|0aONtDbuY5-?0zHkgL(P!I`*%4X!bu6hyOdD_`mbb=@!PxOP@0yRqIoC8=|Ve zKIw~Y{p0^ioLVrp`4+W68iN+slYcYq;x2DZPxL^2z6J$Re#SsOyqCJiHvKj=7v5J` zmstcuhqiXPJN$YEzG%{}SB2>ifxkobq|s)wiQ1XE7p8*J>600}TAD zf*8}mvS~TxhT&m&M5o7Ium&WT9-?0H{=95f*KOig6|GEEUlhKun5(&}N*I2Mc?jxDRZdQSLXIsjRY87k!3xpDn_-gIRGy1RVr0F`p!36oQ`{rBf9OI?#aY)&j zM;R+e4L>~w7w-{piLWLrrCv=DaA`%eNu_4DuiPuHtr&ig@Kc88Rki)$qIF^5Lx+9i zy=m|=(-M?kUfkdi#NnX|0jPQuW^@Djp{%@hd_Wg1PxZGH_M#w_*FQf6IyhPN{>Lgq z%a~x`jB>F7o%2_74+wcP$LK8J1(*{ffuQ$0U795&?TgjD!6AV+-{z#L9 zZ@~WR0>M=oV(QBoIJ+NeQVh*<(TdT@a3jBxbh;1T4?QC*hNfF|!vhs$OJI&}{~#LN z7#Vieh+941b3Bhjf!{LeAErda9rSzqe%SxK#ZbeoeJEwZeHq5{BUuW@skwoO;MY<+CUXAC(vU26*Ytb|9$e;}-b_r*$|#HRaMGQiEu?j~ln zYdJ@vsld|Gng|pRFV(Zm%k5HI3cnVTWvSRcEK*{9Hl2;R`xn}$Qs)6V|3c}PUfY)8i$*5OsK^B`*ZvAVqYfKP}DT~R} zKH0H0@G4v2v=Vb-f3rmP0FR~CP@R9Dp60$=#VVATgM$|`c4dPvBJ*k_jaQ|642+MH zn@gvRsnXrDyKq^}d|&jf#+sB0-&9eQB6%Ayz!0GDczNT7d58j#B>Z_dxPJZ2+X6_# zy;RctNA4*w*5@CAejjRC`*t+Xf42IEp{~rj$}hNso|9dWI`q!5U=a^B_+L+Eb#p+; zbW{W+EWj3k-KRk;L(;>5s_NuKX9=tNL|VyApT9@8hwzYUlvcjK{n1a6-enwAUMCl1 z)eciXg@9mV`FD)p6tncF8Sa|tUjeJ>B&pKfo0%v%6)WO*y~$cWJsFG}ylY8lnn;AF zD@I$@u^U?ds_(#;q(kTTX;k>+i~md^nASk}Y8cF4?up@wWuj&;vgbAnpS}30l5*) z)1G$u4=BSX{Mnqkhx=(gsMGE_a?6XqBvqJL3%Ibc7A*y0_Lv06$XeoUMYujS`gW$Q z5<95_&Qyz)W>O9r=rJIwO=%G~jY7A!xc$b#Nt$lm@LT9W%_zesZv;d(kG8-e$RR_v z=O_Z6LYr>4wGM&&e;L*XEn#BzF)sSTGXl zf@7{IN%F>X4-Fo-0lP;cv|R)A^MD}1vCQ>!k>xu*LVSpi#HUMz$T5QbG?;V8DBZw< zMVyi+uRS9eq;juJLu8)_Ug3~upnEwj-&UTtZE(y6k};J4I$fw1-2?meWTv?-^!!Kk zo(3*mRlRcQPcyB-*@l#BT5P%{`nt5{*wH=im*S2C1ginKDxkwb$0A6I@hqjm!&||AiXe0wh7pLb)JH`5I!RGF&2?12NgIW#@$dG(Mc$6mI zej8z@geOzf5aiE+oAe5C05q>F97^1J``7~`4jN;vyrPt3!wIC3G%8NhyG*n%Ns_h! z7JD$~g=kWmxIqzcGG+`}ZEyb+`fqxn1Cv}TwP?|n8;Q_D1kgfUyz@Y>pdB5dK2mC8 zO2kqF%Q88F4|f9Qp8k+t{l=!0VO2xuGNlgFi)mN&#?zOjrJnm;iBoUx6i!$|g8 z&kB`Vg)|y$1y#b!QOZFr^up^rd2qlGz@3s4nt7JvgXp=i#Kr{e(@igGF$7o2IXQj% zPE|y)3HcIhUwUoYchkAvj!#nhWhlk`tE=jzYn2I1dq)xQ3wJ_VkPQEmMN_hX$^pXO z`m(g&@JlaC93&#pll7=A#rekUy2|P`CwQI$=R&OBcyXl#m@^S@R=m%5Tu$ypw1GM2 zR~4g%&8bG$q%GSg(?nzQLuamw3!2Gtrl&@`U|Ivw#XIR#u=#VX&QAe!nh*|11Cwui zt82C&x5j}E`|uB7vPRC~fvyP!n8G=-X~Juru8qQAbVTe$q;_Bfy}_m1f_lecTkyi( zQ1v@geDsCK(5p;M?}7mJ2<^0GSFv}dZ9fhT*cjKRJ*kP1Z3+$@_;9!EOprbS>4mO~ zF3LR7hM9DKQ-OiY+SKGHBu2G~)*il(_#Im3y!aLC{u1~pwCMoN{}+pEjBZPXabYjE zUtuiII6CZQ>9t?^-L#rptf-|Lfe+g-XpmKsu=PB~^tdZX zH#Qlpy8CgV0~4)@RL-G$M&oAIGG`hz{XC8GJ$Ns ziL=C1&&7@0+sVU91W205mT2 zm9eT_fx|xg8dlEgl1oJnFXPSDaqw}-lfA{)^S}F#N4fvK5>s15VJRO9v{vik8I3?7 zDJx6}O})6@`fY1ERar2idAfrCz;a%!%wJ6$jI&98hl&^cZ@46&t$P5l{Cex7WS?`Z z5$n{}(kU%oKmvM31f;!M#ta=vfP_yl$^XqAmtee|)h;8E61#qvh>$=;GirmRa=R!0 zfW%Gosx1kz)YNt=>-Ex&*;d^>z$s&=A;SlK3x*MbRUgL%MBM5@-Q&a!623mqFH%)@ zfg9R26zhq|iDDQE0_8#AtFH~=@@T1d5QumKQ$duAx2PBIkDboC*B=`;po` z`^7yUR($P9G^(#))(9$afLdD+P-~x@UO%_|IQ~QB!3xb3*d01~CJx#jRP;JrSD(IA z53_Om_rtZo1489+dZfC0(7-LQ8)xuLA7#{&A-T4r7M^mx?qgj#?J~Y{o+C~N#tofO z>1FNspAydQwW3nUz1{cp(mYPvnX2jnv4-!fjlkKw0_uJQ7O!>>wxBP!3eB3Z{I8K# zBUo(#o383b;wzjtx4tIF+8#iKX=_@>5VPKflU+9kV0dHGKybFTbRwl@{pL_AFXT$g zQNkOSYTthV3~KeX-}23UCzZ(pB!x0?g5SCKx&^9cg9K$MpEF}PM!#_I$nA|%K6ry) zq-6g>2L4Fz!DhZP>~S%&+*GP!c+VG135Vr@^*eT*3@F&PTIO8&}6 zu^0|`@1&{neq)X2-QI9!6{P9F80FBkcCFE}KFPQq`ZFv`!4@f%QiIWh%Sa{3Vfz<+~^j}+$)AxYwqPP)Xd*Vv4QIfyk>D2_{d&$s_f+o!w zX|&F6@3PngJ#W&14bIYiL|8dH<<5huxiKK~9x8m99(vI=`7ZtQQI`08O!)e*APvyl z6cuM1r4LU`bY^d@BmQFZI$5@}LAG&BEz-1+@I5uQc+K7fb9>{dfjoZku^JYT!rSG4 z0=cIKa!XwY_UiGPTymdi1mD;%ZNX$N&n8-X?8TSLL%YOT9PlFa0Q|vVJb;$KYh#9` zwNIqjD0hd*H@mq``gBBcrco+fGn7;c0s z`2a8meXeyxl$>nVa?BF*O_WeM?4W4HysArfpzj-Sej?h z3(!X(n@VCC_$@YLept{x-m@PnRalocp;sOJOt-t)+xoe&_J4PAGj63ncIJSJR_*8N zv%IG&eAdu!tc;Y9RS_aM`%E8zR82nPw4!(N0ysb=7DHZ&xI1wGvf0!NPDyb6unjLL zqyCE$o2zSa#)U+QVWtnbrI2=6!(`fU%1p$YBf*fKm!?nks`*ogWffqwD8fb!#$kPN zeFRS5+aZxAlr){&Yt-&X+Voe-#W8s-z~P`!DlAjdDwDpv(tRc6M6DTsV=no+X-Cd? z#5`ykHORI_dBV%~I;DS?v{9^@#Kk(re?iZo=Hz`j#eM!M$p9-kr7F;4jMLYwH<+_>or9w})3&9eTZ_UR)^Z)2&xOs)ZW0V%ZL; zCWG^8Y{@6lz-?WcZM3+cLTVU@OEd?^j5@;_UAYK6?=zk zqc*IB&zUYIB?@WR@sH@{zRw200BJ$Fg!zd==)9oRyw*{gvP?5BxU)(953v>Iea#27UTJU}UxzHQ6O+8^*a z;KoTP8T~(5fIKV8b0jZ5a!jplRylW0#Jt8qmyc8akVo{K?t2o?1a5YiD9^+0a;Fy) z*K@x#E~Z5`DV5C4$tRzr5+5iIW6I-%(vc(ne5gM-GHW%t!_zjJa?eCip~Ev!(C+I~ zUm1~Wxod;R{X>pkOo&W#mgJ8}TsTz@wwII7YWOud!Kv!qihgI=z25@f4yWsjNAQ_2$ ztoul^?1Qr+!j3q21BDKaT1cY-`~hd#%5vKm-8XZgwp!$}*xfd3_|m3QR`vNW@!+7s zdFM96LB9G?Byh7iHy`KlnRGdWpgL?pyz_vNrSSInt5HbXy;olO{5reV;Fqrl9=5T2Us$5dj1NO{bYM-)+t$y9;xjcUyQXZI58~@u6GB~HRK_BW&~DOQL;X%Ro&vGtXe@O4$HPNx0ppK zz_0f3C}&wU!C6ZJNmq|~9-J1%N@^ggwLTCHh9wctg}zsV#dYq*f6%I{1Qw3!RU$w6 zVrli7QNCp^c8l#`8l5WZqUra@#)QUp)JO1~xOI8Q)F^SD5;U%x?3QffU#xqEz0+FqD8V zc^RM9&l3UpAf4-P>_}N=M_G@7>t%t%mE*rY+|B|u%=_}v!!&9rr?d*-QaN3?!FkgUs1NfkZvw5`E4xh% z%=C z!Z_r9C3Dl#fBDzj5C1RT*ADHd{~NY(czbrm;WAn}_-iNF!^UR|Y|~=PUEP2BF=i2X z?=C*}B`eNIR^dszz7!N#e>i7lyjSl64{^73M_FC&P1%O-5v9EC;+!V({tms~*UVeG zqyVWNP!F{O;5}OEkf`g+xy!H0YsR9W%mS!cp)42&p-s+wV%q!BOablnw8Lv{AU5!S zMGopbFI|?&Uxd*JrZ5RQA2a**#%4#>4>Der_B)0~Uq%c7&V5q>CT?L?>z^}8l_T-m4COi0KDxUcM4thMvDCka%P`YdgMqZioH%$*{pPp*@nAwtD5vfSS z;!kO91_oDt4<;d7Imp)QuN*to%ANB56YZ+w!7;!FqEEhOT2fP?sek8?WVV&c24^7V z#ew(rgf69he!5EHs#$Km{TbXl3qZ>|S=S=hm~fiA7VTLJy%jKbkR^Kpm+|?Y4575w ziOHkUkuk$El2YkoAl9um(MP>LU>tj{BZ<-R-~p=_ll*i3QcqK3L0LQRQTwqDu=77p zC81{Suf^t;@j8h)!3_ET+;vcA0a>FBtW`%UKg}}N0BGum#>PN4yiOOwPDNQ6dllZs zQey(BLB$_c=1(Yjb;eQSEzyhtaGhKD{sLJ8csv2{~6EK}Xg z>0wEcQ<~*)1|T96sycCUQ-YCI$tF!FPRT)u=qHOWnxViq_v?7Os%-Y~*YLhyLu&e*cM9Y3U(vvBU1H9;?~b1%Kjj%s~<6F3BS#igo46fEEiz z8@!>v(R_zi;gK++u}vK(m(Q-qT%nYZKVIV}V(Ro$q5mgz^kup_UHLQgqRviMrb=I7 z_uL}1gq0R(%Ap!%3HC)Ns2y4?$90wk6q{c|P09DUueinL1l!$NB5(1!@H46J zZlgMWt^rdX!mf~chiC!&mT5KR#4RE4d6YRTnM}y>HJ8xpsu}QFwWG8beQxl^4bT|e z7ul?7AJb6@nnhbRDhFKPvkL;_u+lC6(0r3n%T4lYvqFROEO$G$8@=)9pE7M75lXl* zYRYctxYl#_w>XX1yUCrN6Fjy|hQ1$ZNn~lLJEyW){clcq<$543XGUaO(S#L|SL~NY z@Eh91*3RSJKZ=fk+zWn#cAg^(9f&vb4s#VUWse*bO|p%ekC~c(mXBVU!AX$BdP;AU^!sF5NYs8B%(oTW=*TTMm3!Io8T zFi?QAE;{YC1#o$n!xtuqQ_X5km6lUR8bNy3&^{QbL}U#Jl^0qm#`SzDb13weNU{WIU7TKsP@IXv;Er3%n( zgFPIMS~-QOU-*?jCS8}EZp$WLY=8!{ja&kf9J)1+^P|ivD^DW z+;En!o7H-l%4BDQ>XmXQ$wAqkDtZQ8^`1CC45~5eCT*7PvZ;0$!A5;B39#s8-#T_> z%F=4i!~!_Qj`AzwN5(W>zJe{&82`gY(6%@ThSPmVuqw+ROqVKV+~N7WHFR!IEmxIY zV4Sb66Oc8!#Z|`;D$9*xKvs)I!q{5>p}QUi=9RtlwDX)3?fQ;i`6-9k)JNC~Ku;Q8 zYc`Tk)gAjZ_Cd0o2Gw403_sP62DW-36_-8;bCG|12F!uJ9-8QO=&iVPqji?mnlNJv zOg)L1k`G!B*I7nq%M2Jko7l)&y0op(3hf0ZkTwZ!FR7mqCB`Ow9I$qYPQ`A=h@TWw z>m>&nFZ4au*XbT3bB9xBb^p7R3-CyQlLqB7&A~=20pq?emrN9g^;iIYju8}`Q|c-6 zS8YU~Wf#_@BsPMhf`cB=s9dJ+$>%crZUF%PH_{T=({XIii~UqFShhRseH@Q3oc+WY z@Q#AX8(h|@@c)t8OpP?_j5Rhy=Ua!2h6jLDY~%^{>OCSGyi@1AuLWW8Zjj-q(tKq^ zNlD5(KQu;VTc_q;_5`ar6M2JQx4>1z>l%Xaqu=$~l?kcKcbZK@s+44>Z`A781uSPeED$Ust^{J1>$Mzol0?tYBS za|-)7hiV?_eG(=^@vj8>|4jELHx?ot-=BH4tU+xG^#JJ*IgqZo0TxF>8DF zEeXUiYw-~$oBy|vr?9xAAJ=uS&Emm-pf6rD)>M9JE9d=~{vFgoy`GpoV`#K9o}p6z zBp_8-G<{E}Q5~4u8H*=uFSsKy*XugUlL)f0uDqS8l7L1<_|13DiMtur`PjU$DM|D6 zFskjET>WdS2tFKB!Y`Jg`y(asVTphaa-z0hwLE5bO##KJ4H&h^v8`Y<%R7F{mE6Hm z6mXgq$eV?6OjBXc`$*oRnmhd>^c?=!BEb{DB0Rozi;z6^UYSlBsItAn?JPHHU~T;) zZ&lUk|K=bs^UOJ`Mg$)msdc};lro5!$UN4DveYb_@jbucrX(-GnW)>T#wwJ__m{=l z&Lzj^#T_8c|DrnIVtYEY6ps8U!SRXoPrSfYk+Z#B8K4qTogQIrFJYldOUVYsnr=HIkgS`4i3?=ryuR)1gCq7aa#Np$0g|-IUj*JU zqKMN)HU11cF^+pE59GpuYROe~M_=XGB`Y(iZrZ58x~I%Hm++>ua#rSlPOu^PY$)97 z=C3JIwi!E(gTkfJm1N^BdJNWqI^Okx!R|B4h1G_`_Lq20G zExO(Sf6<&nkPqk1QilMf*UyxgiGMIT*&~~CMYt8QbiX?dkl-DxAQk)r@y6@CGQX?z zmTOwjWyx*->`Xh;;G9w-vm(3h8RA;EtGK|s;>nf|;@QkAT>fmtnkrc=QR4&J28G(_aO$`-<*I@l_@qWP0HeCBT z*?-ruk%zQ`jm135RbHV!ADBQ>Vy#&{? z+X(csSFtY@#zrJc1eW!!tbMFvhpVOvByCkLg=BI|CL|=;-7KNI6tG3iD={FYN^1&H zflR{8Octe}5CZ~2B*{$V5^f=xkdTDj-^X*t`5%W|=X{>u@B96HY>q2+JDpE~8Ph%@ zd>@+SW_4H~6YY~+_)41Rc>YP)R7w&-oySr%U0H#t5tG;UWVnSV4?oFp(%sTFs{+s|5JH~QFRzz*-=G0@6)JQiA3Y+A?ZSqM2}Ka>9ba~>`tC*8U#dxhP|n;}B7)3;vl^E{FqqRP?s@k$czoOicXNU3 zW#7_}m?Wke5Ae-Ed0{(5F1kl@S{bSw#m~E)+-X{VBO#k#j<~7D%6am7SxX1V(|va# zFpPGc?)h&Lq6ibOtW|jrB|f;Q`4W*mE;NOZ2&A zz3}enr-DHE#WY2E3m!^;=6gnZ^)55d7uE{qog+p$@Oh{`&nRU=$C@JZGsqz*b2A8F zMf16GSvtU0S9w_QpO9D+dP^fB87Bf`o1JA_^rTz${M|TaDpiLq9MAENSJ|)5H#^72 zpZvDv8=WR6Qxu+D30>~pF&Ysbck?cIb|1=rZES7qgnSReW{ehrtgh+Du=RgfUuk^V z$xtnVCKi{PF&Ktu$}Y~)-o-=Y82(i3yYSlpV()s4+9{V$?z5#~pD}kgJQfrHl!k1u zlfGKdsqje;;3CZW4-A2hJwdF?!1gW)bI*P6E6>b08#CoxQ~lT~UJLw&n!|@h=UTP>4Yc0N_mo=qfx07=)@s_MKJ|pr2fE zQ5nz^CI+%3lro$PL)$kGH4wnd%4T!4h+Am}$Y%pVAgmTr7vP?+y+IGo(!~}`c*@j| z0O)oj`dK`6iMujTP~Bh8)4zWc`0TB}aduoAPzcPz9X@6oxnGXzsfcbl86+QZ<0WL> zIu0%X_T^ePlevRPaSa#FE06v)9TbT4mG1G4fOltv8AhDyp~QlEdg5^AF(^{aLJ=PF zE6DjQ0%L0-f5*IbBo4v4P!>+|6#L4i->V*S$wu_p^5zMF9qfXWJL85dXR6y2qe%!v zjBet1JQTh{oEgaee)nU2Oc+zZ6jl5YJQ!DdLStJZ69^y=nLjU^Nn2a=lBY*Qs zWQo|A^rX6jZi*EgPrF@j$3{uN)5U7-;$Wab$&u3o8REr60E7ob)o%g5T}LN)Rhl;Mr8(2_91ydmi((qZdk>Ii(1Jk6_~Pp z6wE*Rlhw~6fXIW|l_J=jlCU~3`?6%wxkW#h%jVB(xz_PhundSr$B}oz#E_l^2L0j0 zhw=a^o>yqy+{H7`#EVrWdEiWdui;N^_WPN_20DC1KIloS6#OaVr(CSuY4pL8{jD47 zMU~x|poFj9!3V`%)b6+l#_Rf_SEZ4ikx{zNc1#GR~0r;+v1ApT5tX)g(r(RT07arW*BTng5bpmyeNCpE zSK$`DtU$&gfMIle_2`X2c_R|QeMdUTFB$?}lTO2RCS)oFEjCkIy%7cS9yRTjm=)<` zI_DK%9_ESS^=T1f8vsSoEzYbwmS46xMGNvzsyLNAk$;d6W=_WJ6<}_!k2_f?YjMkF zxjUTzdB_b-&zgB0p%yMMUQ4Wkw!UB;01G*9WHQ;$a=h&8JCb!>MNAf`777c!K^ofT zXOBt4K@IcK_JYf`D|DCWQcBJVJ^+G zq-HZ8#9(00j7l6IR_3cQ5b8^uDOP=9%X~9t-Ko*QGM|PSV9~w#Sp)>wT@ayOqk8}= zJuivw$=5j2-kxZ!uV>TcRz3bA$iHk#CWHSdmzNDtNzC2MOeCfIHObzBL? z&^I6Wg=*FH5A-ghplwrO>cpP4f?&~F!i@x4w%|CwZ+=E?{#I{-dxn73V78n;V=fxB zJ!>(aq(P}~Djt~>*i5~BZq6Osg<3y_R4KIoy%;{YSTmEMPYIdsgdN2(O`Hw1qK2*D zA|fadY7Lvzd#aCWa!;z#h^F@(Vdx~H_K{XOAY5R-Z>1ehP*Sv*3HeBs0xW2Hz?iw& z*~9a`jFSwh9#CGf0NfSZAeq3sYOc`MJgwL{6^&68!envq2qZm-y4jf--AGtJ%1i?b zZl5)q2l%;^6y9s084C#a*(nBD!cU|7tV7!FhOXsGke#afB-6#3Zm*Y@kT%D_w!azd zOHQdSTgvDlA$Inr@}W<&9(mPWLkm!$yd_s|84jJL%3hph-G-p@mZ!7pi&mslEtD!9 z%&56NA~VtI`;d2ZKc%<6Ezy{tSLoI3Rc(K@^LeNoxxm}0N)$*{p@!MaTub6iiFj0T zl$Zuf8U_af_*+AMVBpUgq5}*^VaF}(ArYtFYw}&E9pLk<&!zmWucj^a5zMpI0~nHf zdE3*{RZ9<=135llLg+55EKkP>uSLn^h~%NpGr5J%_%^n4eeQjGJLs#e)eps8jyNl; zJfOR7sxX(!z%m^xW3gSj>FUG*n{`4{t=R~UKe36$dXUIca(E}h*)R-Cqgorp>q$H7 z4)Rze+Bmf48~8|nFo6=R11v}qwe7<5yUsJ04)5?S&CS!*MtPO4xw62hWeow}(R*pP z0<1+U-#S_Jx@DeUYv|;{@1b1paNK1HO%7~(2Gdf72wrR!7HFdlx1cOeDHH0qOe@Us z09xxEx9_&(q%fd9{a&1jb!{alujHT<3*WrTbxgN5SmX4mN?Hk&-P%=eUGVy5qoQhs z7bf-{XjDz^!@IciecEhfwJj<7_Ss5eeF#4%i)M6$8-fO3kEHBv#=uVOlJn4;8y7r4 z#^xGxb=lc!=~KSCYh^YNTC}k}7V^g9RYSF7&5s2=)M#6gQ*bGyDT>rfy8oSv zJ+3Xq3XEI5$2(l?X3-&2pT^feN<(I}nd z@El)ivk@SG&}p@vRwb75PePX-8jRPPL=&{b0&yr9`h(oc>M+hqgK-4%JoFO-QZZIY zy8YYpKtO-?RISWO&9Gf#!=^56c4eS+f4{r?*Qe!UZcW_SUKdz$441ZcrOz+n3D5PS zrp_E(jmlbv+H=U;E<^7-N}sivP|!*e1EA`Il)qOUqEAwM^+H<|{~=Ajmr<;b`X4p|aW$=sQGyb@+>M9Q|=W9UikT(l}h zNqGcRh^4lAe_`$H(`_8rU5v&sS9(cK{>j}oBtC~a%Rry#FAfCWF#>7skn%jJt6=)> zrz6b1Mo8r~u5&eWFOgVk<2|Ir?Mc>2*=Cw90gIbPQ2c|mZ-@`DTXpI_f?Slj{NY8Y zp8*^_fO6L4d!sYKr~6?}E-yI8hOAl0i+Bvvk{pnbNEWMo+=3K)={BGk4sxfz9pbqF9z}mpW%?;%Rv)nT)soNGGn;lN z@Cunn@p;gLOSCf2xX#}bYn*G6FB(1&aQ*9M=N4vO&IDo_<^&e7 zy_9~;Q!PerfNA7!mK>cccG0(VCbvr9o4w`-G#dV>|4cA|cuucChPkb)BV{Kqag$R2 z3dtzWwU01cVCsA1YUjbr(u>)<)(QQ{DGG;_5Sr3i^x(_SJIeb5c+x2{=d8|Igc2QN ze+#5C3)+emR(MfY>Cq%RbZ$0J*BOihDnL)KmRwv3D9y&%Wf#K;g44yvFJAgS;qo59 zXO>aNYmb9p2548UH9+shZ>8$qbtZrNf3g6lqVd#KplxJam!X)bP#B)hS`Q;|J}W!g z1yCaO;U3!wgHN;BGW3O`{}4cyo|vrpaZUaaX55(a>(fWXKL zC~9)z>4djF=|z>t<;D@`dnY^PPO@EP2J^CjZ4BVo_*^rEF3s+S>NABroKxjSTFKi6 z6bTru&)TDI0l*sQHHGw$adUixc_c&FMuHkHsBj@2!Iydo5A>!%pmkTJ?L>f+#CK#(SNn|#^~#5YBfogtW2n};&TeXiM=_ApyI7nl*EAc1C6 zu~_p67z=yZn_rggY>*dIIar+TQ^3 zZB;(EBS25~)*K=o|BP3b^Cae1*8(N|n1FlIWu7M6#9LDEisDKeZo^A&0|jBr-9aop zr7OSs9{tx?x}bmWuNS&ipVWZml5J26DnqfCd$OGO)l8MUSROg%|L5q?W_uL5h}GLg z9TK&(@*LvH&_BVsp_K}3hD?U?2=uDqnXl@zHd#;8_tlADxM2GYx~Tui&44>HPf>i zBMa&haX#{#Xgf>b^SmM4f|=I#MJSJRooeSi5NB6=rJ}U{&<5PG-#b3ZK<8&sd1}-_ z3NX^#P`}}+?(khPfRo)@QTBoJU`fA&&k?J?dHbXG!*FF=uPrCrZTIF@QdGrw(Ac$g zf03_0mA0M5iO>$2S2xXcukrfVK=b!ZpV;BpG?or~BTdk%4n9f3kYwX5hhCM$@$fru zag0l7oqaekYjYsXMLVcu?9U>>nTQvFKG_>db!x1*6dIxodduj;2H_<6iuT0$J2xoC{^2b1^YIt;j3`Z!HSo$#?l5-4rL#vf) zWUv}6{?|rx@-4y*8(sXBsz|+I1^=`P6SE?``L;o?_K@CYd-9jy%sh`Hp=hSxo}g@o z)C_1)IUjZDdo9S|f-54F;;(m|S{X&@KkqTSQd1&AY+snH8>LkuYbph5deB2&DzdNH ztZt)zK=W(^d$#XJ&qtveUuwWM|B<|~4RMqaioH1gffB}1K*#tLa$t|a8Vdx4rmr>4 z&)afcH-U~Mfw#f|PzYeuev}2%)1*fYfSS$tSlOC}QIc+113$tYfP+#57PV2{JK*pB zg`v5t<|MvQAx%FPWWia0n!R(Us1HgB0Z?hT>A#!fZ@dp&#@JWbn%!7D)TKW-_BV_2 z&_R=Lm|>qs!jybM<9<(29&MmGmtiLJVt*f?u!?>;74v~N=9 z-RRlB{ik&I$cnYyDi@(iKu}*Dyh65Z?DX2d5{@Sq1KefY3fk2q(0`)#NKX z!K+#^xa8or6 z#%oD);7Lh0^}S6t21&&E&YbK{j1wtzDxWF^bFx3{yEIpQrVj9npe--IIYtmlh zfaJ%y%yBkvf9nU>lcsCi^~SH;{Dqb#85xW;xgEh_$=rY7KS+}0>zwk7Pl&FG>clFT zS9Pwzbx1{_f&dJr#ZZ3acIyGa*WVj%22+wq+C|;cR{ik-29TG6gYo8`&dxd%ZcX-_dYb35a9Yea1ay{Ztrz?S>A#;ir;ih&3FA!s5@IzC(UX^fI30z0PaWEMW0YtHw% z8k7d5b2XtTT)?1_q~lkt8y~Yoi5$%h#}{1Lx7GzGh-tPxUB>97nOJGhL!YWbdU1nbCTTHtNer(lMvnpPzY3?$h$(P^@RFEfwu3v7nQ|?6%_;C%1ki`dPZ(7XXt_S zr%rV)Xh)WjQa|U>M zD_o&KKTnViPAroPYUB@e#cgMZsofGFWjmuSBMbo9*!2EQ%Xg;)PSM;P4~`7|ldr}! zY5i&@y+ovW;n@}~slGt2SY6S^tmWTwOK^+rQ~>|JW8%<6#~=iP@FuwXHu=u+pHAwX zmDN(nZJle2Vf^qUNAp3xA?ru6A3+-{Aau*aUn1l~pxy4p1 z;>P(V*-$O2qLg~=D#JhuelH-3;y&QAzb$EGrU# z%de!jk9R(;NUo#i5jk$8-Zlnw@_6R0GKS%v`${|Bc$fw*r%rv5K8v0m2FPYGo;4 z;%l_p_s6E#N|0}?Hsk(gB8+RS-Oj9>d#5|E)4K^&xyr7|%`bZ>J($-?gVfJe6@pB; z``hF?^t{v$`bBGt0*kVATX_NihG3}51D;MC>91$feu|`v+EToU$*Ux3_7Tr%->~Ru zFwBPiJCe1uRs`8V_B=XgH{hE~JzZPn-06GgdC=yX4PT*lo@jMGZN0HcjRoM@56!yRRh(@}y7OV#fdD+p@)vK!4LBvQ?eyb}ut`y6A!w&hUC0zxsed zZv{sMZ3aYZAd|zdeycbkklM!C85tvCh^BCIsTbPYW>tUZr{hRug4J&ZSn;5D4 zkCe!<7hAK<=D-hqC|v#p8My#xPOLjXBS{xLO1?wh!N^*9ac=;2vVcbgy4)iKd~44R z<$Rd%Ywi&75>iy{&nlZvUMGG%5YqizJA}u8%h{(WF` z%mjtK11v6xpt)#@gmdF=t<&00X?-*j%=gemdk-LV~7*zaI~JANiw2DDJ0iFZ9F*@&@M4BJiq zFwSx#MMj3_tD~6$Q&WevA?qHg0$WzCRYj@VK@CovTSH_C-J?Qh!&xV12EhHQ-Q;JV z`+83RP!>Suhz8pa0XX|tQvWLGQa;&SWgdK7yXZp`o$;n|mySdW*$3X0Pzhmonu1Le zZBtjKebNR^y}h`q>JKW8Ff>L-!9!z#f0E1Aw;ySw@92EJmDt-ROrtLhPSJrT;5+d5 z+hfx$3tymlOn!+T)MpKtCqn7=46kpf;HTSX!(3wgh{nymoB=0ik zdIBB0EiflAV9~=P`~4so$yvk?XjbZtLu=Oo^m31u~Oqn5pNf4W8Pf2Glm%F+~B`yNtM+uesK&Ug*6T-nIS6&OY~B=j;e#?w^p zWobCCBMm2&xih=dtmm04SO++I0zLVC;*iL$?E?5?QG0;&ymp|>N9xMH*Y7)ysaHm6 zFN|cR+whD}%sWopqHj)zN9Zg$ndyuWMIBzCkT2+cYHT~iKQ5?2UfSs>nXPgH>c zLZ8`n55>iOAAw6SXrPOb>Aj|#=tbkqE9K4tuS4w3f;ts)4cAg}nQLP5jv<&40MjCD zDwl}M;7z+}WGUhS*@{)0K`H7v6UXV`@%zM)kWvNH2LEr9epV-eaT5Kws_G&H zUXRbncC&|>##?mJVHPRrC?}M*#vSTP&(STj*ECx$aIGo~HFu~#%rXZ4Ze5*YAu3?f zy5(Dt?J)B@)4G8DJsf)z6yFsBPJ;htK$a77j;tEr@3hvhS8xGr0pywXjz0!jrLsma zO>zvBVz7+V-@2ic-Y)ti+y%e*V0~)){-Usx{Ng~)<3kAG`sG?TfhmZswoqe?`ZUJn z0H+^Lo4*p6Ym%Ogn|-|7C!en{`?{&dGm2obdl+%Qf7t|0-v!QLr_$?WEe#|f7>~#% zZ1W^H)bG`bG|hS`du#GOk|8W1OeOftw%awUpQ|$Ykc}>jOWCE}6}8U#6I3(nmu72Q zeKSH5UG`V43HGV3EVVa~t*8hEJm^)BvQ>Qp=Ov}kZgkafd)%AA1_z!#K~jLDrzjRW z!Ap@Sf-XXUZ&Mhv!tFWu+Eu(-vzP$zoWyu%mh@Jg+kJyR*L8-kbS0~*bT6w+fH>^l zq$@3O4z@gE0(o6)IoU7!BE}}x;<$3g-#1rO=^pqx64loWyR+Jo^E+OAz{`V|$DCr< zT5>sA)`J<%czoM;*>Fj8k^4`kN-lc%m>`i!x*j2+qooQS@K9?UEnTvn;{&G8dOw<8 z!-KN`6D=OyS+p?x!^BOcdmDEqOx!%+ZwtNsKgu@+ABHa8_~oo4pAe{hE~8~%X7t$+ zV2|4RlIuzhqBu)M6HbK4lO(y zn5lI)MOhbS*qNOv*7Z+G#v-x|2A*E?x5uAYcw3WvO)@zfso27&@i`-9np^5y1fz3w zd#)XB+GPebW7zsPy#jhJY2c#rQhrGlX!+BXQD9U7)){<&)aaE+5*+Icd|ytR%@{N| zfiXqq?#pO`ErZ_PJ?0T~CuVCXokOv6EMp9Y&1IPu0egwSv&4oh+|&H+xUA4RQ!_r( zBLyJ7%!8B{>4Xdoh<|A$AHD?L4qEVRbbB!1bU&BSjC+*<;}D%*CjHpSWEivZ3d^W* zP;EGP;@8YbtX)=lo!L9Q6_{kXFy|Jl65G;_n;{J;nLh~BfECz7Ol~fA$1H{dohe

;}7zy%3}x6nC5q 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%0AyCl?-_BwuV1$_>d&mkdw*UD=>=D(F7P#x=l# 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

    vTT_bUut?^KET0j7KU5F>`7Q+cYUIYpPW}^B=1D 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

    V$$zY_L(R8=Bzt$L*-fLy})Ygh9s8L?#F%3@JR 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%0Awo^{xfm|P96;4cWt2>X;Y`}vYYG!jW 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�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 z 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

      $PZqK=?E_IW%Vh>6VL}oaeiUjpv}^I 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

      oNIkOL{z${C@}!FD$F;vVgr3v`;B%p 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%0Da^ScBtU~et6M{q$I|?fEkwo!e~Hr zQR9B7ux3VB$1i)pC(aW#~d)J4C{ zE-I*3>n<&GayKgtNY)sgc58Jk1XQqInACm7=NL6{u{QExZ?|Vly})Eb5*8?x6bL{4 z;B%CmRjm#g1mNY8x7D(#0e_EB1?Mg*;%&jkN7)dN`jp7Xa}Us${YG*g=ur1hG=07T zj$Q47EsW;-rX|Rp?3g^JyC5hf2jCgC6MpKBXT_OlOR)=R0Wl(Z9b-1o6et)-Ql88Z z<=F?DB{bQ~t{y{4pu99hXF*l$`>{b^SE^}+wnwb$r~v3ISdOu=Y6dhW7@2BVFwB^; z)YDNSy`P5S4deR~t6Kdc^XS~Xcj((io`kN*l6Qnf?otIXhdu|wMwSnP%28eCC)2`| zh@nW>ju;y1VJ+OWD$p}%Vvz?BHAs}bP#SpnVu&{KZ6;fXMhoZA^1NC!k4aR>2-;;{%)E9~t@F1C(^J)U)6N$w z_25uK_oMp^YM!>R=dOrI@uImRvWk^0=bJ?Hr}Pz&%Wv-UQxYR<^vu>uX*JBm=ESd1 zqkHkbtsas}&BD67LSGV$RIO`*v0A8dYp=zc{nqC?aWj5-N9(LXlA?)_{EVKt=whzg z^>MK2qg8hROclb@oh5zy2b>pb?|$^R7Y-E_I1mKT;x3NmyI?7A|8Qt575}(8M8ko| zdwQHvH?>eK^#qXPRQ`i6exhOIT9PmZQViKsgo~Hl5=jzp=9%~4 z#+mPMl{HdT9OqW_((QVSo5yu9Z;3jrNpHsFNg{Xu35xZpZu8EcWV!NcJrg^}b+!D} zN%Pl{!^Zf(_EFw(EC1qTMog7PcH|u2k5*sqt4or~V&({AI?dFZ98wug$d;k|dx{hF zl3KGhqtWeQ_8VPWw?#jL?P8bBXGI3Ti|+(EX1Y=o%L0E#M=r^`Rhu4<-=S3{(tmV( zl@sV#DD<4n9Vp-gyHEfDe$XYk-aVc@LS|cjFRwFz&NqIgZ1}#Xd8WEX<%D}nHT!eh zC0SPysQFm`8N97;PB|%Kh3aj<>06L{EG(D?N6moIhKwr>8@QKh=ShglTWFSJ{@lDm z+&FyQ^GtpRLy?$LnInJYidMOhMH?>G@vjE^W-86s*54j_=JFo{eI0l7jO4ZaFbL;V zRI;sYdsEyrpZ;fJg_{Xm@%~wGIHyJoZ+^W$jGfWwrSSCp9eZX6fgH;Pa`$S^ww6Cpq9!Yov_egE$8-K-ha z#r2|~b#;tz&CJX1YZ6Zsjyp8SoW!0_6?Z%%_Av)JGldNW-J8;Mv01#>Jokx*FiG*P zi{+i*?viap$5z9|Ch#h48J2ys@(JpkU&5i^FV6mz(9b+#m$fcTjQV~%>ljv{ig{gi z?a<`_12enXr_i?i0;aRSLFU{Szh_iF>YLA*1_6+et@S5HNl&)rH$SW*hhF~M0J2Bj zXWv}hWn-Y&eNN_?h_+<<#8)Pq`o^7jVa513<1SPpv+?!R`fPE$f@78V-PC)+j6HOt z0_Nh#&BIdr3SiY_Z8rAr?tJd!LDQr32@KR~;asa4RfTX(62R#mqJAGZm zuwPK&2`tY{t?v21{NxwGA-G{H(+>fPu};yKr

      I%r4tGbMsrqZN&}HWQSroKhqo) zB?t8}0LfMZVne}yT|5$7>3N}^OqzTYS@_4Q!5WCalMUG0J!RnhjY3yKlGzkRYRgCG zBd-OJr~gaKEJTfY@|R}RU@ua`kRQQ%3TNxTA+HSczn;0+9IieDy0?g`Y*Kx`GxLvo zuxl%|Gzika7PvJY!* z64YyKg+bj*uKSFOTT0t9z4^qF1)=JvSo!(+IhboLO%v=}9dkMfr;+X%dexX#l&{$oObTM&b^u8SW?F|dSoeQe`hxlo-yF5UvXeVkp#r2tT z+V=GmON~Yw(rMR)OO6Ke6H6^W825czUN!>*$Ygc%tdjoLiupD0@3;b21J(L_awo{V za7RFfGyY%2dM5b0vLV)T^(gh;*WYZhv!hurqru&6P>*7zWi;-eSw~uDxT}V064C!q zb@Un}GgBMybQh5=QoX!U4FUaY`sWIDboYWhxIDFS>`eb+IQNQ&=W}W#Z1?=elAdT; zq_dP^RE3C-s)yur;bvACPCsQ5sR{HlB?0`3D}4g==Mg|8kKt30KP_|7#iJ{j{eKPn z2dbnUsr{~LZJMda8i$7|x_bfvw06u6eqFfYy^3h=;QwO10FKj0tS-+gwaKl@n2m-l zxhJl_U1+{FEvvI{S!tV{)V{7@w!RVep$!v(<-!&1C$ZRwzx++}rf~Et+F1?mnL^xI zmc7iTy}SG9NklEDw#8#s8MfZ`WTWogD+h!1aXV)*%I2Gr&CTMo5#Nkp+k@YCbjn8} zp8LDt{8-!n3Pc;Kmz^b<{N~z$c5Qkh`fcBV47IOmPS(^9r&@RUKM>!44#dY;rQ6x$PlPP&^Brr->-t zn3_7AlfT5@-~E>8vY{)2MOWU^{O*eQB33Q2V4;W_vTo7c>ARJm!H`?gVt(@d=|kQd z(&RoL)vlY!ezB_OH!wy6gx@i%)~5EL-T}afYQYJ6yjsU%V|!xl79HiZ1;7VO?r%1~%xw^*Hk#18Whg zh%=kyJ)uYkE9RAxVNseYX@!_WS4NMQWVC?$!l5~sd8RolD*$h63S2O>3eR)Q0i^1y zin!FZ$mK%j=d)H1cXA0JJ&XVf!IbOz=Rs>_Q47QrW|!ZrjYA5aUpP42$V+r=0ngNR zmluHGbs2uaB9W^u2uim z5t&8Ae5h5hu3R`VHcC)Jdv~}6Lj{Eb8L7P+J5)R8~4 zg)>EsO)*!Q);h+-j@nSz?~+>&Y2alSoCCJ;2S8)Xwko)eV{%mo{X^VR+pJ;^^U})5 z*fp=9c5TmwVa7su>PR4*HQixKT&fw-ZEz4x3-sF zD1+wx?-}!zaDdl`{ZoOZM^W(1P3qE?^pZPBzTGB=kqHx^u1 zW|a*XRmxV+*1Q4J!=3x1?ZLG~ZwU8Dl2&=jkaFp{i=sBq>vngIGOrTWV|ZQ>Lmt(w zZV>b*bt#9hwhTm%2l&siO%hgg>8c?FxTk=a=G{LcGFWdZgbCXC!VkacBRZ7kE{UES zmvam>D*A;v+c(T?pHzO?9!CvJgpq(3H>TS?oYlss@t=a}i8AU7&j)KhX#g^h9phOSbH4J6P|Z$3VoX{NP;d@opAV6g$~I1Apcv zcC`E4dr;%>_vBN*Z{4RB!hefAf1VDCN9}>bBe38?)j-*h_kS;&A^YLa7Y>X+oU7Xu zaK$4$wu~l*G-9aH=P&^==2H&|i*8`N(YY)CEvzs{64FAqcB#;ltAV39!t%5y-{UJ; zXCK_Gn1hsy6MdO$bz;89e@7nuv~=|9QyK6nNWRNL)BzHap}qEcXC;NKrN+WZ74;i=lohb9RNnmO_vqn zh-1!L(T?jEH+9E&GPP(rXQ?5WGF) z2ZuwYN7*qk+qRW8>*IK?w^xRq$rjM%7$Rpm@fi86qFM*S^ z(zgN{^Hp`C?Rc>PDq&wh{+`1nZ{@CyPnH?Gul%N-068_@S10JoEDK4?f`a+c%@75>-Tb_6|H`=iBq-9cYhHgVDhu){PNC%s9j7E#lUYrEes^ zDrShvrMGAm>La#?W6r?K-FOx*F>epI!UOUlJA8=kFZ9AV4TUflWn$~pa?i1j?Z06D zVf6i#>#Lp~KDz=`%}n3;aECc?Z20dk3+Ws7lB#^S%DHx=@9lQY@N6FxW|sNW-ieGe zah1!Lj4FKif~Z>vvEs2}$c)_X5xHHm*_g3Q))Mzwn3zZl{G$amKuVvf!Vs!VT>oS8 z)mXcZa$UL|`&O{}TqZk)H8nN|wKYVC$+ale6zhG=WUvcx??SFs8^LE$~ zT92b!o^BsJhIo4Z$JX|q{j9vR)&3gAosySo^hEQ2BhA)gk}i*x{>&*qss1c{Zj=VY z3)0g`04^}%3L??GD0q#Wt&Tt?+O%?+A)M_&@slqP8d#`1BNj+uH6Du~p8D7L-TzEw zUGGL*AQ|}9*+0Vs6*T7Woxby{cQV0a0{Aj$OZ)aviEIjZ(D_yG_|oURjS74g2{ln+ z823D*2(C$$UebF-HwfZ_x__znam^+>GH;ws^uiBXFYs;;s7mzQs3Wc(29D#&6$LeqIy)yT48mzEl=7;zBs*_{tSG z`hwX|gSXx`?q+Vz_0f{O zN66&ot`gN-`GA}4(BuDQvh+DY5f1P_-v3)>8!L0ZfL|DUB>)}|XJ|g9OP6MX*hO=y zky=u@;O#wy3GF+-B=H%&(CppeuKz3p-yVrt{tJww>{0w|{xM#^CvSGlLe+(954sXT zY?6$sV(+tVB)xY_ny8%a+PHiDzVGLGMb24x(%iUK)-ethy1te%9a`uY(8r z6I_$-I^ZkN8o&wJm2Z<|`L6A=d2vFZRmP$A#+fKr%6+ZFY&uc1Bd?`3AF^6Pq5!E_(Tk6V;tw!LAHm4jJSy%Q++*TDuzBUFc}* zT>ccO;WRS@w+wspc~^p4eDJk?NOrO=Fygn|DG7*#CF8xt71w1f=N&$-7`enn(#a6a zHS<0>uin(ny)M+2=GLvec-N&oa>9y-C)s7w0)odbgSaHur1_Otyl2~1MDl&$q3ib6J=-uK{|hn1ExUcWTf%3*vn{%U+d&FC6a zE=}FPDN_U_QFVCs>N<_7S?N(GDGSJJfUlC(QqOWkt8~H-Q7f&e?gkb*A8w|bDA;Z6 zd_?s+LOsEw^E&Ddi^D{w)dbi=$LFdbu&oOsE+aOwXH=0oHCy<&-**T0VX|%-IZ}Yx z2y}BiYFjTM?g4_0+O~Z6=4?(UJI7dp-W=D!b$sOg_^@8{1)(c#!A-WV$(a5}+ zyFMN*d0VzK2b)d|SZ8+OU<}P>m*x-87R}Y(!gCA>(Vb0)jM{6S?ae$=KtO8p!SEtyn4C3E zKT}3NyblONPE+b8J%-HZCf_9UxsVm?hWYTd5iQe4)YL}Q>GhWhU2_)^9@5UZy(!Mw zxD8%Aw|=i6*#w$oOM4iAo-&j@vyV12#iN#Q!A<3z)#dPO1*?Ug!RFZp*+bJ5y1x@N zCsB}gfPTg&=8P(0OK0&!E&x(un%A&JjMQO&mY)awe{reC2>Rixr26Ky3OrX^UK}ky z{!Vzp6JI5iI`Liaid188eAq`H=b#GyZicKwsT=Z~`vCk}>&9Dka7;^5!=UCUGd$S*CWzL~Ow zeJvQ%JJxpP^seN;4J>#4xBS<=S*OUgg;$F47p{Q580~weS(;%AhY+^^zd{^Sq*I8a zW`RnFuB7$uq{nNCbE_;kbz?*o%VB0Vp0^9O)eT@3dPEscN?YhrGAsJ>b12?k*1^^p z-WRP?a(B9s8fpcWN!^e6y;`0?2&?l~`DL&24)s4HW*Th%xa~rPwd%X7_um~djQQD2 z;{w!4+SU=evnx6TzCh{)ohdW-5u<(=4t4;#a^UzOM8MsI+x*+}lJCjS0~{vIh$zp9l`7lmaKpb@y4jwkmenz@J!UYoYcAy+f$vpbQOYa#YysoOQ;> z{pwy}!_=datfVdv^UaouZJtT8u)=15Yjs60YJW~zm~p}K2+NX`t6rSVN<<#?vZpf6 zhZmhwh3FhWZSguRoyvzLgWGRhj1JNA97f&n$Pj35}P{#a@q#+ISg=(xGH zkB&NhSk-w#HW5{tcZ6YcIGa_g4R#e<$y z7gwjec5b3-AfTsD_+c13l5)L{OjM^@c?OtkrR*t}L5rkdB%^7LQ@7n*VOT?4s5zBM_ZQRNng(=aV@rL4Db_PtRx1<* zN~6uYCldlIlxHikqM!l5eCfRwM|szu(FqBwa*UJ2lb%&R>BP z;9I>((5uV~q4THUwRm2>8E~cFqpcFD@&5eVuH4G&O<3Rr_PZp zO7u}0QwwhVJL-t{wf)ykEq9CI6zkO(99bPwZt_r&>E@Pb5v7}=3r0v$Ejl61vNZeX zXUx9vbBQni_KaHnx|sS>Rp^&6)oA8u$<5N~Nk*LSJ-gowhn?DM@tAojg6B`a`yQCW=m5h@Rr`y{e5|EY;D_?OX4MU)nK zs2HT`={1hP_MXQ>)%Y((rW2pv{pI+va>Mo&7D)H%5waedimR4_=H94N)qmiL*Nc8B zv6uby-x6=1`>t#6Lpcpg@iG<+L>T`D@07Gu5B)bxxlexD@wflY1-P{AmnjllPPtQN^EaA^Cxkn8Y?Uyz6+?Rpx(hrI=%jOr! zcQo?Jlg-HmdMi%khQmHv6PYg9bDckO=wlt=&?($L#mR;f!xz5kR+h9ifEaLpnX9Dy zzUOX0jR|!Jyc41^-6$`A9O$?$nV&RY4~^@p7-EpAfE$1MFAQY;k8Atoy*sx0lj#vW zHsfMkbncF$o#A58)wPnrUkHuggSdxKR2KT4Z%V4Y5WYNj0*GMu9w)_+LzTBY9s8Fm zIw|>^fBqhFuHKeH2bK&Cy2G*jZlZgQULchxpJP zXFV~M%jgZh>bIa2rr7%&DwaNP5}_YwOmp#i)ZKVj5b?BKU0CWC0MF7nGQKb^=v%hc znz;cw@SEaT&fis;-6u*>q#5- z98RK9-h*T9V(z%^I>m`{e2uKU&p7JRsTus-uQak1h9YRjW3?wxlT9CKsBQU}6N5nf z&xlNu3^_9W$Ws;AKl$*>t?xfh$hy~ONO$jM%;aA|bsgG!FS=e2VfpeNSjKyWs{f_9 z#gA@=-q4JApBAzbIhQHR{}fcH-Lg<&eQ}Xp6U)t6xv>AnV@45t?vrAW)mI!{FCy#n zS!=SappO|~$Ub>l_HVL@*rWMe?%=LT`0t?`D3CPFM}DOsxbT824gzk(QiZ!&;Dw1= z0+^tVFV{}R9rC`tu{~9GsCDARQjUEzsZ}*t5WjkMsmwxtw9mq|=xATCD)noox!Tv& zb20z5a47B2DvH>x9Qfyz%UDK@9`0b`>_z-REyZ(#$Hq>%uBNw2rJCFL?DI)=1$rqj zrSKnOH!hU1UOGk%`nsH{xCPAo1%%hnLT{yXiYoCJT74|m7~y^K?3I zgPpLQh3Yvr(sZuuOOgE{MEl;^ZLn7q-=jgrccWY=!T(*}$t8(!bEDjhpIbkcEB@KG zc6w(_>-B+!BY0EpgTJs*N*=2vN&mT%=-V@nQnNt(SkKW zK5amRrSn~lWn5h*D)vf_39xc7@I0`{Q&(=$F?G8~K_1kV?_861wE0EcX5Z@UIZ%LD zbpF`WOz$CHtay0%4)-YKm~UZzz~cKaWf@Kio$rO9Js%^4q*42Zat6XO%>d+jaMgJ` z@rcNJRXQdo#vi7_2IvgcBg6BQZA2m}7ytQh8TOTJX35zRz7P$Gv zg<-Bj9I+bzOSDr`XRDRYnlN&AGrx6BrL0$5xQ58!=3D3bT>BD_6OPYEK9I$mM+HHf z|IC!T28aF8h|orU73vlKEsTB{V3iY7uEQv<)g~f6;wS=%%NpM&{j(GLxe>&9W_Z3m zZ~d?7fA(PB1iDxLAXkj!{JO?4DqN%FD7Qv+#ej~js$TLMFJ`4peDStw1c7)z8eavD z`Iei-xQUFjwrCRG@2QK?X{r7X6)<21$gLidf!J&M)OFq`(^b}NqA*dX^U=bvH#;?? zF3Iw0;Ym>HY@_rGNzH~x%YPdgXpZY%cEU)jQprUIt26di2tZP4kqLZ*bGGkRkMG4w zFuRwHlSAP)mwemF9XV?ou5(XmuBH?MwZ>^vqWdM;>$P|NLbM$XXMDU0 znh`CiqN%=X_;uZw|7jH1$-vThS;Z$t0=a&3l{)h$r+$$~w7yoj3EjNvOF9RXSe@V& z#v)k{W_wNRf#;Qvi}!&P2faLPW-DW^;e-J4xwTSV`*Orb4@E;{PdURMsS)8rvYiF{ z68oNC6lLjncc-RoG)x65XaGDe1ojNaf;b_M(P8@@`(5Qk_fUS&m3J^7_16isU{BT+ z=7l+Peuun0f!L~WHejqs`wqB!tcKhsX3`$k=bFHoWAzea#4>3N$$w5kXR|1w%n|xP zp?XLM|FF%Qx=6i^Jf_s2=Iv?=Qmh$%-d%IQ)Y$*CcN(P?)kcg7f(VE;DW(gOPd&~m zL6|EF24wUca-U^UUZM}LMRxLk(+3UiB>``%ry}`)uDJn7F}P};-UWdn_>Kb7LPu2t zZ@*)9=pArEi1B2*yWJ6YJWdf$&PChO=0q2xA()^8tj& z>!CJVSKY43Eyc}@fx=0cxeL06qvie4{eQoR644`W}&OF1^nT=PGeHZze*Fy zY*KiSe-q+UPO?V^`Zh6*d!^`tT{rWbI?OT~!f4PG>TDBfG5E#zsmmq}60T3=pG-77 z7o_H#{n!JrcSRxJ&y-|>{TJVO%<_it2}r7Y0R)^LFUGJ!p`6!QDOt%eLDmn$EaRVm z<~Dxfzn4C<*0YW)rDd#3z78J?#f3(qEJ=_;UQL}(rD;?oNzSOhgWhagA|Egwd({gbnb*&{##GEOXlrk&e+hdUfEJF3L3 z~kc((8OR0{niwJd9@MYmF(#ba~pU1QGOjEfnF2&?E>Uy>P1Re{tdb&vT{= zf$pX)Er(gC5#1+<7`jjK$#lSc7!Zq}+1fnjdT(uSlEMnI8K1P2v_@5jk0sGcH}Zw{ zBCMR9sxWg6lMe+8Ti=n>_sluk9eB?5`U4zlE_>|x;b;@Z`k4#f2aM`R@7L3 zvMPiSetWpN@6W5zg^Ij!+ABfHYw;hMoB71;qW5T3jp)nTn0t(Q^Lo7bsAyBsx*~#a zN(_>ON$X<5YD()&S&~}0*_G2=o;pP;wU-9?RolT*^3Z?LU5uTeXpXFV99ea=1%Z-*O#~zx z>c%G7OQe1Dx)#Z5nvq4cC{g&rOFya7%MLf6k>CO|;A2oB_+v{1bwNKSIT3#a#>{L^ zKu`Y15j=0#h3O7Sd)~ozb6v1>^fXtEGR$*^3|ym9c2V|1hn6B~v_5oy*dYt(FR8u1 z_pawC>8HxBQwe~n#o|Up{!f*_D!`>l^G5EI43T8d|IoZYw$85^$gZ_@{2T>e3H7=1 z8LNaVq$-Qm>Vmo;zE!u-WBW#rtT0se(igo2^|NHD*_LL9UXo}74VxXRWd-pQS*S1N zl9%;mj<^Yot}#%=j=D86f5z&MOj|B$H0|iENKfs<(l6yeY~Y66Vb?TG^r$D+;-Y1N z@Ye$wh}i%98gKnZ7lnL!v7l{$`=EY$Z@RQDXxsy~c=ZVV|78I%KTGd4EuC`0oTc0R z@^8=bjv@6`k?gC>&Sm*60fzlPKKw;CUQUFru0kl~2(JWd8b}tBlj7W{qQn1ui6VN? z(00tsDS%04-($aRXPw3*P;czg$^CmM@eAMUvT->k4)P%~w(DXL6=RXRq<-nS3AQTC$bGIKJy z0oJh6>b>+O_EyEFaMIiEnx5to=vLy-Z%3|eLC3e}7a3#r@S|l;mxci=iN_f{=OM`LW0hee+LEf9f%qf7Fx8{r{e45?sn~W=w1Rq2DdZ%Q;3s zL1y<9cUsWPPln8tFD+wi?)_CsitDcySh`Xrc;!144BiwjJ`zb8&A%s+?j4@KIbgWH zLq|wEz>B1@2cYOYO!Z8iLHfA5=Fef`%e>TgiyVJ7gClhpd9_5XV^1)zN{eGuP5n7_ zI;yG_yU(lilS>2?hJh(8#S28Q)X%)Q_R`UZL%ggOQyvf)C#&0f^c-utMFnER=vxE= z<=}JH#%t66eXK8^ey@u@5*Pl}wdbj9dU)}n&!`6U`1-;PjbTwcS0;2FRdWP+KQ0ZX zgVRX)S1-DIZnBfhcSAllPpsl0sC{#Dtk?{Z_ivk=vqjF&6zzq7{JY;#!xe=yH;yGu zM~hFYlqJ#T$Z|HFGv#j2iN61kS}TS*h0iX-P50RKJxm~oog@4V>)G%#zlHVuj%q6K z2i?CaqhdaKAtq1Viy8GL+^D&c%cY3@aZ7w6yl*Rpl}m#AoL(|}1&JhlnEwvYi|h6I z-=|2fHZ>Y*U?0|hkGq_8)#^4$Fo1?Xr|0;qWL&A|zZE{7OM2Ze7{W;*lz~s*ubc4u zC4Y-GIwaHWNlBs2qj_xyeZOw@)elDPpOcu4H2v`W+S3PHId6o`MTNa-2-enTLdwZI z8>n_oY0t%`ku@^!{#x@3b8+rp(bEHI2>^Xu5(k`G;i z{C^AkixDD9^Pn4iB%TV~Ezzb{TsHI_$_oeUo{yI|9p4`G=W5tKddT)&O zLeY2hME?w**&2qzm?_s!UEu4E7Rz4WgazLpI;2~g=! zOhF(d$ohjA>Fa`rWmC;P(`8watodRCru-hk*XDUciZo4Cf0S?j%WIt@h}HdS@J35Q z4NXj=xwQF}JiQe8{Bq^%Usx*MxlXy`_oQs;Ccn*#e0nQYg&S$$wOmj9`7XMO!%JQK zX4yoo{fcvDVsLsN5Iz$#<_jDvhN_4c2{q6lGu$k3rYF@ia*X?^qU{7L{TFCBo7!g1`_a+oh@nob?K~T#_iRV+&xO4C;K+H_B*Qa1z|oU&BR%m zz&uJxdy6?~(B%IvNyE0d$t0C5*q*WdR88#{HSTaen$HHl+KHRy6o{4+zo$T6W#XrG zanFhz$C4v@PNtJF>!xG5Qc>Ue-S>zc6|&rAcTKRFl$OPGeuF&4dOs_^>Jc3z@kMV6 zoBgkL{;b(Yngpr}i`U#oeNhMre^EJMl#>)T7t{~nl4Dldvdu-5th%vMcg326&(@8e zpzNS!-X%djud3ZY>|yz1f2$9z4BjMt2J^OUZMLh~FbAlDjaNSTGg!sqTwPwn`>9m$*J@=+1r@ z@v@;R5$$V5cSo=+{83-5eO0i?D&X#V&@l+8(+>njVP?ZT2^*Ek6#|aktJ2!~_R!_- z6KcDVC8)az_gs%9+aG52!NEqN)#4JNSjhm)CLe#!t~k+ghOcVp3_yCOP~Ay0eYxg2 z1qxuS9m#5B)lq)VE>`6e^N2iG(|9d_{2bQV*L5O?)}w8K<##tP>7K^&Q=7-o?Ly8v z`vqOJkzi|r-HcfYuz%mtN#D)CS2NAGOCDZ(ut7ZPofNjb10`y6ZZp+5sH0_8QD(P+G8rcY=b~EF{kl$ z^M<6O(y$W1#TUa%IetGlpN>p6vXvKA(Xbh^^^b|6+?MoXNN~+5m~-oei=y%Z8lc1 z`rEVY!k7NO0zjK%b;g5JA28xulo z8Q#E;qU$FjX0pji!gtn6IxFnPVmYbGZXmw1gB#p9@Uhds9ZC?Ek;EJRTV_2Dw zkINXxt&+0Grd=RDYsH(d;n1kocZ= z-g!ssLM5P8>4p+dRu+_BQ)Ys?p=3+f#a(%p@`XwbLeX!q%NFdU5@tJ#MG`W<(My2*5C08GY4zJI z_6^8pv{LlT56;n8w^M$0Y%e7JU9R}n@An3_DxXVx_Dc5AzyKGKSG|4BIl}v)dX_=*v6NDp8$!bRcRGu^J$r2syH!*#a!ff}^ge#y%R7RNw z72h@iz|=1cQ@D1(wte9k^}KUtfmU)=><-n2B2k_$WAGuq0AOSGCnIyoM*oKqN#NI# zQdVLRF0?ZnjbF6cmaC{Cl9sY*VyCFEOOwHMNh*sQshXGYh~4vx@Wk%tKSrC5|1gNa zB!6d9?DMV8KM2h99)TK#b#YqSqe*BU0lM_}e+Ze+uh5t$st8bSrRS%?f$~HZRpc7@ zglQ&h1?x2P_1Cwzs(zAH-^99##2d`EBSdX4i0o zbL7xW8`INoG-Uk+Zyq}%=kEL|NZg^2+{q631j*)VOa0}0cy3{caQh@AL0{D6iY{jF z(a+uxqsHPPHbqS%UO|3h4 zjbMKI9W|AA`P^KD1MmEAK1-uV0Ysv&Lf!Sem{$J5?@qMX(Ex$`^G6~hmbG74|Jwh6 z4TH#KpXoYx?f7K zvh%-9TE1kEWx$v*?z36oHKa|hogB=qTRhvpv?mPj1YIp(4h?y=*1Jyh_KO)U?w>j4 zPMagtS%mhyt9~=}S+dvfgoC+>VA$&C6kmr3wEOV*`p^O?|J@BQ$qN>L&45>S$GYB~ z#Zc|4Z#TX_O&TooTcs{KY3__BJp3P>uCTMUJvi1}bUA5&*BsheBRI%}D|adm&_VMxVTPD} zy-`~)^2YK`U!w5!@nXgA29nb%O5A9DXk2^j0nUVN%Fpx7Bf;(dl~C~GuWY;ABWIs2 zto)GHNj_#!6X+XJ z1gNNaW0dB1B^prvaMq9Sr=w~$rXEKM(DV9nWu^zIb6QUaoZ?VOLv4ng(P7-4;Vf=% zb~W9-pKWQ!{JtY3%9{Qao9~v9?*fJiu=`%tFJCNLz9>_D%!hvL_-!UkPf)y1YQnZ) z^pv+SIn8xa>GP22rn7M0yiV~;Bn z-p^->V`d*@b$t6H>$8Z_djN`)#2@;buUTR6OlyuqI*rS^LY&^7(7RXS7Wr3KtXiTs z`jn+D|Oz3^nBoKuBGL{3-ttVufh1xo{iCeHy|d9L&eR`#}iEI zI6{Yt9Q1@}gZ&c?{Lua(`0r)s$aCTz$d|UHoBwco!Fh1i9oP>PMbhFcenP<5F^rX; z=MZHr?9`F3gS-6!bs4J#L=&6SR>}$Y49CSS(97pR@NGqwK|rOiM))_vZ)R0L*G9j6K-d?4;M%)h31Zs{<0jM9JHT zzX<;jmg_4$9L_gNwcfKrmdypz_f%gj0c#4MSjqDwd4KZ8e8|kMBy!Aw#>B5-c4vB$ z>!a(EYU7jzx2P`q^zq#*&{(+oVFoLIP5XpEDRxlPwJ5EKiM(VlTpSe{EOdaR3zaI7 zFX!%@qGP%*UY#7nz*1v)w%~ysdCG z0ARSf983(O^j!&xpxN*ZBWYY+h%pGM9SD>2jaWfK4#iIR01a8u^CWb5x*!S_o3hV_ z%dQB0exo&Nxi2Rdc6I)rLSnk7rl2GTGd0*cb4NU4gPnoetGJS^vB*3us{c1ma3xms zgf42%E;i>jR@K|HL>ZG+vifu8&YMv?8IimExSi2uC22Wnd%ZVz)B&gPBSYd>HbGLF zV43_arUS#|ye5kp`LA=|*GTE)fg{S?nj}t&Kf*zoga5~4XWRI&`FX6=(h>3cJLU zazTIGlOl@F+Ps&9&CgckI?6U>lQoG$no3W?Y&Jpa7@waNu+)T0OE)%9tK)ai$x#=g zu`^On6@Mzr;imA6xmky{?VLKBJGGn>G?-|3}7 zd!31=1RFbRdQC!AqVLVTG0M{t`R8cg_R0DbQ%N&P5Z_2E4s}xri zYk-M<=M6WDimnaQheZ}gYkSje+#VA)!uQ>V$H-8Q*aAipUE=Wj}; zHE8~o6(M8;dc`wifhmdWDXM74WAd}Js4yG^z11kZ(xI3!^gtMsZF38JK@A}>?9>;} zFs+@(LOKCkTT8)l+wOvM=J@ou3eu*&y%AQ4V)DLv{NeGA^^HK((@`mL_NkI;`Tz5iu+BCy`{7rIC#i?;exdd4%h) zJ{`rk7q4&RJ58-yoL)AO^*-^@+0`c10R&xZ`KDRCiG0g{ty*Z=UIPbXk)kL5lB-i; zD0L4<)Z}oV-OaVOwwa0`IEv&;hE2!*Y9xXH={65s>15-ItWiRojZwuSrJYVjTR+oV ztFMMF`U+Q|L&ufivK;HWK+~fI6Ac{b=qt=WVv04I6f|rZE^-CqHvvoCgShaRx_26m zRx_z6^?@39W9nG+R)N5Do1Rpjtvy!}tR$&BiqBPIG1XI?tLgn*h2C*wC9_|n%n&PV z%ZTHQ8%r0SdFx?1p-yJeN6-kbsG{0D3pt8q zhogb-i|Wmhg8|mhwJd z$!0~%#w<1yJ3AAAyMfS3bzs+K4BCuoP368VXX(!RKkAm3ddqGXRyDTrEJY5jo!vWg zNF_c#45Vp|irI_dnpnkn+Av;kbraT_65=JBLy`5^4f^h6i;CJ#+km-X_p>-5=xn6x zqRyT86pu=~{sgsu^e)w?DwBQ*Bt82y7GP}d4s@xhDv@8etCnV}nZ%a*y_s-u$HFe# z^JS$yGrx>lV7G$Fr*8aLD>%v6+nMO|;xeK?9sGJ%pLdX$6#*aH8UC)R0unM)(*!{G z3CiOF$>Q#`4`H+0QPL@pHo%T;@R^P+3GWMx4K(ovHPtIUWdwc@ts6c^Ui~Dx+j5Bt z25=0jpkk{|OWLz+;DG?#xvJe)j^o2(nkT!T$=3l#YoIT(7kJ{YnlUWN=&#ETs{zjA z-Ejik%EVBM2k!(d?no3hj+^@y$3KbSBwWMa+hU&C`lut{EZJ`^Uze~_<;uq=kI93Nohsw|59izXyOZAd9^+b$u&Y}eZokWK@vIt_ryQ&p9?&_4NK`Bf z8fUV(C}T3DqVQs)yivaz{)1j%@{9gy?@xXI3SPsrE((5=yo@j-(8dMafd*;l{beRv zGI5@%d|De}@;s6$rHirZA*nTq0^2Ju>HBYy;6JS@3iN4rcj%{U8$p;wmB_PtH!>}7 z;`M{vVw;Q;hy+~UkxLn}PIqoGsD8h58N=nxwck(|{Lt=|vscmQ;PaF8M-(CkO+qyNs1tt9egHA@>j$Lbt4_JHN_ z_ly4I0oSZoq4)(#7mu8zT3(vlfw@0%9}~&D{u+`T_SGn;2hFY5fJNCIxzfw#JHqS> zP^(AdrT2!6{Od`k4CU|ipYeBdfltr$?f9#o^@nf%B|eEI)_q<7BPgP_Sika&zfr|< z$>NRouEEG2S0>lB@%NOGP?2+z+{*;BPAoq}+P`%6WcP;CH?^vzR!!}{ESUAvQO03< zA+NPhpRrUQW!Q0x{VK4>2eqvp(NF8-S&l;}I-6-+w5u@<4VHyiAVeL*cizdLxs!^O4s!$Xn9v88j}{5PMqL~`oe{s>u2ZJj3Cl!I=Hw@HRo7#OE$ zeYMrk@+j&He)lYs*^PJ;WKkdCMGzzVFqb-Z4#!a+H;6`hhvRMye5%dG#$-BVotTw; zUO@Jn{tVBljdO^A{PKZh11VA+dMPDVh>FCGb|Z?>fDVtJ$}*I^O?~xKUdpo`0Vh_3$THH*=%0t;*ApW)IFb%Tx%-4(=TXTPvr_ zIUD%g4pv1k?w{J&;Y~Un>LmT)j-(vF(2=8L_k+U%Md6FTQsOTKb$BahHSc~1aO1Ov zo>+5I1;*LnqtmN-KC2emtLI~ndNEIzA3uK?yzj^@EIKiw`g8`9Qp@i~v0{qu;F0Z+}eH5 zH(AcJQRuCR#ZP5P3gLO?IBs1`z!3hl!!+&$t@{6S4gY6@s9*2ze{(9zM(<8+4xF6- zkoCVLxA&)vJ5MisH}JQ`v6>HoPYK&+9$f0-hJM$slv(}6f3Je=Mc=Hy z-HDJ_uvVrs>;>yDUM9)UMZ=j0f)7Q!Pp_f4)&KY8hCj9e2?SMn>d%b;Lds(J$;E{D zrp?I~XUw(n?K9ft=h^dev;ahA&|30}9Z>8N;FXx?T~r;`b&S9Jiv#iz&bsiZH-J4l z-M-CSoTj zi%<(D=YMU!aw1e(LpJe!`>w4`-? zhstjHc6Ag%cvRkYN1RRW7JFTB!b~6&@`u#UqF#8gyyK1uq$?_pH$ef2(~juYEzF@k zx10QF#VctJTNZzccYDv$2%)Elg#+gELP^u+%w)^%SDT#)gWc8Q;C>P~BA~IlPhg;F zpkh@$g)^-JG16xP`!D|AoqTIQz1>%T(`pIsbhF4Rrdl{_*JrhZcVJN5T-+CVQJH{X z2FQI3IgM*YM1qC`ETb`==E?xeAiT8i<%>*ZdfyYeJAvi~VRi4c3whmkb;AqK@@kLD zhOZ#Z9FQM0Jq{3o0j72>#iB#czQScEKWlF{92Skb;wK>TwXHrhZyxH)MOBW@1e@Wl z0FCh!3>VrwN8k9>J!7UU2NO6rQws2Pt2CqMg9&xR?0|~L*_MMS+7M3NkHANZ5Pe5H zSj_%`VWT?W4x0)?S_vsFON{}}?rUqht=#yT)+!z-8RMH%09ct<-BZxCC|fNr;;W)JA-tjYY=)&jQfyi4KHTdO%pZ;+fEF^A0;us!`4+ zq^3&2xkj|ZHBlH5A|z2)+J8G&(b+@90Go(~OL}q`YUY7w;m$ZBymE95P^<@G+rLgU zw6;;e-AFTe)M8LTyFzw18&Wk4JM9zG|0K@3gTp=AL$NTr01r>h0k6)MMTW1%B2+PE zpkd3*qZ%ZQjP>QT>=eR#j;+jPapsOaF3iw5qk0}n-sU~d1y9sdJaHWvRs0h+RWn_= zh04AZBqhf?QFMD*H^>AF3d?g&V@T3Fi~8RZ@yQ)l)HV zDXl7Xy5+&4tCPSlnqF0og0p?~g2Zi>?rxZgxxyN6hoD4kxv7z4lf&2wyWOyW%!n5D z)ezPw_u_IqbP+87@F~R#G{&(0MqaX-Q6&ILYd`~jdQ{APy%Bj#oId>l$cGh<-5KxB)9oHk75lPgOmNXb*!L+n{=&PKgKzn*ZDTji|k#cG;L*%V>k5 zSun*L+CvU*M4#dNbQfH%b&#!H@o|U6hn=tyx3zrB51Ru}0~QFu)q_>6eL>9`aZm^YK8z!ME0D9|W5NrVTqBB}Y!zK8-7a z0y=Vvz4#m_m^28g?vy{zvsyuGh}Dw|SFPN`fJ^RUGXE={3pYvNlne9abpvdO9VjL4itY2aclW>_fZmR;D0H(F5oJ58OP?D+b~;ge_>aXgbu}fL}#v?Jk_MCyzmmFvql<;x@Jw*dJV1cAjc5L zYt|aP7msmt;3<~O!@gZ8eaN+9_`&yk-^Fy$9toxGK*0YZ=BY`FD>u2E*0@TI{1*_b zHzhTAZOpcBt7M4{M+wx3eM(GCmOftTu|sf_EE2XnwtGGB{Y}bc) z^i|Gq;`VP)BTZvNB+Vw$ZJuopa9pKUfb?|9xDqTP?jGHF`X-AXI$@NN)FVopwvvR#!*7piO+H$WS zIl}U%Mg`;WuQ~HB2=pH?MzIB}2>j#v_yH$V*$l zWVrPSt(q>&7S|F7nFALw-A?qbTKV=ezBB@|%j={OQLzt&)o>y`ma(W%a@mT>kigPLsQ36 zp+3|N%14OJO52joFL@OfYz6e!Wc|;DS?7Z?A@{>Ihs&ow-z(Bux*tbrD-DPD`;do_Qk1>W6i(JTRHSXj1uClfb?4&UK5+|Q)*2MYg5cFcq~Px_ zNL!}qtUK+Vo+LUmS3+8_yW&_JU{ZeK?3VTasAck@)3~TPFVeZWlOVnH_V;kXH-EET zF}|~CvsLCj;jg32z5Kd=uT4jMch}6IM(Vp_D?Fn;k`b1P9jzBlH7sA<)6r4F%!&}6C65ygXaj@yHAh5Hiw^c5j=cOAnt?}T!%bymYXFWY;HVv?~~OIa;^k} z4{RqD0nLj0x;3K3t8MsjdNf|6MJFHRQ(NgQSi?2-7KhBeFMk9|Ae<7RjieO*@Ai)3 zQjh7^zdEQ8b0W&B^6!J^9LGi$W=AvYPq;Z=mxtYZh>I1n-q|6JK-yjAUp~gnUoG@a zk(u)coD}p2s%C z6zJg6IIjQYz3gw;S05p*-RzbCffRaK`9C}DovMp*N!shEcM29+o7xOYk>_6_LY@t0 z=syk!EhEtfn&SQ)B`2`XOsH)J`v=SaG%$Vhwb$J0Lg195w~rb64`K6!PY=}tOl}HT ziBpl$ZlNOMGjUOVXjxNDV?7pr5z@RqxkZ~dMF^NylB345)ch`suvlK$)66~P9UJc>{E_P;iiXy117)hv zL4I)eFD9L`LprTfefB~{RoG`*=o|CjZ9YkQ?Ck?AFhrl=UQ(tlugYeYW>xp5id||21R;K&-8A+P9rvQRS=+)ZA1~-5n`3SA5LkA)bkAiu&gXEpG~Y4Az@|{O^L` zHr%q`DlSg#VUXYj&0)a!;mn+)9~%28)qb_Ap6Uo|ZBi?o4RRtE4+L8l95*8m)*FtZ z-@Z4ZZZIgULYp+z(EO)qb*&?tI&{g{++l zFqP_|z)*9-5v|}nV+3}78`TE(54MP#01#(P7n)(!#-cx`X4f z`ux<;wkqHiOhg@pHO=}pr5ZGo<&xbwgPmmQ9vKqhh}+&GL2BhQ4br2srkJPr&S{XN z#k}oq>4>?1{IM@e5fa;!laE}v=#xp7Zrh)BjO(3{>vaQ6mU*i`N^k*5`9=k-K+_tD z(({G;EoIZQP?y0xZN|^P><8LCk=|jUY~%7|gNuYAp<+gYpaPVzEj2J+td=;2Py{u- z9VS5_W3{RfNN8sfcyDK?Lp(n(ThM8@5X~R$uqg8afLz0yiL=9!e9uVQw@uzicfCLh z6Bn>)9!LTxuPdvXsz7y9VTkE$?lb9Td*|gsB1;3V;NK| zO%t^28yCXzMH0rKgXnz_cbUv`h@NU)nKd#qDAWz2bk`Rl^^H{oNmH%-z-(hx8=sg% z9X^PFI-u5M)3nuUBH`;~(=`W|x?T1=>&-*?i?$#PBhWWzIP3sm@l>TIR)Vv$A(z@W zv)*0Rd~8B>`_|TsF)^uAsA=QvJf>%4y>V`RrrXQBG65)n2yEz}n`YueElu~ArSq_2 zH-AS{hd?<}`N3Zi_Fy@dTNV+vfN71Xipe(00k8Kg@*V6N$ip+fz)E5SZv{a8Oi>SJ zQ%isr0+k5VUo`itB4Vm%##=8NL{M8j)!c>ajG0*^(7Q0%v{&H9B1GaGFI zUK2E{iAFE51dFfuxT5r`EK%I~1?Gq)75oKe6jEfHb0Ra+EE;=t>m^?sTMop;j7f}q zbq`m;C|>#5aT-eZtCk;%gH*2I+JEwT)qtmOfS z2*tdSqs3|~ueG4VN1c40eaU^#$TeDalV4XX^-5IdqC6nk!6i`yfa>~&X>I&-ZWg%m zi#M6N7|NK0U&@HBiTn~pqU$&C@l}@Hovc7#tT1D-$q&m9oV~6(8a#d!cR$}I1ygPs z;+oWPrah(NS)_@kgHSEogKRWi*?2gC*iW>Ky?>r7@O?=!HF>!^%Gw%#B zY$ySt2a=aRu9XTsHPd|$)&?qYCO%;4Y#AhPy9ntD0nN35#K(=0*}&-C!Ci0ta)qX$ zZ5ADf505!RiyViv3*$zQ;#t&6q9uwtiBwYPDGXQ?DDorkgIx_{>4=P$xJ%ytT7i(4 zM4lYB;g{(V*1eb~83jCYLblp~uu<Z{F19f0wwv-MsP;kl{lVFjqy9471>odjx>UW1@v%6v--{ZIrG~71^M0q_i%c+AY zs4N}%%uex2zgO}gV}st2*)3RHkg$tD(QlcEwRc&YLkEQ8*FCvft+9o$8DAKhf3!Qg zoqp5=hcqEc!>&R(kNicoA>}SfiseK_N2Fk-AzO4u(GC9B*+`bpL2|!r-X#hjy~O)5Y9?80S)q}5q!%&JCn1+??e{P zWf!&dYmg!573)i{Hh4s8Z@(lrW;jMb^+FIEC zAn279v5@Lr(nA@aIMa}N=?L#a(`FqZO0q_f>)3b*a2Ux#rF=%BSeU4ryjvHt`A(YX zXQ#Ztjj#troSG0m1;!Y4F^OwLY)UADED{U39MqX{cb13 ziQBEnKMjMWjPL5aJv?IYQmalka2j~v2zC%9sN7Re|HUnrf3hdjA+q+W(tok_`%3&G zwBU^W{-S#t`@JaH@o%xKI#n1ZUd$Jk!hh%(fbESJ&~2HWGhR=W%0x*ffS)zgNGg`)2E_c=TzM zenqSi^*ByAEJ-$B-52sdud)bPqOHIB!h?YeyF|qLT+4z3%M-VWanjf+={t<=nsRy5 z@tq}C3)s=9i>gq+P_2qGLI|)5DjAN-LTVxjLWei+V!-y_A5nBZKd=P(947n5{qer9 zqXpkumLYKWt}AVjkgPbd<_kpJ)BhU2%$hn&pqc?2)j!mEbCb}vPG3;h*x!G|IC|-t z>qZ6^p`r9>^q0VMda>QI47Xo6JkjNHkQ00U%6o&2yRYL^{eNmN)W5-e!wm_@I8`C^ zw^?zfb32>6RKt?aW?Tp|+!+0o(G>FC>wcT)o~M?UqA0Bn&#)y6zw@s*QlDb~J(p{0 zUmjxOz8Jb7CXOT!!z^KOi(^%w=<%7$5`egSg1^ z<-V;3rcd)VP3zH@+TWj)_v2N<^@$jF%g_E+;N4Rpk!3CGwM6?Wy{_e`&^XIqLLSlo zc#}y|iN07=HAx{?m|78M$LB_}R-f>0(d@YSNzzh6Cc=_K@%Acc64={qdGA+FYy0AC z^1X8LPt@EO&s8AWy}04qXY{#rsnNgXnjA!m0oVa$h-h~%M;=yOM=qSfta z9d#$WAxeLDJfH*r#=WHJ_Wa(M>N!V(vo8~S8IFF@YDSM!d&3PM%TvuF{1Fc&EGPIf zBgC3_!LMl@S^6HCO}Wf?7{O*b_fGFk>nxAIM7gd9&u+1Q%MPzaE_I}iOAoCcvw7j8 zT(k#{D2iTk{bZjfc{?HEPlGY-Vs4r~+Ehwq91Y(Rq`ujMYeuIquQo^Oj$~C0X;ikb zZR<@zDPPuzmrBP@A`-^#;q{sCQ_iZ>o~MutoFW;W8qT7aUb*P>5iujaTzJ^tUOJPzuW za2l4dS$k7?i2em9-N6M5>t_m30jjID7L{8TTLFzz2du3&C2it4#ca9_t!ZMi*x5j` zwdWvh595%f3ZS(zCV88JS{0ppEOV_vQ>o<)QTm31t&1+gM9EIp3CbqhI^-~`><30q zo8uzV$8ZbUozHg90kUK5Xk6JC7PquOB)W{Hmm`A%6vBdAv(J|xX}55%yaOlNWqeZq z^-Kq2i^Sae_Q9DD;I4n|fpodgqD-|4Hdk@NBeT{Hn$5yoRScXxl)~*QV3vWRD=}X? zFZ+#5xggkz^!|@`3rC{2Za2)lF^)(yRm&na3f8t*vuJ{nu-PZrNOP3Wk&{+tdgB~% zO2q(EQoyw*59mt*&h_4k?=+{+U>pD30Y4(sn44OccOjpf;!{k(^Nyq;sKd0xleLR4 z|579M;BY?QE%Btm>-R36G6$D_UHInNtlC7>rzdaV)3NUY{>Kkg-6%$Mcs-2F*fagT zTV>a(fZI6De2F|Ifp zK)QWdM`aX`wTZW_yhG}MP5U#4vGHq7PEI(4+?wK?Er9uk79E%<-un1 zxk3SI_5rHD)IHNXvmmBz_OWJ5S9hcK+8HCm4x-(Bceg(OQ)huC8&*jK?-ejU_;PG| zMTm{CYXORekoK6@ms=8U%EpxGo+);WCwn;G^(|qF9wgg+%czJ5dwiQ*z&9$*0Wn%P zjyhEFzSussJ^j}n3n#hr(?6Tzp`~~z+-GaJ_ z#KqbwSot0974*xkteF0`cW3US6ThpExp=q_cJrn>1v9hWV-yk|)@hT%;E$@zJ=RrL z&y%H)=~O5(y=OK(u-x3o^gWA&!k!3S9dQNHbZykjWo>``)bTXp$v z)|Dpo;*X?)^<&nwF)=+;Te3+3>#xUDCoP*&8IIPjtDwjK++Nmkc%j_ z+BrnUvusJ%7`n4pP>F9w7p=0%vtLckmf2m$MU4u65Oi2|>JcV}=jL)T#_8qQLN0(N zw;7kW29}!&6zqVO)_#`^_FND*M_Q+r3Z0f0^gR)vuL>Dg%`8l9lVFJ$Mt+UA%hJt& zJ~w}S6&TX@%!#A*VLc94`dGO>t2Khmn#`x0>nhn5Ck317=$sL&xgZ+vlNK#{!iYPl zZ*aZcGE=fJ{8cn8ftFE^VidRlA*F$zGR*7sfM`$o@~r|^*g&@i%1o?lAN$&MtS)Sc z$Lo~0RgQ$uFW`X+fCcSYO~;hXdK@ckmY>O?eGdTBe^W&)EmfSz^fIz)jnSy0bT$^u ze-cdN-&0z+CGD9nt}XL4vzrDAJ#^W&lKCZAXAcbP8!b(*1nl-EL1C0^vL)2$yB>5;4}UFq|1!>@I!*W^a;4_5*4QRTgYOLk|;vCG+@hgX0Q+@ThuTy0_h z8Nr_L6iQQjF8x{T4FtN=Dp&HM8_QnAtgy?oz4a)@@|d1$&Auz|$iDnng7f05YN#^+ z$a`&rsF(tAmvkyhlK2m=dD^39S}v=TgENwnF}4+sEfYpb8p&0%@#OKMb0(D-oPjOL zPdHNsz;9(ho`nrPo&#>9SnYHZ=C@dD{gMq9eLPPg#q61;v&yT-ulDG87544vNBPe?yIIhoLnFwL&HjPBH%oF`MR3==oK8%KF7Bz{o6Nco;zB z%Wy}+&K6-p4L?Fw^z3$SBvA!C+Z#Xj z`i3+dLrVI(Sg1zWT+C_EE%;}0*iW5DBUM(dy#jZXr!uQzi@FlR9`R#C3<8(vHqPs# z>%K5q0W_>VVIb({y+6^J6(M(e!kgSb&=-1bYZBZi+7Gvl@3s-*B|C@;4+vqSzsEBI zLRfpfQ`R&3;Y;7GzWoMcq^77H<2Kgne>z-)Mn9Vei88v4%`(47Buy3BnD495xje6$ zoMa}H#~T)uE3&`UN-z9#@TRbm#wvfK-wprX>EzpnbIGE4!H?fn-)2P@4ex!^{y!ph z+W&&&@7{?YPWf1jC3t0IwS9v=++r3oM`IC@1IoxpF_Cv$$9UuFy5Z1>mcv=q)RLjqUlp5|&p?o|SQDmOYC-p#zk6dr zxdplEzWZxnT(~BdgL1DpS&{j2ZofjFR7^VTcSTTxXPJIEGF^!kGTh_L$G3moyYWVx zlT#cUX;+-lUeFI6Js8%n#c!gRRxq z7hf!20?%nx!I-7T!jE=)w$5hLAm{0^4vJrI&5b;8(-@sR6l4D5R>nefre*I><>#z7 zKGgkQmz{>Ty_KJKyC2P_K#(^sBB<9DFUB$&A`(H8c6<`a>|z&g75th0O`+j`ZeQytxWQ5Pc|Ig$S$wO5C zAL@F4PF3G(t){Tm6bO`b<%`~?2^U%(f;afn52GXJJoRpTgrVI|PySZXQ7|{<+Uwur zWf9~$Hx;<13$Ai{bKcpAOGv2fc#A~tOCf4#?pRDtwQdBFxx;ZG<+PyEpbHx>?G87Q zb-LDI4209+EHu&d`oohqX$G%P{8vw>;uo0Z)%5RZYt8knHL2ZoR@~8;xu@N&Qqw_D zVwWQ!8DYG+UUQAEpc%xS!Tv|wqhSQWL9+J8zck5PrwvX|H; zkKDdGmiPsx_ZVXg=X@6KNxg3$?}LHuO?{Vx7? zVVBk$xJQh-UA!Mj3}4$veaGXcoq_vBNqj_wTk}HYJ4_8IQdVDAIiSeW2TbraiQ2g4 zdrUtONB%Z9u`0sg%g6Qe(vYvQdpRtrEWb)nnX&rZ7Tm^(!xa z?J*c4dFq*T(FdDgn1~E%9cBFcb=vtLYtB7v_u5xk(A$tDaN+trdd%oeYXAiM-+}k` z)MKT~e^e~H{tMQqQ88{pBo9!Ozs8pevhaF2gT4QcrZWvoGJoIxG*0=Ov2w~u%Uq^0 zvvSJ}4HcZG#mba1b6?Yv5_fVzMW&ombE`~oL6|ak0oTk8D;F{qG6mdmK~PXp5l|3$ z_`i7Gb8y_iee=DR^ZcApA#eJIFGs2I)W!N@?v?xTwHTOA!w~KjxJW1Sy6;#J(N1Vx8!nS?DT5o7Hw9q;zBM(f^MRpe}!@zYlP1o!X+HM!<5rZW3 zd#eh&`b})p!-dpnC#~+fs5-@BZ~IG=3BrGFqlw-}uBU9|6nL=wiwAXjH<$)G`*>W} zr`C6mD+807*>%#x4W|Uw*J|=wy1!I5^Ooc2{VrYvdZOsCA{i2<3UuG#o(waoD=x=^ zG8*>zP5P$IrZdY?WtWWmC$GTo@Qe(oBt@RO=N439BOU3rGmq|Jy=?GZb}(x%4pa?g z_f$+s^{F;_`fdkZ+lzaK&}c1KBQU)k1{83QD<*s%NqoD^Xe>_Bn~;exYGMnUSc9_- zBbdd*23g@gl%T<|6|`o=c}HeEFM}G~UAr;-JP`irE<%T$F=#*_jD|5^qdRfcpr*A= zXMtyNYu{dT`V)oj#|Y@J`v{oR>M5)>ij2ljAfVo`#^9B4MdW56uSt}LQ^=NJtf2j5 zPh-S73%kAM9(){Tdp%Q2K|~wrb3X`(`gqs?nvt7wB&ER=G2;Qv6tcT%X5mJVj>avK zy>BpPTQovS%K90ok-ws= zpRI=trgUq&k=ii}2P5|~w)&oSSrxg+8ngiPxwh{5XP7#hP|9h@0U)IgKFCjuXkjUV$|JQ@~#9lu>=<{_%NM z0fU`reQmiW_({v*iRgOAU8JibzXYTUPw4mnfA_Qq0dv+J(2=kj!Z@90Tpd5y*d%$y?G#JiXV${IHs z3*hwb7+kA2<*j}>{!;=C?}e^BDQ`mD(QPHz6Bojt$_JCIzQ@6(vf` z2ivXKnN7hs+Om6;?E|EU#(4Xf${4#jjg2*(B!h@$HXCV&iiU%Hb+IsV>I%`})-G1f z&T?CHgBQ{^1*mu#*byoEbpkk(Sa-X~UE%fEsySsA2TUeejW6rxfkuGCdBkURqFYev zA;DfZl3DBjiR2Pah997p;)F~64On-1hJkJytVqq0US)5@aX30z+(0c=pG3a2CwY1b z9uA!&PStfNh*^B^f(c&6!UHOoHUUem4E(h2t?91Ft_;Vxt^yKz9gH|XK^JaW2Za&s zy=53h`bQGy(1ZqxQaX@_-=l($yl@r3EQ3OB4 z7Sjw)sTyMQNk~G^OcZACEeE(ifi)|C%HJuQfcmY&Ite@Sw_*M}8eHuws)*sC$vAL$ zyUEr5{yZjC?@wXkcRz22ifK4uqmH%hOl7N-2bsme&!1O5Zxx`7KRVD@#U8(!!!K9J zix6qim)6|{c+14!xA2VcinBjWaL!MfR4bkKo_h%RomTy>DNQ;!^x}ir%7VbO`U!t` zG{?YCsKi{yqgZ}25nq;JdGz(2(!Uc0+-U=E9#scsHo{-F@1egOW;|(GF7n)n8PJ)d zS3S)w0rl%sef!LDKt+1+7hw0dfBN0nL}8sHNjOu`(3u}U=Rtg?*nnDF&MSy(?#z7Y z*3tygkF@iuwUrB6H1@neiJsyv-FK@Dj=P>gCXEn8WZ#JG~!Jas*x~qY6or zR9`rTz|)*3aqi-UtJ{7JrknqLeV?}NcF^nU{B(d{?%I!FShAS(BKuF|)bTYd@@c12 zZm`^Lg}k~m7SU&b>y+1{D($q1k&K~|xt(dS{^7YtEf@5*$ z&Lk%$->LZCh4$hCyiZZ_;F#X#EM0^+n5#MrcNY9zvhLYXUAY-bV?E}Q-_6wjk!`NO zr#3_|V|qs;IFA$;@$eBW?4$0*=fmPwenH(r|NSiAQ)kzNVeH})t?lO)or|P_>*bNL zs~*2hteqA6B8CyT`yMA@P8!Mgn^suk;oEq-&~4*}{Og0UT5C-YhDW!7m9~hEpKKC- zH=;fYdYh8{=9p?GfSrg7zJ1af`?%F~-4kvBGc`=159N4=2AKHof4^GDsMQ~Ji_A*D zcEgpz`SC7kb=^S4d(v-C^2g@c&10g!j~MmC9#F48Kc;C%9oi5QRSex;1Qr~&Q;iC? z2oHPi{Pg9@-9)VzrcT(sf=}LEZaLth&)U+{-kd7OPBvbvT`AiaS@$KHv^)TGY(W2M z+Z%|*sEIyai+ual>P~6p<~%BTW&CUZ3ad%?XsOAJ zkx8_Q$$KSh@mPSa-lvol(W62}IXK0{Wo5>q0xO3T_bX53J%9$4*RQq_BD1v@NsyJj zXd3MZOR={W&~Ch;Ew((w%?3yES_&dp_iYZ|G80DYZ1js-T-B}x<2Q=$X9HjF9*ZvC zyI!|8TShq>qx#_pRW|gWo@=@85HhBuDeGs~z?U$5OukrCjN&i)+{$9kpD5rAFOKOW zqDINujQfiKON}xJ(qv}uAS{M=EAYuun(^*VyYF>yZfg{g&mDd{J3=*=F@3+d%tcN~ z6YC%NbbI06J7%d2!AKGo*Ur?J!9N@>p6Ag78fXsMbQodbhQ!esIc?>#NaXrxQ$nNtwk8+GEO(ST`g~0OgmQt*IKIwdi}M7SJyYf6ix z1y3uXj7$69oC>GvL&-qJ_w3&ZSSA~_Em=u?ncqf-;+4B z&(DwK(31-6neigTb!wqa(|{U}pV0nvs_B)1onfBNTus67E2_u$=J$cLkt*X|*P8dP zNxfUWp2G9f$j0-^25?Eh@_|*H)TMKS<|mo9-9pRROi5ek+{W?(F(FF4jAnLhFE;Qy zYZy$$(E}i{t8{`Hnhyi}08D`dfK|o~<6B?Dg{z+Z@XS zFQbCll7eMgI>S`XDzVE(txQmHi721Mtc|%@c(*Vwi7u##MP(QJz+_c6(*y@~ zqwR)5;aw{JBEBP)b{?&Waaiwz)OgY>`-aI@*`%Y}o?H{N?l#lj!a6HT4zeL{tD#-! zLk7NTkVYvK6)AZb8$jQR;d(;mMIKi_OM-8`FqXUZvr#Q~WNp-7 zaSy#4dMoRyW9Tx$yn+`(Z-Q#F>PdmA9uy@y@I3RsXgyb$1Hoo)pw!gPey|i5m*8Pe zKjo@zBrLwXYlPk!0pQea(MZ{Or1%Ll!=qtXmhH=R15B3C8b*^O|th8J=Q)~DAj&a*$j#P$s{s`Ok5 z;|W-+^j1yWy`k$FJ1LEAH>OTr(}|(-K{dmS+?H-<4GxALOE9w#rqa$qvU1n6>LBCA zIRK7Q398z0Iyb)o19!@4hA$h~uJ}4DWsI|96r!@eLl6f)g>N`uk7O z3pFc?cJZyqksDb_B70nGE0BrR$U!6~;5@h{3Tge-5WgL7YZF*hcSSZ0V)J2u7YGNv z)@T-=H08f3JQ|%*N7x*^J6M7P)x4Y#vhL|9$_VW%H=g@b^DZ7w?;8yo8Bmnf4hL$Y z5owCwd6UXr%!fE2=uPa{Hu%tmaxi9Kh4cZ`Ne+hLIk$pWKs{doj+vVa<jj`V7Fr zROyqe>0_bX{+?5| zz<@7H$u4$bQ6q=-#73s3O+DpD(1qNzHkSqx?Bw)rKx6X;y$)z62^gu>jhqv0oxnEv zq_tG;*vI(NDKn^hbWTynI=qtQ)i zN{UFAjdH8zHeY&od6w*B9}Qi!Ra0qaBI{nPzH1xEHIdr>J0|@?^K`rHAP@mmsgs0A z*9nBkNjIxyb0N*TVaCUUfvVUS&*%|#`2bP1sh11&~E z34(lxxYS|;0>FHIz5eD(hvU0219DO7xUO?^qOI?xpUu2dGP{brEj@(SCVo?~ zoBr*kaqv`Q6Kbyt^RnbxMQ&LP?Tn+nvyn03kbl2Dv3xo9N_0RRT>Fyt5o?0w-SwqN zq_4iyx#`ms<+3r8xM*cjr)2#%3)-cST$s z=`hUOuQ-ad)yT^LH0~Xw!b9S%|*@);2eBfYZ zNolWDbq?x(Xq#NmA56o6T�% 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 z%0D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

        =>mxT9tGH1g$nSJ1 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 z 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½wD8jrOuFc>86{8xqMgo)tG26vpMg^i<7^ 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 Y7N7

        cC3MS< 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


        WekbCRoQYb@v{a_ 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%0DDDPU~Q5CpW(fZ{{lvrGh z4^VHkRQqIlo|7nT{RzUG6q3`abzv%#vX+T)FpFL1`nxF)#rtWu`1pn3^qMoeBHV*L zh0G;bB7Pwtt>cQ=6LsSS}w@*#CA70;5gDkFuf^c(|VT>BQ;cRaJ8 z1~mDhFROH4uXT^`gUvQE6eGxuvY5%sZ1#Px-pzW!u$6K-*Sdba@q(O&ZC_EmQj|Qbk6Gtr+Ð6lEF(xWoAr| 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%0D2(OZ$#w_FM^Cs_Km2f{irSA`ZiH6W1vF^|vK_gR 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 UyL5iE;{i*hQ(ZR!jZy&d(qtzwYHyhGi!Ky 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

        ZH2uJR9jy=S+s9-4f_6R&J*pqp2xxo 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

        ~Q#cBLI$2}#D=5Vv!x>pkedsrhZ^ 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%0D0fe-|L^ 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�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℘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ðQ|RiZ^a=?)Il&AxcQ;;`wrgY~XZ&+q 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 z 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

        ');return 0\u6682\u65e0\u6570\u636e'),e},u=function(r,e){return layui.each(e,function(e,i){var t,n=i[s.children]&&0",(t="href"in i?''+a+"":a,n?'
        '+t+("parent"===o?'':"group"===o&&d.isAllowSpread?'':"")+"
        ":'
        '+t+"
        "),""].join(""))).data("item",i),n&&(l=c('
        '),t=c("
          "),"parent"===o?(l.append(u(t,i[s.children])),a.append(l)):a.append(u(t,i[s.children]))),r.append(a))}),r},l=['
          ',"
          "].join("");!(e="contextmenu"!==d.trigger&&!lay.isTopElem(d.elem[0])?e:!0)&&d.elem.data(y+"_opened")||(a.elemView=c("."+v+"["+f+'="'+d.id+'"]'),"reloadData"===i&&a.elemView.length?a.elemView.html(d.content||n()):(a.elemView=c(l),a.elemView.append(d.content||n()),d.className&&a.elemView.addClass(d.className),d.style&&a.elemView.attr("style",d.style),h.thisId=d.id,a.remove(),t.append(a.elemView),d.elem.data(y+"_opened",!0),e=d.shade?'
          ':"",a.elemView.before(e),"mouseenter"===d.trigger&&a.elemView.on("mouseenter",function(){clearTimeout(g.timer)}).on("mouseleave",function(){a.delayRemove()})),a.position(),(g.prevElem=a.elemView).data("prevElem",d.elem),a.elemView.find(".layui-menu").on(o,function(e){layui.stope(e)}),a.elemView.find(".layui-menu li").on("click",function(e){var i=c(this),t=i.data("item")||{},n=t[s.children]&&0n.width()&&(t.addClass(b),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(b),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()+5))}).on("mouseleave",t,function(e){var i=c(this).children("."+x);i.removeClass(b),i.css("margin-top",0)}),h.close=function(e){e=g.getThis(e);return e?(e.remove(),g.call(e)):this},h.open=function(e){e=g.getThis(e);return e?(e.render(),g.call(e)):this},h.reload=function(e,i,t){e=g.getThis(e);return e?(e.reload(i,t),g.call(e)):this},h.reloadData=function(){var t=c.extend([],arguments),n=(t[2]="reloadData",new RegExp("^("+["data","templet","content"].join("|")+")$"));return layui.each(t[1],function(e,i){n.test(e)||delete t[1][e]}),h.reload.apply(null,t)},h.render=function(e){e=new E(e);return g.call(e)},e(r,h)});layui.define(["jquery","lay"],function(e){"use strict";var x=layui.$,b=layui.lay,m={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=x.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},i="slider",f="layui-disabled",T="layui-slider-bar",w="layui-slider-wrap",M="layui-slider-wrap-btn",L="layui-slider-tips",E="layui-slider-input-txt",Y="layui-slider-hover",t=function(e){var t=this;t.index=++m.index,t.config=x.extend({},t.config,m.config,e),t.render()};t.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,tipsAlways:!1,input:!1,range:!1,height:200,disabled:!1,theme:"#16baaa"},t.prototype.precision=function(){var e=this.config,e=x.map([e.min,e.max,e.step],function(e,t){e=String(e).split(".");return e[1]?e[1].length:0});return Math.max.apply(null,e)},t.prototype.render=function(){var n=this,a=n.config,e=x(a.elem);if(1a.max&&(a.value=a.max),l=(a.value-a.min)/(a.max-a.min)*100+"%");var t,e=a.disabled?"#c2c2c2":a.theme,i='
          '+(a.tips?'
          ":"")+'
          '+(a.range?'
          ':"")+"
          ",l=x(a.elem),s=l.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=x(i),a.range?(n.elemTemp.find("."+w).eq(0).data("value",a.value[0]),n.elemTemp.find("."+w).eq(1).data("value",a.value[1])):n.elemTemp.find("."+w).data("value",a.value),l.html(n.elemTemp),"vertical"===a.type&&n.elemTemp.height(a.height+"px"),a.showstep){for(var o=(a.max-a.min)/a.step,r="",u=1;u<1+o;u++){var c=100*u/o;c<100&&(r+='
          ')}n.elemTemp.append(r)}function d(e){e=e.parent().data("value"),e=a.setTips?a.setTips(e):e;n.elemTemp.find("."+L).html(e)}function p(e){var t="vertical"===a.type?a.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+w);return("vertical"===a.type?t-e.parent()[0].offsetTop-i.height():e.parent()[0].offsetLeft)/t*100}function v(e){"vertical"===a.type?n.elemTemp.find("."+L).css({bottom:e+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+L).css({left:e+"%",display:"inline-block"})}a.input&&!a.range&&(e=x('
          '),l.css("position","relative"),l.append(e),l.find("."+E).children("input").val(a.value),"vertical"===a.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),a.disabled?(n.elemTemp.addClass(f),n.elemTemp.find("."+M).addClass(f)):n.slide(),a.tips&&(a.tipsAlways?(d(s=n.elemTemp.find("."+M)),v(p(s))):n.elemTemp.find("."+M).on("mouseover",function(){d(x(this));var e=p(x(this));clearTimeout(t),t=setTimeout(function(){v(e)},300)}).on("mouseout",function(){clearTimeout(t),a.tipsAlways||n.elemTemp.find("."+L).css("display","none")}))},t.prototype.slide=function(e,t,i){var u=this,c=u.config,d=u.elemTemp,p=function(){return"vertical"===c.type?c.height:d[0].offsetWidth},v=d.find("."+w),o=d.next(".layui-slider-input"),r=o.children("."+E).children("input").val(),m=100/((c.max-c.min)/c.step),f=u.precision(),h=function(e,t,i){e=(e=100<(e=100n[1]&&n.reverse(),u.value=c.range?n:l,c.change&&c.change(u.value),"done"===i&&c.done&&c.done(u.value)},y=function(e){var t=e/p()*100/m,i=Math.round(t)*m;return i=e==p()?Math.ceil(t)*m:i},g=x(['
          p()?p():t)/p()*100/m;h(t,o),r.addClass(Y),d.find("."+L).show(),e.preventDefault()},n=function(e){r.removeClass(Y),c.tipsAlways||setTimeout(function(){d.find("."+L).hide()},e)},a=function(){n&&n(b.touchEventsSupported()?1e3:0),g.remove(),c.done&&c.done(u.value),b.touchEventsSupported()&&(t[0].removeEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].removeEventListener("touchend",a),t[0].removeEventListener("touchcancel",a))},x("#LAY-slider-moving")[0]||x("body").append(g),g.on("mousemove",i),g.on("mouseup",a).on("mouseleave",a),b.touchEventsSupported()&&(t[0].addEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].addEventListener("touchend",a),t[0].addEventListener("touchcancel",a))})}),d.on("click",function(e){var t=x("."+M),i=x(this);!t.is(event.target)&&0===t.has(event.target).length&&t.length&&(i=(t=(t=(t="vertical"===c.type?p()-e.clientY+i.offset().top-x(window).scrollTop():e.clientX-i.offset().left-x(window).scrollLeft())<0?0:t)>p()?p():t)/p()*100/m,t=c.range?"vertical"===c.type?Math.abs(t-parseInt(x(v[0]).css("bottom")))>Math.abs(t-parseInt(x(v[1]).css("bottom")))?1:0:Math.abs(t-v[0].offsetLeft)>Math.abs(t-v[1].offsetLeft)?1:0:0,h(i,t,"done"),e.preventDefault())}),o.children(".layui-slider-input-btn").children("i").each(function(t){x(this).on("click",function(){r=o.children("."+E).children("input").val();var e=((r=1==t?r-c.stepc.max?c.max:Number(r)+c.step)-c.min)/(c.max-c.min)*100/m;h(e,0,"done")})});var n=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)c.max?c.max:e,((this.value=e)-c.min)/(c.max-c.min)*100/m);h(e,0,"done")};o.children("."+E).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),n.call(this))}).on("change",n)},t.prototype.events=function(){this.config},m.render=function(e){e=new t(e);return function(){var i=this,n=i.config;return{setValue:function(e,t){return e=(e=e>n.max?n.max:e)',"",'','',"","","
          "].join("")),t=i.elem=k(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),t.addClass("layui-inline").html(e.elemColorBox=o),i.id="id"in i?i.id:t.attr("id")||e.index,e.color=e.elemColorBox.find("."+C)[0].style.background,e.events()},d.prototype.renderPicker=function(){var o,e=this,i=e.config,t=e.elemColorBox[0],r=e.elemPicker=k(['
          ','
          ','
          ','
          ','
          ','
          ',"
          ",'
          ','
          ',"
          ","
          ",'
          ','
          ','
          ',"
          ","
          ",i.predefine?(o=['
          '],layui.each(i.colors,function(e,i){o.push(['
          ','
          ',"
          "].join(""))}),o.push("
          "),o.join("")):"",'
          ','
          ','',"
          ",'
          ','','',"","
          "].join(""));e.elemColorBox.find("."+C)[0];k(a)[0]&&k(a).data("index")==e.index?e.removePicker(d.thisElemInd):(e.removePicker(d.thisElemInd),k("body").append(r)),n.thisId=i.id,d.thisElemInd=e.index,d.thisColor=t.style.background,e.position(),e.pickerEvents()},d.prototype.removePicker=function(e){var i=this.config,e=k("#layui-colorpicker"+(e||this.index));return e[0]&&(e.remove(),delete n.thisId,"function"==typeof i.close)&&i.close(this.color),this},d.prototype.position=function(){var e=this,i=e.config;return r.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},d.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+C)),t=i.elemPicker.find("."+M),r=o[0].style.backgroundColor;r?(e=Y(F(r)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o?t.find("input").val(r):"rgba"===o?(o=F(r),3===(r.match(/[0-9]{1,3}/g)||[]).length?(t.find("input").val("rgba("+o.r+", "+o.g+", "+o.b+", 1)"),i.elemPicker.find("."+D).css("left",280)):(t.find("input").val(r),r=280*r.slice(r.lastIndexOf(",")+1,r.length-1),i.elemPicker.find("."+D).css("left",r)),i.elemPicker.find("."+T)[0].style.background="linear-gradient(to right, rgba("+o.r+", "+o.g+", "+o.b+", 0), rgb("+o.r+", "+o.g+", "+o.b+"))"):t.find("input").val("#"+j(e))):(i.select(0,100,100),t.find("input").val(""),i.elemPicker.find("."+T)[0].style.background="",i.elemPicker.find("."+D).css("left",280))},d.prototype.side=function(){var n=this,l=n.config,c=n.elemColorBox.find("."+C),a=c.attr("lay-type"),s=n.elemPicker.find(".layui-colorpicker-side"),e=n.elemPicker.find("."+B),d=n.elemPicker.find("."+I),t=n.elemPicker.find("."+E),u=n.elemPicker.find("."+T),f=n.elemPicker.find("."+D),p=e[0].offsetTop/180*360,h=100-(t[0].offsetTop+3)/180*100,g=(t[0].offsetLeft+3)/260*100,v=Math.round(f[0].offsetLeft/280*100)/100,y=n.elemColorBox.find("."+w),i=n.elemPicker.find(".layui-colorpicker-pre").children("div"),m=function(e,i,o,t){n.select(e,i,o);var r=X({h:e,s:i,b:o}),e=j({h:e,s:i,b:o}),i=n.elemPicker.find("."+M).find("input");y.addClass(x).removeClass(P),c[0].style.background="rgb("+r.r+", "+r.g+", "+r.b+")","torgb"===a?i.val("rgb("+r.r+", "+r.g+", "+r.b+")"):"rgba"===a?(f.css("left",280*t),i.val("rgba("+r.r+", "+r.g+", "+r.b+", "+t+")"),c[0].style.background="rgba("+r.r+", "+r.g+", "+r.b+", "+t+")",u[0].style.background="linear-gradient(to right, rgba("+r.r+", "+r.g+", "+r.b+", 0), rgb("+r.r+", "+r.g+", "+r.b+"))"):i.val("#"+e),l.change&&l.change(k.trim(n.elemPicker.find("."+M).find("input").val()))},o=k(['
          '].join("")),b=function(e){k("#LAY-colorpicker-moving")[0]||k("body").append(o),o.on("mousemove",e),o.on("mouseup",function(){o.remove()}).on("mouseleave",function(){o.remove()})};e.on("mousedown",function(e){var t=this.offsetTop,r=e.clientY;b(function(e){var i=t+(e.clientY-r),o=s[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;m(p=o,g,h,v),e.preventDefault()}),e.preventDefault()}),s.on("click",function(e){var i=e.clientY-k(this).offset().top+H.scrollTop(),i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;m(p=i,g,h,v),e.preventDefault()}),t.on("mousedown",function(e){var n=this.offsetTop,l=this.offsetLeft,c=e.clientY,a=e.clientX;layui.stope(e),b(function(e){var i=n+(e.clientY-c),o=l+(e.clientX-a),t=d[0].offsetHeight,r=d[0].offsetWidth,r=(o=r<(o=o<0?0:o)?r:o)/260*100,o=100-(i=t<(i=i<0?0:i)?t:i)/180*100;m(p,g=r,h=o,v),e.preventDefault()}),e.preventDefault()}),d.on("mousedown",function(e){var i=e.clientY-k(this).offset().top+H.scrollTop(),o=e.clientX-k(this).offset().left+H.scrollLeft(),o=((i=i<0?0:i)>this.offsetHeight&&(i=this.offsetHeight),(o=(o=o<0?0:o)>this.offsetWidth?this.offsetWidth:o)/260*100),i=100-i/180*100;m(p,g=o,h=i,v),layui.stope(e),e.preventDefault(),t.trigger(e,"mousedown")}),f.on("mousedown",function(e){var t=this.offsetLeft,r=e.clientX;b(function(e){var i=t+(e.clientX-r),o=u[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);m(p,g,h,v=o),e.preventDefault()}),e.preventDefault()}),u.on("click",function(e){var i=e.clientX-k(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);m(p,g,h,v=i),e.preventDefault()}),i.each(function(){k(this).on("click",function(){k(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=Y(F(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);p=i.h,g=i.s,h=i.b,3===(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),v=o,m(i.h,i.s,i.b,o)})}),r.touchEventsSupported()&&layui.each([{elem:s,eventType:"click"},{elem:u,eventType:"click"},{elem:d,eventType:"mousedown"}],function(e,t){r.touchSwipe(t.elem,{onTouchMove:function(e){var i,o;e=e,i=t.eventType,e=e.touches[0],(o=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(o)}})})},d.prototype.select=function(e,i,o,t){this.config;var r=j({h:e,s:100,b:100}),e=(j({h:e,s:i,b:o}),e/360*180),o=180-o/100*180,i=i/100*260,n=this.elemPicker.find("."+I)[0];this.elemPicker.find("."+B).css("top",e),n.style.background="#"+r,this.elemPicker.find("."+E).css({top:o/n.offsetHeight*100+"%",left:i/n.offsetWidth*100+"%"})},d.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+C),d=c.elemPicker.find("."+M+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+w).removeClass(x).addClass(P),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,t,r,n,l=k.trim(d.val());-1>16,g:(65280&r)>>8,b:255&r},t=Y(n),s[0].style.background=o="#"+j(t),c.elemColorBox.find("."+w).removeClass(P).addClass(x)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(o)):(c.color=l,a.done&&a.done(l),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=k(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=k(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},d.prototype.events=function(){var e=this;e.config;e.elemColorBox.on("click",function(){e.renderPicker(),k(a)[0]&&(e.val(),e.side())})},s.on(i,function(e){var i,o,t;n.thisId&&(i=l.getThis(n.thisId))&&(o=i.config,t=i.elemColorBox.find("."+C),k(e.target).hasClass(c)||k(e.target).parents("."+c)[0]||k(e.target).hasClass(a.replace(/\./g,""))||k(e.target).parents(a)[0]||i.elemPicker&&(i.color?(e=Y(F(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+w).removeClass(x).addClass(P),t[0].style.background=i.color||"","function"==typeof o.cancel&&o.cancel(i.color),i.removePicker()))}),H.on("resize",function(){if(n.thisId){var e=l.getThis(n.thisId);if(e)return!(!e.elemPicker||!k(a)[0])&&void e.position()}}),l.that={},l.getThis=function(e){var i=l.that[e];return i||o.error(e?t+" instance with ID '"+e+"' not found":"ID argument required"),i},n.render=function(e){e=new d(e);return l.call(e)},e(t,n)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),c="element",r="layui-this",h="layui-show",o=".layui-tab-title",i=function(){this.config={}},y=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,c,t,i)},i.prototype.tabAdd=function(t,i){var a,e=u(".layui-tab[lay-filter="+t+"]"),l=e.children(o),n=l.children(".layui-tab-bar"),e=e.children(".layui-tab-content"),s=""+(i.title||"unnaming")+"";return n[0]?n.before(s):l.append(s),e.append('
          '+(i.content||"")+"
          "),i.change&&this.tabChange(t,i.id),l.data("LAY_TAB_CHANGE",i.change),C.tabAuto(i.change?"change":null),this},i.prototype.tabDelete=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(o).find('>li[lay-id="'+i+'"]');return C.tabDelete(null,t),this},i.prototype.tabChange=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(o).find('>li[lay-id="'+i+'"]');return C.tabClick.call(t[0],{liElem:t}),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(a.headerElem).index(u(this));C.tabClick.call(this,{index:i,options:a})})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",function(){return/^.+\/.+$/.test(i)?100*new Function("return "+i)()+"%":i}).attr("lay-percent",i),a.text(i),this},".layui-nav"),f="layui-nav-item",p="layui-nav-bar",b="layui-nav-tree",v="layui-nav-child",m="layui-nav-more",g="layui-anim layui-anim-upbit",C={tabClick:function(t){var i=(t=t||{}).options||{},a=t.liElem||u(this),e=i.headerElem?a.parent():a.parents(".layui-tab").eq(0),i=i.bodyElem?u(i.bodyElem):e.children(".layui-tab-content").children(".layui-tab-item"),l=a.find("a"),l="javascript:;"!==l.attr("href")&&"_blank"===l.attr("target"),n="string"==typeof a.attr("lay-unselect"),s=e.attr("lay-filter"),t="index"in t?t.index:a.parent().children("li").index(a);l||n||(a.addClass(r).siblings().removeClass(r),i.eq(t).addClass(h).siblings().removeClass(h)),layui.event.call(this,c,"tab("+s+")",{elem:e,index:t})},tabDelete:function(t,i){var i=i||u(this).parent(),a=i.parent().children("li").index(i),e=i.closest(".layui-tab"),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter");i.hasClass(r)&&(i.next()[0]&&i.next().is("li")?C.tabClick.call(i.next()[0],{index:a+1}):i.prev()[0]&&i.prev().is("li")&&C.tabClick.call(i.prev()[0],null,a-1)),i.remove(),l.eq(a).remove(),setTimeout(function(){C.tabAuto()},50),layui.event.call(this,c,"tabDelete("+n+")",{elem:e,index:a})},tabAuto:function(l){var n="layui-tab-more",s="layui-tab-bar",o="layui-tab-close",c=this;u(".layui-tab").each(function(){var t,i=u(this),a=i.children(".layui-tab-title"),e=(i.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),e=u('');c===window&&d.ie,i.attr("lay-allowclose")&&a.find("li").each(function(){var t,i=u(this);i.find("."+o)[0]||((t=u('')).on("click",C.tabDelete),i.append(t))}),"string"!=typeof i.attr("lay-unauto")&&(a.prop("scrollWidth")>a.outerWidth()+1||a.find("li").length&&a.height()>(t=a.find("li").eq(0).height())+t/2?("change"===l&&a.data("LAY_TAB_CHANGE")&&a.addClass(n),a.find("."+s)[0]||(a.append(e),i.attr("overflow",""),e.on("click",function(t){var i=a.hasClass(n);a[i?"removeClass":"addClass"](n)}))):(a.find("."+s).remove(),i.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.closest(y),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+v),n="string"==typeof e.attr("lay-unselect");if("javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+r).removeClass(r),e.addClass(r)),i.hasClass(b)){var n=f+"ed",s=!e.hasClass(n),o=function(){u(this).css({display:""}),i.children("."+p).css({opacity:0})};if(l.is(":animated"))return;l.removeClass(g),l[0]&&(s?(l.slideDown(200,o),e.addClass(n)):(e.removeClass(n),l.show().slideUp(200,o)),"string"!=typeof i.attr("lay-accordion")&&"all"!==i.attr("lay-shrink")||((s=e.siblings("."+n)).removeClass(n),s.children("."+v).show().stop().slideUp(200,o)))}layui.event.call(this,c,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+h)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(h)),a[n?"addClass":"removeClass"](h),i.html(n?"":""),layui.event.call(this,c,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a=i?'[lay-filter="'+i+'"]':"",i={tab:function(){C.tabAuto.call({})},nav:function(){var s={},o={},c={},r="layui-nav-title";u(y+a).each(function(t){var i=u(this),a=u(''),e=i.find("."+f);i.find("."+p)[0]||(i.append(a),(i.hasClass(b)?e.find("dd,>."+r):e).on("mouseenter",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+v);i.hasClass(b)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(g),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(h),l.find("."+m).addClass(m+"d")},300))}.call(this,a,i,t)}).on("mouseleave",function(){i.hasClass(b)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+v).removeClass(h),i.find("."+m).removeClass(m+"d")},300))}),i.on("mouseleave",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(b)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)})),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+v)[0]&&!t.children("."+m)[0]&&t.append(''),t.off("click",C.clickThis).on("click",C.clickThis)})})},breadcrumb:function(){u(".layui-breadcrumb"+a).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after(""+a+"")}),t.css("visibility","visible"))})},progress:function(){var e="layui-progress";u("."+e+a).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",function(){return/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a}),t.attr("lay-showpercent")&&setTimeout(function(){i.html(''+a+"")},350)})},collapse:function(){u(".layui-collapse"+a).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append(''+(t?"":"")+""),i.off("click",C.collapse).on("click",C.collapse)})})}};return i[t]?i[t]():layui.each(i,function(t,i){i()})},new i),e=u(document);u(function(){a.render()}),e.on("click",".layui-tab-title li",C.tabClick),u(window).on("resize",C.tabAuto),t(c,a)});layui.define(["lay","layer"],function(e){"use strict";var x=layui.$,a=layui.lay,i=layui.layer,b=layui.device(),t="upload",c="layui_"+t+"_index",s={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var i=this;return i.config=x.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,t,e,i)}},o=function(){var i=this,e=i.config.id;return{upload:function(e){i.upload.call(i,e)},reload:function(e){i.reload.call(i,e)},config:(o.that[e]=i).config}},l="layui-upload-file",r="layui-upload-form",F="layui-upload-iframe",w="layui-upload-choose",L="UPLOADING",z=function(e){var i=this;i.index=++s.index,i.config=x.extend({},i.config,s.config,e),i.render()};z.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1,text:{"cross-domain":"Cross-domain requests are not supported","data-format-error":"Please return JSON data format","check-error":"",error:"","limit-number":null,"limit-size":null}},z.prototype.reload=function(e){var i=this;i.config=x.extend({},i.config,e),i.render(!0)},z.prototype.render=function(e){var i=this,t=i.config,n=x(t.elem);return 1"].join("")),n=i.elem.next();(n.hasClass(l)||n.hasClass(r))&&n.remove(),b.ie&&b.ie<10&&i.elem.wrap('
          '),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(t),b.ie&&b.ie<10&&e.initIE()},z.prototype.initIE=function(){var t,e=this.config,i=x(''),n=x(['
          ',"
          "].join(""));x("#"+F)[0]||x("body").append(i),e.elem.next().hasClass(r)||(this.elemFile.wrap(n),e.elem.next("."+r).append((t=[],layui.each(e.data,function(e,i){i="function"==typeof i?i():i,t.push('')}),t.join(""))))},z.prototype.msg=function(e){return i.msg(e,{icon:2,shift:6})},z.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},z.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,i){var t=new FileReader;t.readAsDataURL(i),t.onload=function(){n&&n(e,i,this.result)}})},z.prototype.upload=function(e,i){var t,n,a,o,u=this,f=u.config,c=f.text||{},l=u.elemFile[0],s=function(){return e||u.files||u.chooseFiles||l.files},r=function(){var a=0,o=0,l=s(),r=function(){f.multiple&&a+o===u.fileLength&&"function"==typeof f.allDone&&f.allDone({total:u.fileLength,successful:a,failed:o})},t=function(t){var n=new FormData,i=function(e){t.unified?layui.each(l,function(e,i){delete i[L]}):delete e[L]};if(layui.each(f.data,function(e,i){i="function"==typeof i?t.unified?i():i(t.index,t.file):i,n.append(e,i)}),t.unified)layui.each(l,function(e,i){i[L]||(i[L]=!0,n.append(f.field,i))});else{if(t.file[L])return;n.append(f.field,t.file),t.file[L]=!0}var e={url:f.url,type:"post",data:n,dataType:f.dataType||"json",contentType:!1,processData:!1,headers:f.headers||{},success:function(e){f.unified?a+=u.fileLength:a++,p(t.index,e),r(t.index),i(t.file)},error:function(e){f.unified?o+=u.fileLength:o++,u.msg(c.error||["Upload failed, please try again.","status: "+(e.status||"")+" - "+(e.statusText||"error")].join("
          ")),m(t.index),r(t.index),i(t.file)}};"function"==typeof f.progress&&(e.xhr=function(){var e=x.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var i;e.lengthComputable&&(i=Math.floor(e.loaded/e.total*100),f.progress(i,(f.item||f.elem)[0],e,t.index))}),e}),x.ajax(e)};f.unified?t({unified:!0,index:0}):layui.each(l,function(e,i){t({index:e,file:i})})},d=function(){var n=x("#"+F);u.elemFile.parent().submit(),clearInterval(z.timer),z.timer=setInterval(function(){var e,i=n.contents().find("body");try{e=i.text()}catch(t){u.msg(c["cross-domain"]),clearInterval(z.timer),m()}e&&(clearInterval(z.timer),i.html(""),p(0,e))},30)},p=function(e,i){if(u.elemFile.next("."+w).remove(),l.value="","json"===f.force&&"object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},u.msg(c["data-format-error"])}"function"==typeof f.done&&f.done(i,e||0,function(e){u.upload(e)})},m=function(e){f.auto&&(l.value=""),"function"==typeof f.error&&f.error(e||0,function(e){u.upload(e)})},h=f.exts,g=(n=[],layui.each(e||u.chooseFiles,function(e,i){n.push(i.name)}),n),v={preview:function(e){u.preview(e)},upload:function(e,i){var t={};t[e]=i,u.upload(t)},pushFile:function(){return u.files=u.files||{},layui.each(u.chooseFiles,function(e,i){u.files[e]=i}),u.files},resetFile:function(e,i,t){i=new File([i],t);u.files=u.files||{},u.files[e]=i},getChooseFiles:function(){return u.chooseFiles}},y={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[f.accept]||"\u6587\u4ef6",g=0===g.length?l.value.match(/[^\/\\]+\..+/g)||[]:g;if(0!==g.length){switch(f.accept){case"file":layui.each(g,function(e,i){if(h&&!RegExp(".\\.("+h+")$","i").test(escape(i)))return t=!0});break;case"video":layui.each(g,function(e,i){if(!RegExp(".\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(i)))return t=!0});break;case"audio":layui.each(g,function(e,i){if(!RegExp(".\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(i)))return t=!0});break;default:layui.each(g,function(e,i){if(!RegExp(".\\.("+(h||"jpg|png|gif|bmp|jpeg|svg|webp")+")$","i").test(escape(i)))return t=!0})}if(t)return u.msg(c["check-error"]||"\u9009\u62e9\u7684"+y+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),l.value="";if("choose"!==i&&!f.auto||(f.choose&&f.choose(v),"choose"!==i)){if(u.fileLength=(a=0,y=s(),layui.each(y,function(){a++}),a),f.number&&u.fileLength>f.number)return u.msg("function"==typeof c["limit-number"]?c["limit-number"](f,u.fileLength):"\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+f.number+" \u4e2a\u6587\u4ef6
          \u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+u.fileLength+" \u4e2a\u6587\u4ef6");if(01024*f.size&&(i=1<=(i=f.size/1024)?i.toFixed(2)+"MB":f.size+"KB",l.value="",o=i)}),o)return u.msg("function"==typeof c["limit-size"]?c["limit-size"](f,o):"\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+o);if(!f.before||!1!==f.before(v))b.ie?(9'+e+"")},r=function(t){var n=!0;return layui.each(a.files,function(e,i){if(!(n=!(i.name===t.name)))return!0}),n},u=function(e){var t=function(e){e.ext=e.name.substr(e.name.lastIndexOf(".")+1).toLowerCase(),e.sizes=s.util.parseSize(e.size)};return e instanceof FileList?layui.each(e,function(e,i){t(i)}):t(e),e},f=function(e){var t;return(e=e||[]).length?a.files?(t=[],layui.each(e,function(e,i){r(i)&&t.push(u(i))}),t):u(e):[]};n.elem.off("upload.start").on("upload.start",function(){var e=x(this);a.config.item=e,a.elemFile[0].click()}),b.ie&&b.ie<10||n.elem.off("upload.over").on("upload.over",function(){x(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){x(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,i){var t=x(this),i=f(i.originalEvent.dataTransfer.files);t.removeAttr("lay-over"),o(i),n.auto?a.upload():l(i)}),a.elemFile.on("change",function(){var e=f(this.files);0!==e.length&&(o(e),n.auto?a.upload():l(e))}),n.bindAction.off("upload.action").on("upload.action",function(){a.upload()}),n.elem.data(c)||(n.elem.on("click",function(){a.isFile()||x(this).trigger("upload.start")}),n.drag&&n.elem.on("dragover",function(e){e.preventDefault(),x(this).trigger("upload.over")}).on("dragleave",function(e){x(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),x(this).trigger("upload.drop",e)}),n.bindAction.on("click",function(){x(this).trigger("upload.action")}),n.elem.data(c,n.id))},s.util={parseSize:function(e,i){var t,n;return i=i||2,null!=e&&e?(t="string"==typeof e?parseFloat(e):e,n=Math.floor(Math.log(t)/Math.log(1024)),(e=(e=t/Math.pow(1024,n))%1==0?e:parseFloat(e.toFixed(i)))+["Bytes","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"][n]):"0"}},o.that={},o.getThis=function(e){var i=o.that[e];return i||hint.error(e?t+" instance with ID '"+e+"' not found":"ID argument required"),i},s.render=function(e){e=new z(e);return o.call(e)},e(t,s)});layui.define(["lay","layer","util"],function(e){"use strict";var T=layui.$,h=layui.layer,N=layui.util,l=layui.hint(),$=(layui.device(),"form"),u=".layui-form",_="layui-this",F="layui-hide",A="layui-disabled",t=function(){this.config={verify:{required:function(e){if(!/[\S]+/.test(e))return"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"},phone:function(e){if(e&&!/^1\d{10}$/.test(e))return"\u624b\u673a\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"},email:function(e){if(e&&!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))return"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"},url:function(e){if(e&&!/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/.test(e))return"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"},number:function(e){if(e&&isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:function(e){if(e&&!/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/.test(e))return"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"},identity:function(e){if(e&&!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(e))return"\u8eab\u4efd\u8bc1\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"}},autocomplete:null}},i=(t.prototype.set=function(e){return T.extend(!0,this.config,e),this},t.prototype.verify=function(e){return T.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return T(u+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,$,e,t)},t.prototype.val=function(e,i){return this.getFormElem(e).each(function(e,t){var a=T(this);layui.each(i,function(e,t){var i,e=a.find('[name="'+e+'"]');e[0]&&("checkbox"===(i=e[0].type)?e[0].checked=t:"radio"===i?e.each(function(){this.checked=this.value==t+""}):e.val(t))})}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var a={},n={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i;T(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],a[i]=0|a[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]+++"]")),/^(checkbox|radio)$/.test(t.type)&&!t.checked||(n[i||t.name]=t.value))}),n},t.prototype.render=function(e,t){var i=this.config,a=T(u+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){var e=e||a.find("input,textarea"),t=(i.autocomplete&&e.attr("autocomplete",i.autocomplete),function(e,t){var i=e.val(),a=Number(i),n=Number(e.attr("step"))||1,l=Number(e.attr("min")),r=Number(e.attr("max")),s=Number(e.attr("lay-precision")),o="click"!==t&&""===i,c="init"===t;isNaN(a)||("click"===t&&(a=!!T(this).index()?a-n:a+n),t=function(e){return((e.toString().match(/\.(\d+$)/)||[])[1]||"").length},s=0<=s?s:Math.max(t(n),t(i)),o||(c||r<=(a=a<=l?l:a)&&(a=r),0===s?a=parseInt(a):0'),e=layui.isArray(i.value)?i.value:[i.value],e=T((a=[],layui.each(e,function(e,t){a.push('')}),a.join(""))),n=(t.append(e),i.split&&t.addClass("layui-input-split"),i.className&&t.addClass(i.className),r.next("."+u)),l=(n[0]&&n.remove(),r.parent().hasClass(o)||r.wrap('
          '),r.next("."+c));l[0]?((n=l.find("."+u))[0]&&n.remove(),l.prepend(t),r.css("padding-right",function(){return(r.closest(".layui-input-group")[0]?0:l.outerWidth())+t.outerWidth()})):(t.addClass(c),r.after(t)),"auto"===i.show&&d(t,r.val()),"function"==typeof i.init&&i.init.call(this,r,i),r.on("input propertychange",function(){var e=this.value;"auto"===i.show&&d(t,e)}),r.on("blur",function(){"function"==typeof i.blur&&i.blur.call(this,r,i)}),e.on("click",function(){var e=r.attr("lay-filter");T(this).hasClass(A)||("function"==typeof i.click&&i.click.call(this,r,i),layui.event.call(this,$,"input-affix("+e+")",{elem:r[0],affix:s,options:i}))})},f={eye:{value:"eye-invisible",click:function(e,t){var i="LAY_FORM_INPUT_AFFIX_SHOW",a=e.data(i);e.attr("type",a?"password":"text").data(i,!a),n({value:a?"eye-invisible":"eye"})}},clear:{value:"clear",click:function(e){e.val("").focus(),d(T(this).parent(),null)},show:"auto",disabled:e},number:{value:["up","down"],split:!0,className:"layui-input-number",disabled:r.is("[disabled]"),init:function(e){t.call(this,e,"init")},click:function(e){t.call(this,e,"click")},blur:function(e){t.call(this,e,"blur")}}};n()})},select:function(e){var m,u="\u8bf7\u9009\u62e9",g="layui-form-select",b="layui-select-title",x="layui-select-none",k="layui-select-create-option",C="",e=e||a.find("select"),w=function(e,t){T(e.target).parent().hasClass(b)&&!t||((e=T("."+g)).removeClass(g+"ed "+g+"up"),e.hasClass("layui-select-creatable")&&e.children("dl").children("."+k).remove(),m&&C&&m.val(C)),m=null},d=function(n,e,t,c){var s,u,a,i,o,d,l,r=T(this),f=n.find("."+b),h=f.find("input"),y=n.find("dl"),p=(y.children("dd"),y.children("dt")),v=this.selectedIndex;e||(u=r.attr("lay-search"),a=!(!lay.ie||"10"!==lay.ie&&"11"!==lay.ie||!h.attr("placeholder")),i=function(){var e=n.offset().top+n.outerHeight()+5-j.scrollTop(),t=y.outerHeight(),i=y.children("dd");v=r[0].selectedIndex,n.addClass(g+"ed"),i.removeClass(F),p.removeClass(F),s=null,i.removeClass(_),0<=v&&i.eq(v).addClass(_),e+t>j.height()&&t<=e&&n.addClass(g+"up"),d(),a&&y.off("mousedown.select.ieph").on("mousedown.select.ieph",function(){h[0].__ieph=!0,setTimeout(function(){h[0].__ieph=!1},60)})},o=function(e){n.removeClass(g+"ed "+g+"up"),h.blur(),s=null,c&&y.children("."+k).remove(),e||l(h.val(),function(e){var t=r[0].selectedIndex;e&&(C=T(r[0].options[t]).html(),0===t&&C===h.attr("placeholder")&&(C=""),h.val(C||""))})},d=function(){var e,t,i=y.children("dd."+_);i[0]&&(e=i.position().top,t=y.height(),i=i.height(),t")).addClass(k).attr("lay-value",i).html(N.escape(i)),y.append(t)):e?y.find("."+x)[0]||y.append('

          \u65e0\u5339\u914d\u9879

          '):y.find("."+x).remove()},"keyup"),""===i&&(r.val(""),y.find("."+_).removeClass(_),(r[0].options[0]||{}).value||y.children("dd:eq(0)").addClass(_),y.find("."+x).remove(),c)&&y.children("."+k).remove(),void d()))},50)).on("blur",function(e){var t=r[0].selectedIndex;m=h,C=T(r[0].options[t]).text(),0===t&&C===h.attr("placeholder")&&(C=""),setTimeout(function(){l(h.val(),function(e){C||h.val("")},"blur")},200)}),y.on("click","dd",function(){var e,t=T(this),i=t.attr("lay-value"),a=r.attr("lay-filter");return t.hasClass(A)||(t.hasClass("layui-select-tips")?h.val(""):(h.val(t.text()),t.addClass(_)),c&&t.hasClass(k)&&(t.removeClass(k),(e=T("
          "].join(""));i.after(l),function(a,n){var l=T(this);a.on("click",function(){var e=T(this),t=l.attr("lay-filter"),e=e.next("*[lay-checkbox]")[0]?e.next().html():l.attr("title")||"",i=l.attr("lay-skin")||"primary",e="switch"===i?e.split("|"):[e];l[0].disabled||(l[0].indeterminate&&(l[0].indeterminate=!1,a.find("."+c.SUBTRA).removeClass(c.SUBTRA).addClass("layui-icon-ok")),l[0].checked?(l[0].checked=!1,a.removeClass(n[1]),"switch"===i&&a.children("div").html(e[1])):(l[0].checked=!0,a.addClass(n[1]),"switch"===i&&a.children("div").html(e[0])),layui.event.call(l[0],$,n[2]+"("+t+")",{elem:l[0],value:l[0].value,othis:a}))})}.call(this,l,r)})},radio:function(e){var o="layui-form-radio",c=["layui-icon-radio","layui-icon-circle"],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=T(this),a=i.next("."+o),n=this.disabled,l=i.attr("lay-skin");if("string"==typeof i.attr("lay-ignore"))return i.show();a[0]&&a.remove();var a=N.escape(t.title||""),r=[],s=(i.next("[lay-radio]")[0]&&(a=(s=i.next()).html()||"",1",'',"
          "+a+"
          ","
          "].join("")));i.after(s),function(a){var n=T(this),l="layui-anim-scaleSpring";a.on("click",function(){var e=n[0].name,t=n.parents(u),i=n.attr("lay-filter"),e=t.find("input[name="+e.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(e,function(){var e=T(this).next("."+o);this.checked=!1,e.removeClass(o+"ed"),e.children(".layui-icon").removeClass(l+" "+c[0]).addClass(c[1])}),n[0].checked=!0,a.addClass(o+"ed"),a.children(".layui-icon").addClass(l+" "+c[0]),layui.event.call(n[0],$,"radio("+i+")",{elem:n[0],value:n[0].value,othis:a}))})}.call(this,s)})}},t=function(){layui.each(n,function(e,t){t()})};return"object"===layui.type(e)?T(e).is(u)?(a=T(e),t()):e.each(function(e,t){var i=T(t);i.closest(u).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):t(),this},t.prototype.validate=function(e){var u,d=this.config.verify,f="layui-form-danger";return!(e=T(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var s=T(this),t=(s.attr("lay-verify")||"").split("|"),o=s.attr("lay-vertype"),c=T.trim(s.val());if(s.removeClass(f),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^(checkbox|radio)$/.test(r.type),i=i||a[1];if("required"===t&&(i=s.attr("lay-reqtext")||i),n)return"tips"===o?h.tips(i,"string"!=typeof s.attr("lay-ignore")&&l?s.next():s,{tips:1}):"alert"===o?h.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\b(string|number)\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?s.next().find("input"):r).focus()},7),s.addClass(f),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=T(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(u).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,$,"submit("+e+")",l))}),r=new t,t=T(document),j=T(window);T(function(){r.render()}),t.on("reset",u,function(){var e=T(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",u,i).on("click","*[lay-submit]",i),e($,r)});layui.define(["lay","laytpl","laypage","form","util"],function(n){"use strict";var f=layui.$,d=layui.lay,m=layui.laytpl,O=layui.laypage,p=layui.layer,v=layui.form,g=layui.util,b=layui.hint(),x=layui.device(),k={config:{checkName:"LAY_CHECKED",indexName:"LAY_INDEX",numbersName:"LAY_NUM",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){return this.config=f.extend({},this.config,e),this},on:function(e,t){return layui.onevent.call(this,N,e,t)}},w=function(){var a=this,e=a.config,i=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){k.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},C=function(e){var t=w.that[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},l=function(e){var t=w.config[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},T=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content;"numbers"===a.type&&(i=e.tplData[k.config.numbersName]);("escape"in a?a:t).escape&&(i=g.escape(i));t=e.text&&a.exportTemplet||a.templet||a.toolbar;return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):m(function(e){try{return d(e).html()}catch(t){return e}}(t)||String(i)).render(f.extend({LAY_COL:a},e.tplData))),e.text?f("
          "+i+"
          ").text():i},N="table",R="lay-"+N+"-id",t=".layui-table",D="layui-hide",y="layui-hide-v",h="layui-none",L="layui-table-view",o=".layui-table-header",E=".layui-table-body",u=".layui-table-fixed-r",P=".layui-table-pageview",A=".layui-table-sort",_="layui-table-checked",M="layui-table-edit",W="layui-table-hover",I="laytable-cell-group",H="layui-table-col-special",j="layui-table-tool-panel",S="layui-table-expanded",F="LAY_TABLE_MOVE_DICT",e=function(e){return['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
          ','
          ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{-item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
          ","
          "].join("")},a=['',"","
          "].join(""),s=[,"{{# if(d.data.toolbar){ }}",'
          ','
          ','
          ',"
          ","{{# } }}",'
          ',"{{# if(d.data.loading){ }}",'
          ','
          ','{{# if(typeof d.data.loading === "string"){ }}',"{{- d.data.loading}}","{{# } else{ }}",'',"{{# } }}","
          ","
          ","{{# } }}","{{# var left, right; }}",'
          ',e(),"
          ",'
          ',a,"
          ","{{# if(left){ }}",'
          ','
          ',e({fixed:!0}),"
          ",'
          ',a,"
          ","
          ","{{# }; }}","{{# if(right){ }}",'
          ','
          ',e({fixed:"right"}),'
          ',"
          ",'
          ',a,"
          ","
          ","{{# }; }}","
          ","{{# if(d.data.totalRow){ }}",'
          ','','',"
          ","
          ","{{# } }}",'
          ','
          ',"
          "].join(""),r=f(window),z=f(document),i=function(e){this.index=++k.index,this.config=f.extend({},this.config,k.config,e),this.render()},c=(i.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,cellMaxWidth:Number.MAX_VALUE,editTrigger:"click",defaultToolbar:["filter","exports","print"],defaultContextmenu:!0,autoSort:!0,text:{none:"\u65e0\u6570\u636e"},cols:[]},i.prototype.render=function(e){var t=this,a=t.config,i=(a.elem=f(a.elem),a.where=a.where||{},a.id="id"in a?a.id:a.elem.attr("id")||t.index);if(w.that[i]=t,(w.config[i]=a).request=f.extend({pageName:"page",limitName:"limit"},a.request),a.response=f.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),null!==a.page&&"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if(a.elem.attr("lay-filter")||a.elem.attr("lay-filter",a.id),"reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.index=t.index,t.key=a.id||a.index,t.setInit(),a.height&&/^full-.+$/.test(a.height)?(t.fullHeightGap=a.height.split("-")[1],a.height=r.height()-(parseFloat(t.fullHeightGap)||0)):a.height&&/^#\w+\S*-.+$/.test(a.height)?(i=a.height.split("-"),t.parentHeightGap=i.pop(),t.parentDiv=i.join("-"),a.height=f(t.parentDiv).height()-(parseFloat(t.parentHeightGap)||0)):"function"==typeof a.height&&(t.customHeightFunc=a.height,a.height=t.customHeightFunc());var l,e=a.elem,i=e.next("."+L),n=t.elem=f("
          ");n.addClass((l=[L,L+"-"+t.index,"layui-form","layui-border-box"],a.className&&l.push(a.className),l.join(" "))).attr(((l={"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,style:(l=[],a.width&&l.push("width:"+a.width+"px;"),l.join(""))})[R]=a.id,l)).html(m(s,{open:"{{",close:"}}"}).render({data:a,index:t.index})),t.renderStyle(),i[0]&&(t.resizeObserver&&t.resizeObserver.unobserve(t.elem[0]),i.remove()),e.after(n),t.layTool=n.find(".layui-table-tool"),t.layBox=n.find(".layui-table-box"),t.layHeader=n.find(o),t.layMain=n.find(".layui-table-main"),t.layBody=n.find(E),t.layFixed=n.find(".layui-table-fixed"),t.layFixLeft=n.find(".layui-table-fixed-l"),t.layFixRight=n.find(u),t.layTotal=n.find(".layui-table-total"),t.layPage=n.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),t.pullData(t.page),t.events()},i.prototype.initOpts=function(e){this.config;e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||{checkbox:50,radio:50,space:30,numbers:60}[e.type])},i.prototype.setInit=function(e){var l,a,r=this,d=r.config;if(d.clientWidth=d.width||(l=function(e){var t,a=(e=e||d.elem.parent()).width();try{t="none"===e.css("display")}catch(i){}return!e[0]||a&&!t?a:l(e.parent())})(),"width"===e)return d.clientWidth;d.height=d.maxHeight||d.height,d.css&&-1===d.css.indexOf(L)&&(a=d.css.split("}"),layui.each(a,function(e,t){t&&(a[e]="."+L+"-"+r.index+" "+t)}),d.css=a.join("}"));var c=function(a,e,i,l){var n,o;l?(l.key=[d.index,a,i].join("-"),l.colspan=l.colspan||0,l.rowspan=l.rowspan||0,r.initOpts(l),(n=a+(parseInt(l.rowspan)||1)) td:hover > .layui-table-cell{overflow: auto;}"].concat(x.ie?[".layui-table-edit{height: "+i+";}","td[data-edit]:hover:after{height: "+i+";}"]:[]),function(e,t){t&&o.push(a+" "+t)})),l.css&&o.push(l.css),d.style({target:this.elem[0],text:o.join(""),id:"DF-table-"+n})},i.prototype.renderToolbar=function(){var e=this.config,t=['
          ','
          ','
          '].join(""),a=this.layTool.find(".layui-table-tool-temp"),i=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=f(e.toolbar).html()||"")&&a.html(m(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}}),l=[];"object"==typeof e.defaultToolbar&&layui.each(e.defaultToolbar,function(e,t){t="string"==typeof t?i[t]:t;t&&l.push('
          ')}),this.layTool.find(".layui-table-tool-self").html(l.join(""))},i.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=f('
          ');t.pagebar&&((e=f(t.pagebar).html()||"")&&a.append(m(e).render(t)),this.layPage.append(a))},i.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[1]][t[2]],e?l--:l++,i.attr("colspan",l),i[l?"removeClass":"addClass"](D),t.colspan2=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},i.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},i.prototype.setGroupWidth=function(i){var e,l=this;l.config.cols.length<=1||((e=l.layHeader.find((i?"th[data-key="+i.data("parentkey")+"]>":"")+"."+I)).css("width",0),layui.each(e.get().reverse(),function(){var e=f(this),t=e.parent().data("key"),a=0;l.layHeader.eq(0).find("th[data-parentkey="+t+"]").width(function(e,t){f(this).hasClass(D)||0 tr:first-child > th:last-child")).data("field")&&e.prev()[0]?t(e.prev()):e})()).data("key"),n.cssRules(e,function(e){var t=e.style.width||a.outerWidth();e.style.width=parseFloat(t)+l+"px",0'+(e||"Error")+"");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(D),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(y),t.layPage.find(P).addClass(y),k.cache[t.key]=[],t.syncCheckAll(),t.renderForm(),t.setColsWidth(),t.loading(!1)},i.prototype.page=1,i.prototype.pullData=function(a,t){var e,i,l=this,n=l.config,o=(n.HAS_SET_COLS_PATCH||l.setColsPatch(),n.HAS_SET_COLS_PATCH=!0,n.request),r=n.response,d=function(){"object"==typeof n.initSort&&l.sort({field:n.initSort.field,type:n.initSort.type,reloadType:t.type})},c=function(e,t){l.setColsWidth(),l.loading(!1),"function"==typeof n.done&&n.done(e,a,e[r.countName],t)};t=t||{},"function"==typeof n.before&&n.before(n),l.startTime=(new Date).getTime(),t.renderData?((e={})[r.dataName]=k.cache[l.key],e[r.countName]=n.url?"object"===layui.type(n.page)?n.page.count:e[r.dataName].length:n.data.length,"object"==typeof n.totalRow&&(e[r.totalRowName]=f.extend({},l.totalRow)),l.renderData({res:e,curr:a,count:e[r.countName],type:t.type,sort:!0}),c(e,"renderData")):n.url?(i={},n.page&&(i[o.pageName]=a,i[o.limitName]=n.limit),o=f.extend(i,n.where),n.contentType&&0==n.contentType.indexOf("application/json")&&(o=JSON.stringify(o)),l.loading(!0),f.ajax({type:n.method||"get",url:n.url,contentType:n.contentType,data:o,dataType:n.dataType||"json",jsonpCallback:n.jsonpCallback,headers:n.headers||{},complete:"function"==typeof n.complete?n.complete:undefined,success:function(e){(e="function"==typeof n.parseData?n.parseData(e)||e:e)[r.statusName]!=r.statusCode?l.errorView(e[r.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+r.statusName+'": '+r.statusCode):(l.totalRow=e[r.totalRowName],l.renderData({res:e,curr:a,count:e[r.countName],type:t.type}),d(),n.time=(new Date).getTime()-l.startTime+" ms"),c(e,t.type)},error:function(e,t){l.errorView("\u8bf7\u6c42\u5f02\u5e38\uff0c\u9519\u8bef\u63d0\u793a\uff1a"+t),"function"==typeof n.error&&n.error(e,t)}})):"array"===layui.type(n.data)&&(e={},i=a*n.limit-n.limit,o=n.data.concat(),e[r.dataName]=n.page?o.splice(i,n.limit):o,e[r.countName]=n.data.length,"object"==typeof n.totalRow&&(e[r.totalRowName]=f.extend({},n.totalRow)),l.totalRow=e[r.totalRowName],l.renderData({res:e,curr:a,count:e[r.countName],type:t.type}),d(),c(e,t.type))},i.prototype.eachCols=function(e){return k.eachCols(null,e,this.config.cols),this},i.prototype.col=function(e){try{return e=e.split("-"),this.config.cols[e[1]][e[2]]||{}}catch(t){return b.error(t),{}}},i.prototype.getTrHtml=function(a,l,n,e){var s=this,u=s.config,y=e&&e.trs||[],h=e&&e.trs_fixed||[],p=e&&e.trs_fixed_r||[];return n=n||1,layui.each(a,function(e,o){var i=[],r=[],d=[],c=e+u.limit*(n-1)+1;if("object"!=typeof o){a[e]=o={LAY_KEY:o};try{k.cache[s.key][e]=o}catch(t){}}"array"===layui.type(o)&&0===o.length||(o[k.config.numbersName]=c,l||(o[k.config.indexName]=e),s.eachCols(function(e,l){var t,e=l.field||e,a=l.key,n=o[e];n!==undefined&&null!==n||(n=""),l.colGroup||(e=['','
          "+function(){var e,t=f.extend(!0,{LAY_COL:l},o),a=k.config.checkName,i=k.config.disabledName;switch(l.type){case"checkbox":return'';case"radio":return'';case"numbers":return c}return l.toolbar?m(f(l.toolbar).html()||"").render(t):T.call(s,{item3:l,content:n,tplData:t})}(),"
          "].join(""),i.push(e),l.fixed&&"right"!==l.fixed&&r.push(e),"right"===l.fixed&&d.push(e))}),e=['data-index="'+e+'"'],o[k.config.checkName]&&e.push('class="'+_+'"'),e=e.join(" "),y.push(""+i.join("")+""),h.push(""+r.join("")+""),p.push(""+d.join("")+""))}),{trs:y,trs_fixed:h,trs_fixed_r:p}},k.getTrHtml=function(e,t){e=C(e);return e.getTrHtml(t,null,e.page)},i.prototype.renderData=function(e){var a=this,i=a.config,t=e.res,l=e.curr,n=a.count=e.count,o=e.sort,r=t[i.response.dataName]||[],t=t[i.response.totalRowName],d=[],c=[],s=[],u=function(){if(!o&&a.sortKey)return a.sort({field:a.sortKey.field,type:a.sortKey.sort,pull:!0,reloadType:e.type});a.getTrHtml(r,o,l,{trs:d,trs_fixed:c,trs_fixed_r:s}),"fixed"===i.scrollPos&&"reloadData"===e.type||a.layBody.scrollTop(0),"reset"===i.scrollPos&&a.layBody.scrollLeft(0),a.layMain.find("."+h).remove(),a.layMain.find("tbody").html(d.join("")),a.layFixLeft.find("tbody").html(c.join("")),a.layFixRight.find("tbody").html(s.join("")),a.syncCheckAll(),a.renderForm(),a.fullSize(),a.haveInit?a.scrollPatch():setTimeout(function(){a.scrollPatch()},50),a.haveInit=!0,p.close(a.tipsIndex)};return k.cache[a.key]=r,a.layTotal[0==r.length?"addClass":"removeClass"](y),a.layPage[i.page||i.pagebar?"removeClass":"addClass"](D),a.layPage.find(P)[!i.page||0==n||0===r.length&&1==l?"addClass":"removeClass"](y),0===r.length?a.errorView(i.text.none):(a.layFixLeft.removeClass(D),o?u():(u(),a.renderTotal(r,t),a.layTotal&&a.layTotal.removeClass(D),void(i.page&&(i.page=f.extend({elem:"layui-table-page"+i.index,count:n,limit:i.limit,limits:i.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(a.page=e.curr,i.limit=e.limit,a.pullData(e.curr))}},i.page),i.page.count=n,O.render(i.page)))))},k.renderData=function(e){e=C(e);e&&e.pullData(e.page,{renderData:!0,type:"reloadData"})},i.prototype.renderTotal=function(e,o){var r,d=this,c=d.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||d.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),d.dataTotal=[],r=[],d.eachCols(function(e,t){var a,e=t.field||e,i=o&&o[t.field],l="totalRowDecimals"in t?t.totalRowDecimals:2,l=s[e]?parseFloat(s[e]||0).toFixed(l):"",l=(a=t.totalRowText||"",(n={LAY_COL:t})[e]=l,n=t.totalRow&&T.call(d,{item3:t,content:l,tplData:n})||a,i||n),n=(t.field&&d.dataTotal.push({field:t.field,total:f("
          "+l+"
          ").text()}),['','
          "+("string"==typeof(a=t.totalRow||c.totalRow)?m(a).render(f.extend({TOTAL_NUMS:i||s[e],TOTAL_ROW:o||{},LAY_COL:t},t)):l),"
          "].join(""));r.push(n)}),e=d.layTotal.find(".layui-table-patch"),d.layTotal.find("tbody").html(""+r.join("")+(e.length?e.get(0).outerHTML:"")+""))},i.prototype.getColElem=function(e,t){return e.eq(0).find(".laytable-cell-"+t+":eq(0)")},i.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");v.render(e,t)},i.prototype.renderFormByElem=function(a){layui.each(["input","select"],function(e,t){v.render(a.find(t))})},i.prototype.syncCheckAll=function(){var a,e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),l=k.checkStatus(e.key);t[0]&&(a=l.isAll,e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),t.prop({checked:l.isAll,indeterminate:!l.isAll&&l.data.length}),v.render(t))},i.prototype.setRowActive=function(e,t,a){this.config;e=this.layBody.find('tr[data-index="'+e+'"]');if(t=t||"layui-table-click",a)return e.removeClass(t);e.addClass(t),e.siblings("tr").removeClass(t)},i.prototype.setRowChecked=function(i){var e=this,l=e.config,n="all"===i.index,o="array"===layui.type(i.index),r=(t=e.layBody.find("tr"),n?t:t.filter(o?function(){var e=f(this).data("index");return-1!==i.index.indexOf(e)}:'[data-index="'+i.index+'"]')),t=(i=f.extend({type:"checkbox"},i),k.cache[e.key]),a="checked"in i,d=function(e){return"radio"===i.type||(a?i.checked:!e)},t=(layui.each(t,function(e,t){var a;"array"===layui.type(t)||t[l.disabledName]||(n||(o?-1!==i.index.indexOf(e):Number(i.index)===e)?(a=t[l.checkName]=d(t[l.checkName]),(e=r.filter('[data-index="'+e+'"]'))[a?"addClass":"removeClass"](_),"radio"===i.type&&e.siblings().removeClass(_)):"radio"===i.type&&delete t[l.checkName])}),r.find('input[lay-type="'+({radio:"layTableRadio",checkbox:"layTableCheckbox"}[i.type]||"checkbox")+'"]:not(:disabled)')),c=t.last(),s=c.closest(u);("radio"===i.type&&s.hasClass(D)?t.first():t).prop("checked",d(c.prop("checked"))),e.syncCheckAll(),e.renderForm(i.type)},i.prototype.sort=function(l){var e,t=this,a={},i=t.config,n=i.elem.attr("lay-filter"),o=k.cache[t.key];"string"==typeof(l=l||{}).field&&(r=l.field,t.layHeader.find("th").each(function(e,t){var a=f(this),i=a.data("field");if(i===l.field)return l.field=a,r=i,!1}));try{var r=r||l.field.data("field"),d=l.field.data("key");if(t.sortKey&&!l.pull&&r===t.sortKey.field&&l.type===t.sortKey.sort)return;var c=t.layHeader.find("th .laytable-cell-"+d).find(A);t.layHeader.find("th").find(A).removeAttr("lay-sort"),c.attr("lay-sort",l.type||null),t.layFixed.find("th")}catch(s){b.error("Table modules: sort field '"+r+"' not matched")}t.sortKey={field:r,sort:l.type},i.autoSort&&("asc"===l.type?e=layui.sort(o,r,null,!0):"desc"===l.type?e=layui.sort(o,r,!0,!0):(e=layui.sort(o,k.config.indexName,null,!0),delete t.sortKey,delete i.initSort)),a[i.response.dataName]=e||o,t.renderData({res:a,curr:t.page,count:t.count,sort:!0,type:l.reloadType}),l.fromEvent&&(i.initSort={field:r,type:l.type},layui.event.call(l.field,N,"sort("+n+")",f.extend({config:i},i.initSort)))},i.prototype.loading=function(e){this.config.loading&&this.layBox.find(".layui-table-init").toggleClass(y,!e)},i.prototype.cssRules=function(t,a){var e=this.elem.children("style")[0];d.getStyleRules(e,function(e){if(e.selectorText===".laytable-cell-"+t)return a(e),!0})},i.prototype.fullSize=function(){var e,a,i=this,t=i.config,l=t.height;i.fullHeightGap?(l=r.height()-i.fullHeightGap)<135&&(l=135):i.parentDiv&&i.parentHeightGap?(l=f(i.parentDiv).height()-i.parentHeightGap)<135&&(l=135):i.customHeightFunc&&(l=i.customHeightFunc())<135&&(l=135),1
          ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(E).css("height",t.height()>=n?n:"auto").scrollTop(e.layMain.scrollTop()),e.layFixRight[k.cache[e.key]&&k.cache[e.key].length&&0');a.html(t),s.height&&a.css("max-height",s.height-(c.layTool.outerHeight()||50)),i.find("."+j)[0]||i.append(a),c.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};switch(layui.stope(e),z.trigger("table.tool.panel.remove"),p.close(c.tipsIndex),t){case"LAYTABLE_COLS":n({list:(a=[],c.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
        • "+(t.fieldTitle||t.title||t.field)+"").text())+'" lay-filter="LAY_TABLE_TOOL_COLS">
        • ')}),a.join("")),done:function(){v.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=f(e.elem),t=this.checked,a=e.data("key"),i=c.col(a),l=i.hide,e=e.data("parentkey");i.key&&(i.hide=!t,c.elem.find('*[data-key="'+a+'"]')[t?"removeClass":"addClass"](D),l!=i.hide&&c.setParentCol(!t,e),c.resize(),layui.event.call(this,N,"colToggled("+u+")",{col:i,config:s}))})}});break;case"LAYTABLE_EXPORT":if(!l.length)return p.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",this,{tips:3});x.ie?p.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",this,{tips:3}):n({list:['
        • \u5bfc\u51fa csv \u683c\u5f0f\u6587\u4ef6
        • ','
        • \u5bfc\u51fa xls \u683c\u5f0f\u6587\u4ef6
        • '].join(""),done:function(e,t){t.on("click",function(){var e=f(this).data("type");k.exportFile.call(c,s.id,null,e)})}});break;case"LAYTABLE_PRINT":if(!l.length)return p.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",this,{tips:3});var o=window.open("about:blank","_blank"),r=[""].join(""),d=f(c.layHeader.html());d.append(c.layMain.find("table").html()),d.append(c.layTotal.find("table").html()),d.find("th.layui-table-patch").remove(),d.find("thead>tr>th."+H).filter(function(e,t){return!f(t).children("."+I).length}).remove(),d.find("tbody>tr>td."+H).remove(),o.document.write(r+d.prop("outerHTML")),o.document.close(),layui.device("edg").edg?(o.onafterprint=o.close,o.print()):(o.print(),o.close())}layui.event.call(this,N,"toolbar("+u+")",f.extend({event:t,config:s},{}))}),c.layHeader.on("click","*[lay-event]",function(e){var t=f(this),a=t.attr("lay-event"),t=t.closest("th").data("key"),t=c.col(t);layui.event.call(this,N,"colTool("+u+")",f.extend({event:a,config:s,col:t},{}))}),c.layPagebar.on("click","*[lay-event]",function(e){var t=f(this).attr("lay-event");layui.event.call(this,N,"pagebar("+u+")",f.extend({event:t,config:s},{}))}),e.on("mousemove",function(e){var t=f(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||w.eventMoveElem||(r.allowResize=t.width()-e<=10,o.css("cursor",r.allowResize?"col-resize":""))}).on("mouseleave",function(){f(this);w.eventMoveElem||(r.allowResize=!1,o.css("cursor",""))}).on("mousedown",function(e){var t,a=f(this);r.allowResize&&(t=a.data("key"),e.preventDefault(),r.offset=[e.clientX,e.clientY],c.cssRules(t,function(e){var t=e.style.width||a.outerWidth();r.rule=e,r.ruleWidth=parseFloat(t),r.minWidth=a.data("minwidth")||s.cellMinWidth,r.maxWidth=a.data("maxwidth")||s.cellMaxWidth}),a.data(F,r),w.eventMoveElem=a)}),w.docEvent||z.on("mousemove",function(e){var t,a;w.eventMoveElem&&(t=w.eventMoveElem.data(F)||{},w.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&(e=t.ruleWidth+e.clientX-t.offset[0],a=w.eventMoveElem.closest("."+L).attr(R),a=C(a))&&((e=et.maxWidth&&(e=t.maxWidth),t.rule.style.width=e+"px",a.setGroupWidth(w.eventMoveElem),p.close(c.tipsIndex))}).on("mouseup",function(e){var t,a,i,l,n;w.eventMoveElem&&(i=(t=w.eventMoveElem).closest("."+L).attr(R),a=C(i))&&(i=t.data("key"),l=a.col(i),n=a.config.elem.attr("lay-filter"),r={},o.css("cursor",""),a.scrollPatch(),t.removeData(F),delete w.eventMoveElem,a.cssRules(i,function(e){l.width=parseFloat(e.style.width),layui.event.call(t[0],N,"colResized("+n+")",{col:l,config:a.config})}))}),w.docEvent=!0,e.on("click",function(e){var t=f(this),a=t.find(A),i=a.attr("lay-sort");if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");c.sort({field:t,type:"asc"===i?"desc":"desc"===i?null:"asc",fromEvent:!0})}).find(A+" .layui-edge ").on("click",function(e){var t=f(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?c.sort({field:t,type:"asc",fromEvent:!0}):c.sort({field:t,type:"desc",fromEvent:!0})}),c.commonMember=function(e){var a=f(this).parents("tr").eq(0).data("index"),t=c.layBody.find('tr[data-index="'+a+'"]'),i=(k.cache[c.key]||[])[a]||{},l={tr:t,config:s,data:k.clearCacheKey(i),dataCache:i,index:a,del:function(){k.cache[c.key][a]=[],t.remove(),c.scrollPatch()},update:function(e,t){c.updateRow({index:a,data:e=e||{},related:t},function(e,t){l.data[e]=t})},setRowChecked:function(e){c.setRowChecked(f.extend({index:a},e))}};return f.extend(l,e)}),a=(c.elem.on("click",'input[name="layTableCheckbox"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=(c.layBody.find('input[name="layTableCheckbox"]'),t.parents("tr").eq(0).data("index")),l=t[0].checked,n="layTableAllChoose"===t.attr("lay-filter");t[0].disabled||(n?c.setRowChecked({index:"all",checked:l}):(c.setRowChecked({index:i,checked:l}),layui.stope(e)),layui.event.call(t[0],N,"checkbox("+u+")",d.call(t[0],{checked:l,type:n?"all":"one",getCol:function(){return c.col(a.data("key"))}})))}),c.elem.on("click",'input[lay-type="layTableRadio"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=t[0].checked,l=t.parents("tr").eq(0).data("index");if(layui.stope(e),t[0].disabled)return!1;c.setRowChecked({type:"radio",index:l}),layui.event.call(t[0],N,"radio("+u+")",d.call(t[0],{checked:i,getCol:function(){return c.col(a.data("key"))}}))}),c.layBody.on("mouseenter","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").addClass(W)}).on("mouseleave","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").removeClass(W)}).on("click","tr",function(e){var t=[".layui-form-checkbox",".layui-form-switch",".layui-form-radio","[lay-unrow]"].join(",");f(e.target).is(t)||f(e.target).closest(t)[0]||a.call(this,"row")}).on("dblclick","tr",function(){a.call(this,"rowDouble")}).on("contextmenu","tr",function(e){s.defaultContextmenu||e.preventDefault(),a.call(this,"rowContextmenu")}),function(e){var t=f(this);t.data("off")||layui.event.call(this,N,e+"("+u+")",d.call(t.children("td")[0]))}),n=function(e,t){var a,i,l;(e=f(e)).data("off")||(l=e.data("field"),i=e.data("key"),i=c.col(i),a=e.closest("tr").data("index"),a=k.cache[c.key][a],e.children(y),(i="function"==typeof i.edit?i.edit(a):i.edit)&&((i=f("textarea"===i?'':''))[0].value=(l=e.data("content")||a[l])===undefined||null===l?"":l,e.find("."+M)[0]||e.append(i),i.focus(),t)&&layui.stope(t))},i=(c.layBody.on("change","."+M,function(){var e=f(this),t=e.parent(),a=this.value,i=e.parent().data("field"),e=e.closest("tr").data("index"),e=k.cache[c.key][e],l=d.call(t[0],{value:a,field:i,oldValue:e[i],td:t,reedit:function(){setTimeout(function(){n(l.td);var e={};e[i]=l.oldValue,l.update(e)})},getCol:function(){return c.col(t.data("key"))}}),e={};e[i]=a,l.update(e),layui.event.call(t[0],N,"edit("+u+")",l)}).on("blur","."+M,function(){f(this).remove()}),c.layBody.on(s.editTrigger,"td",function(e){n(this,e)}).on("mouseenter","td",function(){t.call(this)}).on("mouseleave","td",function(){t.call(this,"hide")}),c.layTotal.on("mouseenter","td",function(){t.call(this)}).on("mouseleave","td",function(){t.call(this,"hide")}),"layui-table-grid-down"),t=function(e){var t=f(this),a=t.children(y);t.data("off")||t.parent().hasClass(S)||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.prop("clientWidth")||0'))},l=function(e,t){var a=f(this),i=a.parent(),l=i.data("key"),n=c.col(l),o=i.parent().data("index"),r=i.children(y),i="layui-table-cell-c",d=f('');"tips"===(t=t||n.expandedMode||s.cellExpandedMode)?c.tipsIndex=p.tips(['
          ',r.html(),"
          ",''].join(""),r[0],{tips:[3,""],time:-1,anim:-1,maxWidth:x.ios||x.android?300:c.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){p.close(t)})}}):(c.elem.find("."+i).trigger("click"),c.cssRules(l,function(e){var t=e.style.width,a=n.expandedWidth||s.cellExpandedWidth;atr").each(function(i){n.cols[i]=[],f(this).children().each(function(e){var t=f(this),a=t.attr("lay-data"),a=d.options(this,{attr:a?"lay-data":null,errorText:r+(a||t.attr("lay-options"))}),t=f.extend({title:t.text(),colspan:parseInt(t.attr("colspan"))||1,rowspan:parseInt(t.attr("rowspan"))||1},a);n.cols[i].push(t)})}),e.find("tbody>tr")),t=k.render(n);!a.length||o.data||t.config.url||(l=0,k.eachCols(t.config.id,function(e,i){a.each(function(e){n.data[e]=n.data[e]||{};var t=f(this),a=i.field;n.data[e][a]=t.children("td").eq(l).html()}),l++}),t.reloadData({data:n.data}))}),this},w.that={},w.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),c(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=parseInt(1td').filter('[data-field="'+e+'"]')}}})).replace(/"/g,'""'),n.push(a='"'+a+'"')):t.field&&"normal"!==t.type&&0==i&&(d[t.field]=!0)}),r.push(n.join(","))}),c&&layui.each(c.dataTotal,function(e,t){d[t.field]||i.push('"'+(t.total||"")+'"')}),o.join(",")+"\r\n"+r.join("\r\n")+"\r\n"+i.join(","))),u.download=(a.title||n.title||"table_"+(n.index||""))+"."+l,document.body.appendChild(u),u.click(),document.body.removeChild(u)},k.getOptions=l,k.hideCol=function(e,l){var n=C(e);n&&("boolean"===layui.type(l)?n.eachCols(function(e,t){var a=t.key,i=n.col(a),t=t.parentKey;i.hide!=l&&(i=i.hide=l,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](D),n.setParentCol(i,t))}):(l=layui.isArray(l)?l:[l],layui.each(l,function(e,l){n.eachCols(function(e,t){var a,i;l.field===t.field&&(a=t.key,i=n.col(a),t=t.parentKey,"hide"in l)&&i.hide!=l.hide&&(i=i.hide=!!l.hide,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](D),n.setParentCol(i,t))})})),f("."+j).remove(),n.resize())},k.reload=function(e,t,a,i){if(l(e))return(e=C(e)).reload(t,a,i),w.call(e)},k.reloadData=function(){var a=f.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["elem","id","cols","width","height","maxHeight","toolbar","defaultToolbar","className","css","pagebar"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)&&delete a[1][e]}),k.reload.apply(null,a)},k.render=function(e){e=new i(e);return w.call(e)},k.clearCacheKey=function(e){return delete(e=f.extend({},e))[k.config.checkName],delete e[k.config.indexName],delete e[k.config.numbersName],delete e[k.config.disabledName],e},f(function(){k.init()}),n(N,k)});layui.define(["table"],function(e){"use strict";var A=layui.$,x=layui.form,P=layui.table,y=layui.hint(),B={config:{},on:P.on,eachCols:P.eachCols,index:P.index,set:function(e){var t=this;return t.config=A.extend({},t.config,e),t},resize:P.resize,getOptions:P.getOptions,hideCol:P.hideCol,renderData:P.renderData},i=function(){var a=this,e=a.config,n=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){B.reloadData(n,e,t)}}},j=function(e){var t=i.that[e];return t||y.error(e?"The treeTable instance with ID '"+e+"' not found":"ID argument required"),t||null},F="lay-table-id",L="layui-hide",s=".layui-table-body",q=".layui-table-main",R=".layui-table-fixed-l",Y=".layui-table-fixed-r",l="layui-table-checked",h="layui-table-tree",z="LAY_DATA_INDEX",m="LAY_DATA_INDEX_HISTORY",f="LAY_PARENT_INDEX",b="LAY_CHECKBOX_HALF",H="LAY_EXPAND",X="LAY_HAS_EXPANDED",V="LAY_ASYNC_STATUS",n=["all","parent","children","none"],t=/<[^>]+?>/,p=["flexIconClose","flexIconOpen","iconClose","iconOpen","iconLeaf","icon"],a=function(e){var t=this;t.index=++B.index,t.config=A.extend(!0,{},t.config,B.config,e),t.init(),t.render()},g=function(n,i,e){var l=P.cache[n];layui.each(e||l,function(e,t){var a=t[z]||"";-1!==a.indexOf("-")&&(l[a]=t),t[i]&&g(n,i,t[i])})},d=function(d,a,e){var r=j(d),o=("reloadData"!==e&&(r.status={expand:{}}),A.extend(!0,{},r.getOptions(),a)),n=o.tree,c=n.customName.children,i=n.customName.id,l=(delete a.hasNumberCol,delete a.hasChecboxCol,delete a.hasRadioCol,P.eachCols(null,function(e,t){"numbers"===t.type?a.hasNumberCol=!0:"checkbox"===t.type?a.hasChecboxCol=!0:"radio"===t.type&&(a.hasRadioCol=!0)},o.cols),a.parseData),u=a.done;"reloadData"===e&&"fixed"===o.scrollPos&&(r.scrollTopCache=r.config.elem.next().find(s).scrollTop()),o.url?e&&(!l||l.mod)||(a.parseData=function(){var e=this,t=arguments,a=t[0],t=("function"===layui.type(l)&&(a=l.apply(e,t)||t[0]),e.response.dataName);return n.data.isSimpleData&&!n["async"].enable&&(a[t]=r.flatToTree(a[t])),N(a[t],function(e){e[H]=H in e?e[H]:e[i]!==undefined&&r.status.expand[e[i]]},c),e.autoSort&&e.initSort&&e.initSort.type&&layui.sort(a[t],e.initSort.field,"desc"===e.initSort.type,!0),r.initData(a[t]),a},a.parseData.mod=!0):(a.data=a.data||[],n.data.isSimpleData&&(a.data=r.flatToTree(a.data)),r.initData(a.data)),e&&(!u||u.mod)||(a.done=function(){var e,t=arguments,a=t[3],n="renderData"===a,i=(n||delete r.isExpandAll,this.elem.next()),l=(r.updateStatus(null,{LAY_HAS_EXPANDED:!1}),g(d,c),i.find('[name="layTableCheckbox"][lay-filter="layTableAllChoose"]'));if(l.length&&(e=B.checkStatus(d),l.prop({checked:e.isAll&&e.data.length,indeterminate:!e.isAll&&e.data.length})),!n&&o.autoSort&&o.initSort&&o.initSort.type&&B.sort(d),r.renderTreeTable(i),"reloadData"===a&&"fixed"===this.scrollPos&&i.find(s).scrollTop(r.scrollTopCache),"function"===layui.type(u))return u.apply(this,t)},a.done.mod=!0),a&&a.tree&&a.tree.view&&layui.each(p,function(e,t){a.tree.view[t]!==undefined&&(a.tree.view[t]=r.normalizedIcon(a.tree.view[t]))})};a.prototype.init=function(){var e=this.config,t=e.tree.data.cascade,t=(-1===n.indexOf(t)&&(e.tree.data.cascade="all"),P.render(A.extend({},e,{data:[],url:"",done:null}))),a=t.config.id;(i.that[a]=this).tableIns=t,d(a,e)},a.prototype.config={tree:{customName:{children:"children",isParent:"isParent",name:"name",id:"id",pid:"parentId",icon:"icon"},view:{indent:14,flexIconClose:'',flexIconOpen:'',showIcon:!0,icon:"",iconClose:'',iconOpen:'',iconLeaf:'',showFlexIconIfNotParent:!1,dblClickExpand:!0,expandAllDefault:!1},data:{isSimpleData:!1,rootPid:null,cascade:"all"},"async":{enable:!1,url:"",type:null,contentType:null,headers:null,where:null,autoParam:[]},callback:{beforeExpand:null,onExpand:null}}},a.prototype.normalizedIcon=function(e){return e?t.test(e)?e:'':""},a.prototype.getOptions=function(){return this.tableIns?P.getOptions(this.tableIns.config.id):this.config},a.prototype.flatToTree=function(e){var n,i,l,d,r,o,c,u,t=this.getOptions(),a=t.tree,s=a.customName,t=t.id;return e=e||P.cache[t],t=e,n=s.id,i=s.pid,l=s.children,d=a.data.rootPid,n=n||"id",i=i||"parentId",l=l||"children",c={},u=[],layui.each(t,function(e,t){r=n+t[n],o=n+t[i],c[r]||(c[r]={},c[r][l]=[]);var a={};a[l]=c[r][l],c[r]=A.extend({},t,a),((d?c[r][i]===d:!c[r][i])?u:(c[o]||(c[o]={},c[o][l]=[]),c[o][l])).push(c[r])}),u},a.prototype.treeToFlat=function(e,n,i){var l=this,d=l.getOptions().tree.customName,r=d.children,o=d.pid,c=[];return layui.each(e,function(e,t){var e=(i?i+"-":"")+e,a=A.extend({},t);a[o]=t[o]||n,c.push(a),c=c.concat(l.treeToFlat(t[r],t[d.id],e))}),c},a.prototype.getTreeNode=function(e){var t,a,n=this;return e?(a=(t=n.getOptions()).tree,t.id,a.customName,{data:e,dataIndex:e[z],getParentNode:function(){return n.getNodeByIndex(e[f])}}):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeByIndex=function(t){var a,e,n=this,i=n.getNodeDataByIndex(t);return i?((e=n.getOptions()).tree.customName.parent,a=e.id,(e={data:i,dataIndex:i[z],getParentNode:function(){return n.getNodeByIndex(i[f])},update:function(e){return B.updateNode(a,t,e)},remove:function(){return B.removeNode(a,t)},expand:function(e){return B.expandNode(a,A.extend({},e,{index:t}))},setChecked:function(e){return B.setRowChecked(a,A.extend({},e,{index:t}))}}).dataIndex=t,e):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeById=function(a){var e=this.getOptions(),n=e.tree.customName.id,i="",e=B.getData(e.id,!0);if(layui.each(e,function(e,t){if(t[n]===a)return i=t[z],!0}),i)return this.getNodeByIndex(i)},a.prototype.getNodeDataByIndex=function(e,t,a){var n=this.getOptions(),i=n.tree,n=n.id,n=P.cache[n],l=n[e];if("delete"!==a&&l)return A.extend(l,a),t?A.extend({},l):l;for(var d=n,r=String(e).split("-"),o=0,c=i.customName.children;o
          '),N=function(e){y[V]="success",y[s.children]=e,c.initData(y[s.children],y[z]),J(t,!0,!p&&n,i,l)},C=m.format,"function"===layui.type(C)?C(y,o,N):(I=A.extend({},m.where||o.where),C=m.autoParam,layui.each(C,function(e,t){t=t.split("=");I[t[0].trim()]=y[(t[1]||t[0]).trim()]}),(C=m.contentType||o.contentType)&&0==C.indexOf("application/json")&&(I=JSON.stringify(I)),O=m.method||o.method,D=m.dataType||o.dataType,T=m.jsonpCallback||o.jsonpCallback,_=m.headers||o.headers,k=m.parseData||o.parseData,w=m.response||o.response,A.ajax({type:O||"get",url:b,contentType:C,data:I,dataType:D||"json",jsonpCallback:T,headers:_||{},success:function(e){(e="function"==typeof k?k.call(o,e)||e:e)[w.statusName]!=w.statusCode?(y[V]="error",g.html('')):N(e[w.dataName])},error:function(e,t){y[V]="error","function"==typeof o.error&&o.error(e,t)}})),h;y[X]=!0,v.length&&(!o.initSort||o.url&&!o.autoSort||((m=o.initSort).type?layui.sort(v,m.field,"desc"===m.type,!0):layui.sort(v,P.config.indexName,null,!0)),c.initData(y[s.children],y[z]),O=P.getTrHtml(r,v,null,null,e),S={trs:A(O.trs.join("")),trs_fixed:A(O.trs_fixed.join("")),trs_fixed_r:A(O.trs_fixed_r.join(""))},E=(e.split("-").length-1||0)+1,layui.each(v,function(e,t){S.trs.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed_r.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z])}),d.find(q).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs),d.find(R).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed),d.find(Y).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed_r),c.renderTreeTable(S.trs,E),n)&&!p&&layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)})}else c.isExpandAll=!1,(n&&!p?(layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)}),d.find(v.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(","))):(b=c.treeToFlat(v,y[s.id],e),d.find(b.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))).addClass(L);U("resize-"+r,function(){B.resize(r)},0)(),l&&"loading"!==y[V]&&(C=u.callback.onExpand,"function"===layui.type(C))&&C(r,y,x)}return h},v=(B.expandNode=function(e,t){var a,n,i,e=j(e);if(e)return a=(t=t||{}).index,n=t.expandFlag,i=t.inherit,t=t.callbackFlag,e=e.getOptions().elem.next(),J({trElem:e.find('tr[lay-data-index="'+a+'"]').first()},n,i,null,t)},B.expandAll=function(a,e){if("boolean"!==layui.type(e))return y.error("expandAll \u7684\u5c55\u5f00\u72b6\u6001\u53c2\u6570\u53ea\u63a5\u6536true/false");var t=j(a);if(t){t.isExpandAll=e;var n=t.getOptions(),i=n.tree,l=n.elem.next(),d=i.customName.isParent,r=i.customName.id,o=i.view.showFlexIconIfNotParent;if(e){e=B.getData(a,!0);if(i["async"].enable){var c=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[V])return!(c=!1)}),!c)return void layui.each(B.getData(a),function(e,t){B.expandNode(a,{index:t[z],expandFlag:!0,inherit:!0})})}var u=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[X])return!(u=!1)}),u)t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),l.find('tbody tr[data-level!="0"]').removeClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconOpen),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconOpen);else{if(t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[X]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),n.initSort&&n.initSort.type&&n.autoSort)return B.sort(a);var s,n=P.getTrHtml(a,e),f={trs:A(n.trs.join("")),trs_fixed:A(n.trs_fixed.join("")),trs_fixed_r:A(n.trs_fixed_r.join(""))};layui.each(e,function(e,t){var a=t[z].split("-").length-1;s={"data-index":t[z],"lay-data-index":t[z],"data-level":a},f.trs.eq(e).attr(s).data("index",t[z]),f.trs_fixed.eq(e).attr(s).data("index",t[z]),f.trs_fixed_r.eq(e).attr(s).data("index",t[z])}),layui.each(["main","fixed-l","fixed-r"],function(e,t){l.find(".layui-table-"+t+" tbody").html(f[["trs","trs_fixed","trs_fixed_r"][e]])}),t.renderTreeTable(l,0,!1)}}else t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!1,e[r]!==undefined)&&(t.status.expand[e[r]]=!1)}),l.find('.layui-table-box tbody tr[data-level!="0"]').addClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconClose),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconClose);B.resize(a)}},a.prototype.updateNodeIcon=function(e){var t=this.getOptions().tree||{},a=e.scopeEl,n=e.isExpand,e=e.isParent;a.find(".layui-table-tree-flexIcon").css("visibility",e||t.view.showFlexIconIfNotParent?"visible":"hidden").html(n?t.view.flexIconOpen:t.view.flexIconClose),t.view.showIcon&&(a=a.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom)"),n=e?n?t.view.iconOpen:t.view.iconClose:t.view.iconLeaf,a.toggleClass("layui-table-tree-iconLeaf",!e).html(n))},a.prototype.renderTreeTable=function(e,t,a){var l=this,n=l.getOptions(),d=n.elem.next(),i=(d.hasClass(h)||d.addClass(h),n.id),r=n.tree||{},o=(r.data,r.view||{}),c=r.customName||{},u=c.isParent,s=(d.attr("lay-filter"),l),f=((t=t||0)||(d.find(".layui-table-body tr:not([data-level])").attr("data-level",t),layui.each(P.cache[i],function(e,t){d.find('.layui-table-main tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t[z]),d.find('.layui-table-fixed-l tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t[z]),d.find('.layui-table-fixed-r tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t[z])})),null),y=c.name,p=o.indent||14;if(layui.each(e.find('td[data-field="'+y+'"]'),function(e,t){var a,n,i=(t=A(t)).closest("tr"),t=t.children(".layui-table-cell");t.hasClass("layui-table-tree-item")||(n=i.attr("lay-data-index"))&&(i=d.find('tr[lay-data-index="'+n+'"]'),(a=s.getNodeDataByIndex(n))[H]&&a[u]&&((f=f||{})[n]=!0),a[b]&&i.find('input[type="checkbox"][name="layTableCheckbox"]').prop("indeterminate",!0),n=t.html(),(t=i.find('td[data-field="'+y+'"]>div.layui-table-cell')).addClass("layui-table-tree-item"),t.html(['
          ',a[H]?o.flexIconOpen:o.flexIconClose,"
          ",o.showIcon?'
          '+(l.normalizedIcon(a[c.icon])||o.icon||(a[u]?a[H]?o.iconOpen:o.iconClose:o.iconLeaf)||"")+"
          ":"",n].join("")).find(".layui-table-tree-flexIcon").on("click",function(e){layui.stope(e),J({trElem:i},null,null,null,!0)}))}),!t&&r.view.expandAllDefault&&l.isExpandAll===undefined)return B.expandAll(i,!0);(!1!==a&&f?(layui.each(f,function(e,t){e=d.find('tr[lay-data-index="'+e+'"]');e.find(".layui-table-tree-flexIcon").html(o.flexIconOpen),J({trElem:e.first()},!0)}),U("renderTreeTable2-"+i,function(){x.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0)):U("renderTreeTable-"+i,function(){n.hasNumberCol&&v(l),x.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0))()},function(a){var e=a.getOptions(),t=e.elem.next(),n=0,i=t.find(".layui-table-main tbody tr"),l=t.find(".layui-table-fixed-l tbody tr"),d=t.find(".layui-table-fixed-r tbody tr");layui.each(a.treeToFlat(P.cache[e.id]),function(e,t){t.LAY_HIDE||(a.getNodeDataByIndex(t[z]).LAY_NUM=++n,i.eq(e).find(".laytable-cell-numbers").html(n),l.eq(e).find(".laytable-cell-numbers").html(n),d.eq(e).find(".laytable-cell-numbers").html(n))})}),N=(a.prototype.render=function(e){var t=this;t.tableIns=P["reloadData"===e?"reloadData":"reload"](t.tableIns.config.id,A.extend(!0,{},t.config)),t.config=t.tableIns.config},a.prototype.reload=function(e,t,a){var n=this;e=e||{},delete n.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete n.config[e]}),d(n.getOptions().id,e,a||!0),n.config=A.extend(t,{},n.config,e),n.render(a)},B.reloadData=function(){var e=A.extend(!0,[],arguments);return e[3]="reloadData",B.reload.apply(null,e)},function(e,a,n,i){var l=[];return layui.each(e,function(e,t){"function"===layui.type(a)?a(t):A.extend(t,a),l.push(A.extend({},t)),i||(l=l.concat(N(t[n],a,n,i)))}),l}),o=(a.prototype.updateStatus=function(e,t,a){var n=this.getOptions(),i=n.tree;return e=e||P.cache[n.id],N(e,t,i.customName.children,a)},a.prototype.getTableData=function(){var e=this.getOptions();return P.cache[e.id]},B.updateStatus=function(e,t,a){var e=j(e),n=e.getOptions();return a=a||(n.url?P.cache[n.id]:n.data),e.updateStatus(a,t)},B.sort=function(e){var t,a,i,l,n,d=j(e);d&&(n=(t=d.getOptions()).tree,a=B.getData(e),i=n.customName.children,l=function(e,a,n){layui.sort(e,a,n,!0),layui.each(e,function(e,t){l(t[i]||[],a,n)})},t.autoSort)&&((n=t.initSort).type?l(a,n.field,"desc"===n.type):l(a,P.config.indexName,null),P.cache[e]=a,d.initData(a),B.renderData(e))},function(n){var t=n.config.id,i=j(t),a=n.data=B.getNodeDataByIndex(t,n.index),l=a[z],d=(n.dataIndex=l,n.update);n.update=function(){var e=arguments,t=(A.extend(i.getNodeDataByIndex(l),e[0]),d.apply(this,e)),a=n.config.tree.customName.name;return a in e[0]&&n.tr.find('td[data-field="'+a+'"]').children("div.layui-table-cell").removeClass("layui-table-tree-item"),i.renderTreeTable(n.tr,n.tr.attr("data-level"),!1),t},n.del=function(){B.removeNode(t,a)},n.setRowChecked=function(e){B.setRowChecked(t,{index:a,checked:e})}}),u=(B.updateNode=function(e,a,t){var n,i,l,d,r,o=j(e);o&&((d=o.getOptions()).tree,d=(n=d.elem.next()).find('tr[lay-data-index="'+a+'"]'),i=d.attr("data-index"),l=d.attr("data-level"),t)&&(d=o.getNodeDataByIndex(a,!1,t),r=P.getTrHtml(e,[d]),layui.each(["main","fixed-l","fixed-r"],function(e,t){n.find(".layui-table-"+t+' tbody tr[lay-data-index="'+a+'"]').replaceWith(A(r[["trs","trs_fixed","trs_fixed_r"][e]].join("")).attr({"data-index":i,"lay-data-index":a,"data-level":l}).data("index",i))}),o.renderTreeTable(n.find('tr[lay-data-index="'+a+'"]'),l))},B.removeNode=function(e,t){var a=j(e);if(a){var n,i=a.getOptions(),l=i.tree,d=l.customName.isParent,r=l.customName.children,o=i.elem.next(),c=[],u=P.cache[e],t=a.getNodeDataByIndex("string"===layui.type(t)?t:t[z],!1,"delete"),s=a.getNodeDataByIndex(t[f]),l=(a.updateCheckStatus(s),a.treeToFlat([t],t[l.customName.pid],t[f])),t=(layui.each(l,function(e,t){t=t[z];c.push('tr[lay-data-index="'+t+'"]'),-1!==t.indexOf("-")&&delete u[t]}),o.find(c.join(",")).remove(),a.initData());for(n in u)-1!==n.indexOf("-")&&n!==u[n][z]&&delete u[n];layui.each(a.treeToFlat(t),function(e,t){t[m]&&t[m]!==t[z]&&o.find('tr[lay-data-index="'+t[m]+'"]').attr({"data-index":t[z],"lay-data-index":t[z]}).data("index",t[z])}),layui.each(u,function(e,t){o.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),i.hasNumberCol&&v(a),s&&(l=o.find('tr[lay-data-index="'+s[z]+'"]'),s[d]=!(!s[r]||!s[r].length),a.updateNodeIcon({scopeEl:l,isExpand:s[H],isParent:s[d]})),B.resize(e)}},B.addNodes=function(e,t){var a=j(e);if(a){var n=a.getOptions(),i=n.tree,l=n.elem.next(),d=P.config.checkName,r=(t=t||{}).parentIndex,o=t.index,c=t.data,t=t.focus,u=(r="number"===layui.type(r)?r.toString():r)?a.getNodeDataByIndex(r):null,o="number"===layui.type(o)?o:-1,c=A.extend(!0,[],layui.isArray(c)?c:[c]);layui.each(c,function(e,t){d in t||!u||(t[d]=u[d])}),a.getTableData();if(u){var s=i.customName.isParent,f=i.customName.children;u[s]=!0;var y=(y=u[f])?(p=y.splice(-1===o?y.length:o),u[f]=y.concat(c,p)):u[f]=c,f=(a.updateStatus(y,function(e){(e[s]||i.view.showFlexIconIfNotParent)&&(e[X]=!1)}),a.treeToFlat(y));l.find(f.map(function(e){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")).remove(),a.initData(),u[X]=!1,u[V]="local",J({trElem:l.find('tr[lay-data-index="'+r+'"]')},!0)}else{var p=P.cache[e].splice(-1===o?P.cache[e].length:o);if(P.cache[e]=P.cache[e].concat(c,p),n.url||(n.page?(y=n.page,n.data.splice.apply(n.data,[y.limit*(y.curr-1),y.limit].concat(P.cache[e]))):n.data=P.cache[e]),a.initData(),l.find(".layui-none").length)return P.renderData(e),c;var x,f=P.getTrHtml(e,c),h={trs:A(f.trs.join("")),trs_fixed:A(f.trs_fixed.join("")),trs_fixed_r:A(f.trs_fixed_r.join(""))},r=(layui.each(c,function(e,t){x={"data-index":t[z],"lay-data-index":t[z],"data-level":"0"},h.trs.eq(e).attr(x).data("index",t[z]),h.trs_fixed.eq(e).attr(x).data("index",t[z]),h.trs_fixed_r.eq(e).attr(x).data("index",t[z])}),parseInt(c[0][z])-1),y=l.find(q),n=l.find(R),f=l.find(Y);-1==r?y.find('tr[data-level="0"][data-index="0"]')[0]?(y.find('tr[data-level="0"][data-index="0"]').before(h.trs),n.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed_r)):(y.find("tbody").prepend(h.trs),n.find("tbody").prepend(h.trs_fixed),f.find("tbody").prepend(h.trs_fixed_r)):-1===o?(y.find("tbody").append(h.trs),n.find("tbody").append(h.trs_fixed),f.find("tbody").append(h.trs_fixed_r)):(r=p[0][m],y.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs),n.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed_r)),layui.each(P.cache[e],function(e,t){l.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),a.renderTreeTable(l.find(c.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))}return a.updateCheckStatus(u),u&&(o=l.find('tr[lay-data-index="'+u[z]+'"]'),a.updateNodeIcon({scopeEl:o,isExpand:u[H],isParent:u[s]})),B.resize(e),t&&l.find(q).find('tr[lay-data-index="'+c[0][z]+'"]').get(0).scrollIntoViewIfNeeded(),c}},B.checkStatus=function(e,n){var i,t,a,l=j(e);if(l)return l=l.getOptions().tree,i=P.config.checkName,t=B.getData(e,!0).filter(function(e,t,a){return e[i]||n&&e[b]}),a=!0,layui.each("all"===l.data.cascade?P.cache[e]:B.getData(e,!0),function(e,t){if(!t[i])return!(a=!1)}),{data:t,isAll:a}},B.on("sort",function(e){var e=e.config,t=e.elem.next(),e=e.id;t.hasClass(h)&&B.sort(e)}),B.on("row",function(e){e.config.elem.next().hasClass(h)&&o(e)}),B.on("rowDouble",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(h)&&(o(e),(t.tree||{}).view.dblClickExpand)&&J({trElem:e.tr.first()},null,null,null,!0)}),B.on("rowContextmenu",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(h)&&o(e)}),B.on("tool",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(h)&&o(e)}),B.on("edit",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(h)&&(o(e),e.field===t.tree.customName.name)&&((a={})[e.field]=e.value,e.update(a))}),B.on("radio",function(e){var t=e.config,a=t.elem.next(),t=t.id;a.hasClass(h)&&(a=j(t),o(e),u.call(a,e.tr,e.checked))}),a.prototype.setRowCheckedClass=function(e,t){var a=this.getOptions(),n=(e.data("index"),a.elem.next());e[t?"addClass":"removeClass"](l),e.each(function(){var e=A(this).data("index");n.find('.layui-table-fixed-r tbody tr[data-index="'+e+'"]')[t?"addClass":"removeClass"](l)})},a.prototype.updateCheckStatus=function(e,t){var a,n,i,l,d,r,o,c=this,u=c.getOptions();return!!u.hasChecboxCol&&(a=u.tree,n=u.id,i=u.elem.next(),l=P.config.checkName,"all"!==(d=a.data.cascade)&&"parent"!==d||!e||(d=c.updateParentCheckStatus(e,"boolean"===layui.type(t)?t:null),layui.each(d,function(e,t){var a=i.find('tr[lay-data-index="'+t[z]+'"] input[name="layTableCheckbox"]:not(:disabled)'),n=t[l];c.setRowCheckedClass(a.closest("tr"),n),x.render(a.prop({checked:n,indeterminate:t[b]}))})),o=!(r=!0),0<(e=(e="all"===a.data.cascade?P.cache[n]:B.getData(n,!0)).filter(function(e){return!e[u.disabledName]})).length?layui.each(e,function(e,t){if((t[l]||t[b])&&(o=!0),t[l]||(r=!1),o&&!r)return!0}):r=!1,o=o&&!r,x.render(i.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({checked:r,indeterminate:o})),r)},a.prototype.updateParentCheckStatus=function(a,n){var i,e=this.getOptions(),t=e.tree,e=e.id,l=P.config.checkName,t=t.customName.children,d=[];return!(a[b]=!1)===n?a[t].length?layui.each(a[t],function(e,t){if(!t[l])return n=!1,a[b]=!0}):n=!1:!1===n?layui.each(a[t],function(e,t){if(t[l]||t[b])return a[b]=!0}):(n=!1,i=0,layui.each(a[t],function(e,t){t[l]&&i++}),n=a[t].length?a[t].length===i:a[l],a[b]=!n&&0')),n=(e.tree(a),i.elem=p(i.elem));if(n[0]){if(e.key=i.id||e.index,e.elem=a,e.elemNone=p('
          '+i.text.none+"
          "),n.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=p(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(T),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(T)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(r,e){var d=this,s=d.config,o=s.customName,e=e||s.data;layui.each(e,function(e,i){var a,n,t=i[o.children]&&0"),c=p(['
          ','
          ','
          ',s.showLine?t?'':'':'',s.showCheckbox?'':"",s.isJump&&i.href?''+(i[o.title]||i.label||s.text.defaultNodeName)+"":''+(i[o.title]||i.label||s.text.defaultNodeName)+"","
          ",s.edit?(a={add:'',update:'',del:''},n=['
          '],!0===s.edit&&(s.edit=["update","del"]),"object"==typeof s.edit?(layui.each(s.edit,function(e,i){n.push(a[i]||"")}),n.join("")+"
          "):void 0):"","
          "].join(""));t&&(c.append(l),d.tree(l,i[o.children])),r.append(c),c.prev("."+k)[0]&&c.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||c.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),d.spread(c,i),s.showCheckbox&&(i.checked&&d.checkids.push(i[o.id]),d.checkClick(c,i)),s.edit&&d.operate(c,i)})},l.prototype.spread=function(n,t){var l=this,c=l.config,e=n.children("."+b),i=e.children("."+g),a=i.find('input[same="layuiTreeCheck"]'),r=e.find("."+C),e=e.find("."+w),d=c.onlyIconControl?r:i,s="";d.on("click",function(e){var i=n.children("."+N),a=(d.children(".layui-icon")[0]?d:d.find(".layui-tree-icon")).children(".layui-icon");i[0]?n.hasClass(F)?(n.removeClass(F),i.slideUp(200),a.removeClass(x).addClass(v),l.updateFieldValue(t,"spread",!1)):(n.addClass(F),i.slideDown(200),a.addClass(x).removeClass(v),l.updateFieldValue(t,"spread",!0),c.accordion&&((i=n.siblings("."+k)).removeClass(F),i.children("."+N).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(x).addClass(v))):s="normal"}),e.on("click",function(){p(this).hasClass(u)||(s=n.hasClass(F)?c.onlyIconControl?"open":"close":c.onlyIconControl?"close":"open",a[0]&&l.updateFieldValue(t,"checked",a.prop("checked")),c.click&&c.click({elem:n,state:s,data:t}))})},l.prototype.updateFieldValue=function(e,i,a){i in e&&(e[i]=a)},l.prototype.setCheckbox=function(e,i,a){var t,n=this,l=n.config.customName,c=a.prop("checked");a.prop("disabled")||("object"!=typeof i[l.children]&&!e.find("."+N)[0]||e.find("."+N).find('input[same="layuiTreeCheck"]').each(function(e){this.disabled||((e=i[l.children][e])&&n.updateFieldValue(e,"checked",c),n.updateFieldValue(this,"checked",c))}),(t=function(e){var i,a,n;e.parents("."+k)[0]&&(a=(e=e.parent("."+N)).parent(),n=e.prev().find('input[same="layuiTreeCheck"]'),c?n.prop("checked",c):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||n.prop("checked",!1)),t(a))})(e),n.renderForm("checkbox"))},l.prototype.checkClick=function(a,n){var t=this,l=t.config;a.children("."+b).children("."+g).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=p(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(a,n,e),t.updateFieldValue(n,"checked",i),l.oncheck&&l.oncheck({elem:a,checked:i,data:n}))})},l.prototype.operate=function(r,d){var s=this,o=s.config,u=o.customName,e=r.children("."+b),h=e.children("."+g);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=p(this).data("type"),n=r.children("."+N),t={data:d,type:e,elem:r};if("add"==e){n[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(v).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(m),r.append('
          '));var a,l=o.operate&&o.operate(t),c={};if(c[u.title]=o.text.defaultNodeName,c[u.id]=l,s.tree(r.children("."+N),[c]),o.showLine&&(n[0]?(n.hasClass(S)||n.addClass(S),r.find("."+N).each(function(){p(this).children("."+k).last().addClass(T)}),(n.children("."+k).last().prev().hasClass(T)?n.children("."+k).last().prev():n.children("."+k).last()).removeClass(T),!r.parent("."+N)[0]&&r.next()[0]&&n.children("."+k).last().removeClass(T)):(l=r.siblings("."+k),a=1,c=r.parent("."+N),layui.each(l,function(e,i){p(i).children("."+N)[0]||(a=0)}),(1==a?(l.children("."+N).addClass(L),l.children("."+N).children("."+k).removeClass(T),r.children("."+N).addClass(L),c.removeClass(S),c.children("."+k).last().children("."+N).children("."+k).last()):r.children("."+N).children("."+k)).addClass(T))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(r.children("."+N).children("."+k).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+w).html(),h.children("."+w).html(""),h.append(''),h.children(".layui-tree-editInput").val(f.unescape(l)).focus(),i=function(e){var i=f.escape(e.val().trim())||o.text.defaultNodeName;e.remove(),h.children("."+w).html(i),t.data[u.title]=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(p(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(p(this)))})):y.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(d[u.title]||"")+'" \u5417\uff1f',function(e){var l,a,i;o.operate&&o.operate(t),t.status="remove",y.close(e),r.prev("."+k)[0]||r.next("."+k)[0]||r.parent("."+N)[0]?(r.siblings("."+k).children("."+b)[0]?(o.showCheckbox&&(l=function(e){var i,a,n,t;e.parents("."+k)[0]&&(i=e.siblings("."+k).children("."+b),a=(e=e.parent("."+N).prev()).find('input[same="layuiTreeCheck"]')[0],n=1,(t=0)==a.checked)&&(i.each(function(e,i){i=p(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(n=0),i.disabled||(t=1)}),1==n)&&1==t&&(a.checked=!0,s.renderForm("checkbox"),l(e.parent("."+k)))})(r),o.showLine&&(e=r.siblings("."+k),a=1,i=r.parent("."+N),layui.each(e,function(e,i){p(i).children("."+N)[0]||(a=0)}),1==a?(n[0]||(i.removeClass(S),e.children("."+N).addClass(L),e.children("."+N).children("."+k).removeClass(T)),(r.next()[0]?i.children("."+k).last():r.prev()).children("."+N).children("."+k).last().addClass(T),r.next()[0]||r.parents("."+k)[1]||r.parents("."+k).eq(0).next()[0]||r.prev("."+k).addClass(T)):!r.next()[0]&&r.hasClass(T)&&r.prev().addClass(T))):(e=r.parent("."+N).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(x).addClass("layui-icon-file"),(i=e.parents("."+N).eq(0)).addClass(S),i.children("."+k).each(function(){p(this).children("."+N).children("."+k).last().addClass(T)})):e.find(".layui-tree-iconArrow").addClass(m),r.parents("."+k).eq(0).removeClass(F),r.parent("."+N).remove()),r.remove()):(r.remove(),s.elem.append(s.elemNone))})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=p(this),a=e.val(),e=e.nextAll(),n=[];e.find("."+w).each(function(){var i,e=p(this).parents("."+b);-1!=p(this).html().indexOf(a)&&(n.push(p(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+N)[0]&&i(e.parent("."+N).parent("."+k))})(e.parent("."+k)))}),e.find("."+b).each(function(){var e=p(this).parent("."+k);e.hasClass("layui-tree-searchShow")||e.addClass(m)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:n})}),i.elem.find(".layui-tree-search").on("keydown",function(){p(this).nextAll().find("."+b).each(function(){p(this).parent("."+k).removeClass("layui-tree-searchShow "+m)}),p(".layui-tree-emptyText")[0]&&p(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var t=this,e=t.config,l=e.customName,i=[],a=[],c=(t.elem.find(".layui-form-checked").each(function(){i.push(p(this).prev()[0].value)}),function(e,n){layui.each(e,function(e,a){layui.each(i,function(e,i){if(a[l.id]==i)return t.updateFieldValue(a,"checked",!0),delete(i=p.extend({},a))[l.children],n.push(i),a[l.children]&&(i[l.children]=[],c(a[l.children],i[l.children])),!0})})});return c(p.extend({},e.data),a),a},l.prototype.setChecked=function(l){this.config;this.elem.find("."+k).each(function(e,i){var a=p(this).data("id"),n=p(i).children("."+b).find('input[same="layuiTreeCheck"]'),t=n.next();if("number"==typeof l){if(a.toString()==l.toString())return n[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i.toString()==a.toString()&&!n[0].checked)return t.click(),!0})})},n.that={},n.config={},t.reload=function(e,i){e=n.that[e];return e.reload(i),n.call(e)},t.getChecked=function(e){return n.that[e].getChecked()},t.setChecked=function(e,i){return n.that[e].setChecked(i)},t.render=function(e){e=new l(e);return n.call(e)},e(a,t)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",u="layui-btn-disabled",c="layui-none",r="layui-transfer-box",h="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['
          ','
          ','","
          ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
            ',"
            "].join("")},p=['
            ',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'
            ','",'","
            ",y({index:1,checkAllName:"layTransferRightCheckAll"}),"
            "].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p,{open:"{{",close:"}}"}).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],t.id="id"in t?t.id:elem.attr("id")||e.index,e.key=t.id,i.html(e.elem),e.layBox=e.elem.find("."+r),e.layHeader=e.elem.find("."+h),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,t=e.config,l=[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}];e.parseData(function(a){var i=a.selected?1:0,n=["
          • ",'',"
          • "].join("");i?layui.each(t.value,function(e,t){t==a.value&&a.selected&&(l[i].views[e]=n)}):l[i].views.push(n),delete a.selected}),e.layData.eq(0).html(l[0].views.join("")),e.layData.eq(1).html(l[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(c){var r=this,o=r.config;c=c||{},r.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+h).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),r.layBtn.eq(e)[l?"removeClass":"addClass"](u),c.stopNone||(i=a.children("li:not(."+s+")").length,r.noneView(a,i?"":o.text.none))}),r.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('

            '+(t||"")+"

            ");e.find("."+c)[0]&&e.find("."+c).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),c=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+r).find("."+f).append(t.clone()),t.remove(),c.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+r).find("."+f).append(e.clone()),e.remove(),c.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+r).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(c),e)},v.prototype.events=function(){var n=this,l=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+r).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent().data("index");a[0].disabled||!1!==("function"==typeof l.dblclick?l.dblclick({elem:t,data:n.getData([a[0].value])[0],index:i}):null)&&n.transfer(i,t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(u)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t[0].title,a=("cs"!==l.showSearch&&(a=a.toLowerCase(),i=i.toLowerCase()),-1!==a.indexOf(i));e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?l.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define(["jquery","lay"],function(e){"use strict";var a=layui.$,l=layui.lay,t=(layui.hint(),layui.device(),{config:{},set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,d,e,i)}}),d="carousel",r="layui-this",s="layui-carousel-left",u="layui-carousel-right",c="layui-carousel-prev",h="layui-carousel-next",o="layui-carousel-arrow",m="layui-carousel-ind",i=function(e){var i=this;i.config=a.extend({},i.config,t.config,e),i.render()};i.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},i.prototype.render=function(){var e=this,i=e.config,n=a(i.elem);if(1*[carousel-item]>*"),i.index<0&&(i.index=0),i.index>=e.elemItem.length&&(i.index=e.elemItem.length-1),i.interval<800&&(i.interval=800),i.full?i.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):i.elem.css({width:i.width,height:i.height}),i.elem.attr("lay-anim",i.anim),e.elemItem.eq(i.index).addClass(r),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},i.prototype.reload=function(e){var i=this;clearInterval(i.timer),i.config=a.extend({},i.config,e),i.render()},i.prototype.prevIndex=function(){var e=this.config.index-1;return e=e<0?this.elemItem.length-1:e},i.prototype.nextIndex=function(){var e=this.config.index+1;return e=e>=this.elemItem.length?0:e},i.prototype.addIndex=function(e){var i=this.config;i.index=i.index+(e=e||1),i.index>=this.elemItem.length&&(i.index=0)},i.prototype.subIndex=function(e){var i=this.config;i.index=i.index-(e=e||1),i.index<0&&(i.index=this.elemItem.length-1)},i.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},i.prototype.arrow=function(){var i=this,e=i.config,n=a(['",'"].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+o)[0]&&e.elem.find("."+o).remove(),e.elem.append(n),n.on("click",function(){var e=a(this).attr("lay-type");i.slide(e)})},i.prototype["goto"]=function(e){var i=this,n=i.config;e>n.index?i.slide("add",e-n.index):e
              ',(i=[],layui.each(e.elemItem,function(e){i.push("")}),i.join("")),"
            "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+m)[0]&&n.elem.find("."+m).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-t.height()/2),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){e["goto"](a(this).index())})},i.prototype.slide=function(e,i){var n=this,t=n.elemItem,a=n.config,o=a.index,l=a.elem.attr("lay-filter");n.haveSlide||("sub"===e?(n.subIndex(i),t.eq(a.index).addClass(c),setTimeout(function(){t.eq(o).addClass(u),t.eq(a.index).addClass(u)},50)):(n.addIndex(i),t.eq(a.index).addClass(h),setTimeout(function(){t.eq(o).addClass(s),t.eq(a.index).addClass(s)},50)),setTimeout(function(){t.removeClass(r+" "+c+" "+h+" "+s+" "+u),t.eq(a.index).addClass(r),n.haveSlide=!1},350),n.elemInd.find("li").eq(a.index).addClass(r).siblings().removeClass(r),n.haveSlide=!0,e={index:a.index,prevIndex:o,item:t.eq(a.index)},"function"==typeof a.change&&a.change(e),layui.event.call(this,d,"change("+l+")",e))},i.prototype.events=function(){var t,a,o=this,e=o.config;e.elem.data("haveEvents")||(e.elem.on("mouseenter touchstart",function(){"always"!==o.config.autoplay&&clearInterval(o.timer)}).on("mouseleave touchend",function(){"always"!==o.config.autoplay&&o.autoplay()}),t=e.elem,a="updown"===e.anim,l.touchSwipe(t,{onTouchEnd:function(e,i){var n=Date.now()-i.timeStart,i=a?i.distanceY:i.distanceX;(.25t[a?"height":"width"]()/3)&&o.slide(0a.length&&(a.value=a.length),parseInt(a.value)===a.value||a.half||(a.value=Math.ceil(a.value)-a.value<.5?Math.ceil(a.value):Math.floor(a.value)),'
              "),n=1;n<=a.length;n++){var o='
            • ";a.half&&parseInt(a.value)!==a.value&&n==Math.ceil(a.value)?i=i+'
            • ":i+=o}i+="
            "+(a.text?''+a.value+"\u661f":"")+"";var l=a.elem,s=l.next(".layui-rate");s[0]&&s.remove(),e.elemTemp=u(i),a.span=e.elemTemp.next("span"),a.setText&&a.setText(a.value),l.html(e.elemTemp),l.addClass("layui-inline"),a.readonly||e.action()},a.prototype.setvalue=function(e){this.config.value=e,this.render()},a.prototype.action=function(){var n=this.config,t=this.elemTemp,i=t.find("i").width(),l=t.children("li");l.each(function(e){var a=e+1,l=u(this);l.on("click",function(e){n.value=a,n.half&&e.pageX-u(this).offset().left<=i/2&&(n.value=n.value-.5),n.text&&t.next("span").text(n.value+"\u661f"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value)}),l.on("mousemove",function(e){t.find("i").each(function(){u(this).addClass(h).removeClass(s)}),t.find("i:lt("+a+")").each(function(){u(this).addClass(f).removeClass(v)}),n.half&&e.pageX-u(this).offset().left<=i/2&&l.children("i").addClass(o).removeClass(f)}),l.on("mouseleave",function(){t.find("i").each(function(){u(this).addClass(h).removeClass(s)}),t.find("i:lt("+Math.floor(n.value)+")").each(function(){u(this).addClass(f).removeClass(v)}),n.half&&parseInt(n.value)!==n.value&&t.children("li:eq("+Math.floor(n.value)+")").children("i").addClass(o).removeClass("layui-icon-rate-solid layui-icon-rate")})}),r.touchSwipe(t,{onTouchMove:function(e,a){var i;Date.now()-a.timeStart<=200||(a=e.touches[0].pageX,e=t.width()/n.length,a=(a-t.offset().left)/e,(i=(i=(e=a%1)<=.5&&n.half?.5+(a-e):Math.ceil(a))>n.length?n.length:i)<0&&(i=0),l.each(function(e){var a=u(this).children("i"),l=Math.ceil(i)-e==1,t=Math.ceil(i)>e,e=i-e==.5;t?(a.addClass(f).removeClass(v),n.half&&e&&a.addClass(o).removeClass(f)):a.addClass(h).removeClass(s),a.toggleClass("layui-rate-hover",l)}),n.value=i,n.text&&t.next("span").text(n.value+"\u661f"),n.setText&&n.setText(n.value))},onTouchEnd:function(e,a){Date.now()-a.timeStart<=200||(t.find("i").removeClass("layui-rate-hover"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value))}})},a.prototype.events=function(){},c.render=function(e){e=new a(e);return function(){var a=this;return{setvalue:function(e){a.setvalue.call(a,e)},config:a.config}}.call(e)},e(l,c)});layui.define("jquery",function(o){"use strict";var v=layui.$,l=function(o){};l.prototype.load=function(o){var i,n,r,l,c,m,e,a,f,s,u,p,t,d,y=this,h=0,g=v((o=o||{}).elem);if(g[0])return c=v(o.scrollElem||document),m="mb"in o?o.mb:50,e=!("isAuto"in o)||o.isAuto,a=o.end||"\u6ca1\u6709\u66f4\u591a\u4e86",f="top"===(o.direction||"bottom"),y._cleanup(g,c),s=o.scrollElem&&o.scrollElem!==document,p=v('"),g.find(".layui-flow-more")[0]||g[f?"prepend":"append"](p),t=function(o,l){var e=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,t=c.scrollTop();o=v(o),p[f?"after":"before"](o),(l=0==l||null)?p.html(a):p.find("a").html(u),n=l,i=null,r&&r(),f&&(o=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,1===h?c.scrollTop(o):1
            '),"function"==typeof o.done&&o.done(++h,t)})(),p.find("a").on("click.flow",function(){v(this);n||i||d()}),o.isLazyimg&&(r=y.lazyimg({elem:o.elem+" img",scrollElem:o.scrollElem,direction:o.direction})),e&&c.on("scroll.flow",function(){var e=v(this),t=e.scrollTop();l&&clearTimeout(l),!n&&g.width()&&(l=setTimeout(function(){var o=(s?e:v(window)).height(),l=s?e.prop("scrollHeight"):document.documentElement.scrollHeight;(f?t<=m:l-t-o<=m)&&!i&&d()},100))}),y},l.prototype.lazyimg=function(o){var l,m=this,a=0,f=v((o=o||{}).scrollElem||document),s=o.elem||"img",n="top"===(o.direction||"bottom"),u=o.scrollElem&&o.scrollElem!==document,p=function(l,o){var e,t=f.scrollTop(),o=t+o,i=u?l.offset().top-f.offset().top+t:l.offset().top;(n?i+l.height():i)>=t&&i<=o&&l.attr("lay-src")&&(e=l.attr("lay-src"),layui.img(e,function(){var o=m.lazyimg.elem.eq(a);l.attr("src",e).removeAttr("lay-src"),o[0]&&r(o),a++},function(){m.lazyimg.elem.eq(a);l.removeAttr("lay-src")}))},r=function(o,l){var e=(u?l||f:v(window)).height(),t=f.scrollTop(),i=t+e;if(m.lazyimg.elem=v(s),o)p(o,e);else for(var n=0;n"),preview:"Preview"},wordWrap:!0,lang:"text",highlighter:!1,langMarker:!1},W=layui.code?layui.code.index+1e4:0,R=function(e){return String(e).replace(/\s+$/,"").replace(/^\n|\n$/,"")};e("code",function(l,e){var o,i,t,a,n,d,c,s,r,u,y,p,E,f,h,v,m,L,_,M,C,g={config:l=x.extend(!0,{},T,l),reload:function(e){layui.code(this.updateOptions(e))},updateOptions:function(e){return delete(e=e||{}).elem,x.extend(!0,l,e)},reloadCode:function(e){layui.code(this.updateOptions(e),"reloadCode")}},w=x(l.elem);return 1',l.ln?['
            ',D.digit(t+1)+".","
            "].join(""):"",'
            ',e||" ","
            ",""].join("")})}},a=l.code,n=function(e){return"function"==typeof l.codeParse?l.codeParse(e,l):e},"reloadCode"===e?o.children(".layui-code-wrap").html(w(n(a)).html):(d=layui.code.index=++W,o.attr("lay-code-index",d),(M=A.CDDE_DATA_CLASS in o.data())&&o.attr("class",o.data(A.CDDE_DATA_CLASS)||""),M||o.data(A.CDDE_DATA_CLASS,o.attr("class")),c={copy:{className:"file-b",title:["\u590d\u5236\u4ee3\u7801"],event:function(e){var t=D.unescape(n(l.code));lay.clipboard.writeText({text:t,done:function(){N.msg("\u5df2\u590d\u5236",{icon:1})},error:function(){N.msg("\u590d\u5236\u5931\u8d25",{icon:2})}}),"function"==typeof l.onCopy&&l.onCopy(t)}}},function b(){var e=o.parent("."+A.ELEM_PREVIEW),t=e.children("."+A.ELEM_TAB),a=e.children("."+A.ELEM_ITEM+"-preview");return t.remove(),a.remove(),e[0]&&o.unwrap(),b}(),l.preview&&(M="LAY-CODE-DF-"+d,f=l.layout||["code","preview"],s="iframe"===l.preview,E=x('
            '),C=x('
            '),r=x('
            '),_=x('
            '),u=x('
            '),l.id&&E.attr("id",l.id),E.addClass(l.className),C.attr("lay-filter",M),layui.each(f,function(e,t){var a=x('
          • ');0===e&&a.addClass("layui-this"),a.html(l.text[t]),r.append(a)}),x.extend(c,{full:{className:"screen-full",title:["\u6700\u5927\u5316\u663e\u793a","\u8fd8\u539f\u663e\u793a"],event:function(e){var e=e.elem,t=e.closest("."+A.ELEM_PREVIEW),a="layui-icon-"+this.className,i="layui-icon-screen-restore",l=this.title,o=x("html,body"),n="layui-scrollbar-hide";e.hasClass(a)?(t.addClass(A.ELEM_FULL),e.removeClass(a).addClass(i),e.attr("title",l[1]),o.addClass(n)):(t.removeClass(A.ELEM_FULL),e.removeClass(i).addClass(a),e.attr("title",l[0]),o.removeClass(n))}},window:{className:"release",title:["\u5728\u65b0\u7a97\u53e3\u9884\u89c8"],event:function(e){D.openWin({content:n(l.code)})}}}),l.copy&&("array"===layui.type(l.tools)?-1===l.tools.indexOf("copy")&&l.tools.unshift("copy"):l.tools=["copy"]),u.on("click",">i",function(){var e=x(this),t=e.data("type"),e={elem:e,type:t,options:l,rawCode:l.code,finalCode:D.unescape(n(l.code))};c[t]&&"function"==typeof c[t].event&&c[t].event(e),"function"==typeof l.toolsEvent&&l.toolsEvent(e)}),l.addTools&&l.tools&&(l.tools=[].concat(l.tools,l.addTools)),layui.each(l.tools,function(e,t){var a="object"==typeof t,i=a?t:c[t]||{className:t,title:[t]},l=i.className||i.type,o=i.title||[""],a=a?i.type||l:t;a&&(c[a]||((t={})[a]=i,x.extend(c,t)),u.append(''))}),o.addClass(A.ELEM_ITEM).wrap(E),C.append(r),l.tools&&C.append(u),o.before(C),s&&_.html(''),y=function(e){var t=e.children("iframe")[0];s&&t?t.srcdoc=n(l.code):e.html(l.code),setTimeout(function(){"function"==typeof l.done&&l.done({container:e,options:l,render:function(){I.render(e.find(".layui-form")),S.render()}})},3)},"preview"===f[0]?(_.addClass(A.ELEM_SHOW),o.before(_),y(_)):o.addClass(A.ELEM_SHOW).after(_),l.previewStyle=[l.style,l.previewStyle].join(""),_.attr("style",l.previewStyle),S.on("tab("+M+")",function(e){var t=x(this),a=x(e.elem).closest("."+A.ELEM_PREVIEW).find("."+A.ELEM_ITEM),e=a.eq(e.index);a.removeClass(A.ELEM_SHOW),e.addClass(A.ELEM_SHOW),"preview"===t.attr("lay-id")&&y(e),L()})),p=x(''),o.addClass((E=["layui-code-view layui-border-box"],l.wordWrap||E.push("layui-code-nowrap"),E.join(" "))),(C=l.theme||l.skin)&&(o.removeClass("layui-code-theme-dark layui-code-theme-light"),o.addClass("layui-code-theme-"+C)),l.highlighter&&o.addClass([l.highlighter,"language-"+l.lang,"layui-code-hl"].join(" ")),f=w(l.encode?D.escape(n(a)):a),h=f.lines,o.html(p.html(f.html)),l.ln&&o.append('
            '),l.height&&p.css("max-height",l.height),l.codeStyle=[l.style,l.codeStyle].join(""),l.codeStyle&&p.attr("style",function(e,t){return(t||"")+l.codeStyle}),v=[{selector:">.layui-code-wrap>.layui-code-line{}",setValue:function(e,t){e.style["padding-left"]=t+"px"}},{selector:">.layui-code-wrap>.layui-code-line>.layui-code-line-number{}",setValue:function(e,t){e.style.width=t+"px"}},{selector:">.layui-code-ln-side{}",setValue:function(e,t){e.style.width=t+"px"}}],m=lay.style({target:o[0],id:"DF-code-"+d,text:x.map(x.map(v,function(e){return e.selector}),function(e,t){return['.layui-code-view[lay-code-index="'+d+'"]',e].join(" ")}).join("")}),L=function b(){var e,i;return l.ln&&(e=Math.floor(h.length/100),i=p.children("."+A.ELEM_LINE).last().children("."+A.ELEM_LINE_NUM).outerWidth(),o.addClass(A.ELEM_LN_MODE),e)&&A.LINE_RAW_WIDTH
          • ')).html(l.title||l.text.code),o.prepend(_)),M=x('
            '),l.copy&&!l.preview&&((C=x(['','',""].join(""))).on("click",function(){c.copy.event()}),M.append(C)),l.langMarker&&M.append(''+l.lang+""),l.about&&M.append(l.about),o.append(M),l.preview||setTimeout(function(){"function"==typeof l.done&&l.done({})},3),l.elem.length===1+d&&"function"==typeof l.allDone&&l.allDone())),g})}),layui["layui.all"]||layui.addcss("modules/code.css?v=6","skincodecss"); \ No newline at end of file diff --git a/static/component/pear/css/module/global.css b/static/component/pear/css/module/global.css new file mode 100644 index 0000000..9e1e129 --- /dev/null +++ b/static/component/pear/css/module/global.css @@ -0,0 +1,977 @@ +.pear-container { + padding: 10px; + margin: 0px; + box-sizing: border-box; + background-color: transparent; + width: 100%; +} + +*::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +*::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +*::-webkit-scrollbar-track { + background: transparent; +} + +*::-webkit-scrollbar-thumb { + background: #E6E6E6; + border-radius: 4px; +} + +*::-webkit-scrollbar-thumb:hover { + background: #E6E6E6; +} + +*::-webkit-scrollbar-corner { + background: #f6f6f6; +} + +.pear-row::after, +.pear-row::before { + content: ""; + display: table; + clear: both; +} + +.pear-col { + float: left; + min-height: 1px; +} + +.pear-row * { + box-sizing: border-box +} + +.pear-col-md1 { + width: 4.16%; +} + +.pear-col-md2 { + width: 8.33%; +} + +.pear-col-md3 { + width: 12.5%; +} + +.pear-col-md4 { + width: 16.66%; +} + +.pear-col-md5 { + width: 20.83%; +} + +.pear-col-md6 { + width: 25%; +} + +.pear-col-md7 { + width: 29.16%; +} + +.pear-col-md8 { + width: 33.33%; +} + +.pear-col-md9 { + width: 37.5%; +} + +.pear-col-md10 { + width: 41.66%; +} + +.pear-col-md11 { + width: 45.83%; +} + +.pear-col-md12 { + width: 50%; +} + +.pear-col-md13 { + width: 54.16%; +} + +.pear-col-md14 { + width: 58.33%; +} + +.pear-col-md15 { + width: 62.5%; +} + +.pear-col-md16 { + width: 66.66%; +} + +.pear-col-md17 { + width: 70.83%; +} + +.pear-col-md18 { + width: 75%; +} + +.pear-col-md19 { + width: 79.16%; +} + +.pear-col-md20 { + width: 83.33%; +} + +.pear-col-md21 { + width: 87.5%; +} + +.pear-col-md22 { + width: 91.66%; +} + +.pear-col-md23 { + width: 95.83%; +} + +.pear-col-md24 { + width: 100%; +} + +.pear-col-md-offset1 { + margin-left: 4.16%; +} + +.pear-col-md-offset2 { + margin-left: 8.33%; +} + +.pear-col-md-offset3 { + margin-left: 12.5%; +} + +.pear-col-md-offset4 { + margin-left: 16.66%; +} + +.pear-col-md-offset5 { + margin-left: 20.83%; +} + +.pear-col-md-offset6 { + margin-left: 25%; +} + +.pear-col-md-offset7 { + margin-left: 29.16%; +} + +.pear-col-md-offset8 { + margin-left: 33.33%; +} + +.pear-col-md-offset9 { + margin-left: 37.5%; +} + +.pear-col-md-offset10 { + margin-left: 41.66%; +} + +.pear-col-md-offset11 { + margin-left: 45.83%; +} + +.pear-col-md-offset12 { + margin-left: 50%; +} + +.pear-col-md-offset13 { + margin-left: 54.16%; +} + +.pear-col-md-offset14 { + margin-left: 58.33%; +} + +.pear-col-md-offset15 { + margin-left: 62.5%; +} + +.pear-col-md-offset16 { + margin-left: 66.66%; +} + +.pear-col-md-offset17 { + margin-left: 70.83%; +} + +.pear-col-md-offset18 { + margin-left: 75%; +} + +.pear-col-md-offset19 { + margin-left: 79.16%; +} + +.pear-col-md-offset20 { + margin-left: 83.33%; +} + +.pear-col-md-offset21 { + margin-left: 87.5%; +} + +.pear-col-md-offset22 { + margin-left: 91.66%; +} + +.pear-col-md-offset23 { + margin-left: 95.83%; +} + +.pear-col-md-offset24 { + margin-left: 100%; +} + + +@media all and (max-width: 768px) { + .pear-col-xs1 { + width: 4.16%; + } + + .pear-col-xs2 { + width: 8.33%; + } + + .pear-col-xs3 { + width: 12.5%; + } + + .pear-col-xs4 { + width: 16.66%; + } + + .pear-col-xs5 { + width: 20.83%; + } + + .pear-col-xs6 { + width: 25%; + } + + .pear-col-xs7 { + width: 29.16%; + } + + .pear-col-xs8 { + width: 33.33%; + } + + .pear-col-xs9 { + width: 37.5%; + } + + .pear-col-xs10 { + width: 41.66%; + } + + .pear-col-xs11 { + width: 45.83%; + } + + .pear-col-xs12 { + width: 50%; + } + + .pear-col-xs13 { + width: 54.16%; + } + + .pear-col-xs14 { + width: 58.33%; + } + + .pear-col-xs15 { + width: 62.5%; + } + + .pear-col-xs16 { + width: 66.66%; + } + + .pear-col-xs17 { + width: 70.83%; + } + + .pear-col-xs18 { + width: 75%; + } + + .pear-col-xs19 { + width: 79.16%; + } + + .pear-col-xs20 { + width: 83.33%; + } + + .pear-col-xs21 { + width: 87.5%; + } + + .pear-col-xs22 { + width: 91.66%; + } + + .pear-col-xs23 { + width: 95.83%; + } + + .pear-col-xs24 { + width: 100%; + } + + .pear-col-xs-offset1 { + margin-left: 4.16%; + } + + .pear-col-xs-offset2 { + margin-left: 8.33%; + } + + .pear-col-xs-offset3 { + margin-left: 12.5%; + } + + .pear-col-xs-offset4 { + margin-left: 16.66%; + } + + .pear-col-xs-offset5 { + margin-left: 20.83%; + } + + .pear-col-xs-offset6 { + margin-left: 25%; + } + + .pear-col-xs-offset7 { + margin-left: 29.16%; + } + + .pear-col-xs-offset8 { + margin-left: 33.33%; + } + + .pear-col-xs-offset9 { + margin-left: 37.5%; + } + + .pear-col-xs-offset10 { + margin-left: 41.66%; + } + + .pear-col-xs-offset11 { + margin-left: 45.83%; + } + + .pear-col-xs-offset12 { + margin-left: 50%; + } + + .pear-col-xs-offset13 { + margin-left: 54.16%; + } + + .pear-col-xs-offset14 { + margin-left: 58.33%; + } + + .pear-col-xs-offset15 { + margin-left: 62.5%; + } + + .pear-col-xs-offset16 { + margin-left: 66.66%; + } + + .pear-col-xs-offset17 { + margin-left: 70.83%; + } + + .pear-col-xs-offset18 { + margin-left: 75%; + } + + .pear-col-xs-offset19 { + margin-left: 79.16%; + } + + .pear-col-xs-offset20 { + margin-left: 83.33%; + } + + .pear-col-xs-offset21 { + margin-left: 87.5%; + } + + .pear-col-xs-offset22 { + margin-left: 91.66%; + } + + .pear-col-xs-offset23 { + margin-left: 95.83%; + } + + .pear-col-xs-offset24 { + margin-left: 100%; + } +} + +@media all and (min-width: 768px) and (max-width: 992px) { + .pear-col-sm1 { + width: 4.16%; + } + + .pear-col-sm2 { + width: 8.33%; + } + + .pear-col-sm3 { + width: 12.5%; + } + + .pear-col-sm4 { + width: 16.66%; + } + + .pear-col-sm5 { + width: 20.83%; + } + + .pear-col-sm6 { + width: 25%; + } + + .pear-col-sm7 { + width: 29.16%; + } + + .pear-col-sm8 { + width: 33.33%; + } + + .pear-col-sm9 { + width: 37.5%; + } + + .pear-col-sm10 { + width: 41.66%; + } + + .pear-col-sm11 { + width: 45.83%; + } + + .pear-col-sm12 { + width: 50%; + } + + .pear-col-sm13 { + width: 54.16%; + } + + .pear-col-sm14 { + width: 58.33%; + } + + .pear-col-sm15 { + width: 62.5%; + } + + .pear-col-sm16 { + width: 66.66%; + } + + .pear-col-sm17 { + width: 70.83%; + } + + .pear-col-sm18 { + width: 75%; + } + + .pear-col-sm19 { + width: 79.16%; + } + + .pear-col-sm20 { + width: 83.33%; + } + + .pear-col-sm21 { + width: 87.5%; + } + + .pear-col-sm22 { + width: 91.66%; + } + + .pear-col-sm23 { + width: 95.83%; + } + + .pear-col-sm24 { + width: 100%; + } + + .pear-col-sm-offset1 { + margin-left: 4.16%; + } + + .pear-col-sm-offset2 { + margin-left: 8.33%; + } + + .pear-col-sm-offset3 { + margin-left: 12.5%; + } + + .pear-col-sm-offset4 { + margin-left: 16.66%; + } + + .pear-col-sm-offset5 { + margin-left: 20.83%; + } + + .pear-col-sm-offset6 { + margin-left: 25%; + } + + .pear-col-sm-offset7 { + margin-left: 29.16%; + } + + .pear-col-sm-offset8 { + margin-left: 33.33%; + } + + .pear-col-sm-offset9 { + margin-left: 37.5%; + } + + .pear-col-sm-offset10 { + margin-left: 41.66%; + } + + .pear-col-sm-offset11 { + margin-left: 45.83%; + } + + .pear-col-sm-offset12 { + margin-left: 50%; + } + + .pear-col-sm-offset13 { + margin-left: 54.16%; + } + + .pear-col-sm-offset14 { + margin-left: 58.33%; + } + + .pear-col-sm-offset15 { + margin-left: 62.5%; + } + + .pear-col-sm-offset16 { + margin-left: 66.66%; + } + + .pear-col-sm-offset17 { + margin-left: 70.83%; + } + + .pear-col-sm-offset18 { + margin-left: 75%; + } + + .pear-col-sm-offset19 { + margin-left: 79.16%; + } + + .pear-col-sm-offset20 { + margin-left: 83.33%; + } + + .pear-col-sm-offset21 { + margin-left: 87.5%; + } + + .pear-col-sm-offset22 { + margin-left: 91.66%; + } + + .pear-col-sm-offset23 { + margin-left: 95.83%; + } + + .pear-col-sm-offset24 { + margin-left: 100%; + } +} + +@media all and (min-width: 1200px) { + .pear-col-lg1 { + width: 4.16%; + } + + .pear-col-lg2 { + width: 8.33%; + } + + .pear-col-lg3 { + width: 12.5%; + } + + .pear-col-lg4 { + width: 16.66%; + } + + .pear-col-lg5 { + width: 20.83%; + } + + .pear-col-lg6 { + width: 25%; + } + + .pear-col-lg7 { + width: 29.16%; + } + + .pear-col-lg8 { + width: 33.33%; + } + + .pear-col-lg9 { + width: 37.5%; + } + + .pear-col-lg10 { + width: 41.66%; + } + + .pear-col-lg11 { + width: 45.83%; + } + + .pear-col-lg12 { + width: 50%; + } + + .pear-col-lg13 { + width: 54.16%; + } + + .pear-col-lg14 { + width: 58.33%; + } + + .pear-col-lg15 { + width: 62.5%; + } + + .pear-col-lg16 { + width: 66.66%; + } + + .pear-col-lg17 { + width: 70.83%; + } + + .pear-col-lg18 { + width: 75%; + } + + .pear-col-lg19 { + width: 79.16%; + } + + .pear-col-lg20 { + width: 83.33%; + } + + .pear-col-lg21 { + width: 87.5%; + } + + .pear-col-lg22 { + width: 91.66%; + } + + .pear-col-lg23 { + width: 95.83%; + } + + .pear-col-lg24 { + width: 100%; + } + + .pear-col-lg-offset1 { + margin-left: 4.16%; + } + + .pear-col-lg-offset2 { + margin-left: 8.33%; + } + + .pear-col-lg-offset3 { + margin-left: 12.5%; + } + + .pear-col-lg-offset4 { + margin-left: 16.66%; + } + + .pear-col-lg-offset5 { + margin-left: 20.83%; + } + + .pear-col-lg-offset6 { + margin-left: 25%; + } + + .pear-col-lg-offset7 { + margin-left: 29.16%; + } + + .pear-col-lg-offset8 { + margin-left: 33.33%; + } + + .pear-col-lg-offset9 { + margin-left: 37.5%; + } + + .pear-col-lg-offset10 { + margin-left: 41.66%; + } + + .pear-col-lg-offset11 { + margin-left: 45.83%; + } + + .pear-col-lg-offset12 { + margin-left: 50%; + } + + .pear-col-lg-offset13 { + margin-left: 54.16%; + } + + .pear-col-lg-offset14 { + margin-left: 58.33%; + } + + .pear-col-lg-offset15 { + margin-left: 62.5%; + } + + .pear-col-lg-offset16 { + margin-left: 66.66%; + } + + .pear-col-lg-offset17 { + margin-left: 70.83%; + } + + .pear-col-lg-offset18 { + margin-left: 75%; + } + + .pear-col-lg-offset19 { + margin-left: 79.16%; + } + + .pear-col-lg-offset20 { + margin-left: 83.33%; + } + + .pear-col-lg-offset21 { + margin-left: 87.5%; + } + + .pear-col-lg-offset22 { + margin-left: 91.66%; + } + + .pear-col-lg-offset23 { + margin-left: 95.83%; + } + + .pear-col-lg-offset24 { + margin-left: 100%; + } +} + +.pear-col-space1 { + margin: -.5px +} + +.pear-col-space1 > * { + padding: .5px +} + +.pear-col-space2 { + margin: -1px +} + +.pear-col-space2 > * { + padding: 1px +} + +.pear-col-space4 { + margin: -2px +} + +.pear-col-space4 > * { + padding: 2px +} + +.pear-col-space5 { + margin: -2.5px +} + +.pear-col-space5 > * { + padding: 2.5px +} + +.pear-col-space6 { + margin: -3px +} + +.pear-col-space6 > * { + padding: 3px +} + +.pear-col-space8 { + margin: -4px +} + +.pear-col-space8 > * { + padding: 4px +} + +.pear-col-space10 { + margin: -5px +} + +.pear-col-space10 > * { + padding: 5px +} + +.pear-col-space12 { + margin: -6px +} + +.pear-col-space12 > * { + padding: 6px +} + +.pear-col-space14 { + margin: -7px +} + +.pear-col-space14 > * { + padding: 7px +} + +.pear-col-space15 { + margin: -7.5px +} + +.pear-col-space15 > * { + padding: 7.5px +} + +.pear-col-space16 { + margin: -8px +} + +.pear-col-space16 > * { + padding: 8px +} + +.pear-col-space18 { + margin: -9px +} + +.pear-col-space18 > * { + padding: 9px +} + +.pear-col-space20 { + margin: -10px +} + +.pear-col-space20 > * { + padding: 10px +} + +.pear-col-space22 { + margin: -11px +} + +.pear-col-space22 > * { + padding: 11px +} + +.pear-col-space24 { + margin: -12px +} + +.pear-col-space24 > * { + padding: 12px +} + +.pear-col-space25 { + margin: -12.5px +} + +.pear-col-space25 > * { + padding: 12.5px +} + +.pear-col-space26 { + margin: -13px +} + +.pear-col-space26 > * { + padding: 13px +} + +.pear-col-space28 { + margin: -14px +} + +.pear-col-space28 > * { + padding: 14px +} + +.pear-col-space30 { + margin: -15px +} + +.pear-col-space30 > * { + padding: 15px +} \ No newline at end of file diff --git a/static/component/pear/css/module/menu.css b/static/component/pear/css/module/menu.css new file mode 100644 index 0000000..8e639b4 --- /dev/null +++ b/static/component/pear/css/module/menu.css @@ -0,0 +1,277 @@ +.pear-nav-tree { + width: 230px !important; + border-radius: 0px; + background-color: #28333E; +} + +.pear-nav-tree .layui-nav-item > a { + height: 56px; + line-height: 56px; + padding-top: 0px; + padding-bottom: 0px; +} + +.pear-nav-tree .layui-nav-item dd a { + height: 48px; + line-height: 48px; +} + +.pear-nav-tree .layui-nav-item > a .layui-nav-more { + padding: 0px; +} + +.pear-side-scroll::-webkit-scrollbar { + width: 0px; + height: 0px; +} + +.pear-side-scroll { + width: 230px; +} + +.pear-nav-tree .layui-nav-child dd.layui-this, +.layui-nav-tree .layui-nav-child dd.layui-this a, +.layui-nav-tree .layui-this, +.layui-nav-tree .layui-this > a, +.layui-nav-tree .layui-this > a:hover { + background-color: var(--global-primary-color); +} + +.pear-nav-tree .toast { + font-size: 14px; + margin: 5px; + margin-right: 8px; + text-align: center; + height: 40px; + line-height: 40px; + color: lightgray; +} + + +.pear-nav-tree .layui-nav-item a i { + margin-right: 12px; +} + +.pear-nav-tree .layui-nav-item a span { + letter-spacing: 2px; + font-size: 13.5px; +} + +.pear-nav-tree .layui-nav-item a:hover { + background-color: transparent; +} + +.pear-nav-tree .layui-nav-more { + margin-right: 5px; +} + +.pear-nav-tree .layui-nav-bar { + display: none; +} + +.pear-nav-tree .layui-nav-item a .layui-badge-dot { + float: right; + right: 13px; +} + +.pear-nav-tree .layui-nav-item a .layui-badge { + float: right; + right: 10px; +} + +/** 实 现 菜 单 隐 藏 */ +.pear-nav-mini { + overflow: hidden; +} + +.pear-nav-mini .layui-nav-item a span { + display: none; +} + +.pear-nav-mini .layui-nav-child { + display: none; +} + +.pear-nav-mini .layui-nav-more { + display: none !important; +} + +.pear-nav-control.pc a { + font-weight: 500; + font-size: 14px; +} + +.pear-nav-control.pc li { + display: inline-block; +} + +.pear-nav-control.pc .layui-nav-bar { + top: 0px !important; +} + +.pear-nav-control.pc .layui-this * { + background-color: whitesmoke; +} + +.pear-nav-control.pc * { + color: darkslategray !important; +} + +.pear-nav-control.pc .layui-nav-bar { + display: none !important; +} + +.pear-nav-control .layui-nav-child { + border: 1px solid whitesmoke; + border-radius: 6px; + width: 150px; +} + +/** 隐 藏 后 子 级 悬 浮 菜 单 */ +.pear-nav-tree .layui-nav-hover { + position: fixed; + min-width: 130px; + padding: 4px; + display: block !important; + background: transparent !important; +} + +.pear-nav-tree .layui-nav-hover:before { + content: ''; + position: absolute; + right: 4px; + left: 4px; + bottom: 0; + top: 0; + border-radius: 4px; + overflow: hidden; + background-color: #28333E; + display: block; + box-shadow: 0px 0px 3px lightgray; +} + +.pear-nav-tree .layui-nav-hover a span { + display: inline-block !important; +} + +.pear-nav-tree .layui-nav-hover a i { + display: none; +} + +.pear-nav-tree .layui-nav-child dd a span { + margin-left: 26px !important; +} + +.pear-nav-tree .layui-nav-child dd a i { + display: none; +} + +.pear-nav-tree .layui-nav-hover dd a span { + margin-left: 0px !important; +} + +.pear-nav-tree dl { + padding-top: 0; + padding-bottom: 0; +} + +/** 亮 样 式*/ +.dark-theme .layui-nav-tree { + background-color: #28333E !important; +} + +.light-theme { + background-color: white !important; +} + +.light-theme .pear-nav-tree, +.light-theme .pear-nav-tree .layui-nav-hover:before, +.light-theme .pear-nav-tree .layui-nav-child { + background-color: white !important; +} + +.light-theme .pear-nav-tree a, +.light-theme .pear-nav-tree .layui-nav-more { + color: dimgray !important; + border-top-color: dimgray; +} + +.light-theme .pear-nav-tree .layui-nav-itemed > a > .layui-nav-more { + border-top-color: white !important; + border-bottom-color: dimgray !important; +} + +.light-theme .pear-nav-tree .layui-this a, +.light-theme .pear-nav-tree .layui-this { + color: white !important; + background-color: var(--global-primary-color) !important; + +} + +.light-theme .pear-nav-tree .layui-this a:hover { + background-color: var(--global-primary-color) !important; + +} + +.light-theme .pear-nav-tree .layui-nav-bar { + display: none; + +} + +/** 下 拉 图 标 */ +.pear-nav-tree.arrow .layui-nav-more { + font-family: layui-icon !important; + font-size: 10px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow: hidden; + width: auto; + height: auto; + line-height: normal; + border: none; + top: 23px; + margin-right: 2px !important; + margin: 0; + padding: 0; + display: inline-block; + transition: all .2s; + -webkit-transition: all .2s; +} + +.pear-nav-tree.arrow .layui-nav-child .layui-nav-more { + top: 17px; +} + +.pear-nav-tree.arrow .layui-nav-more:before { + content: "\e61a"; +} + +.pear-nav-tree.arrow .layui-nav-itemed > a > .layui-nav-more { + transform: rotate(180deg); + -ms-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -o-transform: rotate(180deg); + width: 12px; + text-align: center; +} + +.pear-nav-tree.arrow .layui-nav-child.layui-nav-hover > dd > a > .layui-nav-more { + display: inline-block !important; + transform: rotate(270deg); + -ms-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -webkit-transform: rotate(270deg); + -o-transform: rotate(270deg); + width: 12px; + text-align: center; + background-color: transparent !important; +} + +.pear-nav-tree.arrow .layui-nav-child.layui-nav-hover > a > .layui-nav-more:before, +.pear-nav-tree.arrow .layui-nav-itemed > a > .layui-nav-more:before { + content: '\e61a'; + display: inline-block; + vertical-align: middle; +} \ No newline at end of file diff --git a/static/component/pear/css/module/menuSearch.css b/static/component/pear/css/module/menuSearch.css new file mode 100644 index 0000000..240a5b9 --- /dev/null +++ b/static/component/pear/css/module/menuSearch.css @@ -0,0 +1,91 @@ +/* 搜索面板 */ +.menu-search-content .layui-input { + padding-left: 30px; +} + +.menu-search-content .layui-input:focus { + border: 1px solid var(--global-primary-color) !important; + box-shadow: none; +} + +.menu-search-content { + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +.menu-search-input-wrapper { + width: 100%; + padding: 15px 15px; +} + +.menu-search-no-data { + display: flex; + justify-content: center; + width: 100%; + height: 122px; + align-items: center; +} + +.menu-search-list { + width: 100%; + padding: 5px 15px; +} + +.menu-search-list li { + position: relative; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: nowrap; + height: 50px; + margin-bottom: 8px; + padding: 0px 10px; + color: currentColor; + font-size: 14px; + border-radius: 4px; + box-shadow: 0 1px 3px #d4d9e1; + cursor: pointer; + background-color: #fff; +} + +.menu-search-list li.this, +.menu-search-list li:hover { + background-color: var(--global-primary-color); + color: white; +} + +.menu-search-tips { + margin-bottom: 15px; + padding: 0 15px; + width: 100% +} + +.menu-search-tips > div { + display: flex; + align-items: center; + justify-content: flex-end; + font-size: 12px; +} + +.menu-search-tips .mr-1 { + margin-right: 4px; +} + +.menu-search-tips .mr-5 { + margin-right: 20px; +} + +.menu-search-tips .w-5 { + width: 14px; +} + +.menu-search-tips kbd { + line-height: 1.5; + border: 1px solid #e5e7eb; + font-size: 10px; + text-align: center; + padding: 2px 6px; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; + border-radius: 5px; +} \ No newline at end of file diff --git a/static/component/pear/css/module/messageCenter.css b/static/component/pear/css/module/messageCenter.css new file mode 100644 index 0000000..107b314 --- /dev/null +++ b/static/component/pear/css/module/messageCenter.css @@ -0,0 +1,39 @@ +.pear-message-center { + width: 360px; + height: 100%; +} + +.pear-message-center .layui-tab .layui-tab-title { + display: flex; +} + +.pear-message-center .layui-tab .layui-tab-title .layui-this::after { + display: none; +} + +.pear-message-center .layui-tab .layui-tab-title li { + flex: 1; +} + +.pear-message-center .message-item img { + margin-left: 8px; + width: 33px !important; + height: 33px !important; + border-radius: 50px; + margin-right: 15px; +} + +.pear-message-center .message-item { + height: 64px !important; + line-height: 45px !important; + padding-right: 20px; + padding-left: 20px; + border-bottom: 1px solid whitesmoke; + padding-top: 10px; + padding-bottom: 15px; +} + +.pear-message-center .message-item .extra { + float: right; + right: 10px; +} \ No newline at end of file diff --git a/static/component/pear/css/module/nprogress.css b/static/component/pear/css/module/nprogress.css new file mode 100644 index 0000000..b5b4bfe --- /dev/null +++ b/static/component/pear/css/module/nprogress.css @@ -0,0 +1,82 @@ +/* Make clicks pass-through */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: var(--global-primary-color); + + position: fixed; + z-index: 999999; + top: 0; + left: 0; + + width: 100%; + height: 2px; +} + +/* Fancy blur effect */ +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px var(--global-primary-color), 0 0 5px var(--global-primary-color); + opacity: 1.0; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +/* Remove these to get rid of the spinner */ +#nprogress .spinner { + display: block; + position: fixed; + z-index: 1031; + top: 15px; + right: 15px; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: var(--global-primary-color); + border-left-color: var(--global-primary-color); + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} + +@keyframes nprogress-spinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/static/component/pear/css/module/page.css b/static/component/pear/css/module/page.css new file mode 100644 index 0000000..b0be0d9 --- /dev/null +++ b/static/component/pear/css/module/page.css @@ -0,0 +1,154 @@ +.pear-page { + width: 100%; + position: relative; + overflow-y: auto; + height: 100%; +} + +.pear-page .dot { + width: 5px; + height: 24px; + background-color: #5FB878; + margin-top: 8px; + margin-left: 15px; + border-radius: 2px; + display: inline-block; +} + +.pear-page .pear-page-title { + height: 40px; + line-height: 40px; + background-color: white; + border: whitesmoke 1px solid; +} + +.pear-page .pear-page-content, +.pear-page .pear-page-content iframe { + width: 100%; + height: calc(100% - 0px) !important; +} + +.pear-page .pear-page-content iframe { + height: calc(100% - 4px) !important; +} + +.pear-page-loading { + position: absolute; + display: none; + width: 100%; + height: calc(100% - 0px) !important; + background-color: #fff; + top: 0px; + z-index: 19; +} + +.pear-page-loading.close { + animation: close 1s; + -webkit-animation: close 1s; + animation-fill-mode: forwards; +} + +.ball-loader { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%) +} + +.ball-loader > span, +.signal-loader > span { + background-color: #4aca85; + display: inline-block +} + +.ball-loader > span:nth-child(1), +.ball-loader.sm > span:nth-child(1), +.signal-loader > span:nth-child(1), +.signal-loader.sm > span:nth-child(1) { + -webkit-animation-delay: 0s; + animation-delay: 0s +} + +.ball-loader > span:nth-child(2), +.ball-loader.sm > span:nth-child(2), +.signal-loader > span:nth-child(2), +.signal-loader.sm > span:nth-child(2) { + -webkit-animation-delay: .1s; + animation-delay: .1s +} + +.ball-loader > span:nth-child(3), +.ball-loader.sm > span:nth-child(3), +.signal-loader > span:nth-child(3), +.signal-loader.sm > span:nth-child(3) { + -webkit-animation-delay: .15s; + animation-delay: .15s +} + +.ball-loader > span:nth-child(4), +.ball-loader.sm > span:nth-child(4), +.signal-loader > span:nth-child(4), +.signal-loader.sm > span:nth-child(4) { + -webkit-animation-delay: .2s; + animation-delay: .2s +} + +.ball-loader > span { + width: 20px; + height: 20px; + margin: 0 3px; + border-radius: 50%; + transform: scale(0); + -ms-transform: scale(0); + -webkit-transform: scale(0); + animation: ball-load 1s ease-in-out infinite; + -webkit-animation: 1s ball-load ease-in-out infinite +} + +@-webkit-keyframes ball-load { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } + + 100% { + transform: scale(0); + -webkit-transform: scale(0) + } +} + +@keyframes ball-load { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } + + 100% { + transform: scale(0); + -webkit-transform: scale(0) + } +} + +@-webkit-keyframes close { + 0% { + opacity: 1; + /*display: block;*/ + } + + 100% { + opacity: 0; + /*display: none;*/ + } +} diff --git a/static/component/pear/css/module/tabPage.css b/static/component/pear/css/module/tabPage.css new file mode 100644 index 0000000..91383c3 --- /dev/null +++ b/static/component/pear/css/module/tabPage.css @@ -0,0 +1,315 @@ +.pear-tab-page { + margin: 0px; + overflow: hidden; + height: 100% !important; +} + +.pear-tab-page .layui-tab-content { + height: calc(100% - 42px) !important; +} + +.pear-tab-page .layui-tab-content .layui-tab-item { + overflow-y: auto; + height: 100%; +} + +.pear-tab-page-menu { + box-shadow: none; + border-radius: 4px !important; + overflow: hidden; + box-shadow: 2px 0 6px rgba(0, 21, 41, .10); +} + +.pear-tab-page-menu .item { + height: 20px; + padding-left: 18px; + padding-top: 7px; + padding-bottom: 7px; + color: #333; + font-size: 13.5px; + line-height: 20px; + cursor: pointer; +} + +.pear-tab-page-menu .item:hover { + background: var(--global-primary-color); + color: white; +} + +.pear-tab-page .layui-tab-content { + padding: 0px; +} + +.pear-tab-page > .layui-tab-title { + border: none; + border: 1px solid whitesmoke; + background-color: white; +} + +.pear-tab-page > .layui-tab-title li { + border-right: 1px solid whitesmoke; + color: dimgray; + font-size: 13.5px; +} + +.pear-tab-page > .layui-tab-title .layui-tab-bar { + display: none; +} + +.pear-tab-page .layui-nav-more { + display: none; +} + +.pear-tab-page > .layui-tab-title .layui-this:after { + display: none; +} + +.pear-tab-page > .layui-tab-title .pear-tab-page-active { + display: inline-block; + background-color: lightgray; + width: 8px; + height: 8px; + border-radius: 30px; + margin-right: 12px; +} + +.pear-tab-page > .layui-tab-title .layui-this .pear-tab-page-active { + background-color: var(--global-primary-color) !important; +} + +.pear-tab-page > .layui-tab-title .layui-tab-close:hover { + background-color: white; + line-height: 19px; + color: gray; +} + +.pear-tab-page > .layui-tab-title .disable-close + .layui-tab-close { + display: none; +} + +.pear-tab-page > .layui-tab-title .able-close + .layui-tab-close { + display: inline-block; +} + +.pear-tab-page .layui-tab-close { + font-size: 13px; +} + +.pear-tab-page .layui-tab-control > li { + position: absolute; + top: 0px; + height: 40px; + line-height: 40px; + width: 40px; + background-color: white; + border-top: whitesmoke 1px solid; + border-bottom: whitesmoke 1px solid; + text-align: center; +} + +.pear-tab-page .layui-tab-prev { + left: 0px; + border-right: whitesmoke 1px solid; +} + +.pear-tab-page .layui-tab-next { + right: 40px; + border-left: 1px solid whitesmoke; +} + +.pear-tab-page .layui-tab-tool { + right: 0px; + border-left: 1px solid whitesmoke; +} + +.pear-tab-page .layui-tab-control .layui-tab-tool, +.pear-tab-page .layui-tab-control .layui-tab-prev, +.pear-tab-page .layui-tab-control .layui-tab-next { + display: none; +} + +.pear-tab-page.layui-tab-roll .layui-tab-control .layui-tab-prev, +.pear-tab-page.layui-tab-roll .layui-tab-control .layui-tab-next { + display: block; +} + +.pear-tab-page.layui-tab-roll .layui-tab-control .layui-tab-next { + right: 0px; + border-right: 1px solid whitesmoke; +} + +.pear-tab-page.layui-tab-roll .layui-tab-title { + padding-left: 40px; + padding-right: 40px; +} + +.pear-tab-page.layui-tab-tool .layui-tab-control .layui-tab-tool { + display: block; +} + +.pear-tab-page.layui-tab-tool .layui-tab-title { + padding-left: 0px; + padding-right: 40px; +} + +.pear-tab-page.layui-tab-rollTool > .layui-tab-title { + padding-left: 40px; + padding-right: 80px; +} + +.pear-tab-page.layui-tab-rollTool .layui-tab-control .layui-tab-prev, +.pear-tab-page.layui-tab-rollTool .layui-tab-control .layui-tab-next, +.pear-tab-page.layui-tab-rollTool .layui-tab-control .layui-tab-tool { + display: block; +} + +.pear-tab-page .layui-tab-tool .layui-nav { + position: absolute; + height: 43px !important; + top: 0; + width: 100%; + height: 100%; + padding: 0; + background: 0 0; +} + +.pear-tab-page .layui-tab-tool .layui-nav-item { + height: 40px; +} + +.pear-tab-page .layui-tab-tool .layui-nav-bar { + display: none; +} + +.pear-tab-page .layui-tab-tool .layui-nav-child { + left: auto; + top: 45px; + right: 3px; + width: 120px; + border: 1px solid whitesmoke; +} + +.pear-tab-page .layui-tab-tool .layui-this a { + background-color: #009688; +} + +.pear-tab-page-loading { + position: absolute; + display: none; + width: 100%; + height: calc(100% - 42px); + top: 42px; + z-index: 19; + background-color: #fff +} + +.pear-tab-page-loading.close { + animation: close 1s; + -webkit-animation: close 1s; + animation-fill-mode: forwards; +} + +.ball-loader { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%) +} + +.ball-loader > span, +.signal-loader > span { + background-color: var(--global-primary-color) !important; + display: inline-block +} + +.ball-loader > span:nth-child(1), +.ball-loader.sm > span:nth-child(1), +.signal-loader > span:nth-child(1), +.signal-loader.sm > span:nth-child(1) { + -webkit-animation-delay: 0s; + animation-delay: 0s +} + +.ball-loader > span:nth-child(2), +.ball-loader.sm > span:nth-child(2), +.signal-loader > span:nth-child(2), +.signal-loader.sm > span:nth-child(2) { + -webkit-animation-delay: .1s; + animation-delay: .1s +} + +.ball-loader > span:nth-child(3), +.ball-loader.sm > span:nth-child(3), +.signal-loader > span:nth-child(3), +.signal-loader.sm > span:nth-child(3) { + -webkit-animation-delay: .15s; + animation-delay: .15s +} + +.ball-loader > span:nth-child(4), +.ball-loader.sm > span:nth-child(4), +.signal-loader > span:nth-child(4), +.signal-loader.sm > span:nth-child(4) { + -webkit-animation-delay: .2s; + animation-delay: .2s +} + +.ball-loader > span { + width: 20px; + height: 20px; + margin: 0 3px; + border-radius: 50%; + transform: scale(0); + -ms-transform: scale(0); + -webkit-transform: scale(0); + animation: ball-load 1s ease-in-out infinite; + -webkit-animation: 1s ball-load ease-in-out infinite +} + +@-webkit-keyframes ball-load { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } + + 100% { + transform: scale(0); + -webkit-transform: scale(0) + } +} + +@keyframes ball-load { + 0% { + transform: scale(0); + -webkit-transform: scale(0) + } + + 50% { + transform: scale(1); + -webkit-transform: scale(1) + } + + 100% { + transform: scale(0); + -webkit-transform: scale(0) + } +} + +@-webkit-keyframes close { + 0% { + opacity: 1; + /*display: block;*/ + } + + 100% { + opacity: 0; + /*display: none;*/ + } +} diff --git a/static/component/pear/css/module/toast.css b/static/component/pear/css/module/toast.css new file mode 100644 index 0000000..5472da5 --- /dev/null +++ b/static/component/pear/css/module/toast.css @@ -0,0 +1,1929 @@ +.iziToast-capsule { + font-size: 0; + height: 0; + width: 100%; + transform: translateZ(0); + backface-visibility: hidden; + transition: transform 0.5s cubic-bezier(0.25, 0.8, 0.25, 1), height 0.5s cubic-bezier(0.25, 0.8, 0.25, 1); +} + +.iziToast-capsule, .iziToast-capsule * { + box-sizing: border-box; +} + +.iziToast-overlay { + display: block; + position: fixed; + top: -100px; + left: 0; + right: 0; + bottom: -100px; + z-index: 19891100; +} + +.iziToast { + display: inline-block; + clear: both; + position: relative; + font-family: 'Lato', Tahoma, Arial; + font-size: 14px; + padding: 8px 45px 9px 0; + background: #fff; + border-color: #fff; + width: 100%; + pointer-events: all; + cursor: default; + transform: translateX(0); + -webkit-touch-callout: none /* iOS Safari */; + -webkit-user-select: none /* Chrome/Safari/Opera */; + -khtml-user-select: none /* Konqueror */; + -moz-user-select: none /* Firefox */; + -ms-user-select: none /* Internet Explorer/Edge */; + user-select: none; + min-height: 45px; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); + max-width: 90%; + margin: 5px 0; + border-radius: 4px; +} + +.iziToast > .iziToast-progressbar { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + z-index: 1; + background: rgba(255, 255, 255, 0.5); +} + +.iziToast > .iziToast-progressbar > div { + height: 2px; + width: 100%; + background: #dddddd; + border-radius: 0 0 3px 3px; +} + +.iziToast.iziToast-theme-dark > .iziToast-progressbar > div { + background: #fff; +} + +.iziToast.iziToast-balloon:before { + content: ''; + position: absolute; + right: 8px; + left: auto; + width: 0px; + height: 0px; + top: 100%; + border-right: 0px solid transparent; + border-left: 15px solid transparent; + border-top: 10px solid #000; + border-top-color: inherit; + border-radius: 0; +} + +.iziToast.iziToast-balloon .iziToast-progressbar { + top: 0; + bottom: auto; +} + +.iziToast.iziToast-balloon > div { + border-radius: 0 0 0 3px; +} + +.iziToast > .iziToast-cover { + position: absolute; + left: 0; + top: 0; + bottom: 0; + height: 100%; + margin: 0; + background-size: 100%; + background-position: 50% 50%; + background-repeat: no-repeat; +} + +.iziToast > .iziToast-close { + position: absolute; + right: 0; + top: 0; + border: 0; + padding: 0; + opacity: 0.6; + width: 42px; + height: 100%; + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAJPAAACTwBcGfW0QAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAD3SURBVFiF1ZdtDoMgDEBfdi4PwAX8vLFn0qT7wxantojKupmQmCi8R4tSACpgjC2ICCUbEBa8ingjsU1AXRBeR8aLN64FiknswN8CYefBBDQ3whuFESy7WyQMeC0ipEI0A+0FeBvHUFN8xPaUhAH/iKoWsnXHGegy4J0yxialOfaHJAz4bhRzQzgDvdGnz4GbAonZbCQMuBm1K/kcFu8Mp1N2cFFpsxsMuJqqbIGExGl4loARajU1twskJLLhIsID7+tvUoDnIjTg5T9DPH9EBrz8rxjPzciAl9+O8SxI8CzJ8CxKFfh3ynK8Dyb8wNHM/XDqejx/AtNyPO87tNybAAAAAElFTkSuQmCC") no-repeat 50% 50%; + background-size: 8px; + cursor: pointer; + outline: none; +} + +.iziToast > .iziToast-close:hover { + opacity: 1; +} + +.iziToast > .iziToast-body { + position: relative; + padding: 0 0 0 10px; + height: auto; + min-height: 28px; + margin: 0 0 0 15px; + text-align: left; +} + +.iziToast > .iziToast-body:after { + content: ""; + display: table; + clear: both; +} + +.iziToast > .iziToast-body .iziToast-texts { + margin: 6px 0; + padding-right: 2px; + display: inline-block; + float: left; +} + +.iziToast > .iziToast-body .iziToast-inputs { + min-height: 19px; + float: left; + margin: 3px -2px; +} + +.iziToast > .iziToast-body .iziToast-inputs > input:not([type=checkbox]):not([type=radio]), +.iziToast > .iziToast-body .iziToast-inputs > select { + position: relative; + display: inline-block; + margin: 2px; + border-radius: 2px; + border: 0; + padding: 4px 7px; + font-size: 13px; + letter-spacing: 0.02em; + background: rgba(0, 0, 0, 0.1); + color: #000; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); + min-height: 26px; +} + +.iziToast > .iziToast-body .iziToast-inputs > input:not([type=checkbox]):not([type=radio]):focus, +.iziToast > .iziToast-body .iziToast-inputs > select:focus { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.6); +} + +.iziToast > .iziToast-body .iziToast-buttons { + min-height: 17px; + float: left; + margin: 4px 0 0 0; +} + +.iziToast > .iziToast-body .iziToast-buttons > a, +.iziToast > .iziToast-body .iziToast-buttons > button, +.iziToast > .iziToast-body .iziToast-buttons > input:not([type=checkbox]):not([type=radio]) { + position: relative; + display: inline-block; + margin: 2px; + border-radius: 2px; + border: 0; + padding: 5px 10px; + font-size: 12px; + letter-spacing: 0.02em; + cursor: pointer; + background: rgba(0, 0, 0, 0.1); + color: #555; +} + +.iziToast > .iziToast-body .iziToast-buttons > a:hover, +.iziToast > .iziToast-body .iziToast-buttons > button:hover, +.iziToast > .iziToast-body .iziToast-buttons > input:not([type=checkbox]):not([type=radio]):hover { + background: rgba(0, 0, 0, 0.15); +} + +.iziToast > .iziToast-body .iziToast-buttons > a:focus, +.iziToast > .iziToast-body .iziToast-buttons > button:focus, +.iziToast > .iziToast-body .iziToast-buttons > input:not([type=checkbox]):not([type=radio]):focus { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.6); +} + +.iziToast > .iziToast-body .iziToast-buttons > a:active, +.iziToast > .iziToast-body .iziToast-buttons > button:active, +.iziToast > .iziToast-body .iziToast-buttons > input:not([type=checkbox]):not([type=radio]):active { + top: 1px; +} + +.iziToast > .iziToast-body .iziToast-icon { + height: 100%; + position: absolute; + left: 0; + top: 50%; + display: table; + font-size: 23px; + line-height: 24px; + margin-top: -11px; + color: #000; + width: 24px; + height: 24px; +} + +.iziToast > .iziToast-body .iziToast-icon.ico-info { + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTU1NzcxMTk5MzYwIiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjEwODAzIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTUxMiAyOC40MTZjLTI2Ny40Njg4IDAtNDg0LjI0OTYgMjE2LjgzMi00ODQuMjQ5NiA0ODQuMjQ5NiAwIDI2Ny40MTc2IDIxNi44MzIgNDg0LjI0OTYgNDg0LjI0OTYgNDg0LjI0OTYgMjY3LjQxNzYgMCA0ODQuMzAwOC0yMTYuODMyIDQ4NC4zMDA4LTQ4NC4yNDk2Qzk5Ni4zMDA4IDI0NS4yNDggNzc5LjQxNzYgMjguNDE2IDUxMiAyOC40MTZ6TTQ1NS41MjY0IDI0NS4wOTQ0QzQ3MC4zMjMyIDIyOS44ODggNDkwLjcwMDggMjIxLjMzNzYgNTExLjc5NTIgMjIxLjY0NDhjMjEuMTk2OC0wLjIwNDggNDEuNzc5MiA4LjI0MzIgNTYuNTI0OCAyMy40NDk2IDE1LjAwMTYgMTQuNzk2OCAyMy4yOTYgMzUuMTIzMiAyMy4wOTEyIDU2LjExNTIgMC4yMDQ4IDIxLjE5NjgtOC4yOTQ0IDQxLjU3NDQtMjMuMzk4NCA1Ni4yMTc2LTE0LjY5NDQgMTQuNjk0NC0zNC43MTM2IDIzLjA0LTU1LjM5ODQgMjMuMDRMNTExLjc5NTIgMzgwLjQ2NzJjLTIwLjk5MiAwLjIwNDgtNDEuMzY5Ni04LjE0MDgtNTYuMDY0LTIzLjE0MjRDNDQwLjY3ODQgMzQyLjY4MTYgNDMyLjMzMjggMzIyLjMwNCA0MzIuNTM3NiAzMDEuMjA5NiA0MzIuMzMyOCAyODAuMjE3NiA0NDAuNjc4NCAyNTkuODkxMiA0NTUuNTI2NCAyNDUuMDk0NHpNNjI3LjYwOTYgNzY4LjE1MzZsMCAxMy40MTQ0IDAgMjIuMjIwOEwzOTYuMjg4IDgwMy43ODg4bDAtNTcuMTM5MiAyMS42MDY0LTAuNzY4YzEwLjI0LTAuNDYwOCAxNC41OTItMi43MTM2IDE2Ljk5ODQtNC43NjE2bDEuMjI4OC01LjQyNzJjMC45NzI4LTUuNTgwOCAxLjYzODQtMTQuNDM4NCAxLjU4NzItMjUuOTA3Mkw0MzcuNzA4OCA1MDcuOTA0YzAuMjU2LTE3Ljc2NjQtMi4zNTUyLTI5LjkwMDgtMy40ODE2LTMyLjU2MzJsMCAwTDQzMS42MTYgNDc0LjA2MDhDNDI4Ljg1MTIgNDczLjA4OCA0MjMuOTM2IDQ3Mi4wNjQgNDE3LjE3NzYgNDcxLjY1NDRMMzk2LjI4OCA0NzAuMzc0NCAzOTYuMjg4IDQxMy40OTEybDE4OS40OTEyIDAgMCAyOTYuMjk0NGMtMC4zMDcyIDE3LjcxNTIgMi40MDY0IDI5Ljc5ODQgMy40MzA0IDMyLjU2MzJsMC4wNTEyIDAgMi43MTM2IDEuMTc3NmMyLjgxNiAwLjk3MjggNy43ODI0IDEuOTk2OCAxNC42OTQ0IDIuMzU1MmwyMC44ODk2IDEuMjhMNjI3LjU1ODQgNzY4LjE1MzZ6IiBwLWlkPSIxMDgwNCIgZmlsbD0iIzQwOUVGRiI+PC9wYXRoPjwvc3ZnPg==") no-repeat 50% 50%; + background-size: 85%; +} + +.iziToast > .iziToast-body .iziToast-icon.ico-warning { + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTU1NzcwODczNzUzIiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjUxMTgiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNTEyLjAyMzI3MyAxMDI0Qzc5NC43NjM2MzYgMTAyNCAxMDI0IDc5NC43ODY5MDkgMTAyNCA1MTEuOTc2NzI3IDEwMjQgMjI5LjIzNjM2NCA3OTQuNzg2OTA5LTAuMDIzMjczIDUxMi4wMjMyNzMtMC4wMjMyNzNTMCAyMjkuMjEzMDkxIDAgNTExLjk3NjcyN0MwIDc5NC43ODY5MDkgMjI5LjIzNjM2NCAxMDI0IDUxMi4wMjMyNzMgMTAyNE00NjkuMzQxMDkxIDc2OGMwLTIzLjU1MiAxOC45MjA3MjctNDIuNjU4OTA5IDQyLjcwNTQ1NS00Mi42NTg5MDkgMjMuNTUyIDAgNDIuNjU4OTA5IDE4LjkyMDcyNyA0Mi42NTg5MDkgNDIuNjU4OTA5IDAgMjMuNTc1MjczLTE4LjkyMDcyNyA0Mi43MDU0NTUtNDIuNjU4OTA5IDQyLjcwNTQ1NUM0ODguNDcxMjczIDgxMC43MDU0NTUgNDY5LjM0MTA5MSA3OTEuNzM4MTgyIDQ2OS4zNDEwOTEgNzY4TTQ2OS4zNDEwOTEgMjU1LjgxMzgxOGMwLTIzLjQ1ODkwOSAxOC45MjA3MjctNDIuNDcyNzI3IDQyLjcwNTQ1NS00Mi40NzI3MjcgMjMuNTUyIDAgNDIuNjU4OTA5IDE5LjQzMjcyNyA0Mi42NTg5MDkgNDIuNDcyNzI3bDAgMzQxLjczNjcyN2MwIDIzLjQ1ODkwOS0xOC45MjA3MjcgNDIuNDcyNzI3LTQyLjY1ODkwOSA0Mi40NzI3MjctMjMuNTc1MjczIDAtNDIuNzA1NDU1LTE5LjQzMjcyNy00Mi43MDU0NTUtNDIuNDcyNzI3TDQ2OS4zNDEwOTEgMjU1LjgxMzgxOHoiIHAtaWQ9IjUxMTkiIGZpbGw9IiNmZjk5MDAiPjwvcGF0aD48L3N2Zz4=") no-repeat 50% 50%; + background-size: 85%; +} + +.iziToast > .iziToast-body .iziToast-icon.ico-error { + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTU1NzcwNDI1NDkwIiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjEyNjUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNTExLjk5NjQxOCAyMy41MjA2OTNjLTI2OS43NjcwNSAwLTQ4OC40NTQ3NDggMjE4LjY4ODcyMS00ODguNDU0NzQ4IDQ4OC40NTQ3NDggMCAyNjkuNzY4MDczIDIxOC42ODg3MjEgNDg4LjQ1MzcyNCA0ODguNDU0NzQ4IDQ4OC40NTM3MjQgMjY5Ljc2NjAyNyAwIDQ4OC40NTQ3NDgtMjE4LjY4NTY1MSA0ODguNDU0NzQ4LTQ4OC40NTM3MjRDMTAwMC40NTExNjYgMjQyLjIwOTQxNCA3ODEuNzYyNDQ1IDIzLjUyMDY5MyA1MTEuOTk2NDE4IDIzLjUyMDY5M3pNNzY5LjMzNDM5MSA3MTUuMTU1OTU2bC01NC4xNTY0MzQgNTQuMTU2NDM0TDUxMS45OTY0MTggNTY2LjEyOTgyOCAzMDguODEzODU2IDc2OS4zMTIzOWwtNTQuMTU1NDExLTU0LjE1NjQzNEw0NTcuODQxMDA4IDUxMS45NzU0NDEgMjU0LjY1ODQ0NiAzMDguNzkyODc4bDU0LjE1NTQxMS01NC4xNTU0MTFMNTExLjk5NjQxOCA0NTcuODIwMDNsMjAzLjE4MjU2Mi0yMDMuMTgyNTYyIDU0LjE1NjQzNCA1NC4xNTU0MTFMNTY2LjE1MTgyOSA1MTEuOTc1NDQxIDc2OS4zMzQzOTEgNzE1LjE1NTk1NnoiIHAtaWQ9IjEyNjYiIGZpbGw9IiNGNTZDNkMiPjwvcGF0aD48L3N2Zz4=") no-repeat 50% 50%; + background-size: 80%; +} + +.iziToast > .iziToast-body .iziToast-icon.ico-success { + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTU1NzcwNTI2MjA3IiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQ5NjUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTAyNCA1MTEuOTk5NTAyYzAgMjgyLjc3MDU1Ny0yMjkuMjI5OTQxIDUxMi4wMDA0OTgtNTExLjk5OTUwMiA1MTIuMDAwNDk4LTI4Mi43Njk1NjEgMC01MTIuMDAwNDk4LTIyOS4yMjk5NDEtNTEyLjAwMDQ5OC01MTIuMDAwNDk4IDAtMjgyLjc2ODU2NiAyMjkuMjMwOTM2LTUxMS45OTk1MDIgNTEyLjAwMDQ5OC01MTEuOTk5NTAyQzc5NC43NjkwNjQgMCAxMDI0IDIyOS4yMzA5MzYgMTAyNCA1MTEuOTk5NTAyek03OTYuNTc3MDgxIDM3OC4zMTc3MTNsLTQ4LjQ1OTA1MS00OC40NTkwNTEtMjk3LjA3ODM4NyAyOTcuMDc3MzkyTDI3Ny4yNjc4NTIgNDUzLjE2NTI1OGwtNDguNDU4MDU2IDQ4LjQ1ODA1NiAyMjIuMjI4ODUxIDIyMi4yMzA4NDJMNzk2LjU3NzA4MSAzNzguMzE3NzEzeiIgcC1pZD0iNDk2NiIgZmlsbD0iIzY3YzIzYSI+PC9wYXRoPjwvc3ZnPg==") no-repeat 50% 50%; + background-size: 85%; +} + +.iziToast > .iziToast-body .iziToast-icon.ico-question { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfhCQkUEhFovxTxAAAEDklEQVRo3s2ZTWgTQRTHf03ipTRUqghNSgsRjHgQrFUQC6JgD1Kak3gQUUoPqRdBglf1oBehBws9Cn4cGk+1SOmh2upBxAYVoeJHrR9tgq0i1Cq0lqYeks7MbpPdmU00/c8hm9n33v/t7Nt5M2+qMEWQI0QIibZKRrQpHvLL2KI2wnQzzBKrDm2RIeKEy01dTYKUI7G1ZRknQXV5yP10kTYgly1NF/5S6duZ8ES+1iZodyaocrjXxE0OFeifYYgp0mRIkwFChAkRJsIxGgrIP+I0n82fvZW5dc/zkss0O2o1c5mX6/TmaDWl77RFe5YkUW3tKEmyFv0lOvXJ/fTYnmCEFuMRbGHEZqVHLyT9DFjUJmkzJl9DG5MWWwM6Llif/gF1nukB6nhgGwUXdFrE+wiURA8QoM9i0zEWWpXQW+ZsyeRrOMuyEo5Fv4gmy4dXPvqcC+pH2VRYaMwy+OWG+iLGCgm0W0Kv9HdvR8ASjmKCXpuK/bxiV/76A/v5UdDIZuKcJGjrnec5KZ7wwsWFOp6xPX/9mt2sqDe7FO+Kf/fXHBPPDWpdXGhTpLvUG9VKwh1xMDDjkvu+cNDFBTk7ptX1QkKZ850m3duu6fcrWxwdaFFyREJ2j4vOpKP6Du6z4uJCv8sYJIVkCnJBGGZaBONO3roY2EqNrSfIPi7SKP4fdXyNUd6I6wbSAHEl33tFLe+FlSsusnK90A0+oEPcuufZgXnOi+u9LrKSJQZQw6LwqBnv2CKsfHORbFbyQhA6xN/pEuihSdj56Co7LWRjPiKie6gkB2LiKuUqK5kiPkLiz1QJ9K1cNXBAMoUCigNpQ9IqDtMI1HKA4/jyvUsaoSyZLA5kjOjDPFZen8Ql5TsvBskUgjciIPSX3QAXC86DT7VWvlEh/xZ+ij9BDVWJ0QL0SbZq6QaFxoLPcXPmBLveLCc4wXdDK6s+6/vwhCSniFLPXW0NJe5UB8zKCsviqpc7vGPVQFcyZbyPwGD+d5ZnxmNWlhG4xSBZZjivjIWHEQgoDkSMjMwTo54569JSE5IpA7EyJSMTyGTUAUFlO1ZKOtaHTMeL1PhYYFTcihmY2cQ5+ullj7EDkiVfVez2sCTz8yiv84djhg7IJVk81xFWJlPdfHBG0flkRC/zQFZ+DSllNtfDdUsOMCliyGX5uOzU3ZhIXFDof4m1gDuKbEx0t2YS25gVGpcMnr/I1kx3c6piB8P8ZoqEwfMX3ZyCXynJTmq/U7NUXqfUzCbWL1wqVKBQUeESzQYoUlW8TAcVL1RCxUu1G6BYXfFyfQ4VPbDI4T8d2WzgQ6sc/vmxnTsqfHCZQzUJxm1h5dxS5Tu6lQgTZ0ipqRVqSwzTbbLHMt+c19iO76tsx/cLZub+Ali+tYC93olEAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA5LTA5VDIwOjE4OjE3KzAyOjAwjKtfjgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wOS0wOVQyMDoxODoxNyswMjowMP325zIAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC") no-repeat 50% 50%; + background-size: 85%; +} + +.iziToast > .iziToast-body .iziToast-icon.ico-load { + background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTQ1NTUyMzAyOTE3IiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQyNDAiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNTEyIDY0YzI0Ny4yIDAgNDQ4IDIwMC44IDQ0OCA0NDhoLTY0YzAtMjEyLTE3Mi0zODQtMzg0LTM4NFY2NHogbTAgODMyYy0yMTIgMC0zODQtMTcyLTM4NC0zODRINjRjMCAyNDcuMiAyMDAuOCA0NDggNDQ4IDQ0OHYtNjR6IiBwLWlkPSI0MjQxIiBmaWxsPSIjMUU5RkZGIj48L3BhdGg+PC9zdmc+') no-repeat 50% 50%; + background-size: 85%; + animation: rotating 1.2s linear infinite +} + +@keyframes rotating { + from { + transform: rotate(0) + } + to { + transform: rotate(360deg) + } +} + +.iziToast > .iziToast-body .iziToast-title { + padding: 0; + margin: 0 0 10px 0; + line-height: 16px; + font-size: 14px; + text-align: left; + float: left; + color: #303133; + white-space: normal; +} + +.iziToast > .iziToast-body .iziToast-message { + padding: 0; + margin: 0; + font-size: 14px; + line-height: 16px; + text-align: left; + float: left; + color: #606266; + white-space: normal; +} + +.iziToast.iziToast-animateInside .iziToast-title, +.iziToast.iziToast-animateInside .iziToast-message, +.iziToast.iziToast-animateInside .iziToast-icon, +.iziToast.iziToast-animateInside .iziToast-buttons-child, +.iziToast.iziToast-animateInside .iziToast-inputs-child { + opacity: 0; +} + +.iziToast-target { + position: relative; + width: 100%; + margin: 0 auto; +} + +.iziToast-target .iziToast-capsule { + overflow: hidden; +} + +.iziToast-target .iziToast-capsule:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; +} + +.iziToast-target .iziToast-capsule .iziToast { + width: 100%; + float: left; +} + +.iziToast-wrapper { + z-index: 19891101; + position: fixed; + width: 100%; + pointer-events: none; + display: flex; + flex-direction: column; +} + +.iziToast-wrapper .iziToast.iziToast-balloon:before { + border-right: 0 solid transparent; + border-left: 15px solid transparent; + border-top: 10px solid #000; + border-top-color: inherit; + right: 8px; + left: auto; +} + +.iziToast-wrapper-bottomLeft { + left: 0; + bottom: 0; + text-align: left; +} + +.iziToast-wrapper-bottomLeft .iziToast.iziToast-balloon:before { + border-right: 15px solid transparent; + border-left: 0 solid transparent; + right: auto; + left: 8px; +} + +.iziToast-wrapper-bottomRight { + right: 0; + bottom: 0; + text-align: right; +} + +.iziToast-wrapper-topLeft { + left: 0; + top: 0; + text-align: left; +} + +.iziToast-wrapper-topLeft .iziToast.iziToast-balloon:before { + border-right: 15px solid transparent; + border-left: 0 solid transparent; + right: auto; + left: 8px; +} + +.iziToast-wrapper-topRight { + top: 0; + right: 0; + text-align: right; +} + +.iziToast-wrapper-topCenter { + top: 0; + left: 0; + right: 0; + text-align: center; +} + +.iziToast-wrapper-bottomCenter { + bottom: 0; + left: 0; + right: 0; + text-align: center; +} + +.iziToast-wrapper-center { + top: 0; + bottom: 0; + left: 0; + right: 0; + text-align: center; + justify-content: center; + flex-flow: column; + align-items: center; +} + +.iziToast-rtl { + direction: rtl; + padding: 8px 0 9px 45px; + font-family: Tahoma, 'Lato', Arial; +} + +.iziToast-rtl .iziToast-cover { + left: auto; + right: 0; +} + +.iziToast-rtl .iziToast-close { + right: auto; + left: 0; +} + +.iziToast-rtl .iziToast-body { + padding: 0 10px 0 0; + margin: 0 16px 0 0; + text-align: right; +} + +.iziToast-rtl .iziToast-body .iziToast-buttons, +.iziToast-rtl .iziToast-body .iziToast-inputs, +.iziToast-rtl .iziToast-body .iziToast-texts, +.iziToast-rtl .iziToast-body .iziToast-title, +.iziToast-rtl .iziToast-body .iziToast-message { + float: right; + text-align: right; +} + +.iziToast-rtl .iziToast-body .iziToast-icon { + left: auto; + right: 0; +} + +@media only screen and (min-width: 568px) { + .iziToast-wrapper { + padding: 10px 15px; + } + + .iziToast { + width: auto; + } + + .iziToast:not(.iziToast-rtl) .iziToast-cover { + border-radius: 3px 0 0 3px; + } + + .iziToast.iziToast-rtl .iziToast-cover { + border-radius: 0 3px 3px 0; + } + + .iziToast.iziToast-color-dark:after { + box-shadow: inset 0 -10px 20px -10px rgba(255, 255, 255, 0.3), 0 10px 10px -5px rgba(0, 0, 0, 0.25); + } + + .iziToast.iziToast-balloon .iziToast-progressbar { + background: transparent; + } + + .iziToast.iziToast-balloon:after { + box-shadow: 0 10px 10px -5px rgba(0, 0, 0, 0.25), inset 0 10px 20px -5px rgba(0, 0, 0, 0.25); + } + + .iziToast-target .iziToast:after { + box-shadow: inset 0 -10px 20px -10px rgba(0, 0, 0, 0.2), inset 0 0 5px rgba(0, 0, 0, 0.1); + } +} + +.iziToast.iziToast-theme-dark { + background: #565c70; + border-color: #565c70; +} + +.iziToast.iziToast-theme-dark .iziToast-title { + color: #fff; +} + +.iziToast.iziToast-theme-dark .iziToast-message { + color: rgba(255, 255, 255, 0.9); + font-weight: 300; +} + +.iziToast.iziToast-theme-dark .iziToast-close { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfgCR4OIQIPSao6AAAAwElEQVRIx72VUQ6EIAwFmz2XB+AConhjzqTJ7JeGKhLYlyx/BGdoBVpjIpMJNjgIZDKTkQHYmYfwmR2AfAqGFBcO2QjXZCd24bEggvd1KBx+xlwoDpYmvnBUUy68DYXD77ESr8WDtYqvxRex7a8oHP4Wo1Mkt5I68Mc+qYqv1h5OsZmZsQ3gj/02h6cO/KEYx29hu3R+VTTwz6D3TymIP1E8RvEiiVdZfEzicxYLiljSxKIqlnW5seitTW6uYnv/Aqh4whX3mEUrAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA5LTMwVDE0OjMzOjAyKzAyOjAwl6RMVgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wOS0zMFQxNDozMzowMiswMjowMOb59OoAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC") no-repeat 50% 50%; + background-size: 8px; +} + +.iziToast.iziToast-theme-dark .iziToast-icon { + color: #fff; +} + +.iziToast.iziToast-theme-dark .iziToast-icon.ico-info { + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTQxNjQ5NjA1MTc2IiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjM1MzIiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNODUxLjE3MTU1NiA3MTcuOTM3Nzc4YzMuMjQyNjY3IDExLjk0NjY2NyAyLjg0NDQ0NCAyNC40NjIyMjItMS40MjIyMjMgMzYuNDA4ODg5YTYyLjkxOTExMSA2Mi45MTkxMTEgMCAwIDEtMjEuOTU5MTExIDI5LjUyNTMzMyA2NS4yNTE1NTYgNjUuMjUxNTU2IDAgMCAxLTM4LjkxMiAxMi41MTU1NTZIMTc4LjExOTExMWE2NC44NTMzMzMgNjQuODUzMzMzIDAgMCAxLTM4Ljc5ODIyMi0xMi41NzI0NDUgNjIuMjM2NDQ0IDYyLjIzNjQ0NCAwIDAgMS0yMi4wMTYtMjkuNTI1MzMzIDYwLjY0MzU1NiA2MC42NDM1NTYgMCAwIDEtMS4zNjUzMzMtMzYuNDA4ODg5YzMuNTg0LTEzLjE0MTMzMyAxMS40MzQ2NjctMjQuNTc2IDIyLjY5ODY2Ni0zMy4xMDkzMzNsNTguNDgxNzc4LTQ0LjAzMmE0MC43MzI0NDQgNDAuNzMyNDQ0IDAgMCAwIDE2LjQ5Nzc3OC0zMi43MTExMTJ2LTIwMy4wOTMzMzNjMC0zNS4yMTQyMjIgNy4xNjgtNjkuNTE4MjIyIDIxLjIxOTU1NS0xMDEuNzE3MzMzIDEzLjY1MzMzMy0zMS4xNzUxMTEgMzMuMTA5MzMzLTU5LjE2NDQ0NCA1Ny44NTYtODMuMTE0NjY3QTI2OC44NTY4ODkgMjY4Ljg1Njg4OSAwIDAgMSA0MTQuNzIgMTUyLjA2NHYtMjguNTAxMzMzQzQxNC43MiA4Ni44MTI0NDQgNDQ1LjYxMDY2NyA1Ni44ODg4ODkgNDgzLjU1NTU1NiA1Ni44ODg4ODljMzcuOTQ0ODg5IDAgNjguODM1NTU2IDI5LjkyMzU1NiA2OC44MzU1NTUgNjYuNjczNzc4djI4LjUwMTMzM2MxMi4zNDQ4ODkgMy4xODU3NzggMjQuNDYyMjIyIDcuMTY4IDM2LjIzODIyMiAxMi4wMDM1NTZhMjY4LjY4NjIyMiAyNjguNjg2MjIyIDAgMCAxIDg1Ljc4ODQ0NSA1Ni4wMzU1NTVjMjQuNzQ2NjY3IDI0LjAwNzExMSA0NC4yMDI2NjcgNTEuOTM5NTU2IDU3Ljc5OTExMSA4My4wNTc3NzggMTQuMTA4NDQ0IDMyLjMxMjg4OSAyMS4yMTk1NTYgNjYuNTYgMjEuMjE5NTU1IDEwMS44MzExMTF2MjAzLjA5MzMzM2MwIDEyLjg1Njg4OSA2LjAzMDIyMiAyNC44NjA0NDQgMTYuNTU0NjY3IDMyLjcxMTExMWw1OC40ODE3NzggNDQuMDMyYzExLjIwNzExMSA4LjUzMzMzMyAxOS4wNTc3NzggMTkuOTExMTExIDIyLjc1NTU1NSAzMy4wNTI0NDV6TTM5OC4yMjIyMjIgODU2LjE3Nzc3OFY4NTMuMzMzMzMzaDE3MC42NjY2Njd2Mi44NDQ0NDVDNTY4Ljg4ODg4OSA5MzUuOTM2IDUzMC42MDI2NjcgOTY3LjExMTExMSA0ODMuNTU1NTU2IDk2Ny4xMTExMTFTMzk4LjIyMjIyMiA5MzUuOTM2IDM5OC4yMjIyMjIgODU2LjE3Nzc3OHoiIHAtaWQ9IjM1MzMiIGZpbGw9IiNmZmZmZmYiPjwvcGF0aD48L3N2Zz4=") no-repeat 50% 50%; + background-size: 85%; +} + +.iziToast.iziToast-theme-dark .iziToast-icon.ico-warning { + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTQxNjUxMTE1OTQ4IiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjUgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjUwOTYiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4LjEyNSIgaGVpZ2h0PSIxMjgiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTk4NC4wMjI5NTAwMiA3NDYuODc1NDk3NUw2NDEuOTY0NjA3NTIgMTMwLjM4MDY1Yy0zMC40OTE4NDI1LTU0Ljg2MTUwMjUtNzcuOTMxMzE1LTg2LjMzNTY3MjUtMTMwLjE0MzUxLTg2LjMzNTY3MjUtNTIuMjkxNTc1IDAtOTkuNzQwOTcgMzEuNTEzODYtMTMwLjE0MzUxIDg2LjQzNDg5NzVMMzkuOTc2NDU1MDIgNzQ2LjgyNTg4NUM5Ljk2MDg5MjUyIDgwMC45NjMwNDUgNy45MTY4NTc1MiA4NTguMDE3NDIgMzQuMzUwMzk3NTIgOTAzLjM1MzMyMjVjMjYuNTEyOTIgNDUuNDc0ODE3NSA3Ny4xOTcwNSA3MS41NjEwNyAxMzkuMDczNzYgNzEuNTYxMDdoNjc3LjIyMDU0NzVjNjEuOTA2NDc3NSAwIDExMi41OTA2MDc1LTI2LjA4NjI1MjUgMTM5LjAxNDIyNS03MS40OTE2MTI1IDI2LjQ4MzE1MjUtNDUuMjc2MzY3NSAyNC40MjkxOTUtMTAyLjM0MDY2NS01LjYzNTk4LTE1Ni41NDcyODI1ek05MTEuNzU3MzgyNTIgODU3Ljk5NzU3NWMtOS44OTI3MzI1IDE2Ljk4NzMyLTMyLjE1ODgyMjUgMjYuNzMxMjE1LTYxLjExMjY3NzUgMjYuNzMxMjE1SDE3My40MjQxNTc1MmMtMjguOTQzOTMyNSAwLTUxLjIyOTg2NzUtOS43NjM3NC02MS4xNjIyOS0yNi43OTA3NS0xMC4wMjE3MjUtMTcuMTg1NzctNy42MTA1NTc1LTQxLjc0Mzk1NzUgNi41ODg1NC02Ny4zNzM3NzVsMzQxLjcxMTA1NS02MTYuMzY1ODU1YzE0LjA2MDE4MjUtMjUuMzkxNjc3NSAzMi43NTQxNzI1LTM5Ljk1NzkwNzUgNTEuMjU5NjM1LTM5Ljk1NzkwNzUgMTguNDk1NTQgMCAzNy4xOTk0NTI1IDE0LjU2NjIzIDUxLjMwOTI0NzUgMzkuOTM4MDYyNWwzNDIuMDI4NTc1IDYxNi40NDUyMzVjMTQuMjI4ODY1IDI1LjY0OTY2MjUgMTYuNjQwMDMyNSA1MC4xODgwMDUgNi41OTg0NjI1IDY3LjM3Mzc3NXoiIGZpbGw9IiNmZmZmZmYiIHAtaWQ9IjUwOTciPjwvcGF0aD48cGF0aCBkPSJNNTEyLjAxOTU0NzUyIDYzMC4yODYxMjI1YTQ1LjA4Nzg0IDQ1LjA4Nzg0IDAgMCAwIDQ1LjA5Nzc2MjUtNDUuMDA4NDZWMzc0LjY1Mjc1NWE0NS4wNzc5MTc1IDQ1LjA3NzkxNzUgMCAwIDAtNDUuMDk3NzYyNS00NS4wMDg0NiA0NS4wODc4NCA0NS4wODc4NCAwIDAgMC00NS4wOTc3NjI1IDQ1LjAwODQ2djIxMC42MTQ5ODVhNDUuMDg3ODQgNDUuMDg3ODQgMCAwIDAgNDUuMDk3NzYyNSA0NS4wMTgzODI1ek01MTIuMDE5NTQ3NTIgNjc1LjM3Mzk2MjVhNjAuMTcwMDQgNjAuMTcwMDQgMCAwIDAtNjAuMTMwMzUgNjAuMTMwMzVjMCAzMy4xNDExNSAyNi45MTk3NDI1IDYwLjEzMDM1IDYwLjEzMDM1IDYwLjEzMDM1IDMzLjE0MTE1IDAgNjAuMTMwMzUtMjYuOTE5NzQyNSA2MC4xMzAzNS02MC4xMzAzNSAwLTMzLjE0MTE1LTI2LjkxOTc0MjUtNjAuMTMwMzUtNjAuMTMwMzUtNjAuMTMwMzV6IiBmaWxsPSIjZmZmZmZmIiBwLWlkPSI1MDk4Ij48L3BhdGg+PC9zdmc+") no-repeat 50% 50%; + background-size: 85%; +} + +.iziToast.iziToast-theme-dark .iziToast-icon.ico-error { + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTQxNjUxMzE1NTQ3IiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjY4MDYiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNzcyLjI2NjY2NyA4ODMuMmMyNS42IDI1LjYgNjQgMjUuNiA4OS42IDAgMjUuNi0yNS42IDI1LjYtNjQgMC04OS42TDIzMC40IDE2Mi4xMzMzMzNjLTI1LjYtMjUuNi02NC0yNS42LTg5LjYgMC0yNS42IDI1LjYtMjUuNiA2NCAwIDg5LjZsNjMxLjQ2NjY2NyA2MzEuNDY2NjY3eiIgcC1pZD0iNjgwNyIgZmlsbD0iI2ZmZmZmZiI+PC9wYXRoPjxwYXRoIGQ9Ik04NjEuODY2NjY3IDI1MS43MzMzMzNjMjUuNi0yNS42IDI1LjYtNjQgMC04OS42LTI1LjYtMjUuNi02NC0yNS42LTg5LjYgMEwxNDAuOCA3OTMuNmMtMjUuNiAyNS42LTI1LjYgNjQgMCA4OS42czY0IDI1LjYgODkuNiAwbDYzMS40NjY2NjctNjMxLjQ2NjY2N3oiIHAtaWQ9IjY4MDgiIGZpbGw9IiNmZmZmZmYiPjwvcGF0aD48L3N2Zz4=") no-repeat 50% 50%; + background-size: 80%; +} + +.iziToast.iziToast-theme-dark .iziToast-icon.ico-success { + background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTQxNjUxMjQyNTMxIiBjbGFzcz0iaWNvbiIgc3R5bGU9IiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjYwMjMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNDA0LjI1MTQyOCA4MDkuNjEwN2MtMTEuNjY0MTAyIDAtMjMuMzI3MTc5LTQuNDQ4NzgyLTMyLjIyNTc2Ny0xMy4zNDczNjlMODMuOTgwMDk4IDUwOC4yMTk4MTVjLTE3Ljc5ODE5OS0xNy43OTcxNzUtMTcuNzk4MTk5LTQ2LjY1MzMzNSAwLTY0LjQ1MTUzM3M0Ni42NTMzMzUtMTcuNzk4MTk5IDY0LjQ1MTUzNCAwbDI4OC4wNDQ1MzkgMjg4LjA0MjQ5MWMxNy43OTgxOTkgMTcuNzk4MTk5IDE3Ljc5ODE5OSA0Ni42NTQzNTkgMCA2NC40NTI1NTgtOC44OTc1NjMgOC44OTg1ODctMjAuNTYxNjY1IDEzLjM0NzM2OS0zMi4yMjQ3NDMgMTMuMzQ3MzY5eiIgcC1pZD0iNjAyNCIgZmlsbD0iI2ZmZmZmZiI+PC9wYXRoPjxwYXRoIGQ9Ik00MDQuMjczOTUzIDgwOS42MTE3MjNjLTExLjY2NDEwMiAwLTIzLjMyNjE1NS00LjQ0OTgwNi0zMi4yMjU3NjYtMTMuMzQ4MzkyLTE3Ljc5ODE5OS0xNy43OTcxNzUtMTcuNzk5MjIyLTQ2LjY1MzMzNS0wLjAwMTAyNC02NC40NTE1MzRMODc2LjEwMTgxMyAyMjcuNzM1NjQ2YzE3Ljc5NjE1MS0xNy43OTgxOTkgNDYuNjUzMzM1LTE3Ljc5OTIyMiA2NC40NTE1MzMtMC4wMDEwMjQgMTcuNzk4MTk5IDE3Ljc5NzE3NSAxNy43OTkyMjIgNDYuNjUzMzM1IDAuMDAxMDI0IDY0LjQ1MTUzM0w0MzYuNTAwNzQ0IDc5Ni4yNjIzMDdjLTguODk4NTg3IDguODk4NTg3LTIwLjU2MjY4OSAxMy4zNDk0MTctMzIuMjI2NzkxIDEzLjM0OTQxNnoiIHAtaWQ9IjYwMjUiIGZpbGw9IiNmZmZmZmYiPjwvcGF0aD48L3N2Zz4=") no-repeat 50% 50%; + background-size: 85%; +} + +.iziToast.iziToast-theme-dark .iziToast-icon.ico-question { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfhCQkUEg18vki+AAAETUlEQVRo3s1ZTWhbRxD+VlIuxsLFCYVIIQYVopBDoK5bKDWUBupDMNbJ5FBKg/FBziUQdE9yaC+FHBrwsdCfQ9RTGoLxwWl+DqHEojUFFydxnB9bInZDqOsErBrr6yGvs/ueX97bldTKo4Pe7puZb3Z33s7srIIjMY1jyCEjP6ImvyX8pF64arSHznKC06wzijY5xSKz7YbuYokV2lODsyyxqz3gSY6z6gCuqcpxJluFH+Z8U+D/0jyHoxFUBHgfvsGHIS9WMIUlVFFDFTUAGWSRQRY5HMeBEP6b+Ew9dh/7INd2jGeO59kfKdXP85zbIbfGQVf4sYC3N1hm3lo6zzIbPvk6x+zBk7wQGMEMB5xncIAzAS0XrFySSV72iS1yyBVcdA1x0afrsoUJgdFfY2+z8ADAXl7zz0KcwJiPfZKpVuABgClO+nRG+QIHDdfb4qlWwUXvKW4Z7vi6L4J9vg+vbfCeCeZH2RfOdMOc/HbCA4BvIW6EMQz7XK/ltd+hP+VzR9mgva2YSfyGI17fA7ynnocqeQNFfIJ0oHsdv6CC2+rXGBN6cQdveY3fcVRtmy/HDete+93zy8jA8zV7YkwYMrjHzRddRsCdiVCwwmh6wg9iTNC7Y9XIF1iS7kbUpsvvGEdPuTfSgAEjRpR096x0liPFD/Eqt2NMuBQzB2XhrACAApjFsuQFh9XdGAX70B3oSuNdnMVBaX+sopYxjwVpHFBVACyKTXNoktjD+6Ll8xhenS9MAAkAI/Lux2YNUOs4I413Ypg1SgEAu7kpFvWjaeJe0fJHDGe/cNaZBkekudw8PMA+0fMwlndZeAsJ5KR/qhUDUJCnSiyvRsolkJHGUgvjH8QXDgZopEzKMKDqCKrwEQ4C6MH7GEXC665buLJG8hlQc4LP4paxfJrOqYVYYY2UARfEIazTbgDg2dB98GebzJd54b8L/iWNdLyooeR6CHyZ+6xk0yKxkYg6nEVSUG4VJ9QJ9cxRCxO+9WiOyvgUeexXP1hLGH5nGuBWVtiSp4vqe3VP0UFWI9Wan4Er3v8q7jjPWVtm4FtcQQMrOKO2nOQCM5AyDMi56FDrKHA/1nyppS1ppBpYaE8wciEjGI2AaeM41kI4doDX4XiT3Qm1gevyruCgZg9P8xIv8m1nCzTKq6oiJ9xTMiZ505P5m8cdZ0CnZMVXHVljM7WMBzxpyDxygtdxoCEFTaMIWbZU85UvBjgUMYy0fBaAF8V1Lj9qWQ1aMZ5f4k9r+AGMSkMP1vZoZih6k6sicc5h/OFHM9vDqU/VIU7zJZdYYsKGH4g4nAJMGiXZRds1pVMoZ69RM5vfkbh0qkBhsnS2RLMLilQdL9MBHS9UAh0v1e6CYnXHy/WeeCcvLDwl/9OVze69tPKM+M+v7eJN6OzFpWdEF0ucDbhVNFXadnVrmJFlkVNGTS2M6pzmhMvltfPhnN2B63sVuL7fcNP3D1TSk2ihosPrAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA5LTA5VDIwOjE4OjEzKzAyOjAweOR7nQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wOS0wOVQyMDoxODoxMyswMjowMAm5wyEAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC") no-repeat 50% 50%; + background-size: 85%; +} + +.iziToast.iziToast-theme-dark .iziToast-buttons > a, +.iziToast.iziToast-theme-dark .iziToast-buttons > button, +.iziToast.iziToast-theme-dark .iziToast-buttons > input { + color: #fff; + background: rgba(255, 255, 255, 0.1); +} + +.iziToast.iziToast-theme-dark .iziToast-buttons > a:hover, +.iziToast.iziToast-theme-dark .iziToast-buttons > button:hover, +.iziToast.iziToast-theme-dark .iziToast-buttons > input:hover { + background: rgba(255, 255, 255, 0.2); +} + +.iziToast.iziToast-theme-dark .iziToast-buttons > a:focus, +.iziToast.iziToast-theme-dark .iziToast-buttons > button:focus, +.iziToast.iziToast-theme-dark .iziToast-buttons > input:focus { + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.6); +} + +.iziToast.iziToast-theme-dark.iziToast-color-red { + background: #F56C6C; + border-color: #F56C6C; +} + +.iziToast.iziToast-theme-dark.iziToast-color-orange { + background: #E6A23C; + border-color: #E6A23C; +} + +.iziToast.iziToast-theme-dark.iziToast-color-yellow { + background: rgba(255, 249, 178, 0.9); + border-color: rgba(255, 249, 178, 0.9); +} + +.iziToast.iziToast-theme-dark.iziToast-color-blue { + background: #409EFF; + border-color: #409EFF; +} + +.iziToast.iziToast-theme-dark.iziToast-color-green { + background: #67C23A; + border-color: #67C23A; +} + +.iziToast.iziToast-layout2 .iziToast-body .iziToast-texts, +.iziToast.iziToast-layout2 .iziToast-body .iziToast-message { + width: 100%; +} + +.iziToast.iziToast-layout3 { + border-radius: 2px; +} + +.iziToast.iziToast-layout3::after { + display: none; +} + +.iziToast.revealIn, +.iziToast .revealIn { + -webkit-animation: iziT-revealIn 1s cubic-bezier(0.25, 1.6, 0.25, 1) both; + -moz-animation: iziT-revealIn 1s cubic-bezier(0.25, 1.6, 0.25, 1) both; + animation: iziT-revealIn 1s cubic-bezier(0.25, 1.6, 0.25, 1) both; +} + +.iziToast.slideIn, +.iziToast .slideIn { + -webkit-animation: iziT-slideIn 1s cubic-bezier(0.16, 0.81, 0.32, 1) both; + -moz-animation: iziT-slideIn 1s cubic-bezier(0.16, 0.81, 0.32, 1) both; + animation: iziT-slideIn 1s cubic-bezier(0.16, 0.81, 0.32, 1) both; +} + +.iziToast.bounceInLeft { + -webkit-animation: iziT-bounceInLeft 0.7s ease-in-out both; + animation: iziT-bounceInLeft 0.7s ease-in-out both; +} + +.iziToast.bounceInRight { + -webkit-animation: iziT-bounceInRight 0.85s ease-in-out both; + animation: iziT-bounceInRight 0.85s ease-in-out both; +} + +.iziToast.bounceInDown { + -webkit-animation: iziT-bounceInDown 0.7s ease-in-out both; + animation: iziT-bounceInDown 0.7s ease-in-out both; +} + +.iziToast.bounceInUp { + -webkit-animation: iziT-bounceInUp 0.7s ease-in-out both; + animation: iziT-bounceInUp 0.7s ease-in-out both; +} + +.iziToast.fadeIn, +.iziToast .fadeIn { + -webkit-animation: iziT-fadeIn 0.5s ease both; + animation: iziT-fadeIn 0.5s ease both; +} + +.iziToast.fadeInUp { + -webkit-animation: iziT-fadeInUp 0.7s ease both; + animation: iziT-fadeInUp 0.7s ease both; +} + +.iziToast.fadeInDown { + -webkit-animation: iziT-fadeInDown 0.7s ease both; + animation: iziT-fadeInDown 0.7s ease both; +} + +.iziToast.fadeInLeft { + -webkit-animation: iziT-fadeInLeft 0.85s cubic-bezier(0.25, 0.8, 0.25, 1) both; + animation: iziT-fadeInLeft 0.85s cubic-bezier(0.25, 0.8, 0.25, 1) both; +} + +.iziToast.fadeInRight { + -webkit-animation: iziT-fadeInRight 0.85s cubic-bezier(0.25, 0.8, 0.25, 1) both; + animation: iziT-fadeInRight 0.85s cubic-bezier(0.25, 0.8, 0.25, 1) both; +} + +.iziToast.flipInX { + -webkit-animation: iziT-flipInX 0.85s cubic-bezier(0.35, 0, 0.25, 1) both; + animation: iziT-flipInX 0.85s cubic-bezier(0.35, 0, 0.25, 1) both; +} + +.iziToast.fadeOut { + -webkit-animation: iziT-fadeOut 0.7s ease both; + animation: iziT-fadeOut 0.7s ease both; +} + +.iziToast.fadeOutDown { + -webkit-animation: iziT-fadeOutDown 0.7s cubic-bezier(0.4, 0.45, 0.15, 0.91) both; + animation: iziT-fadeOutDown 0.7s cubic-bezier(0.4, 0.45, 0.15, 0.91) both; +} + +.iziToast.fadeOutUp { + -webkit-animation: iziT-fadeOutUp 0.7s cubic-bezier(0.4, 0.45, 0.15, 0.91) both; + animation: iziT-fadeOutUp 0.7s cubic-bezier(0.4, 0.45, 0.15, 0.91) both; +} + +.iziToast.fadeOutLeft { + -webkit-animation: iziT-fadeOutLeft 0.5s ease both; + animation: iziT-fadeOutLeft 0.5s ease both; +} + +.iziToast.fadeOutRight { + -webkit-animation: iziT-fadeOutRight 0.5s ease both; + animation: iziT-fadeOutRight 0.5s ease both; +} + +.iziToast.flipOutX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation: iziT-flipOutX 0.7s cubic-bezier(0.4, 0.45, 0.15, 0.91) both; + animation: iziT-flipOutX 0.7s cubic-bezier(0.4, 0.45, 0.15, 0.91) both; +} + +.iziToast-overlay.fadeIn { + -webkit-animation: iziT-fadeIn 0.5s ease both; + animation: iziT-fadeIn 0.5s ease both; +} + +.iziToast-overlay.fadeOut { + -webkit-animation: iziT-fadeOut 0.7s ease both; + animation: iziT-fadeOut 0.7s ease both; +} + +@-webkit-keyframes iziT-revealIn { + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 1); + } + 100% { + opacity: 1; + } +} + +@-moz-keyframes iziT-revealIn { + 0% { + opacity: 0; + -moz-transform: scale3d(0.3, 0.3, 1); + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes iziT-slideIn { + 0% { + opacity: 0; + -webkit-transform: translateX(50px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes iziT-slideIn { + 0% { + opacity: 0; + -moz-transform: translateX(50px); + } + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-webkit-keyframes iziT-bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(280px); + } + 50% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + 70% { + -webkit-transform: translateX(10px); + } + 100% { + -webkit-transform: translateX(0); + } +} + +@-webkit-keyframes iziT-bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(-280px); + } + 50% { + opacity: 1; + -webkit-transform: translateX(20px); + } + 70% { + -webkit-transform: translateX(-10px); + } + 100% { + -webkit-transform: translateX(0); + } +} + +@-webkit-keyframes iziT-bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-200px); + } + 50% { + opacity: 1; + -webkit-transform: translateY(10px); + } + 70% { + -webkit-transform: translateY(-5px); + } + 100% { + -webkit-transform: translateY(0); + } +} + +@-webkit-keyframes iziT-bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(200px); + } + 50% { + opacity: 1; + -webkit-transform: translateY(-10px); + } + 70% { + -webkit-transform: translateY(5px); + } + 100% { + -webkit-transform: translateY(0); + } +} + +@-webkit-keyframes iziT-fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-webkit-keyframes iziT-fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-webkit-keyframes iziT-fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-webkit-keyframes iziT-fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-webkit-keyframes iziT-fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-webkit-keyframes iziT-flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@-webkit-keyframes iziT-fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@-webkit-keyframes iziT-fadeOutDown { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@-webkit-keyframes iziT-fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@-webkit-keyframes iziT-fadeOutLeft { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(-200px, 0, 0); + transform: translate3d(-200px, 0, 0); + } +} + +@-webkit-keyframes iziT-fadeOutRight { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(200px, 0, 0); + transform: translate3d(200px, 0, 0); + } +} + +@-webkit-keyframes iziT-flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@-moz-keyframes iziT-revealIn { + 0% { + opacity: 0; + transform: scale3d(0.3, 0.3, 1); + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes iziT-revealIn { + 0% { + opacity: 0; + transform: scale3d(0.3, 0.3, 1); + } + 100% { + opacity: 1; + } +} + +@-o-keyframes iziT-revealIn { + 0% { + opacity: 0; + transform: scale3d(0.3, 0.3, 1); + } + 100% { + opacity: 1; + } +} + +@keyframes iziT-revealIn { + 0% { + opacity: 0; + transform: scale3d(0.3, 0.3, 1); + } + 100% { + opacity: 1; + } +} + +@-moz-keyframes iziT-slideIn { + 0% { + opacity: 0; + transform: translateX(50px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +@-webkit-keyframes iziT-slideIn { + 0% { + opacity: 0; + transform: translateX(50px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +@-o-keyframes iziT-slideIn { + 0% { + opacity: 0; + transform: translateX(50px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes iziT-slideIn { + 0% { + opacity: 0; + transform: translateX(50px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +@-moz-keyframes iziT-bounceInLeft { + 0% { + opacity: 0; + transform: translateX(280px); + } + 50% { + opacity: 1; + transform: translateX(-20px); + } + 70% { + transform: translateX(10px); + } + 100% { + transform: translateX(0); + } +} + +@-webkit-keyframes iziT-bounceInLeft { + 0% { + opacity: 0; + transform: translateX(280px); + } + 50% { + opacity: 1; + transform: translateX(-20px); + } + 70% { + transform: translateX(10px); + } + 100% { + transform: translateX(0); + } +} + +@-o-keyframes iziT-bounceInLeft { + 0% { + opacity: 0; + transform: translateX(280px); + } + 50% { + opacity: 1; + transform: translateX(-20px); + } + 70% { + transform: translateX(10px); + } + 100% { + transform: translateX(0); + } +} + +@keyframes iziT-bounceInLeft { + 0% { + opacity: 0; + transform: translateX(280px); + } + 50% { + opacity: 1; + transform: translateX(-20px); + } + 70% { + transform: translateX(10px); + } + 100% { + transform: translateX(0); + } +} + +@-moz-keyframes iziT-bounceInRight { + 0% { + opacity: 0; + transform: translateX(-280px); + } + 50% { + opacity: 1; + transform: translateX(20px); + } + 70% { + transform: translateX(-10px); + } + 100% { + transform: translateX(0); + } +} + +@-webkit-keyframes iziT-bounceInRight { + 0% { + opacity: 0; + transform: translateX(-280px); + } + 50% { + opacity: 1; + transform: translateX(20px); + } + 70% { + transform: translateX(-10px); + } + 100% { + transform: translateX(0); + } +} + +@-o-keyframes iziT-bounceInRight { + 0% { + opacity: 0; + transform: translateX(-280px); + } + 50% { + opacity: 1; + transform: translateX(20px); + } + 70% { + transform: translateX(-10px); + } + 100% { + transform: translateX(0); + } +} + +@keyframes iziT-bounceInRight { + 0% { + opacity: 0; + transform: translateX(-280px); + } + 50% { + opacity: 1; + transform: translateX(20px); + } + 70% { + transform: translateX(-10px); + } + 100% { + transform: translateX(0); + } +} + +@-moz-keyframes iziT-bounceInDown { + 0% { + opacity: 0; + transform: translateY(-200px); + } + 50% { + opacity: 1; + transform: translateY(10px); + } + 70% { + transform: translateY(-5px); + } + 100% { + transform: translateY(0); + } +} + +@-webkit-keyframes iziT-bounceInDown { + 0% { + opacity: 0; + transform: translateY(-200px); + } + 50% { + opacity: 1; + transform: translateY(10px); + } + 70% { + transform: translateY(-5px); + } + 100% { + transform: translateY(0); + } +} + +@-o-keyframes iziT-bounceInDown { + 0% { + opacity: 0; + transform: translateY(-200px); + } + 50% { + opacity: 1; + transform: translateY(10px); + } + 70% { + transform: translateY(-5px); + } + 100% { + transform: translateY(0); + } +} + +@keyframes iziT-bounceInDown { + 0% { + opacity: 0; + transform: translateY(-200px); + } + 50% { + opacity: 1; + transform: translateY(10px); + } + 70% { + transform: translateY(-5px); + } + 100% { + transform: translateY(0); + } +} + +@-moz-keyframes iziT-bounceInUp { + 0% { + opacity: 0; + transform: translateY(200px); + } + 50% { + opacity: 1; + transform: translateY(-10px); + } + 70% { + transform: translateY(5px); + } + 100% { + transform: translateY(0); + } +} + +@-webkit-keyframes iziT-bounceInUp { + 0% { + opacity: 0; + transform: translateY(200px); + } + 50% { + opacity: 1; + transform: translateY(-10px); + } + 70% { + transform: translateY(5px); + } + 100% { + transform: translateY(0); + } +} + +@-o-keyframes iziT-bounceInUp { + 0% { + opacity: 0; + transform: translateY(200px); + } + 50% { + opacity: 1; + transform: translateY(-10px); + } + 70% { + transform: translateY(5px); + } + 100% { + transform: translateY(0); + } +} + +@keyframes iziT-bounceInUp { + 0% { + opacity: 0; + transform: translateY(200px); + } + 50% { + opacity: 1; + transform: translateY(-10px); + } + 70% { + transform: translateY(5px); + } + 100% { + transform: translateY(0); + } +} + +@-moz-keyframes iziT-fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-webkit-keyframes iziT-fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-o-keyframes iziT-fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes iziT-fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-moz-keyframes iziT-fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-webkit-keyframes iziT-fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-o-keyframes iziT-fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes iziT-fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-moz-keyframes iziT-fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-webkit-keyframes iziT-fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-o-keyframes iziT-fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes iziT-fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-moz-keyframes iziT-fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-webkit-keyframes iziT-fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-o-keyframes iziT-fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes iziT-fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-moz-keyframes iziT-fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-webkit-keyframes iziT-fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-o-keyframes iziT-fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes iziT-fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@-moz-keyframes iziT-flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@-webkit-keyframes iziT-flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@-o-keyframes iziT-flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes iziT-flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@-moz-keyframes iziT-fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@-webkit-keyframes iziT-fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@-o-keyframes iziT-fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes iziT-fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@-moz-keyframes iziT-fadeOutDown { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@-webkit-keyframes iziT-fadeOutDown { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@-o-keyframes iziT-fadeOutDown { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes iziT-fadeOutDown { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@-moz-keyframes iziT-fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@-webkit-keyframes iziT-fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@-o-keyframes iziT-fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes iziT-fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@-moz-keyframes iziT-fadeOutLeft { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(-200px, 0, 0); + transform: translate3d(-200px, 0, 0); + } +} + +@-webkit-keyframes iziT-fadeOutLeft { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(-200px, 0, 0); + transform: translate3d(-200px, 0, 0); + } +} + +@-o-keyframes iziT-fadeOutLeft { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(-200px, 0, 0); + transform: translate3d(-200px, 0, 0); + } +} + +@keyframes iziT-fadeOutLeft { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(-200px, 0, 0); + transform: translate3d(-200px, 0, 0); + } +} + +@-moz-keyframes iziT-fadeOutRight { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(200px, 0, 0); + transform: translate3d(200px, 0, 0); + } +} + +@-webkit-keyframes iziT-fadeOutRight { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(200px, 0, 0); + transform: translate3d(200px, 0, 0); + } +} + +@-o-keyframes iziT-fadeOutRight { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(200px, 0, 0); + transform: translate3d(200px, 0, 0); + } +} + +@keyframes iziT-fadeOutRight { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(200px, 0, 0); + transform: translate3d(200px, 0, 0); + } +} + +@-moz-keyframes iziT-flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@-webkit-keyframes iziT-flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@-o-keyframes iziT-flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes iziT-flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} \ No newline at end of file diff --git a/static/component/pear/css/pear.css b/static/component/pear/css/pear.css new file mode 100644 index 0000000..62b55bf --- /dev/null +++ b/static/component/pear/css/pear.css @@ -0,0 +1,10 @@ +@import url("../../layui/css/layui.css"); +@import url("../font/iconfont.css"); +@import url("module/nprogress.css"); +@import url("module/messageCenter.css"); +@import url("module/global.css"); +@import url("module/menu.css"); +@import url("module/menuSearch.css"); +@import url("module/page.css"); +@import url("module/tabPage.css"); +@import url("module/toast.css"); \ No newline at end of file diff --git a/static/component/pear/font/iconfont.css b/static/component/pear/font/iconfont.css new file mode 100644 index 0000000..e23a69e --- /dev/null +++ b/static/component/pear/font/iconfont.css @@ -0,0 +1,579 @@ +@font-face { + font-family: "pear-icon"; /* Project id 2654996 */ + src: url('iconfont.woff2?t=1625555217253') format('woff2'), + url('iconfont.woff?t=1625555217253') format('woff'), + url('iconfont.ttf?t=1625555217253') format('truetype'); +} + +.pear-icon { + font-family: "pear-icon" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.pear-icon-load:before { + content: "\e6f0"; +} + +.pear-icon-download:before { + content: "\e68d"; +} + +.pear-icon-electronics:before { + content: "\e68e"; +} + +.pear-icon-drag:before { + content: "\e68f"; +} + +.pear-icon-elipsis:before { + content: "\e690"; +} + +.pear-icon-export:before { + content: "\e691"; +} + +.pear-icon-explain:before { + content: "\e692"; +} + +.pear-icon-edit:before { + content: "\e693"; +} + +.pear-icon-eye-close:before { + content: "\e694"; +} + +.pear-icon-email:before { + content: "\e695"; +} + +.pear-icon-error:before { + content: "\e696"; +} + +.pear-icon-favorite:before { + content: "\e697"; +} + +.pear-icon-file-common:before { + content: "\e698"; +} + +.pear-icon-file-delete:before { + content: "\e699"; +} + +.pear-icon-file-add:before { + content: "\e69a"; +} + +.pear-icon-film:before { + content: "\e69b"; +} + +.pear-icon-fabulous:before { + content: "\e69c"; +} + +.pear-icon-file:before { + content: "\e69d"; +} + +.pear-icon-folder-close:before { + content: "\e69e"; +} + +.pear-icon-filter:before { + content: "\e69f"; +} + +.pear-icon-good:before { + content: "\e6a0"; +} + +.pear-icon-hide:before { + content: "\e6a1"; +} + +.pear-icon-home:before { + content: "\e6a2"; +} + +.pear-icon-history:before { + content: "\e6a3"; +} + +.pear-icon-file-open:before { + content: "\e6a4"; +} + +.pear-icon-forward:before { + content: "\e6a5"; +} + +.pear-icon-import:before { + content: "\e6a6"; +} + +.pear-icon-image-text:before { + content: "\e6a7"; +} + +.pear-icon-keyboard-26:before { + content: "\e6a8"; +} + +.pear-icon-keyboard-9:before { + content: "\e6a9"; +} + +.pear-icon-link:before { + content: "\e6aa"; +} + +.pear-icon-layout:before { + content: "\e6ab"; +} + +.pear-icon-fullscreen-shrink:before { + content: "\e6ac"; +} + +.pear-icon-layers:before { + content: "\e6ad"; +} + +.pear-icon-lock:before { + content: "\e6ae"; +} + +.pear-icon-fullscreen-expand:before { + content: "\e6af"; +} + +.pear-icon-map:before { + content: "\e6b0"; +} + +.pear-icon-meh:before { + content: "\e6b1"; +} + +.pear-icon-menu:before { + content: "\e6b2"; +} + +.pear-icon-loading:before { + content: "\e6b3"; +} + +.pear-icon-help:before { + content: "\e6b4"; +} + +.pear-icon-minus-circle:before { + content: "\e6b5"; +} + +.pear-icon-modular:before { + content: "\e6b6"; +} + +.pear-icon-notification:before { + content: "\e6b7"; +} + +.pear-icon-mic:before { + content: "\e6b8"; +} + +.pear-icon-more:before { + content: "\e6b9"; +} + +.pear-icon-pad:before { + content: "\e6ba"; +} + +.pear-icon-operation:before { + content: "\e6bb"; +} + +.pear-icon-play:before { + content: "\e6bc"; +} + +.pear-icon-print:before { + content: "\e6bd"; +} + +.pear-icon-mobile-phone:before { + content: "\e6be"; +} + +.pear-icon-minus:before { + content: "\e6bf"; +} + +.pear-icon-navigation:before { + content: "\e6c0"; +} + +.pear-icon-pdf:before { + content: "\e6c1"; +} + +.pear-icon-prompt:before { + content: "\e6c2"; +} + +.pear-icon-move:before { + content: "\e6c3"; +} + +.pear-icon-refresh:before { + content: "\e6c4"; +} + +.pear-icon-run-up:before { + content: "\e6c5"; +} + +.pear-icon-picture:before { + content: "\e6c6"; +} + +.pear-icon-run-in:before { + content: "\e6c7"; +} + +.pear-icon-pin:before { + content: "\e6c8"; +} + +.pear-icon-save:before { + content: "\e6c9"; +} + +.pear-icon-search:before { + content: "\e6ca"; +} + +.pear-icon-share:before { + content: "\e6cb"; +} + +.pear-icon-scanning:before { + content: "\e6cc"; +} + +.pear-icon-security:before { + content: "\e6cd"; +} + +.pear-icon-sign-out:before { + content: "\e6ce"; +} + +.pear-icon-select:before { + content: "\e6cf"; +} + +.pear-icon-stop:before { + content: "\e6d0"; +} + +.pear-icon-success:before { + content: "\e6d1"; +} + +.pear-icon-smile:before { + content: "\e6d2"; +} + +.pear-icon-switch:before { + content: "\e6d3"; +} + +.pear-icon-setting:before { + content: "\e6d4"; +} + +.pear-icon-survey:before { + content: "\e6d5"; +} + +.pear-icon-task:before { + content: "\e6d6"; +} + +.pear-icon-skip:before { + content: "\e6d7"; +} + +.pear-icon-text:before { + content: "\e6d8"; +} + +.pear-icon-time:before { + content: "\e6d9"; +} + +.pear-icon-telephone-out:before { + content: "\e6da"; +} + +.pear-icon-toggle-left:before { + content: "\e6db"; +} + +.pear-icon-toggle-right:before { + content: "\e6dc"; +} + +.pear-icon-telephone:before { + content: "\e6dd"; +} + +.pear-icon-top:before { + content: "\e6de"; +} + +.pear-icon-unlock:before { + content: "\e6df"; +} + +.pear-icon-user:before { + content: "\e6e0"; +} + +.pear-icon-upload:before { + content: "\e6e1"; +} + +.pear-icon-work:before { + content: "\e6e2"; +} + +.pear-icon-training:before { + content: "\e6e3"; +} + +.pear-icon-warning:before { + content: "\e6e4"; +} + +.pear-icon-zoom-in:before { + content: "\e6e5"; +} + +.pear-icon-zoom-out:before { + content: "\e6e6"; +} + +.pear-icon-add-bold:before { + content: "\e6e7"; +} + +.pear-icon-arrow-left-bold:before { + content: "\e6e8"; +} + +.pear-icon-arrow-up-bold:before { + content: "\e6e9"; +} + +.pear-icon-close-bold:before { + content: "\e6ea"; +} + +.pear-icon-arrow-down-bold:before { + content: "\e6eb"; +} + +.pear-icon-minus-bold:before { + content: "\e6ec"; +} + +.pear-icon-arrow-right-bold:before { + content: "\e6ed"; +} + +.pear-icon-select-bold:before { + content: "\e6ee"; +} + +.pear-icon-3column:before { + content: "\e663"; +} + +.pear-icon-column-4:before { + content: "\e664"; +} + +.pear-icon-add:before { + content: "\e665"; +} + +.pear-icon-add-circle:before { + content: "\e666"; +} + +.pear-icon-adjust:before { + content: "\e667"; +} + +.pear-icon-arrow-up-circle:before { + content: "\e668"; +} + +.pear-icon-arrow-right-circle:before { + content: "\e669"; +} + +.pear-icon-arrow-down:before { + content: "\e66a"; +} + +.pear-icon-ashbin:before { + content: "\e66b"; +} + +.pear-icon-arrow-right:before { + content: "\e66c"; +} + +.pear-icon-browse:before { + content: "\e66d"; +} + +.pear-icon-bottom:before { + content: "\e66e"; +} + +.pear-icon-back:before { + content: "\e66f"; +} + +.pear-icon-bad:before { + content: "\e670"; +} + +.pear-icon-arrow-double-left:before { + content: "\e671"; +} + +.pear-icon-arrow-left-circle:before { + content: "\e672"; +} + +.pear-icon-arrow-double-right:before { + content: "\e673"; +} + +.pear-icon-caps-lock:before { + content: "\e674"; +} + +.pear-icon-camera:before { + content: "\e675"; +} + +.pear-icon-chart-bar:before { + content: "\e676"; +} + +.pear-icon-attachment:before { + content: "\e677"; +} + +.pear-icon-code:before { + content: "\e678"; +} + +.pear-icon-close:before { + content: "\e679"; +} + +.pear-icon-check-item:before { + content: "\e67a"; +} + +.pear-icon-calendar:before { + content: "\e67b"; +} + +.pear-icon-comment:before { + content: "\e67c"; +} + +.pear-icon-column-vertical:before { + content: "\e67d"; +} + +.pear-icon-column-horizontal:before { + content: "\e67e"; +} + +.pear-icon-complete:before { + content: "\e67f"; +} + +.pear-icon-chart-pie:before { + content: "\e680"; +} + +.pear-icon-cry:before { + content: "\e681"; +} + +.pear-icon-customer-service:before { + content: "\e682"; +} + +.pear-icon-delete:before { + content: "\e683"; +} + +.pear-icon-direction-down:before { + content: "\e684"; +} + +.pear-icon-copy:before { + content: "\e685"; +} + +.pear-icon-cut:before { + content: "\e686"; +} + +.pear-icon-data-view:before { + content: "\e687"; +} + +.pear-icon-direction-down-circle:before { + content: "\e688"; +} + +.pear-icon-direction-right:before { + content: "\e689"; +} + +.pear-icon-direction-up:before { + content: "\e68a"; +} + +.pear-icon-discount:before { + content: "\e68b"; +} + +.pear-icon-direction-left:before { + content: "\e68c"; +} + diff --git a/static/component/pear/font/iconfont.js b/static/component/pear/font/iconfont.js new file mode 100644 index 0000000..4cc2abd --- /dev/null +++ b/static/component/pear/font/iconfont.js @@ -0,0 +1 @@ +!function(c){var h,l,o,a,s,p,t='',v=(v=document.getElementsByTagName("script"))[v.length-1].getAttribute("data-injectcss");if(v&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function i(){s||(s=!0,o())}h=function(){var c,h,l;(l=document.createElement("div")).innerHTML=t,t=null,(h=l.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",c=h,(l=document.body).firstChild?(h=l.firstChild).parentNode.insertBefore(c,h):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(l=function(){document.removeEventListener("DOMContentLoaded",l,!1),h()},document.addEventListener("DOMContentLoaded",l,!1)):document.attachEvent&&(o=h,a=c.document,s=!1,(p=function(){try{a.documentElement.doScroll("left")}catch(c){return void setTimeout(p,50)}i()})(),a.onreadystatechange=function(){"complete"==a.readyState&&(a.onreadystatechange=null,i())})}(window); \ No newline at end of file diff --git a/static/component/pear/font/iconfont.json b/static/component/pear/font/iconfont.json new file mode 100644 index 0000000..cb96655 --- /dev/null +++ b/static/component/pear/font/iconfont.json @@ -0,0 +1,996 @@ +{ + "id": "2654996", + "name": "pear-admin-layui", + "font_family": "pear-icon", + "css_prefix_text": "pear-icon-", + "description": "", + "glyphs": [ + { + "icon_id": "22697089", + "name": "加载", + "font_class": "load", + "unicode": "e6f0", + "unicode_decimal": 59120 + }, + { + "icon_id": "15838464", + "name": "download", + "font_class": "download", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "15838465", + "name": "electronics", + "font_class": "electronics", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "15838466", + "name": "drag", + "font_class": "drag", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "15838467", + "name": "elipsis", + "font_class": "elipsis", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "15838468", + "name": "export", + "font_class": "export", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "15838469", + "name": "explain", + "font_class": "explain", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "15838470", + "name": "edit", + "font_class": "edit", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "15838471", + "name": "eye-close", + "font_class": "eye-close", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "15838472", + "name": "email", + "font_class": "email", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "15838473", + "name": "error", + "font_class": "error", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "15838474", + "name": "favorite", + "font_class": "favorite", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "15838475", + "name": "file-common", + "font_class": "file-common", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "15838476", + "name": "file-delete", + "font_class": "file-delete", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "15838477", + "name": "file-add", + "font_class": "file-add", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "15838478", + "name": "film", + "font_class": "film", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "15838479", + "name": "fabulous", + "font_class": "fabulous", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "15838480", + "name": "file", + "font_class": "file", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "15838481", + "name": "folder-close", + "font_class": "folder-close", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "15838482", + "name": "filter", + "font_class": "filter", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "15838483", + "name": "good", + "font_class": "good", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "15838484", + "name": "hide", + "font_class": "hide", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "15838485", + "name": "home", + "font_class": "home", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "15838486", + "name": "history", + "font_class": "history", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "15838487", + "name": "file-open", + "font_class": "file-open", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "15838488", + "name": "forward", + "font_class": "forward", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "15838489", + "name": "import", + "font_class": "import", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "15838490", + "name": "image-text", + "font_class": "image-text", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "15838491", + "name": "keyboard-26", + "font_class": "keyboard-26", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "15838492", + "name": "keyboard-9", + "font_class": "keyboard-9", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "15838493", + "name": "link", + "font_class": "link", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "15838494", + "name": "layout", + "font_class": "layout", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "15838495", + "name": "fullscreen-shrink", + "font_class": "fullscreen-shrink", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "15838496", + "name": "layers", + "font_class": "layers", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "15838497", + "name": "lock", + "font_class": "lock", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "15838498", + "name": "fullscreen-expand", + "font_class": "fullscreen-expand", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "15838499", + "name": "map", + "font_class": "map", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "15838500", + "name": "meh", + "font_class": "meh", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "15838501", + "name": "menu", + "font_class": "menu", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "15838502", + "name": "loading", + "font_class": "loading", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "15838503", + "name": "help", + "font_class": "help", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "15838504", + "name": "minus-circle", + "font_class": "minus-circle", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "15838505", + "name": "modular", + "font_class": "modular", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "15838506", + "name": "notification", + "font_class": "notification", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "15838507", + "name": "mic", + "font_class": "mic", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "15838508", + "name": "more", + "font_class": "more", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "15838509", + "name": "pad", + "font_class": "pad", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "15838510", + "name": "operation", + "font_class": "operation", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "15838511", + "name": "play", + "font_class": "play", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "15838512", + "name": "print", + "font_class": "print", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "15838513", + "name": "mobile-phone", + "font_class": "mobile-phone", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "15838514", + "name": "minus", + "font_class": "minus", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "15838515", + "name": "navigation", + "font_class": "navigation", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "15838516", + "name": "pdf", + "font_class": "pdf", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "15838517", + "name": "prompt", + "font_class": "prompt", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "15838518", + "name": "move", + "font_class": "move", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "15838519", + "name": "refresh", + "font_class": "refresh", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "15838520", + "name": "run-up", + "font_class": "run-up", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "15838521", + "name": "picture", + "font_class": "picture", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "15838522", + "name": "run-in", + "font_class": "run-in", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "15838523", + "name": "pin", + "font_class": "pin", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "15838524", + "name": "save", + "font_class": "save", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "15838525", + "name": "search", + "font_class": "search", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "15838526", + "name": "share", + "font_class": "share", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "15838527", + "name": "scanning", + "font_class": "scanning", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "15838528", + "name": "security", + "font_class": "security", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "15838529", + "name": "sign-out", + "font_class": "sign-out", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "15838530", + "name": "select", + "font_class": "select", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "15838531", + "name": "stop", + "font_class": "stop", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "15838532", + "name": "success", + "font_class": "success", + "unicode": "e6d1", + "unicode_decimal": 59089 + }, + { + "icon_id": "15838533", + "name": "smile", + "font_class": "smile", + "unicode": "e6d2", + "unicode_decimal": 59090 + }, + { + "icon_id": "15838534", + "name": "switch", + "font_class": "switch", + "unicode": "e6d3", + "unicode_decimal": 59091 + }, + { + "icon_id": "15838535", + "name": "setting", + "font_class": "setting", + "unicode": "e6d4", + "unicode_decimal": 59092 + }, + { + "icon_id": "15838536", + "name": "survey", + "font_class": "survey", + "unicode": "e6d5", + "unicode_decimal": 59093 + }, + { + "icon_id": "15838537", + "name": "task", + "font_class": "task", + "unicode": "e6d6", + "unicode_decimal": 59094 + }, + { + "icon_id": "15838538", + "name": "skip", + "font_class": "skip", + "unicode": "e6d7", + "unicode_decimal": 59095 + }, + { + "icon_id": "15838539", + "name": "text", + "font_class": "text", + "unicode": "e6d8", + "unicode_decimal": 59096 + }, + { + "icon_id": "15838540", + "name": "time", + "font_class": "time", + "unicode": "e6d9", + "unicode_decimal": 59097 + }, + { + "icon_id": "15838541", + "name": "telephone-out", + "font_class": "telephone-out", + "unicode": "e6da", + "unicode_decimal": 59098 + }, + { + "icon_id": "15838542", + "name": "toggle-left", + "font_class": "toggle-left", + "unicode": "e6db", + "unicode_decimal": 59099 + }, + { + "icon_id": "15838543", + "name": "toggle-right", + "font_class": "toggle-right", + "unicode": "e6dc", + "unicode_decimal": 59100 + }, + { + "icon_id": "15838544", + "name": "telephone", + "font_class": "telephone", + "unicode": "e6dd", + "unicode_decimal": 59101 + }, + { + "icon_id": "15838545", + "name": "top", + "font_class": "top", + "unicode": "e6de", + "unicode_decimal": 59102 + }, + { + "icon_id": "15838546", + "name": "unlock", + "font_class": "unlock", + "unicode": "e6df", + "unicode_decimal": 59103 + }, + { + "icon_id": "15838547", + "name": "user", + "font_class": "user", + "unicode": "e6e0", + "unicode_decimal": 59104 + }, + { + "icon_id": "15838548", + "name": "upload", + "font_class": "upload", + "unicode": "e6e1", + "unicode_decimal": 59105 + }, + { + "icon_id": "15838549", + "name": "work", + "font_class": "work", + "unicode": "e6e2", + "unicode_decimal": 59106 + }, + { + "icon_id": "15838550", + "name": "training", + "font_class": "training", + "unicode": "e6e3", + "unicode_decimal": 59107 + }, + { + "icon_id": "15838551", + "name": "warning", + "font_class": "warning", + "unicode": "e6e4", + "unicode_decimal": 59108 + }, + { + "icon_id": "15838552", + "name": "zoom-in", + "font_class": "zoom-in", + "unicode": "e6e5", + "unicode_decimal": 59109 + }, + { + "icon_id": "15838554", + "name": "zoom-out", + "font_class": "zoom-out", + "unicode": "e6e6", + "unicode_decimal": 59110 + }, + { + "icon_id": "15838560", + "name": "add-bold", + "font_class": "add-bold", + "unicode": "e6e7", + "unicode_decimal": 59111 + }, + { + "icon_id": "15838561", + "name": "arrow-left-bold", + "font_class": "arrow-left-bold", + "unicode": "e6e8", + "unicode_decimal": 59112 + }, + { + "icon_id": "15838562", + "name": "arrow-up-bold", + "font_class": "arrow-up-bold", + "unicode": "e6e9", + "unicode_decimal": 59113 + }, + { + "icon_id": "15838563", + "name": "close-bold", + "font_class": "close-bold", + "unicode": "e6ea", + "unicode_decimal": 59114 + }, + { + "icon_id": "15838564", + "name": "arrow-down-bold", + "font_class": "arrow-down-bold", + "unicode": "e6eb", + "unicode_decimal": 59115 + }, + { + "icon_id": "15838565", + "name": "minus-bold", + "font_class": "minus-bold", + "unicode": "e6ec", + "unicode_decimal": 59116 + }, + { + "icon_id": "15838566", + "name": "arrow-right-bold", + "font_class": "arrow-right-bold", + "unicode": "e6ed", + "unicode_decimal": 59117 + }, + { + "icon_id": "15838567", + "name": "select-bold", + "font_class": "select-bold", + "unicode": "e6ee", + "unicode_decimal": 59118 + }, + { + "icon_id": "15838406", + "name": "column-3", + "font_class": "3column", + "unicode": "e663", + "unicode_decimal": 58979 + }, + { + "icon_id": "15838423", + "name": "column-4", + "font_class": "column-4", + "unicode": "e664", + "unicode_decimal": 58980 + }, + { + "icon_id": "15838424", + "name": "add", + "font_class": "add", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "15838425", + "name": "add-circle", + "font_class": "add-circle", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "15838426", + "name": "adjust", + "font_class": "adjust", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "15838427", + "name": "arrow-up-circle", + "font_class": "arrow-up-circle", + "unicode": "e668", + "unicode_decimal": 58984 + }, + { + "icon_id": "15838428", + "name": "arrow-right-circle", + "font_class": "arrow-right-circle", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "15838429", + "name": "arrow-down", + "font_class": "arrow-down", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "15838430", + "name": "ashbin", + "font_class": "ashbin", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "15838431", + "name": "arrow-right", + "font_class": "arrow-right", + "unicode": "e66c", + "unicode_decimal": 58988 + }, + { + "icon_id": "15838432", + "name": "browse", + "font_class": "browse", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "15838433", + "name": "bottom", + "font_class": "bottom", + "unicode": "e66e", + "unicode_decimal": 58990 + }, + { + "icon_id": "15838434", + "name": "back", + "font_class": "back", + "unicode": "e66f", + "unicode_decimal": 58991 + }, + { + "icon_id": "15838435", + "name": "bad", + "font_class": "bad", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "15838436", + "name": "arrow-double-left", + "font_class": "arrow-double-left", + "unicode": "e671", + "unicode_decimal": 58993 + }, + { + "icon_id": "15838437", + "name": "arrow-left-circle", + "font_class": "arrow-left-circle", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "15838438", + "name": "arrow-double-right", + "font_class": "arrow-double-right", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "15838439", + "name": "caps-lock", + "font_class": "caps-lock", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "15838440", + "name": "camera", + "font_class": "camera", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "15838441", + "name": "chart-bar", + "font_class": "chart-bar", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "15838442", + "name": "attachment", + "font_class": "attachment", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "15838443", + "name": "code", + "font_class": "code", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "15838444", + "name": "close", + "font_class": "close", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "15838445", + "name": "check-item", + "font_class": "check-item", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "15838446", + "name": "calendar", + "font_class": "calendar", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "15838447", + "name": "comment", + "font_class": "comment", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "15838448", + "name": "column-vertical", + "font_class": "column-vertical", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "15838449", + "name": "column-horizontal", + "font_class": "column-horizontal", + "unicode": "e67e", + "unicode_decimal": 59006 + }, + { + "icon_id": "15838450", + "name": "complete", + "font_class": "complete", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "15838451", + "name": "chart-pie", + "font_class": "chart-pie", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "15838452", + "name": "cry", + "font_class": "cry", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "15838453", + "name": "customer-service", + "font_class": "customer-service", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "15838454", + "name": "delete", + "font_class": "delete", + "unicode": "e683", + "unicode_decimal": 59011 + }, + { + "icon_id": "15838455", + "name": "direction-down", + "font_class": "direction-down", + "unicode": "e684", + "unicode_decimal": 59012 + }, + { + "icon_id": "15838456", + "name": "copy", + "font_class": "copy", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "15838457", + "name": "cut", + "font_class": "cut", + "unicode": "e686", + "unicode_decimal": 59014 + }, + { + "icon_id": "15838458", + "name": "data-view", + "font_class": "data-view", + "unicode": "e687", + "unicode_decimal": 59015 + }, + { + "icon_id": "15838459", + "name": "direction-down-circle", + "font_class": "direction-down-circle", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "15838460", + "name": "direction-right", + "font_class": "direction-right", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "15838461", + "name": "direction-up", + "font_class": "direction-up", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "15838462", + "name": "discount", + "font_class": "discount", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "15838463", + "name": "direction-left", + "font_class": "direction-left", + "unicode": "e68c", + "unicode_decimal": 59020 + } + ] +} diff --git a/static/component/pear/font/iconfont.ttf b/static/component/pear/font/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f40ab3acea096b8096b94762a26da9c9ca1baf99 GIT binary patch literal 33116 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 literal 0 HcmV?d00001 diff --git a/static/component/pear/font/iconfont.woff b/static/component/pear/font/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..869e1a06606fb68a0e13c408d75919a343cc06f7 GIT binary patch literal 16624 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 literal 0 HcmV?d00001 diff --git a/static/component/pear/font/iconfont.woff2 b/static/component/pear/font/iconfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4a3ea5e4eda162e70b54ba932a3950a45297c374 GIT binary patch literal 13564 zcmV3c?XOt8{2Ca#<<(C+W`vN_vcm= zbyBj5F)|Qr90tS}Yf%J-Nk-g2+ z+&1B{1j$}1KFZ~;Y+?p^tf(Tb`lb@`;vPt*1K}s>q#0p|zNiFQ9Z8i+w*eJPmDJN+ zxP~txI`62an;tEgtI51knUKsc8u-wFm>{Mv{3K}yxqtgd{>S4ClZ+#8(RG$XlAT@dkIM(a4*SCa>EQWlWjr< zYh|#OAOzi!RWP7dZbVxgVB!QfK{w#5&=my8``@R<3awvZtNAgy<+Atm5F;r{?2$ld)u#z>N=MTtZj zLz1>ET@D;z?wjg)!BR@Q2^th<{LiAqackndd#ym$Flf1@JI-`#fl={Z6!G=n@KUE8!W zGY0(L^ED-H!GhLS3=$)RFV5h+kVhOu1i(N4YyZo`T7Px$Y6snTC|1jx`{sR^xnJEX zl%kFFRZuOJO2~=QGylIids{%-pF{V*L#k5I{E*7>z58a6-aH;KGvL+mKC&33Z;e=v zHLyVl>6<|;o&niMXd`mS36>4$#|w|~=d*DrqEKBJ9|9<(|jZXr> z|HHf(0C-5GGPy#ja&&TbadmU|@bvQb@l|WII=#VYf(R4JxR6R42e8;2E{`t|io_DB zOpc0%&YcGaPhJoxZ%iy0HV!Tvj}Kpd`~?Wa7bIASP+`Ie2#JVENJWSgC0dMFah8yg z1Arhf1PX&AkSH_;i^CI$Br=6cqcfN+HiygO3mlP$j|Ld9)Os|A-q-vWa4(M~Pb5zz z&m_+!FC;G|uOzP}ZzOLe?iaCa93}*rw`oM7ar&b5A}yfaw5N!w)!71Y`1{00w)yB6Fu`A2gPMA*y(7DUg-^^}S-}M3(TS+^so%}TP9rJLw2KJg^|}Uv?}L9&r(+^VScsaJ z(%l(Wh$3XABb{BVaIs)0yjUKBDCY`bnoaUv(IuTC1_5!aO{BIH&ex+%V-aNa)pP_6 zYj7K7tZkUf^!gBS)wxnxU^ztJm^V|5twD;V==aO_$hkIYZ;2r#YTlEHcj-H0H%a`) zO1q^G4PTpy27`b2%uHqG+MnZ8#4Zm7Ac1j0>ow6YnFRGT`b-13H6vPEeMV1^r$Vr% zF*?f%08v{31d%{a9Fd5(-o*9+h-^qnqn{VhwKk@wVUCU56LoGW{I;eOn3I0d{mRTE za#bN#PVCrda26r@VYW8LtTzZ#a7fKmyl4!G(K>j+yL7RZ@{}gkvqc~Ust=Gqi0zar z946L?TZ#5_Ew52S2{7@CD(F+pVGyE4n+*eJS}>wcqf%jT5{b!X_|NUv6KSdYDpJ0~ z=a(truDpQ2bm+ALXerV{pgGX1Yqa!NUyfY-p87LG41<1D-o^nn0$j`JXl=dOf0~P2 z_FwA)6&Twp{`omtTW2Ah;XIzF6OD-cKU9o zyo{#vg@JGLoejWy>=1fP^~oSICJLriC4o!|f)mA64-ykiIlo2vP>!*QObA)U4M*qB zwx2$pJb-r$5F=2T0baSd5^t{pa6Y!38rOg%911_@oL`P_D?=h&G|lTHbfx_a@(M!C zznIS8o(pSmYJm7mjU5tj6=0k8ULM7o_-pQ^Ras`@U#8rHHyC;BG$C%;vd1DaDb^{| zp8U3LEV~LwT)7iD3i31)-iE^0N-L@Ti6Uu*JTPJdH97H6i5L%(`2vqo;v)UEB%&$T zCW@lP*2h=7dA`cv6UnFT9_PlSMi3tNk=}1%v$BSGXPZ>m3NnbaK8FeDJ+E)VsE{AlYl15B=)WT|ad(HxUxAQC{sJ8yGIgz_1yKP-i zF!VcY{_x{~eBr&>$Li4%p`ZxGStw&DGhvTYBx?8Z z_TMQEdYdF8Hqqc<^6&Zv5p}2bC=e2yJ6X$3iiLy}L^PE244|Nso06xTi3A|G<_Mu> z%ky61?(W5uNIB6aYE}-nqD}~zbfGHOD&LU%hfA$`)n}L-;4{4<`t;A@xgRw**&Zeu zu@8)FsSH#@0mab&8iY(oNk6Tt+AZ??qPLC7GSbi-IgW#4Qv zB#wBj_-a?f@Zg_Plb`96|EGO|U#JZFle5!g3DlvzyIYTT=zAUL2PQXDfd*G3mWEYUjxi)!q7^Jb<7C(*iN+3OXdn|kjIHXj)|kE` zGAOQuu!8X35rKQMS79M>NpOuH5D-fOT}{I~2-lC{0tuMz(Jl4xBegnADpV*@+Iyhy zP9Ri1NWW)S${rCP8;$7UWdNA>VE)Q{uYh8j`(P-m{7U2HIPV-~$%iDK%=>ZrcIs%^ z)QI13qq7u!8f8sS!1|Pv@O5~H3E!F~sWRT?~QCgB%mGa5Tid?2B%tIp0#+8Yu zxh1q>O4wGNa#uv%iyR?>=^V)tB?uGbLYGFXN3W;6sJMh?R_BQk<* zgWu)bwqP*SB4{a4{XEDGEr^_C_~hWLc%s_&^XzQt0w>!Zr0a%^E=rM^fIoP?88s2D6^6 z`)^f?nLFX_ml5ydKh*KtdH6^dNM-MVeB+N_5SWhPCkSL~>vDFIGA+tuBxt!PQ zmUsdX5&JsDRG|P1LG47|#DWw+R!1!hdVhx7#Q7jS8H0o&#mB}$;x6nGd*@bK%!l`6 zA*n0jr6+oXYZL3^f5bLpUzi{W4rBSI+Te~7cOP0ht*bqsWv>He7XnDKo;NNsUXVw3Ga1hOr)px+x{f)kwQM!V#7xufC-kbY%%-ClWlu z3s)F*e4Hc;X7L?hCJTLLGPx%yc8Rp5b7^j^XC<^}6|1^Ynu11UA!V5)zs`xlM;@dk z5mMnqh5h>{oTRx&vk5W?M!Z(ZVlT-O@!WcZW~)=0V(gnWYoIGLsbt|_rLmMqpXu{d zpdfq23{;R)CoIS|{h@TyFu}PLi6nqH8pmQ`9&GXa_2H)6h*i@^SZPQ>u6_ZG+G#hL z60bA6@sg6k9qw)WK0;?Lp4ODHc=^yONkB7Ux#OIX=xHFa)?rz3%sNIZEOJYYL zI*=dUHXo=f6UOS#_jzGLVZC^c48xkt3Q7zuWRl`zT9}{^BH9=Bch)eO@NvZtF&F%D zy>v#Q=Z}Y#6R$Z+cYS=RDx>rfIJ~i3lSwzQAC}WeD(3MKGojkQ)Y7S1;>+dWFSGeQGqt0IPYd(UOnH*;C|XMKkwSQx!0R%y;|(j6;oMYxLWyQ z2l~OGQ`Suyyl`#rky$ z_Z=70d3=*cn;^{K?GtE^d4rRd2#!RuQ+?7hp>~VgM^5#Mv!q5u^J}3oLoz=idN>`T9!05|W$45k_;%U!P~H6SghEkG}P zZ$OgH5s#MM$~~B$xp!&J#c5<#=}(JdK6h#jE}L${a|jvKX55#a+<0(>tgg{2xnoXX zSzxt9bdV~P2?Gbu%XdQgwDr;B$&*w4h3H)G)qkA)2$l)P@t!0-`QAaGThS$&-~Pxm zhZziNskoJ{bv4fo?t%cFnPb|_a;)H#k5n|cRiuILY$yVXw^Y;SJQlk+2ohmMin2@C zE(N3dIGHRf%HhsmykiEv3zcYW``jyda+d_DL?f~yu8!mLtTd$LhsEcsbTtL@v03M5 zVKetIACcJ>`HuCp=sy`B)c5+w!A38AeocY-Dwms=RpLY0mtVdCh`e>~O?LLp(%T{Xlc2n<}h0_HVtZpck33K+Kn<}geO z^DzWV=D8+v$-QS28~hAq*cIu6-6OU#kka_PTF9uonu7QK8%7Nsc4XPeBQeUV3sZNo z?&=qQQXy9_%SMRx-@Ezk5A<~+ee#> z$772vd~PW~c}IaDCiJgzEwGt^LDTWag{no8Au}@y0_^h$QLDfB>JnAo8El#z>}!>S z<=<=VS7(Xf(HMXBC{d`a{l_)@1YDMa_)q&0~5>%*Lupzt3|S!V{Cak?^0 zwQSmO^z6x$7Uj;5AHaGDW5wfM1^77SW&}^3C1D_}kEtF{&W?e?JGu%njYmr=cmopg zD);qN;zCnr{#-wK*BhKdT)wzEXa-f0j5ozxptG{F7-SX^!!(@v!^f${U6($P(!iXQ(a{a4ZGW&I* z7*mE(zeY@8?;Y1EP8qB;4bb!xbOkV@#uo0$0^!UJNZG#qz8WmlQljzOZ&p4n$-`vN zZXy^X8%G&i>BJJ2yJnd#k=)9Ztx>2pK{W-~r9*Ba{YnySHx}RK%g~SaMHF$FW?Ook zI($s!k(R&nm=!+=!&N5pzB)xs65K}zh1ur$>%nS#^8HlY@tnBvYvqJ=8%e_1u9%R*_G=d0sw-ptea=6&7yiGUep+6%-Yw zqG(dtN!aSuSQ0z+xFbjYHc412`*_TkrBSA*Kl;z9IIrZ4ikxjhBzOVia2rWSvN@?X z7)Jxoj*YTy>``p7Bhp5!arz#C;)vzIfr)Da3V34RU|W;`;$7sOEY>)y#p%GBU6%?8 zQ6Z#v2UFM0#8lO0^PIE&9d>D)q0Y*@74YTrusK z^lObK^gII8?0ub5CA}?Lyw?xL5h1*Vyv^3%Na<#ev=ODUuf?ebUutifoL+k9KL$fv z4J-cdcF%p_e|Z*^iV?N7H7?+wk?`3g*bFwp_IB{3EFeWqKyG=-iG1yIdmV{S(%H}a zTeMfA+>Toc%C6oi7Eh>>`q7o$wqgZg}Gi{5?q?MIRUXrX}3;$i51ssYVdHTU&$*!Z+k&` zd65iAFHFv0qZn{xPkSrt^Z;s{jWLv@d*~4uzrXUi7l`o8$6q3*>p*v4A;F*Tzx)ot3e@-@?xL z_g_T%&-EXhr}(`-YbJvH9zI=bsCNyb9k4uNkCzmcepCKUUFP_;LqNP((gx%3zqC)* zIne)hyytXpw1;=~Ur1kSFBt%3|YD&PDg2BrIiH2hv4zkmhZtAY~7V_(*lNDc9=Vv}}IXDIdN-=c{4LxujYafDC4334AyIjD zfE~b%`u^9Qo_4bELiarr}jWRc$)FKHVZ^$EA+WWX<=STcXL$9NbTd%+K58K@uGsl4RKm6 z`|9sl$9?uCw>^0J%QetnC~s3$&c{BR_+)2C>X*~8+)d~IC@gHiI+6lF)cE_-OqW;k zNO_^riijduVapivj9$;Q-!$B0%zO3*3YUek2o~k>>gWffy7T&j+QvvyJ8Lo+(GCu+ z%q`7yekF9mi%+B4(M4dN%M{D20{~gjDE%H`1sYEi4@sg1h!K3es z{chwkYy=B@8PK`p{djnr3pv1KDE@t2VkYsh*8s24q zq$B0#Xe>-6V(aP>wf@+>g-lCvaYa??07f~uws(^Y_OXARdIG;*#J!a}_^w54@4qPHO3srYOrzU51iV;x0$YYXnX0^w0;MD0yV1CzbB}teLbVi zbAV&3YhuV_01e8(01)IWGlN2z@%xSN73_MpZ|?NAVO#Cagce}l7{%7> z1wp*+o27Ty`z*>U)x%r3D!4ZNcxHO`^#|02hNUt98ldi%259$7td*bXQbc&Ah>QaW zR|?65>7<2RKICzvItC?k#9~lUhFHJtK=S<)+d9n1ysT7OQ5-d^l=B*Q4dW?8>#qIT zSWhUC1pDt(n>Ut5Hvgy#qftY&_%FtWPVe&n|4!!-9x>Bj)SDJ-pOu~4n!elf-0JJrv4A1 zJItWwD=-g#ZbgKsRr>tO6^_&TcN3yH|JIw8I|PpR2jv9w#CKK%XA$3-84}j?BCiuu z*Ptq}o_pl76%``Zkr6;>>uH)NSjjeBS?5ez8?M_nchUQd+WYtC9QQWM`Ou!PTMm@2 z94`L$v$=iuO;W+?SX*$Vo9?^T2LfeQFPe4q&d_3(P{5U@6(UG z@zdg`n|#vWroK)0Y4#Z2=c;qX9UkfBiM?SQuA>NFodI^g+vS)?Mmktrz*z^C+Gm`o zLm$zdhMx9v_L@F1G1QU5X1n7L2+!dGnf?cNVxog)aCmsb4xz(n#i=bbf|r3gngO1i5 zUTn#mH^!SNKJ)p0oORhU0;76^*td{&KYkyhVtJb|=B_JxK)j;*?`l~Mfzc2vvnn{X%lkCidLt{DOVf_5k4`%K6-|gb;Na7kiTyoAw49XzLo5 zkbC}cU~v@0gKwTri7DgpI(-x7K}KVcYpVg=#qJtf;aP@s?Us!RNwrSOsjF^daWU1^ zG0le5K5oqI>XefbES~p|_oen|fPbN3X2^a0o{%Fi@*n2R%jY=(ZtJXNkPuE;5?fOf z*HV3o+9jz7?U0(HY;DL+bkwgWu|Pl}yk4K^P@j#3so4Ke0NZ|JCWaAnk>PeQx$wzH zVmxDxF#e(aPC#Z96%JvV4*0jAJ<$NfWm44s^s;h6_ zc>E8m`plUIjEb0b7!-JZe1Rmb2$f=Fya;*0cmm_F2Pv17u&6Mxk(5DUH(}C zho>Cvrx4{y9b>6c@sQ?lp!pis820##scqM{b-vm5cAGVrZlQ-XC8|v!f#{ffPOGL{ z+`*i92AZ-JVOv3~#+)Tg3x_NMwiJ+Lm-z*X!|t!qffye+>YEtY6?yb+kg{I&hgkea zZEYph^=xZoSF&Smt8m_Hs{I#nKHI4Af2Up<-MncxUGfNo(7|#}@Z%tl@ssKhu8v_8 z{hu=@fkW?D{~MaOM|kau z1V_vO;2}xmi_!XPM$NU%iii+v6g4NBmbxY^qVK?#k;Zqqq9_5p^htbc%S4<9f{Zl& z%E9;Z`z4aBP#iu3(G}+}tO#P{MpjKU)UU0GERjYON0og~B(%_eplkCFsTx{XS!u^D zhEy+ARV@*fTCNGp3JuE$%f1pWf@#+Dx_EigCP`%lDmVFjSzJ5)<+xDo*p5s5@Xz3H zfHf~6;dhvZ(%?VGqz)Dpv9z=jKiw^eU9ab^U$X}5I*twQ7sss*)JMNMZYlWs*<#~4 z`ninH0S_S0l1Yc6<&Dm&Me_XZEkHPTpw6$me3tkz?%qF|zk=8o~QIo}jW_rEY+5FC1!8sV!by#M0c{!0c#h zwjkVdg3O;XFBWV$e$gV5t}ukrueynX!KZ!WS^C+H-JgPq3SGa)-Orp%gK#Jg=6Z4A zI0y%kZ(^T3{i*#Y@~cu;r;fe<2LH2X&y5>qMC3wgoSL#&o_V@sdpn%q(*Kh0@O^Qe zvup9w^o)^W*uIhrzq)Y)L|)Jh4XHTq<<>U8xsEslq4&`{llv`gdk?!oddLlazirT{ z+j>JjMnBs3^Y@Km?H4Xk9l^`Z?(@$Ng|w)aigLp>T7h18RWCZ9RiG8-UKQ#mYQy!S zrOF?M0{`evV2!md|83JI^3?$W>cGU4L_VqxNDMp)2>JNE{Kgg zDW73V)2x!^Ol^F%J4o(K^9vmne_e#TWGq&-U z?taIcAR9q_q$v}C@Xd8rrGrD7xyQWGeY{mAQD<2L0ZTOpM4pU;T_~Y`M8Wi zryQg_4m!tao8`*5R=MZ!8-9mD+v7|j?%lH@)&_47wPw%mZj)--TwEMbbAP~~#MsJh z=M6-eSzolq+XkNHF5U;ksu`|!^~Yi~w*h`D=r zBSyHpTM@;%8b)K?RocsZuBJX2+LT}W=KVCGvc4rc_1P1vSmy$h5#~VyqhZAy4Z#$l zd-WN&5loy(1omWId4e`Z8sBzmi6)8t=4#WAikOz7;yu{p=D5;9!=S5mn8tnV}J zQ_WxM@G@5&n4qW7A1GXPS&2fj@+Z|Z$(3+5$<((kaq4!Ttj{S-JSTpp`pK7djqs{R z;Nj)!@XN*LqP+dsAMt*_HN|drr7U&n0ZAH>Cebd+Nn*d}xD`jU1?PPN>(#?F2_Zo- z$Cs5hou%$I@LqGijbKp}f8y@7&AD5ka8M5yb3lpC6L=Evx|*H4ooUgs^L? zo@XnDANwa#txMcm$PQz^P;vj`4}5lh)z8tpI2lk~%!^;!>vGX)L&Ts}dOw_9yYyD} z=A^b&seb3uG8rK1Fmq^2VR(jD`pU*`<;iqj3cj+{D=TEUMiQy}c!(urf0% z^w`JWZ=?`<#+x5;d;Q|4hPi_gGi29GjB#f8)cvs9CkcL@9a#^cogWd!Y>x8T;aS*YunGGqgAR5x^FPF1}UXh#|#hK6m^AL zC7hF=lGrfc;FA}aXf!4UZi=s;Z!jMH<=U+X>LUG7x-)3frqN>j&_lpyVXJ zKAF!?4#EfO6=?A)IPvgDpQ@@v`icLVYq`QL3N<2qm3qT+5V?rV{>Z8WX%HV+DaC1pEU$79zEB68Y#qv7wcpqEy*WGj1wJ?B_U#L>=yjAKk9zbczk z4k&ogkZX4rNIlxUg_tD&h2(8O@`4XMF2#_f>{jtI$@<~$kLY{qYL2a=JV-PQAFLft z{E@P5sJ1z`XKZaTPQO|jtUO{**bhF}n(C0=9PBpvT7l@Y4T)(Ff})u}XuoD-z6xXR zWMN;&sHFvIG}E+subAQzy1pPB4#z+@^EPtx**lP2x!fY;USk*oVh^hY4F>zTnY ziBFns6gT5jX`giJ*bc;)AZQdP@JYy`lU87~Oeh5+cP8h9>?Am5Fihc7rPzQZTW6!) zkkQ;tg2#tU+DUz z>TT$>DSrn@ema?;rt1llx#CivKTBvn(qMc>&3r}@#v`PaFNyFn$R> zFy!|{Aaj95=$^{BXt4*S^${jrKiXeA&;S-z_@yfq37^^e>+#F4m zqDU4|ltt|gQRQVyRwTVkzLgf6q~zyCeDP<7TDM=MAK%%?8y6rt-u zS0Tkl5xMrdcg5&!8CCb*kh2N%t0XitE3AY_Xws}-MGWR&H=}O;73n4bUb?Ev zXI5CTm&;kG{&j3wfa~vrW82O#8RUjTwrp0TR#OFDE);G4lyAS^R9sAhlO1A>i+=XOBk;DUxLBmmwV?3{-U_#P zG>KgZtxo7yw9L0KDWTY}!WI?fYMT%cuQ#LCD_01V_!);$QOl{5ZHORO4DWDwIE|K(L8MTeu);H23WNR_N|D{RE|bO6wS_ zi@O~@bmz_7`c`un*O}<-?uQ))ai;|{LT?{9@z-0|KsjU8G;b?=6syCkz~0E{glsEE z)fw`uiu}J#Hua^z(dH=llB7FhQe@Z)f8Gjv-NSdfAxm66X^aagV;8cN!Ie?axVC%N zyY#M&cY^ynwrczqz((lFA8pDYTYhmejKiP3a-brKQjck_j|bowg755J{~UwYP_G;LLFzBi-kjQfdEO6O%Wl_N0;%B~gOXxt3gND3WU~weTA8L`kX@v3_ha81zMk zqvm!~2iCB!dzm+gSpDx{V-Y*0zRoH*?B1cz-Qv*~YBe+_alY;_6JO=}w|pWU^!~j1 z;KAw=vfPfQ+b_HJgqs;_(OicWYo z1BnOhF&Fhbn{@CTl_{2rnbg~+H4g6rDXJHHu>tSIRjL6DaNS=#@Yg)rv%%IRaJ?{O z$Eklf=M(Ky_Ii#THiF$FokL;U>+J1FqK9+16Yt@yh-7E4C4FbIAeM!v0)jq0Ttmeg z@M`emqL%o$rvw??xot$(9x+!rL4&Zxi3V-Gz!5Z;iV*!Q5;R9`l1*RWIDE;w@A#%N z*^XanzNnI+M0H4VO0tb*ON5yYCWy)zvModim%V63=*9eghTqDmwrMY3{8&JGjx&ap zDognI7G!*d$Hyl~%)(p;DMJiVjFj^K?C2T8IbsLy-4Dg3BOH+Mopk5UT{{~ocI2u4 z+2*LsT}`{Ey1J~W*=B>;KT5g?LhS`n%X=pu7^0*izu4-aI$)d2>ggt zKHOV^x7CyU{O!jlpezmWZv{+*?SZq_l3uT@uh*PGNOE7#p8AE*pTg^dcOw>*g21Ic zuC1TGOiSrT&AUnqNbSLU#^08{K+$}AAL5XC4&qZJNg2G1r)^1Rq<5w~GBS>TRoAyo zqnKw#4P0e3@e=9EfE7%tw^UzCCLF`|O6QEz^vSHR3)|w1fb$GWT9Uo}W;F)1vR;f1 zjqXL7g0O452Lr(V-y#6@q<78wX3FX9GqBieifFH=m-HTxp{xdC^*SF$LPo~Yq=!03 z7~f0D4}R618O!f6(FgZpC$4W^-V_I`D`iXM(P)2bA^}@itb@&142y`KG%BX>K1rlk zSuK4~tIRZ%TZlH-@JxtByc~-+cYXsW?0*w%0Dgn} z0$c1s0jtes`1JU-jDHCTEn-dkdKjL<{<3~Q1p!a~QU7fy2=hbGr-aKdJ+oSDL#_l7 z6yAxHXDCZx7@tQ)3fJFe#kVH786mKSApJe@Ds z+x_u;y+7Z&X}f+HCx|eij0>r>aa`|FcDzbRQ8m+bM#wT zbYwledJag2BI-|Hmn$P=P?!oKC3Eyk+RGn3 zb8n{QmLw;T3Vj#)8U-<{a59+_m@Eax%uQMD`F%U7Kw}d54U!zU=54)j3p;p+f4UaB z9~@ooPgl5ElL?+;YEKRWBYjhrl@cnG03oEna&Lnt6&#vDZb5@Z3_5RU?+1|@+-&(1BF zA)cNU%7l=CQjl@{jsWRfyRB~!#VhA>z_^B``^&W8Q96^KsM)>_nlw0X~iy`l>E%@cmIz?`gJ88uLA?*(? CFI#&6 literal 0 HcmV?d00001 diff --git a/static/component/pear/module/admin.js b/static/component/pear/module/admin.js new file mode 100644 index 0000000..de45386 --- /dev/null +++ b/static/component/pear/module/admin.js @@ -0,0 +1,890 @@ +layui.define(['jquery', 'tools', 'element', 'yaml', 'form', 'tabPage', 'menu', 'page', 'fullscreen', 'messageCenter', 'menuSearch'], + function (exports) { + "use strict"; + + var $ = layui.jquery, + form = layui.form, + yaml = layui.yaml, + page = layui.page, + menu = layui.menu, + tabPage = layui.tabPage, + messageCenter = layui.messageCenter, + menuSearch = layui.menuSearch, + fullscreen = layui.fullscreen, + tools = layui.tools; + + var configurationCache; + + var logout = function () { + }; + + var body = $('body'); + + var pearAdmin = new function () { + + this.configuration = {}; + + this.configurationPath = "pear.config.yml"; + + this.instances = {}; + + /** + * @since Pear Admin 4.0 + * + * 获取 pear.config 实现 [ default ] + */ + this.configurationProvider = () => { + return new Promise((resolve) => { + if (this.configurationPath.indexOf("yml") == -1) { + $.ajax({ + type: 'get', + url: this.configurationPath, + dataType: 'json', + async: false, + success: (result) => { + resolve(result); + } + }); + } else { + resolve(yaml.load(this.configurationPath)); + } + }) + } + + /** + * @since Pear Admin 4.0 + * + * 配置 pear.config 路径 + */ + this.setConfigurationPath = (path) => { + this.configurationPath = path; + } + + /** + * @since Pear Admin 4.0 + * + * 获取 pear.config 实现 [ implement ] + */ + this.setConfigurationProvider = (provider) => { + this.configurationProvider = provider; + } + + /** + * @since Pear Admin 4.0 + * + * 获取 pear.config 配置 + */ + this.getConfiguration = () => { + return this.configuration; + } + + /** + * @since Pear Admin 4.0 + * + * Core Function. + * + * @param {*} options + */ + this.render = (options) => { + if (options !== undefined) { + pearAdmin.apply(options); + } else { + this.configurationProvider().then((result) => { + pearAdmin.apply(result); + }) + } + } + + /** + * @since Pear Admin 4.0 + * + * 启动构建 + */ + this.apply = function (configuration) { + configurationCache = configuration; + pearAdmin.logoRender(configuration); + pearAdmin.menuRender(configuration); + pearAdmin.menuSearchRender(configuration); + pearAdmin.bodyRender(configuration); + pearAdmin.messageCenterRender(configuration); + pearAdmin.themeRender(configuration); + pearAdmin.keepLoad(configuration); + window.PearAdmin = pearAdmin; + } + + /** + * @since Pear Admin 4.0 + * + * 菜单搜索 + */ + this.menuSearchRender = function (options) { + menuSearch.render({ + elem: ".menuSearch", + dataProvider: () => pearAdmin.instances.menu.cache(), + select: (node) => { + if (node.type == "1") { + pearAdmin.instances.menu.selectItem(node.id); + if (node.openType === "_layer") { + layer.open({ + type: 2, + title: data.title, + content: data.url, + area: ['80%', '80%'], + maxmin: true + }) + } else { + if (isMuiltTab(options) === "true" || + isMuiltTab(options) === true) { + pearAdmin.instances.tabPage.changePage({ + id: node.id, + title: node.title, + type: node.openType, + url: node.url, + close: true + }); + } else { + pearAdmin.instances.page.changePage({ + href: node.url, + type: node.openType + }); + } + } + } + } + }) + } + + /** + * @since Pear Admin 4.0 + * + * 消息中心 + */ + this.messageCenterRender = function (options) { + messageCenter.render({ + elem: '.message', + url: options.header.message, + height: '250px' + }); + } + + this.logoRender = function (param) { + $(".layui-logo .logo").attr("src", param.logo.image); + $(".layui-logo .title").html(param.logo.title); + } + + /** + * @since Pear Admin 4.0 + * + * 侧边菜单 + */ + this.menuRender = function (param) { + pearAdmin.instances.menu = menu.render({ + elem: 'side', + async: param.menu.async, + method: param.menu.method, + control: isControl(param) === 'true' || isControl(param) === true ? 'control' : false, + controlWidth: param.menu.controlWidth, + accordion: param.menu.accordion, + data: param.menu.data, + url: param.menu.data, + parseData: false, + defaultMenu: 0, + change: function () { + compatible(); + }, + done: function () { + pearAdmin.instances.menu.isCollapse = param.menu.collapse; + pearAdmin.instances.menu.selectItem(param.menu.select); + if (param.menu.collapse) { + if ($(window).width() >= 768) { + collapse() + } + } + } + }); + } + + /** + * @since Pear Admin 4.0 + * + * 视图容器 + */ + this.bodyRender = function (param) { + + body.on("click", ".refresh", function () { + pearAdmin.refresh(); + }) + + if (isMuiltTab(param) === "true" || isMuiltTab(param) === true) { + + pearAdmin.instances.tabPage = tabPage.render({ + elem: 'content', + session: param.tab.session, + index: 0, + tabMax: param.tab.max, + preload: param.tab.preload, + closeEvent: function (id) { + pearAdmin.instances.menu.selectItem(id); + }, + data: [{ + id: param.tab.index.id, + url: param.tab.index.href, + title: param.tab.index.title, + close: false + }], + success: function (id) { + if (param.tab.session) { + setTimeout(function () { + pearAdmin.instances.menu.selectItem(id); + pearAdmin.instances.tabPage.positionTab(); + }, 500) + } + } + }); + + pearAdmin.instances.tabPage.click(function (id) { + if (!param.tab.keepState) { + pearAdmin.instances.tabPage.refresh(false); + } + pearAdmin.instances.tabPage.positionTab(); + pearAdmin.instances.menu.selectItem(id); + }) + + pearAdmin.instances.menu.click(function (dom, data) { + if (data.menuOpenType === "_layer") { + layer.open({ + type: 2, + title: data.menuTitle, + content: data.menuUrl, + area: ['80%', '80%'], + maxmin: true + }) + } else { + pearAdmin.instances.tabPage.changePage({ + id: data.menuId, + title: data.menuTitle, + type: data.menuOpenType, + url: data.menuUrl, + close: true + }); + } + compatible(); + }) + + } else { + + pearAdmin.instances.page = page.render({ + elem: 'content', + title: '首页', + url: param.tab.index.href + }); + + pearAdmin.instances.menu.click(function (dom, data) { + if (data.menuOpenType === "_layer") { + layer.open({ + type: 2, + title: data.menuTitle, + content: data.menuUrl, + area: ['80%', '80%'], + maxmin: true + }) + } else { + pearAdmin.instances.page.changePage({href: data.menuUrl, type: data.menuOpenType}); + } + compatible() + }) + } + } + + this.keepLoad = function (param) { + compatible() + setTimeout(function () { + $(".loader-wrapper").fadeOut(200); + }, param.other.keepLoad) + } + + /*** + * @since Pear Admin 4.0 + * + * 切换主题色 + */ + this.changeTheme = function () { + const variableKey = "--global-primary-color"; + const variableVal = localStorage.getItem("theme-color-color"); + document.documentElement.style.setProperty(variableKey, variableVal); + } + + /** + * @since Pear Admin 4.0 + * + * 主题配置 + */ + this.themeRender = function (option) { + if (option.theme.allowCustom === false) { + $(".setting").remove(); + } + var colorId = localStorage.getItem("theme-color"); + var currentColor = getColorById(colorId); + localStorage.setItem("theme-color", currentColor.id); + localStorage.setItem("theme-color-color", currentColor.color); + localStorage.setItem("theme-color-second", currentColor.second); + pearAdmin.changeTheme(); + + var menu = localStorage.getItem("theme-menu"); + if (menu === null) { + menu = option.theme.defaultMenu; + } else { + if (option.theme.allowCustom === false) { + menu = option.theme.defaultMenu; + } + } + + var header = localStorage.getItem("theme-header"); + if (header === null) { + header = option.theme.defaultHeader; + } else { + if (option.theme.allowCustom === false) { + header = option.theme.defaultHeader; + } + } + + var banner = localStorage.getItem("theme-banner"); + if (banner === null) { + banner = option.theme.banner; + } else { + if (option.theme.allowCustom === false) { + banner = option.theme.banner; + } + } + + var autoHead = localStorage.getItem("auto-head"); + if (autoHead === null) { + autoHead = option.other.autoHead; + } else { + if (option.theme.allowCustom === false) { + autoHead = option.other.autoHead; + } + } + + var muiltTab = localStorage.getItem("muilt-tab"); + if (muiltTab === null) { + muiltTab = option.tab.enable; + } else { + if (option.theme.allowCustom === false) { + muiltTab = option.tab.enable; + } + } + + var control = localStorage.getItem("control"); + if (control === null) { + control = option.menu.control; + } else { + if (option.theme.allowCustom === false) { + control = option.menu.control; + } + } + + var footer = localStorage.getItem("footer"); + if (footer === null) { + footer = option.other.footer; + } else { + if (option.theme.allowCustom === false) { + footer = option.other.footer; + } + } + + var dark = localStorage.getItem("dark"); + if (dark === null) { + dark = option.theme.dark; + } else { + if (option.theme.allowCustom === false) { + dark = option.theme.dark; + } + } + + localStorage.setItem("muilt-tab", muiltTab); + localStorage.setItem("theme-banner", banner); + localStorage.setItem("theme-menu", menu); + localStorage.setItem("footer", footer); + localStorage.setItem("control", control); + localStorage.setItem("theme-header", header); + localStorage.setItem("auto-head", autoHead); + localStorage.setItem("dark", dark); + this.menuSkin(menu); + this.headerSkin(header); + this.bannerSkin(banner); + this.switchTheme(dark); + this.footer(footer); + } + + this.footer = function (footer) { + var bodyDOM = $(".pear-admin .layui-body"); + var footerDOM = $(".pear-admin .layui-footer"); + if (footer === true || footer === "true") { + footerDOM.removeClass("close"); + bodyDOM.css("height", "calc(100% - 105px)"); + } else { + footerDOM.addClass("close"); + bodyDOM.css("height", "calc(100% - 60px)"); + } + } + + this.bannerSkin = function (theme) { + var pearAdmin = $(".pear-admin"); + pearAdmin.removeClass("banner-layout"); + if (theme === true || theme === "true") { + pearAdmin.addClass("banner-layout"); + } + } + + this.switchTheme = function (checked) { + var $pearAdmin = $(".pear-admin"); + $pearAdmin.removeClass("pear-admin-dark"); + if (checked === true || checked === "true") { + $pearAdmin.addClass("pear-admin-dark"); + } + } + + this.menuSkin = function (theme) { + var pearAdmin = $(".pear-admin .layui-side"); + pearAdmin.removeClass("light-theme"); + pearAdmin.removeClass("dark-theme"); + pearAdmin.addClass(theme); + } + + this.headerSkin = function (theme) { + var pearAdmin = $(".pear-admin .layui-header"); + pearAdmin.removeClass("dark-theme"); + pearAdmin.removeClass("light-theme"); + pearAdmin.removeClass("auto-theme"); + pearAdmin.addClass(theme); + } + + /** + * 设置注销逻辑 + * + * @param callback 实现 + */ + this.logout = function (callback) { + if (callback != undefined) { + logout = callback; + } + } + + /** + * @since Pear Admin 4.0.3 + * + * 刷新当前页面 + */ + this.refresh = function () { + var refreshBtn = $(".refresh a"); + refreshBtn.addClass("layui-anim layui-anim-rotate layui-anim-loop layui-icon-loading"); + refreshBtn.removeClass("layui-icon-refresh-1"); + if (isMuiltTab(configurationCache) === "true" || isMuiltTab(configurationCache) === true) pearAdmin.instances.tabPage.refresh(true); + else pearAdmin.instances.page.refresh(true); + setTimeout(function () { + refreshBtn.removeClass("layui-anim layui-anim-rotate layui-anim-loop layui-icon-loading"); + refreshBtn.addClass("layui-icon-refresh-1"); + }, 600) + } + + /** + * @since Pear Admin 4.0.3 + * + * 切换内容页面 + * + * PS: tabPages 模式下,如果页面不存在则新增,反则仅做切换。 + */ + this.changePage = function (data) { + if (isMuiltTab(configurationCache) === "true" || isMuiltTab(configurationCache) === true) { + pearAdmin.instances.tabPage.changePage({ + id: data.id, + title: data.title, + url: data.url, + type: data.type, + close: true + }); + } else { + pearAdmin.instances.page.changePage({href: data.url, type: data.type}); + } + } + + }; + + /** + * @since Pear Admin 4.0 + * + * 菜单折叠 + */ + function collapse() { + pearAdmin.instances.menu.collapse(); + var admin = $(".pear-admin"); + var left = $(".layui-icon-spread-left") + var right = $(".layui-icon-shrink-right") + if (admin.is(".pear-mini")) { + left.addClass("layui-icon-shrink-right") + left.removeClass("layui-icon-spread-left") + admin.removeClass("pear-mini"); + pearAdmin.instances.menu.isCollapse = false; + } else { + right.addClass("layui-icon-spread-left") + right.removeClass("layui-icon-shrink-right") + admin.addClass("pear-mini"); + pearAdmin.instances.menu.isCollapse = true; + } + } + + /** + * @since Pear Admin 4.0 + * + * 使用 admin.logout(Function) 实现注销 + * + * Promise 作为返回值类型时,泛型内容为 true 时视为注销成功,则清除 pearAdmin.instances.tabPage 缓存 + * + * 否则视为注销失败,不做任何处置。 + */ + body.on("click", ".logout", function () { + var promise = logout(); + if (promise != undefined) { + promise.then((asyncResult) => { + if (asyncResult) { + if (pearAdmin.instances.tabPage != undefined) { + pearAdmin.instances.tabPage.clear(); + } + } + }) + } else { + if (pearAdmin.instances.tabPage != undefined) { + pearAdmin.instances.tabPage.clear(); + } + } + }) + + body.on("click", ".collapse,.pear-cover", function () { + collapse(); + }); + + body.on("click", ".fullScreen", function () { + if ($(this).hasClass("layui-icon-screen-restore")) { + fullscreen.fullClose().then(function () { + $(".fullScreen").eq(0).removeClass("layui-icon-screen-restore"); + }); + } else { + fullscreen.fullScreen().then(function () { + $(".fullScreen").eq(0).addClass("layui-icon-screen-restore"); + }); + } + }); + + body.on("click", '[user-menu-id]', function () { + if (isMuiltTab(configurationCache) === "true" || isMuiltTab(configurationCache) === true) { + pearAdmin.instances.tabPage.changePage({ + id: $(this).attr("user-menu-id"), + title: $(this).attr("user-menu-title"), + url: $(this).attr("user-menu-url"), + close: true + }, 300); + } else { + pearAdmin.instances.page.changePage({ + href: $(this).attr("user-menu-url"), + type: "_component" + }, true); + } + }); + + body.on("click", ".setting", function () { + + var menuItem = + '
          • ' + + '' + + '
            ' + + '
            ' + + '
            ' + + '
          • '; + + menuItem += + '
          • ' + + '' + + '
            ' + + '
            ' + + '
            ' + + '
          • '; + + var menuHtml = + '
            \n' + + '
            菜单风格
            \n' + + '
            \n' + + '
              \n' + menuItem + '
            \n' + + '
            \n' + + '
            '; + + var headItem = + '
          • ' + + '' + + '
            ' + + '
            ' + + '
            ' + + '
          • '; + + headItem += + '
          • ' + + '' + + '
            ' + + '
            ' + + '
            ' + + '
          • '; + + headItem += + '
          • ' + + '' + + '
            ' + + '
            ' + + '
            ' + + '
          • '; + + var headHtml = + '
            \n' + + '
            顶栏风格
            \n' + + '
            \n' + + '
              \n' + headItem + '
            \n' + + '
            \n' + + '
            '; + + var moreItem = + '
            菜单分割
            '; + + moreItem += + '
            多选项卡
            '; + + moreItem += + '
            通栏布局
            '; + + moreItem += + '
            开启页脚
            '; + + moreItem += + '
            夜间模式
            '; + + var moreHtml = '
            \n' + + '
            更多设置
            \n' + + '
            \n' + + '
            \n' + moreItem + '
            \n' + + '
            \n' + + '
            '; + + layer.open({ + type: 1, + offset: 'r', + area: ['320px', '100%'], + title: false, + shade: 0.1, + closeBtn: 0, + shadeClose: false, + anim: -1, + skin: 'layer-anim-right', + move: false, + content: menuHtml + headHtml + buildColorHtml() + moreHtml, + success: function (layero, index) { + + form.render(); + + var color = localStorage.getItem("theme-color"); + var menu = localStorage.getItem("theme-menu"); + var header = localStorage.getItem("theme-header"); + + if (color !== "null") { + $(".select-color-item").removeClass("layui-icon").removeClass("layui-icon-ok"); + $("*[color-id='" + color + "']").addClass("layui-icon").addClass("layui-icon-ok"); + } + + if (menu !== "null") { + $("*[data-select-bgcolor]").removeClass("layui-this"); + $("[data-select-bgcolor='" + menu + "']").addClass("layui-this"); + } + + if (header !== "null") { + $("*[data-select-header]").removeClass("layui-this"); + $("[data-select-header='" + header + "']").addClass("layui-this"); + } + + $('#layui-layer-shade' + index).click(function () { + var $layero = $('#layui-layer' + index); + $layero.animate({ + left: $layero.offset().left + $layero.width() + }, 200, function () { + layer.close(index); + }); + }) + + form.on('switch(control)', function (data) { + localStorage.setItem("control", this.checked); + window.location.reload(); + }) + + form.on('switch(muilt-tab)', function (data) { + localStorage.setItem("muilt-tab", this.checked); + window.location.reload(); + }) + + form.on('switch(auto-head)', function (data) { + localStorage.setItem("auto-head", this.checked); + pearAdmin.changeTheme(); + }) + + form.on('switch(banner)', function (data) { + localStorage.setItem("theme-banner", this.checked); + pearAdmin.bannerSkin(this.checked); + }) + + form.on('switch(footer)', function (data) { + localStorage.setItem("footer", this.checked); + pearAdmin.footer(this.checked); + }) + + form.on('switch(dark)', function (data) { + localStorage.setItem("dark", this.checked); + pearAdmin.switchTheme(this.checked); + }) + + if (localStorage.getItem('theme-banner') === 'true') { + $('input[name="banner"]').attr('checked', 'checked') + } else { + $('input[name="banner"]').removeAttr('checked') + } + + if (localStorage.getItem('control') === 'true') { + $('input[name="control"]').attr('checked', 'checked') + } else { + $('input[name="control"]').removeAttr('checked') + } + + if (localStorage.getItem('muilt-tab') === 'true') { + $('input[name="muilt-tab"]').attr('checked', 'checked') + } else { + $('input[name="muilt-tab"]').removeAttr('checked') + } + + if (localStorage.getItem('footer') === 'true') { + $('input[name="footer"]').attr('checked', 'checked') + } else { + $('input[name="footer"]').removeAttr('checked') + } + + if (localStorage.getItem('dark') === 'true') { + $('input[name="dark"]').attr('checked', 'checked') + } else { + $('input[name="dark"]').removeAttr('checked') + } + + form.render('checkbox'); + } + }); + }); + + body.on('click', '[data-select-bgcolor]', function () { + var theme = $(this).attr('data-select-bgcolor'); + $('[data-select-bgcolor]').removeClass("layui-this"); + $(this).addClass("layui-this"); + localStorage.setItem("theme-menu", theme); + pearAdmin.menuSkin(theme); + }); + + body.on('click', '[data-select-header]', function () { + var headerColor = $(this).attr('data-select-header'); + $('[data-select-header]').removeClass("layui-this"); + $(this).addClass("layui-this"); + localStorage.setItem("theme-header", headerColor); + if (headerColor == "auto-theme") { + localStorage.setItem("auto-head", true); + pearAdmin.changeTheme(); + } else { + localStorage.setItem("auto-head", false); + pearAdmin.changeTheme(); + } + pearAdmin.headerSkin(headerColor); + }); + + body.on('click', '.select-color-item', function () { + $(".select-color-item").removeClass("layui-icon").removeClass("layui-icon-ok"); + $(this).addClass("layui-icon").addClass("layui-icon-ok"); + var colorId = $(".select-color-item.layui-icon-ok").attr("color-id"); + var currentColor = getColorById(colorId); + localStorage.setItem("theme-color", currentColor.id); + localStorage.setItem("theme-color-color", currentColor.color); + localStorage.setItem("theme-color-second", currentColor.second); + pearAdmin.changeTheme(); + }); + + function getColorById(id) { + var color; + var flag = false; + $.each(configurationCache.colors, function (i, value) { + if (value.id === id) { + color = value; + flag = true; + } + }) + if (flag === false || configurationCache.theme.allowCustom === false) { + $.each(configurationCache.colors, function (i, value) { + if (value.id === configurationCache.theme.defaultColor) { + color = value; + } + }) + } + return color; + } + + function buildColorHtml() { + var colors = ""; + $.each(configurationCache.colors, function (i, value) { + colors += ""; + }) + return "
            主题颜色
            " + + colors + "
            " + } + + function compatible() { + if ($(window).width() <= 768) { + collapse() + } + } + + function isControl(option) { + if (option.theme.allowCustom) { + if (localStorage.getItem("control") != null) { + return localStorage.getItem("control") + } else { + return option.menu.control + } + } else { + return option.menu.control + } + } + + function isMuiltTab(option) { + if (option.theme.allowCustom) { + if (localStorage.getItem("muilt-tab") != null) { + return localStorage.getItem("muilt-tab") + } else { + return option.tab.enable + } + } else { + return option.tab.enable + } + } + + window.onresize = function () { + if (!fullscreen.isFullscreen()) { + $(".fullScreen").eq(0).removeClass("layui-icon-screen-restore"); + } + } + + $(window).on('resize', tools.debounce(function () { + if (pearAdmin.instances.menu && !pearAdmin.instances.menu.isCollapse && $(window).width() <= 768) { + collapse(); + } + }, 50)); + + exports('admin', pearAdmin); + }) \ No newline at end of file diff --git a/static/component/pear/module/button.js b/static/component/pear/module/button.js new file mode 100644 index 0000000..5d8f19e --- /dev/null +++ b/static/component/pear/module/button.js @@ -0,0 +1,60 @@ +layui.define(['jquery'], function (exports) { + "use strict"; + + /** + * @since Pear Admin 4.0 + * + * Button component + * */ + var MOD_NAME = 'button', + $ = layui.jquery; + + var button = function (opt) { + this.option = opt; + }; + + /** + * @since Pear Admin 4.0 + * + * Button start loading + * */ + button.prototype.load = function (opt) { + + var options = { + elem: opt.elem, + time: opt.time ? opt.time : false, + done: opt.done ? opt.done : function () { + } + } + + var text = $(options.elem).html(); + + $(options.elem).html(""); + $(options.elem).attr("disabled", "disabled"); + + var $button = $(options.elem); + + if (options.time != "" || options.time != false) { + setTimeout(function () { + $button.attr("disabled", false); + $button.html(text); + options.done(); + }, options.time); + } + options.text = text; + return new button(options); + } + + /** + * @since Pear Admin 4.0 + * + * Button stop loaded + * */ + button.prototype.stop = function (success) { + $(this.option.elem).attr("disabled", false); + $(this.option.elem).html(this.option.text); + success && success(); + } + + exports(MOD_NAME, new button()); +}); diff --git a/static/component/pear/module/extends/count.js b/static/component/pear/module/extends/count.js new file mode 100644 index 0000000..c42e494 --- /dev/null +++ b/static/component/pear/module/extends/count.js @@ -0,0 +1,38 @@ +layui.define(['jquery', 'element'], function (exports) { + "use strict"; + + var MOD_NAME = 'count', + $ = layui.jquery, + element = layui.element; + + var count = new function () { + + this.up = function (targetEle, options) { + + options = options || {}; + + var $this = document.getElementById(targetEle), + time = options.time, + finalNum = options.num, + regulator = options.regulator, + step = finalNum / (time / regulator), + count = 0.00, + initial = 0; + + var timer = setInterval(function () { + count = count + step; + if (count >= finalNum) { + clearInterval(timer); + count = finalNum; + } + var t = count.toFixed(options.bit ? options.bit : 0); + ; + if (t == initial) return; + initial = t; + $this.innerHTML = initial; + }, 30); + } + + } + exports(MOD_NAME, count); +}); \ No newline at end of file diff --git a/static/component/pear/module/extends/echarts.js b/static/component/pear/module/extends/echarts.js new file mode 100644 index 0000000..5a42954 --- /dev/null +++ b/static/component/pear/module/extends/echarts.js @@ -0,0 +1,96008 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* 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. +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.echarts = {})); +}(this, (function (exports) { + 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({__proto__: []} instanceof Array && function (d, b) { + d.__proto__ = b; + }) || + function (d, b) { + for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; + }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var Browser = (function () { + function Browser() { + this.firefox = false; + this.ie = false; + this.edge = false; + this.newEdge = false; + this.weChat = false; + } + + return Browser; + }()); + var Env = (function () { + function Env() { + this.browser = new Browser(); + this.node = false; + this.wxa = false; + this.worker = false; + this.svgSupported = false; + this.touchEventsSupported = false; + this.pointerEventsSupported = false; + this.domSupported = false; + this.transformSupported = false; + this.transform3dSupported = false; + this.hasGlobalWindow = typeof window !== 'undefined'; + } + + return Env; + }()); + var env = new Env(); + if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') { + env.wxa = true; + env.touchEventsSupported = true; + } else if (typeof document === 'undefined' && typeof self !== 'undefined') { + env.worker = true; + } else if (typeof navigator === 'undefined') { + env.node = true; + env.svgSupported = true; + } else { + detect(navigator.userAgent, env); + } + + function detect(ua, env) { + var browser = env.browser; + var firefox = ua.match(/Firefox\/([\d.]+)/); + var ie = ua.match(/MSIE\s([\d.]+)/) + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge?\/([\d.]+)/); + var weChat = (/micromessenger/i).test(ua); + if (firefox) { + browser.firefox = true; + browser.version = firefox[1]; + } + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + if (edge) { + browser.edge = true; + browser.version = edge[1]; + browser.newEdge = +edge[1].split('.')[0] > 18; + } + if (weChat) { + browser.weChat = true; + } + env.svgSupported = typeof SVGRect !== 'undefined'; + env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge; + env.pointerEventsSupported = 'onpointerdown' in window + && (browser.edge || (browser.ie && +browser.version >= 11)); + env.domSupported = typeof document !== 'undefined'; + var style = document.documentElement.style; + env.transform3dSupported = ((browser.ie && 'transition' in style) + || browser.edge + || (('WebKitCSSMatrix' in window) && ('m11' in new WebKitCSSMatrix())) + || 'MozPerspective' in style) + && !('OTransition' in style); + env.transformSupported = env.transform3dSupported + || (browser.ie && +browser.version >= 9); + } + + var DEFAULT_FONT_SIZE = 12; + var DEFAULT_FONT_FAMILY = 'sans-serif'; + var DEFAULT_FONT = DEFAULT_FONT_SIZE + "px " + DEFAULT_FONT_FAMILY; + var OFFSET = 20; + var SCALE = 100; + var defaultWidthMapStr = "007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N"; + + function getTextWidthMap(mapStr) { + var map = {}; + if (typeof JSON === 'undefined') { + return map; + } + for (var i = 0; i < mapStr.length; i++) { + var char = String.fromCharCode(i + 32); + var size = (mapStr.charCodeAt(i) - OFFSET) / SCALE; + map[char] = size; + } + return map; + } + + var DEFAULT_TEXT_WIDTH_MAP = getTextWidthMap(defaultWidthMapStr); + var platformApi = { + createCanvas: function () { + return typeof document !== 'undefined' + && document.createElement('canvas'); + }, + measureText: (function () { + var _ctx; + var _cachedFont; + return function (text, font) { + if (!_ctx) { + var canvas = platformApi.createCanvas(); + _ctx = canvas && canvas.getContext('2d'); + } + if (_ctx) { + if (_cachedFont !== font) { + _cachedFont = _ctx.font = font || DEFAULT_FONT; + } + return _ctx.measureText(text); + } else { + text = text || ''; + font = font || DEFAULT_FONT; + var res = /^([0-9]*?)px$/.exec(font); + var fontSize = +(res && res[1]) || DEFAULT_FONT_SIZE; + var width = 0; + if (font.indexOf('mono') >= 0) { + width = fontSize * text.length; + } else { + for (var i = 0; i < text.length; i++) { + var preCalcWidth = DEFAULT_TEXT_WIDTH_MAP[text[i]]; + width += preCalcWidth == null ? fontSize : (preCalcWidth * fontSize); + } + } + return {width: width}; + } + }; + })(), + loadImage: function (src, onload, onerror) { + var image = new Image(); + image.onload = onload; + image.onerror = onerror; + image.src = src; + return image; + } + }; + + function setPlatformAPI(newPlatformApis) { + for (var key in platformApi) { + if (newPlatformApis[key]) { + platformApi[key] = newPlatformApis[key]; + } + } + } + + var BUILTIN_OBJECT = reduce([ + 'Function', + 'RegExp', + 'Date', + 'Error', + 'CanvasGradient', + 'CanvasPattern', + 'Image', + 'Canvas' + ], function (obj, val) { + obj['[object ' + val + ']'] = true; + return obj; + }, {}); + var TYPED_ARRAY = reduce([ + 'Int8', + 'Uint8', + 'Uint8Clamped', + 'Int16', + 'Uint16', + 'Int32', + 'Uint32', + 'Float32', + 'Float64' + ], function (obj, val) { + obj['[object ' + val + 'Array]'] = true; + return obj; + }, {}); + var objToString = Object.prototype.toString; + var arrayProto = Array.prototype; + var nativeForEach = arrayProto.forEach; + var nativeFilter = arrayProto.filter; + var nativeSlice = arrayProto.slice; + var nativeMap = arrayProto.map; + var ctorFunction = function () { + }.constructor; + var protoFunction = ctorFunction ? ctorFunction.prototype : null; + var protoKey = '__proto__'; + var idStart = 0x0907; + + function guid() { + return idStart++; + } + + function logError() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (typeof console !== 'undefined') { + console.error.apply(console, args); + } + } + + function clone(source) { + if (source == null || typeof source !== 'object') { + return source; + } + var result = source; + var typeStr = objToString.call(source); + if (typeStr === '[object Array]') { + if (!isPrimitive(source)) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + } else if (TYPED_ARRAY[typeStr]) { + if (!isPrimitive(source)) { + var Ctor = source.constructor; + if (Ctor.from) { + result = Ctor.from(source); + } else { + result = new Ctor(source.length); + for (var i = 0, len = source.length; i < len; i++) { + result[i] = source[i]; + } + } + } + } else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + result[key] = clone(source[key]); + } + } + } + return result; + } + + function merge(target, source, overwrite) { + if (!isObject(source) || !isObject(target)) { + return overwrite ? clone(source) : target; + } + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + var targetProp = target[key]; + var sourceProp = source[key]; + if (isObject(sourceProp) + && isObject(targetProp) + && !isArray(sourceProp) + && !isArray(targetProp) + && !isDom(sourceProp) + && !isDom(targetProp) + && !isBuiltInObject(sourceProp) + && !isBuiltInObject(targetProp) + && !isPrimitive(sourceProp) + && !isPrimitive(targetProp)) { + merge(targetProp, sourceProp, overwrite); + } else if (overwrite || !(key in target)) { + target[key] = clone(source[key]); + } + } + } + return target; + } + + function mergeAll(targetAndSources, overwrite) { + var result = targetAndSources[0]; + for (var i = 1, len = targetAndSources.length; i < len; i++) { + result = merge(result, targetAndSources[i], overwrite); + } + return result; + } + + function extend(target, source) { + if (Object.assign) { + Object.assign(target, source); + } else { + for (var key in source) { + if (source.hasOwnProperty(key) && key !== protoKey) { + target[key] = source[key]; + } + } + } + return target; + } + + function defaults(target, source, overlay) { + var keysArr = keys(source); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if ((overlay ? source[key] != null : target[key] == null)) { + target[key] = source[key]; + } + } + return target; + } + + var createCanvas = platformApi.createCanvas; + + function indexOf(array, value) { + if (array) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + } + return -1; + } + + function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + + function F() { + } + + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + for (var prop in clazzPrototype) { + if (clazzPrototype.hasOwnProperty(prop)) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; + } + + function mixin(target, source, override) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + if (Object.getOwnPropertyNames) { + var keyList = Object.getOwnPropertyNames(source); + for (var i = 0; i < keyList.length; i++) { + var key = keyList[i]; + if (key !== 'constructor') { + if ((override ? source[key] != null : target[key] == null)) { + target[key] = source[key]; + } + } + } + } else { + defaults(target, source, override); + } + } + + function isArrayLike(data) { + if (!data) { + return false; + } + if (typeof data === 'string') { + return false; + } + return typeof data.length === 'number'; + } + + function each(arr, cb, context) { + if (!(arr && cb)) { + return; + } + if (arr.forEach && arr.forEach === nativeForEach) { + arr.forEach(cb, context); + } else if (arr.length === +arr.length) { + for (var i = 0, len = arr.length; i < len; i++) { + cb.call(context, arr[i], i, arr); + } + } else { + for (var key in arr) { + if (arr.hasOwnProperty(key)) { + cb.call(context, arr[key], key, arr); + } + } + } + } + + function map(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.map && arr.map === nativeMap) { + return arr.map(cb, context); + } else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + result.push(cb.call(context, arr[i], i, arr)); + } + return result; + } + } + + function reduce(arr, cb, memo, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + memo = cb.call(context, memo, arr[i], i, arr); + } + return memo; + } + + function filter(arr, cb, context) { + if (!arr) { + return []; + } + if (!cb) { + return slice(arr); + } + if (arr.filter && arr.filter === nativeFilter) { + return arr.filter(cb, context); + } else { + var result = []; + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + result.push(arr[i]); + } + } + return result; + } + } + + function find(arr, cb, context) { + if (!(arr && cb)) { + return; + } + for (var i = 0, len = arr.length; i < len; i++) { + if (cb.call(context, arr[i], i, arr)) { + return arr[i]; + } + } + } + + function keys(obj) { + if (!obj) { + return []; + } + if (Object.keys) { + return Object.keys(obj); + } + var keyList = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + keyList.push(key); + } + } + return keyList; + } + + function bindPolyfill(func, context) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; + } + + var bind = (protoFunction && isFunction(protoFunction.bind)) + ? protoFunction.call.bind(protoFunction.bind) + : bindPolyfill; + + function curry(func) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; + } + + function isArray(value) { + if (Array.isArray) { + return Array.isArray(value); + } + return objToString.call(value) === '[object Array]'; + } + + function isFunction(value) { + return typeof value === 'function'; + } + + function isString(value) { + return typeof value === 'string'; + } + + function isStringSafe(value) { + return objToString.call(value) === '[object String]'; + } + + function isNumber(value) { + return typeof value === 'number'; + } + + function isObject(value) { + var type = typeof value; + return type === 'function' || (!!value && type === 'object'); + } + + function isBuiltInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)]; + } + + function isTypedArray(value) { + return !!TYPED_ARRAY[objToString.call(value)]; + } + + function isDom(value) { + return typeof value === 'object' + && typeof value.nodeType === 'number' + && typeof value.ownerDocument === 'object'; + } + + function isGradientObject(value) { + return value.colorStops != null; + } + + function isImagePatternObject(value) { + return value.image != null; + } + + function isRegExp(value) { + return objToString.call(value) === '[object RegExp]'; + } + + function eqNaN(value) { + return value !== value; + } + + function retrieve() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + for (var i = 0, len = args.length; i < len; i++) { + if (args[i] != null) { + return args[i]; + } + } + } + + function retrieve2(value0, value1) { + return value0 != null + ? value0 + : value1; + } + + function retrieve3(value0, value1, value2) { + return value0 != null + ? value0 + : value1 != null + ? value1 + : value2; + } + + function slice(arr) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return nativeSlice.apply(arr, args); + } + + function normalizeCssArray(val) { + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + var len = val.length; + if (len === 2) { + return [val[0], val[1], val[0], val[1]]; + } else if (len === 3) { + return [val[0], val[1], val[2], val[1]]; + } + return val; + } + + function assert(condition, message) { + if (!condition) { + throw new Error(message); + } + } + + function trim(str) { + if (str == null) { + return null; + } else if (typeof str.trim === 'function') { + return str.trim(); + } else { + return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + } + + var primitiveKey = '__ec_primitive__'; + + function setAsPrimitive(obj) { + obj[primitiveKey] = true; + } + + function isPrimitive(obj) { + return obj[primitiveKey]; + } + + var HashMap = (function () { + function HashMap(obj) { + this.data = {}; + var isArr = isArray(obj); + this.data = {}; + var thisMap = this; + (obj instanceof HashMap) + ? obj.each(visit) + : (obj && each(obj, visit)); + + function visit(value, key) { + isArr ? thisMap.set(value, key) : thisMap.set(key, value); + } + } + + HashMap.prototype.get = function (key) { + return this.data.hasOwnProperty(key) ? this.data[key] : null; + }; + HashMap.prototype.set = function (key, value) { + return (this.data[key] = value); + }; + HashMap.prototype.each = function (cb, context) { + for (var key in this.data) { + if (this.data.hasOwnProperty(key)) { + cb.call(context, this.data[key], key); + } + } + }; + HashMap.prototype.keys = function () { + return keys(this.data); + }; + HashMap.prototype.removeKey = function (key) { + delete this.data[key]; + }; + return HashMap; + }()); + + function createHashMap(obj) { + return new HashMap(obj); + } + + function concatArray(a, b) { + var newArray = new a.constructor(a.length + b.length); + for (var i = 0; i < a.length; i++) { + newArray[i] = a[i]; + } + var offset = a.length; + for (var i = 0; i < b.length; i++) { + newArray[i + offset] = b[i]; + } + return newArray; + } + + function createObject(proto, properties) { + var obj; + if (Object.create) { + obj = Object.create(proto); + } else { + var StyleCtor = function () { + }; + StyleCtor.prototype = proto; + obj = new StyleCtor(); + } + if (properties) { + extend(obj, properties); + } + return obj; + } + + function disableUserSelect(dom) { + var domStyle = dom.style; + domStyle.webkitUserSelect = 'none'; + domStyle.userSelect = 'none'; + domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)'; + domStyle['-webkit-touch-callout'] = 'none'; + } + + function hasOwn(own, prop) { + return own.hasOwnProperty(prop); + } + + function noop() { + } + + var RADIAN_TO_DEGREE = 180 / Math.PI; + + var util = /*#__PURE__*/Object.freeze({ + __proto__: null, + guid: guid, + logError: logError, + clone: clone, + merge: merge, + mergeAll: mergeAll, + extend: extend, + defaults: defaults, + createCanvas: createCanvas, + indexOf: indexOf, + inherits: inherits, + mixin: mixin, + isArrayLike: isArrayLike, + each: each, + map: map, + reduce: reduce, + filter: filter, + find: find, + keys: keys, + bind: bind, + curry: curry, + isArray: isArray, + isFunction: isFunction, + isString: isString, + isStringSafe: isStringSafe, + isNumber: isNumber, + isObject: isObject, + isBuiltInObject: isBuiltInObject, + isTypedArray: isTypedArray, + isDom: isDom, + isGradientObject: isGradientObject, + isImagePatternObject: isImagePatternObject, + isRegExp: isRegExp, + eqNaN: eqNaN, + retrieve: retrieve, + retrieve2: retrieve2, + retrieve3: retrieve3, + slice: slice, + normalizeCssArray: normalizeCssArray, + assert: assert, + trim: trim, + setAsPrimitive: setAsPrimitive, + isPrimitive: isPrimitive, + HashMap: HashMap, + createHashMap: createHashMap, + concatArray: concatArray, + createObject: createObject, + disableUserSelect: disableUserSelect, + hasOwn: hasOwn, + noop: noop, + RADIAN_TO_DEGREE: RADIAN_TO_DEGREE + }); + + function create(x, y) { + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + return [x, y]; + } + + function copy(out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + } + + function clone$1(v) { + return [v[0], v[1]]; + } + + function set(out, a, b) { + out[0] = a; + out[1] = b; + return out; + } + + function add(out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + } + + function scaleAndAdd(out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + } + + function sub(out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + } + + function len(v) { + return Math.sqrt(lenSquare(v)); + } + + var length = len; + + function lenSquare(v) { + return v[0] * v[0] + v[1] * v[1]; + } + + var lengthSquare = lenSquare; + + function mul(out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + } + + function div(out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + } + + function dot(v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + } + + function scale(out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + } + + function normalize(out, v) { + var d = len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; + } + + function distance(v1, v2) { + return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1])); + } + + var dist = distance; + + function distanceSquare(v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); + } + + var distSquare = distanceSquare; + + function negate(out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + } + + function lerp(out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + } + + function applyTransform(out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + } + + function min(out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + } + + function max(out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + + var vector = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create, + copy: copy, + clone: clone$1, + set: set, + add: add, + scaleAndAdd: scaleAndAdd, + sub: sub, + len: len, + length: length, + lenSquare: lenSquare, + lengthSquare: lengthSquare, + mul: mul, + div: div, + dot: dot, + scale: scale, + normalize: normalize, + distance: distance, + dist: dist, + distanceSquare: distanceSquare, + distSquare: distSquare, + negate: negate, + lerp: lerp, + applyTransform: applyTransform, + min: min, + max: max + }); + + var Param = (function () { + function Param(target, e) { + this.target = target; + this.topTarget = e && e.topTarget; + } + + return Param; + }()); + var Draggable = (function () { + function Draggable(handler) { + this.handler = handler; + handler.on('mousedown', this._dragStart, this); + handler.on('mousemove', this._drag, this); + handler.on('mouseup', this._dragEnd, this); + } + + Draggable.prototype._dragStart = function (e) { + var draggingTarget = e.target; + while (draggingTarget && !draggingTarget.draggable) { + draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget; + } + if (draggingTarget) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event); + } + }; + Draggable.prototype._drag = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + var x = e.offsetX; + var y = e.offsetY; + var dx = x - this._x; + var dy = y - this._y; + this._x = x; + this._y = y; + draggingTarget.drift(dx, dy, e); + this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event); + var dropTarget = this.handler.findHover(x, y, draggingTarget).target; + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event); + } + } + } + }; + Draggable.prototype._dragEnd = function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + draggingTarget.dragging = false; + } + this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event); + if (this._dropTarget) { + this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event); + } + this._draggingTarget = null; + this._dropTarget = null; + }; + return Draggable; + }()); + + var Eventful = (function () { + function Eventful(eventProcessors) { + if (eventProcessors) { + this._$eventProcessor = eventProcessors; + } + } + + Eventful.prototype.on = function (event, query, handler, context) { + if (!this._$handlers) { + this._$handlers = {}; + } + var _h = this._$handlers; + if (typeof query === 'function') { + context = handler; + handler = query; + query = null; + } + if (!handler || !event) { + return this; + } + var eventProcessor = this._$eventProcessor; + if (query != null && eventProcessor && eventProcessor.normalizeQuery) { + query = eventProcessor.normalizeQuery(query); + } + if (!_h[event]) { + _h[event] = []; + } + for (var i = 0; i < _h[event].length; i++) { + if (_h[event][i].h === handler) { + return this; + } + } + var wrap = { + h: handler, + query: query, + ctx: (context || this), + callAtLast: handler.zrEventfulCallAtLast + }; + var lastIndex = _h[event].length - 1; + var lastWrap = _h[event][lastIndex]; + (lastWrap && lastWrap.callAtLast) + ? _h[event].splice(lastIndex, 0, wrap) + : _h[event].push(wrap); + return this; + }; + Eventful.prototype.isSilent = function (eventName) { + var _h = this._$handlers; + return !_h || !_h[eventName] || !_h[eventName].length; + }; + Eventful.prototype.off = function (eventType, handler) { + var _h = this._$handlers; + if (!_h) { + return this; + } + if (!eventType) { + this._$handlers = {}; + return this; + } + if (handler) { + if (_h[eventType]) { + var newList = []; + for (var i = 0, l = _h[eventType].length; i < l; i++) { + if (_h[eventType][i].h !== handler) { + newList.push(_h[eventType][i]); + } + } + _h[eventType] = newList; + } + if (_h[eventType] && _h[eventType].length === 0) { + delete _h[eventType]; + } + } else { + delete _h[eventType]; + } + return this; + }; + Eventful.prototype.trigger = function (eventType) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[eventType]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(eventType, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(hItem.ctx); + break; + case 1: + hItem.h.call(hItem.ctx, args[0]); + break; + case 2: + hItem.h.call(hItem.ctx, args[0], args[1]); + break; + default: + hItem.h.apply(hItem.ctx, args); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(eventType); + return this; + }; + Eventful.prototype.triggerWithContext = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._$handlers) { + return this; + } + var _h = this._$handlers[type]; + var eventProcessor = this._$eventProcessor; + if (_h) { + var argLen = args.length; + var ctx = args[argLen - 1]; + var len = _h.length; + for (var i = 0; i < len; i++) { + var hItem = _h[i]; + if (eventProcessor + && eventProcessor.filter + && hItem.query != null + && !eventProcessor.filter(type, hItem.query)) { + continue; + } + switch (argLen) { + case 0: + hItem.h.call(ctx); + break; + case 1: + hItem.h.call(ctx, args[0]); + break; + case 2: + hItem.h.call(ctx, args[0], args[1]); + break; + default: + hItem.h.apply(ctx, args.slice(1, argLen - 1)); + break; + } + } + } + eventProcessor && eventProcessor.afterTrigger + && eventProcessor.afterTrigger(type); + return this; + }; + return Eventful; + }()); + + var LN2 = Math.log(2); + + function determinant(rows, rank, rowStart, rowMask, colMask, detCache) { + var cacheKey = rowMask + '-' + colMask; + var fullRank = rows.length; + if (detCache.hasOwnProperty(cacheKey)) { + return detCache[cacheKey]; + } + if (rank === 1) { + var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2); + return rows[rowStart][colStart]; + } + var subRowMask = rowMask | (1 << rowStart); + var subRowStart = rowStart + 1; + while (rowMask & (1 << subRowStart)) { + subRowStart++; + } + var sum = 0; + for (var j = 0, colLocalIdx = 0; j < fullRank; j++) { + var colTag = 1 << j; + if (!(colTag & colMask)) { + sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j] + * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache); + colLocalIdx++; + } + } + detCache[cacheKey] = sum; + return sum; + } + + function buildTransformer(src, dest) { + var mA = [ + [src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]], + [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]], + [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]], + [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]], + [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]], + [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]], + [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]], + [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]] + ]; + var detCache = {}; + var det = determinant(mA, 8, 0, 0, 0, detCache); + if (det === 0) { + return; + } + var vh = []; + for (var i = 0; i < 8; i++) { + for (var j = 0; j < 8; j++) { + vh[j] == null && (vh[j] = 0); + vh[j] += ((i + j) % 2 ? -1 : 1) + * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache) + / det * dest[i]; + } + } + return function (out, srcPointX, srcPointY) { + var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1; + out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk; + out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk; + }; + } + + var EVENT_SAVED_PROP = '___zrEVENTSAVED'; + var _calcOut = []; + + function transformLocalCoord(out, elFrom, elTarget, inX, inY) { + return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true) + && transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]); + } + + function transformCoordWithViewport(out, el, inX, inY, inverse) { + if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) { + var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {}); + var markers = prepareCoordMarkers(el, saved); + var transformer = preparePointerTransformer(markers, saved, inverse); + if (transformer) { + transformer(out, inX, inY); + return true; + } + } + return false; + } + + function prepareCoordMarkers(el, saved) { + var markers = saved.markers; + if (markers) { + return markers; + } + markers = saved.markers = []; + var propLR = ['left', 'right']; + var propTB = ['top', 'bottom']; + for (var i = 0; i < 4; i++) { + var marker = document.createElement('div'); + var stl = marker.style; + var idxLR = i % 2; + var idxTB = (i >> 1) % 2; + stl.cssText = [ + 'position: absolute', + 'visibility: hidden', + 'padding: 0', + 'margin: 0', + 'border-width: 0', + 'user-select: none', + 'width:0', + 'height:0', + propLR[idxLR] + ':0', + propTB[idxTB] + ':0', + propLR[1 - idxLR] + ':auto', + propTB[1 - idxTB] + ':auto', + '' + ].join('!important;'); + el.appendChild(marker); + markers.push(marker); + } + return markers; + } + + function preparePointerTransformer(markers, saved, inverse) { + var transformerName = inverse ? 'invTrans' : 'trans'; + var transformer = saved[transformerName]; + var oldSrcCoords = saved.srcCoords; + var srcCoords = []; + var destCoords = []; + var oldCoordTheSame = true; + for (var i = 0; i < 4; i++) { + var rect = markers[i].getBoundingClientRect(); + var ii = 2 * i; + var x = rect.left; + var y = rect.top; + srcCoords.push(x, y); + oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1]; + destCoords.push(markers[i].offsetLeft, markers[i].offsetTop); + } + return (oldCoordTheSame && transformer) + ? transformer + : (saved.srcCoords = srcCoords, + saved[transformerName] = inverse + ? buildTransformer(destCoords, srcCoords) + : buildTransformer(srcCoords, destCoords)); + } + + function isCanvasEl(el) { + return el.nodeName.toUpperCase() === 'CANVAS'; + } + + var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; + var _calcOut$1 = []; + var firefoxNotSupportOffsetXY = env.browser.firefox + && +env.browser.version.split('.')[0] < 39; + + function clientToLocal(el, e, out, calculate) { + out = out || {}; + if (calculate) { + calculateZrXY(el, e, out); + } else if (firefoxNotSupportOffsetXY + && e.layerX != null + && e.layerX !== e.offsetX) { + out.zrX = e.layerX; + out.zrY = e.layerY; + } else if (e.offsetX != null) { + out.zrX = e.offsetX; + out.zrY = e.offsetY; + } else { + calculateZrXY(el, e, out); + } + return out; + } + + function calculateZrXY(el, e, out) { + if (env.domSupported && el.getBoundingClientRect) { + var ex = e.clientX; + var ey = e.clientY; + if (isCanvasEl(el)) { + var box = el.getBoundingClientRect(); + out.zrX = ex - box.left; + out.zrY = ey - box.top; + return; + } else { + if (transformCoordWithViewport(_calcOut$1, el, ex, ey)) { + out.zrX = _calcOut$1[0]; + out.zrY = _calcOut$1[1]; + return; + } + } + } + out.zrX = out.zrY = 0; + } + + function getNativeEvent(e) { + return e + || window.event; + } + + function normalizeEvent(el, e, calculate) { + e = getNativeEvent(e); + if (e.zrX != null) { + return e; + } + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + if (!isTouch) { + clientToLocal(el, e, e, calculate); + var wheelDelta = getWheelDeltaMayPolyfill(e); + e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3; + } else { + var touch = eventType !== 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + touch && clientToLocal(el, touch, e, calculate); + } + var button = e.button; + if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) { + e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); + } + return e; + } + + function getWheelDeltaMayPolyfill(e) { + var rawWheelDelta = e.wheelDelta; + if (rawWheelDelta) { + return rawWheelDelta; + } + var deltaX = e.deltaX; + var deltaY = e.deltaY; + if (deltaX == null || deltaY == null) { + return rawWheelDelta; + } + var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX); + var sign = deltaY > 0 ? -1 + : deltaY < 0 ? 1 + : deltaX > 0 ? -1 + : 1; + return 3 * delta * sign; + } + + function addEventListener(el, name, handler, opt) { + el.addEventListener(name, handler, opt); + } + + function removeEventListener(el, name, handler, opt) { + el.removeEventListener(name, handler, opt); + } + + var stop = function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + }; + + function isMiddleOrRightButtonOnMouseUpDown(e) { + return e.which === 2 || e.which === 3; + } + + var GestureMgr = (function () { + function GestureMgr() { + this._track = []; + } + + GestureMgr.prototype.recognize = function (event, target, root) { + this._doTrack(event, target, root); + return this._recognize(event); + }; + GestureMgr.prototype.clear = function () { + this._track.length = 0; + return this; + }; + GestureMgr.prototype._doTrack = function (event, target, root) { + var touches = event.touches; + if (!touches) { + return; + } + var trackItem = { + points: [], + touches: [], + target: target, + event: event + }; + for (var i = 0, len = touches.length; i < len; i++) { + var touch = touches[i]; + var pos = clientToLocal(root, touch, {}); + trackItem.points.push([pos.zrX, pos.zrY]); + trackItem.touches.push(touch); + } + this._track.push(trackItem); + }; + GestureMgr.prototype._recognize = function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + }; + return GestureMgr; + }()); + + function dist$1(pointPair) { + var dx = pointPair[1][0] - pointPair[0][0]; + var dy = pointPair[1][1] - pointPair[0][1]; + return Math.sqrt(dx * dx + dy * dy); + } + + function center(pointPair) { + return [ + (pointPair[0][0] + pointPair[1][0]) / 2, + (pointPair[0][1] + pointPair[1][1]) / 2 + ]; + } + + var recognizers = { + pinch: function (tracks, event) { + var trackLen = tracks.length; + if (!trackLen) { + return; + } + var pinchEnd = (tracks[trackLen - 1] || {}).points; + var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd; + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1) { + var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + event.pinchScale = pinchScale; + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + return { + type: 'pinch', + target: tracks[0].target, + event: event + }; + } + } + }; + + var SILENT = 'silent'; + + function makeEventPacket(eveType, targetInfo, event) { + return { + type: eveType, + event: event, + target: targetInfo.target, + topTarget: targetInfo.topTarget, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta, + zrByTouch: event.zrByTouch, + which: event.which, + stop: stopEvent + }; + } + + function stopEvent() { + stop(this.event); + } + + var EmptyProxy = (function (_super) { + __extends(EmptyProxy, _super); + + function EmptyProxy() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.handler = null; + return _this; + } + + EmptyProxy.prototype.dispose = function () { + }; + EmptyProxy.prototype.setCursor = function () { + }; + return EmptyProxy; + }(Eventful)); + var HoveredResult = (function () { + function HoveredResult(x, y) { + this.x = x; + this.y = y; + } + + return HoveredResult; + }()); + var handlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var Handler = (function (_super) { + __extends(Handler, _super); + + function Handler(storage, painter, proxy, painterRoot) { + var _this = _super.call(this) || this; + _this._hovered = new HoveredResult(0, 0); + _this.storage = storage; + _this.painter = painter; + _this.painterRoot = painterRoot; + proxy = proxy || new EmptyProxy(); + _this.proxy = null; + _this.setHandlerProxy(proxy); + _this._draggingMgr = new Draggable(_this); + return _this; + } + + Handler.prototype.setHandlerProxy = function (proxy) { + if (this.proxy) { + this.proxy.dispose(); + } + if (proxy) { + each(handlerNames, function (name) { + proxy.on && proxy.on(name, this[name], this); + }, this); + proxy.handler = this; + } + this.proxy = proxy; + }; + Handler.prototype.mousemove = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var lastHovered = this._hovered; + var lastHoveredTarget = lastHovered.target; + if (lastHoveredTarget && !lastHoveredTarget.__zr) { + lastHovered = this.findHover(lastHovered.x, lastHovered.y); + lastHoveredTarget = lastHovered.target; + } + var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y); + var hoveredTarget = hovered.target; + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default'); + if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(lastHovered, 'mouseout', event); + } + this.dispatchToElement(hovered, 'mousemove', event); + if (hoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(hovered, 'mouseover', event); + } + }; + Handler.prototype.mouseout = function (event) { + var eventControl = event.zrEventControl; + if (eventControl !== 'only_globalout') { + this.dispatchToElement(this._hovered, 'mouseout', event); + } + if (eventControl !== 'no_globalout') { + this.trigger('globalout', {type: 'globalout', event: event}); + } + }; + Handler.prototype.resize = function () { + this._hovered = new HoveredResult(0, 0); + }; + Handler.prototype.dispatch = function (eventName, eventArgs) { + var handler = this[eventName]; + handler && handler.call(this, eventArgs); + }; + Handler.prototype.dispose = function () { + this.proxy.dispose(); + this.storage = null; + this.proxy = null; + this.painter = null; + }; + Handler.prototype.setCursorStyle = function (cursorStyle) { + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(cursorStyle); + }; + Handler.prototype.dispatchToElement = function (targetInfo, eventName, event) { + targetInfo = targetInfo || {}; + var el = targetInfo.target; + if (el && el.silent) { + return; + } + var eventKey = ('on' + eventName); + var eventPacket = makeEventPacket(eventName, targetInfo, event); + while (el) { + el[eventKey] + && (eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket)); + el.trigger(eventName, eventPacket); + el = el.__hostTarget ? el.__hostTarget : el.parent; + if (eventPacket.cancelBubble) { + break; + } + } + if (!eventPacket.cancelBubble) { + this.trigger(eventName, eventPacket); + if (this.painter && this.painter.eachOtherLayer) { + this.painter.eachOtherLayer(function (layer) { + if (typeof (layer[eventKey]) === 'function') { + layer[eventKey].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + } + }; + Handler.prototype.findHover = function (x, y, exclude) { + var list = this.storage.getDisplayList(); + var out = new HoveredResult(x, y); + for (var i = list.length - 1; i >= 0; i--) { + var hoverCheckResult = void 0; + if (list[i] !== exclude + && !list[i].ignore + && (hoverCheckResult = isHover(list[i], x, y))) { + !out.topTarget && (out.topTarget = list[i]); + if (hoverCheckResult !== SILENT) { + out.target = list[i]; + break; + } + } + } + return out; + }; + Handler.prototype.processGesture = function (event, stage) { + if (!this._gestureMgr) { + this._gestureMgr = new GestureMgr(); + } + var gestureMgr = this._gestureMgr; + stage === 'start' && gestureMgr.clear(); + var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom); + stage === 'end' && gestureMgr.clear(); + if (gestureInfo) { + var type = gestureInfo.type; + event.gestureEvent = type; + var res = new HoveredResult(); + res.target = gestureInfo.target; + this.dispatchToElement(res, type, gestureInfo.event); + } + }; + return Handler; + }(Eventful)); + each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) { + Handler.prototype[name] = function (event) { + var x = event.zrX; + var y = event.zrY; + var isOutside = isOutsideBoundary(this, x, y); + var hovered; + var hoveredTarget; + if (name !== 'mouseup' || !isOutside) { + hovered = this.findHover(x, y); + hoveredTarget = hovered.target; + } + if (name === 'mousedown') { + this._downEl = hoveredTarget; + this._downPoint = [event.zrX, event.zrY]; + this._upEl = hoveredTarget; + } else if (name === 'mouseup') { + this._upEl = hoveredTarget; + } else if (name === 'click') { + if (this._downEl !== this._upEl + || !this._downPoint + || dist(this._downPoint, [event.zrX, event.zrY]) > 4) { + return; + } + this._downPoint = null; + } + this.dispatchToElement(hovered, name, event); + }; + }); + + function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var el = displayable; + var isSilent = void 0; + var ignoreClip = false; + while (el) { + if (el.ignoreClip) { + ignoreClip = true; + } + if (!ignoreClip) { + var clipPath = el.getClipPath(); + if (clipPath && !clipPath.contain(x, y)) { + return false; + } + if (el.silent) { + isSilent = true; + } + } + var hostEl = el.__hostTarget; + el = hostEl ? hostEl : el.parent; + } + return isSilent ? SILENT : true; + } + return false; + } + + function isOutsideBoundary(handlerInstance, x, y) { + var painter = handlerInstance.painter; + return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight(); + } + + var DEFAULT_MIN_MERGE = 32; + var DEFAULT_MIN_GALLOPING = 7; + + function minRunLength(n) { + var r = 0; + while (n >= DEFAULT_MIN_MERGE) { + r |= n & 1; + n >>= 1; + } + return n + r; + } + + function makeAscendingRun(array, lo, hi, compare) { + var runHi = lo + 1; + if (runHi === hi) { + return 1; + } + if (compare(array[runHi++], array[lo]) < 0) { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) { + runHi++; + } + reverseRun(array, lo, runHi); + } else { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) { + runHi++; + } + } + return runHi - lo; + } + + function reverseRun(array, lo, hi) { + hi--; + while (lo < hi) { + var t = array[lo]; + array[lo++] = array[hi]; + array[hi--] = t; + } + } + + function binaryInsertionSort(array, lo, hi, start, compare) { + if (start === lo) { + start++; + } + for (; start < hi; start++) { + var pivot = array[start]; + var left = lo; + var right = start; + var mid; + while (left < right) { + mid = left + right >>> 1; + if (compare(pivot, array[mid]) < 0) { + right = mid; + } else { + left = mid + 1; + } + } + var n = start - left; + switch (n) { + case 3: + array[left + 3] = array[left + 2]; + case 2: + array[left + 2] = array[left + 1]; + case 1: + array[left + 1] = array[left]; + break; + default: + while (n > 0) { + array[left + n] = array[left + n - 1]; + n--; + } + } + array[left] = pivot; + } + } + + function gallopLeft(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) > 0) { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } else { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) > 0) { + lastOffset = m + 1; + } else { + offset = m; + } + } + return offset; + } + + function gallopRight(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + if (compare(value, array[start + hint]) < 0) { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } else { + maxOffset = length - hint; + while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + lastOffset += hint; + offset += hint; + } + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + if (compare(value, array[start + m]) < 0) { + offset = m; + } else { + lastOffset = m + 1; + } + } + return offset; + } + + function TimSort(array, compare) { + var minGallop = DEFAULT_MIN_GALLOPING; + var length = 0; + var runStart; + var runLength; + var stackSize = 0; + length = array.length; + var tmp = []; + runStart = []; + runLength = []; + + function pushRun(_runStart, _runLength) { + runStart[stackSize] = _runStart; + runLength[stackSize] = _runLength; + stackSize += 1; + } + + function mergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1]) + || (n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) { + if (runLength[n - 1] < runLength[n + 1]) { + n--; + } + } else if (runLength[n] > runLength[n + 1]) { + break; + } + mergeAt(n); + } + } + + function forceMergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + if (n > 0 && runLength[n - 1] < runLength[n + 1]) { + n--; + } + mergeAt(n); + } + } + + function mergeAt(i) { + var start1 = runStart[i]; + var length1 = runLength[i]; + var start2 = runStart[i + 1]; + var length2 = runLength[i + 1]; + runLength[i] = length1 + length2; + if (i === stackSize - 3) { + runStart[i + 1] = runStart[i + 2]; + runLength[i + 1] = runLength[i + 2]; + } + stackSize--; + var k = gallopRight(array[start2], array, start1, length1, 0, compare); + start1 += k; + length1 -= k; + if (length1 === 0) { + return; + } + length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare); + if (length2 === 0) { + return; + } + if (length1 <= length2) { + mergeLow(start1, length1, start2, length2); + } else { + mergeHigh(start1, length1, start2, length2); + } + } + + function mergeLow(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length1; i++) { + tmp[i] = array[start1 + i]; + } + var cursor1 = 0; + var cursor2 = start2; + var dest = start1; + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + return; + } + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + return; + } + var _minGallop = minGallop; + var count1; + var count2; + var exit; + while (1) { + count1 = 0; + count2 = 0; + exit = false; + do { + if (compare(array[cursor2], tmp[cursor1]) < 0) { + array[dest++] = array[cursor2++]; + count2++; + count1 = 0; + if (--length2 === 0) { + exit = true; + break; + } + } else { + array[dest++] = tmp[cursor1++]; + count1++; + count2 = 0; + if (--length1 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare); + if (count1 !== 0) { + for (i = 0; i < count1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + dest += count1; + cursor1 += count1; + length1 -= count1; + if (length1 <= 1) { + exit = true; + break; + } + } + array[dest++] = array[cursor2++]; + if (--length2 === 0) { + exit = true; + break; + } + count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare); + if (count2 !== 0) { + for (i = 0; i < count2; i++) { + array[dest + i] = array[cursor2 + i]; + } + dest += count2; + cursor2 += count2; + length2 -= count2; + if (length2 === 0) { + exit = true; + break; + } + } + array[dest++] = tmp[cursor1++]; + if (--length1 === 1) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + minGallop < 1 && (minGallop = 1); + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + } else if (length1 === 0) { + throw new Error(); + } else { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + } + } + + function mergeHigh(start1, length1, start2, length2) { + var i = 0; + for (i = 0; i < length2; i++) { + tmp[i] = array[start2 + i]; + } + var cursor1 = start1 + length1 - 1; + var cursor2 = length2 - 1; + var dest = start2 + length2 - 1; + var customCursor = 0; + var customDest = 0; + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + return; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + return; + } + var _minGallop = minGallop; + while (true) { + var count1 = 0; + var count2 = 0; + var exit = false; + do { + if (compare(tmp[cursor2], array[cursor1]) < 0) { + array[dest--] = array[cursor1--]; + count1++; + count2 = 0; + if (--length1 === 0) { + exit = true; + break; + } + } else { + array[dest--] = tmp[cursor2--]; + count2++; + count1 = 0; + if (--length2 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + if (exit) { + break; + } + do { + count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare); + if (count1 !== 0) { + dest -= count1; + cursor1 -= count1; + length1 -= count1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = count1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + if (length1 === 0) { + exit = true; + break; + } + } + array[dest--] = tmp[cursor2--]; + if (--length2 === 1) { + exit = true; + break; + } + count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare); + if (count2 !== 0) { + dest -= count2; + cursor2 -= count2; + length2 -= count2; + customDest = dest + 1; + customCursor = cursor2 + 1; + for (i = 0; i < count2; i++) { + array[customDest + i] = tmp[customCursor + i]; + } + if (length2 <= 1) { + exit = true; + break; + } + } + array[dest--] = array[cursor1--]; + if (--length1 === 0) { + exit = true; + break; + } + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + if (exit) { + break; + } + if (_minGallop < 0) { + _minGallop = 0; + } + _minGallop += 2; + } + minGallop = _minGallop; + if (minGallop < 1) { + minGallop = 1; + } + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + array[dest] = tmp[cursor2]; + } else if (length2 === 0) { + throw new Error(); + } else { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + } + } + + return { + mergeRuns: mergeRuns, + forceMergeRuns: forceMergeRuns, + pushRun: pushRun + }; + } + + function sort(array, compare, lo, hi) { + if (!lo) { + lo = 0; + } + if (!hi) { + hi = array.length; + } + var remaining = hi - lo; + if (remaining < 2) { + return; + } + var runLength = 0; + if (remaining < DEFAULT_MIN_MERGE) { + runLength = makeAscendingRun(array, lo, hi, compare); + binaryInsertionSort(array, lo, hi, lo + runLength, compare); + return; + } + var ts = TimSort(array, compare); + var minRun = minRunLength(remaining); + do { + runLength = makeAscendingRun(array, lo, hi, compare); + if (runLength < minRun) { + var force = remaining; + if (force > minRun) { + force = minRun; + } + binaryInsertionSort(array, lo, lo + force, lo + runLength, compare); + runLength = force; + } + ts.pushRun(lo, runLength); + ts.mergeRuns(); + remaining -= runLength; + lo += runLength; + } while (remaining !== 0); + ts.forceMergeRuns(); + } + + var REDRAW_BIT = 1; + var STYLE_CHANGED_BIT = 2; + var SHAPE_CHANGED_BIT = 4; + + var invalidZErrorLogged = false; + + function logInvalidZError() { + if (invalidZErrorLogged) { + return; + } + invalidZErrorLogged = true; + console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors'); + } + + function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; + } + + var Storage = (function () { + function Storage() { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + this.displayableSortFunc = shapeCompareFunc; + } + + Storage.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._roots.length; i++) { + this._roots[i].traverse(cb, context); + } + }; + Storage.prototype.getDisplayList = function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + var displayList = this._displayList; + if (update || !displayList.length) { + this.updateDisplayList(includeIgnore); + } + return displayList; + }; + Storage.prototype.updateDisplayList = function (includeIgnore) { + this._displayListLen = 0; + var roots = this._roots; + var displayList = this._displayList; + for (var i = 0, len = roots.length; i < len; i++) { + this._updateAndAddDisplayable(roots[i], null, includeIgnore); + } + displayList.length = this._displayListLen; + sort(displayList, shapeCompareFunc); + }; + Storage.prototype._updateAndAddDisplayable = function (el, clipPaths, includeIgnore) { + if (el.ignore && !includeIgnore) { + return; + } + el.beforeUpdate(); + el.update(); + el.afterUpdate(); + var userSetClipPath = el.getClipPath(); + if (el.ignoreClip) { + clipPaths = null; + } else if (userSetClipPath) { + if (clipPaths) { + clipPaths = clipPaths.slice(); + } else { + clipPaths = []; + } + var currentClipPath = userSetClipPath; + var parentClipPath = el; + while (currentClipPath) { + currentClipPath.parent = parentClipPath; + currentClipPath.updateTransform(); + clipPaths.push(currentClipPath); + parentClipPath = currentClipPath; + currentClipPath = currentClipPath.getClipPath(); + } + } + if (el.childrenRef) { + var children = el.childrenRef(); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (el.__dirty) { + child.__dirty |= REDRAW_BIT; + } + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + el.__dirty = 0; + } else { + var disp = el; + if (clipPaths && clipPaths.length) { + disp.__clipPaths = clipPaths; + } else if (disp.__clipPaths && disp.__clipPaths.length > 0) { + disp.__clipPaths = []; + } + if (isNaN(disp.z)) { + logInvalidZError(); + disp.z = 0; + } + if (isNaN(disp.z2)) { + logInvalidZError(); + disp.z2 = 0; + } + if (isNaN(disp.zlevel)) { + logInvalidZError(); + disp.zlevel = 0; + } + this._displayList[this._displayListLen++] = disp; + } + var decalEl = el.getDecalElement && el.getDecalElement(); + if (decalEl) { + this._updateAndAddDisplayable(decalEl, clipPaths, includeIgnore); + } + var textGuide = el.getTextGuideLine(); + if (textGuide) { + this._updateAndAddDisplayable(textGuide, clipPaths, includeIgnore); + } + var textEl = el.getTextContent(); + if (textEl) { + this._updateAndAddDisplayable(textEl, clipPaths, includeIgnore); + } + }; + Storage.prototype.addRoot = function (el) { + if (el.__zr && el.__zr.storage === this) { + return; + } + this._roots.push(el); + }; + Storage.prototype.delRoot = function (el) { + if (el instanceof Array) { + for (var i = 0, l = el.length; i < l; i++) { + this.delRoot(el[i]); + } + return; + } + var idx = indexOf(this._roots, el); + if (idx >= 0) { + this._roots.splice(idx, 1); + } + }; + Storage.prototype.delAllRoots = function () { + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + return; + }; + Storage.prototype.getRoots = function () { + return this._roots; + }; + Storage.prototype.dispose = function () { + this._displayList = null; + this._roots = null; + }; + return Storage; + }()); + + var requestAnimationFrame; + requestAnimationFrame = (env.hasGlobalWindow + && ((window.requestAnimationFrame && window.requestAnimationFrame.bind(window)) + || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window)) + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame)) || function (func) { + return setTimeout(func, 16); + }; + var requestAnimationFrame$1 = requestAnimationFrame; + + var easingFuncs = { + linear: function (k) { + return k; + }, + quadraticIn: function (k) { + return k * k; + }, + quadraticOut: function (k) { + return k * (2 - k); + }, + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + cubicIn: function (k) { + return k * k * k; + }, + cubicOut: function (k) { + return --k * k * k + 1; + }, + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + quarticIn: function (k) { + return k * k * k * k; + }, + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + quinticIn: function (k) { + return k * k * k * k * k; + }, + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + quinticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }, + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + exponentialInOut: function (k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }, + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + circularInOut: function (k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }, + elasticIn: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + }, + elasticOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) + * Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }, + elasticInOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + backInOut: function (k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }, + bounceIn: function (k) { + return 1 - easingFuncs.bounceOut(1 - k); + }, + bounceOut: function (k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }, + bounceInOut: function (k) { + if (k < 0.5) { + return easingFuncs.bounceIn(k * 2) * 0.5; + } + return easingFuncs.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } + }; + + var mathPow = Math.pow; + var mathSqrt = Math.sqrt; + var EPSILON = 1e-8; + var EPSILON_NUMERIC = 1e-4; + var THREE_SQRT = mathSqrt(3); + var ONE_THIRD = 1 / 3; + var _v0 = create(); + var _v1 = create(); + var _v2 = create(); + + function isAroundZero(val) { + return val > -EPSILON && val < EPSILON; + } + + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + + function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); + } + + function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t); + } + + function cubicRootAt(p0, p1, p2, p3, val, roots) { + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + var n = 0; + if (isAroundZero(A) && isAroundZero(B)) { + if (isAroundZero(b)) { + roots[0] = 0; + } else { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } else { + var disc = B * B - 4 * A * C; + if (isAroundZero(disc)) { + var K = B / A; + var t1 = -b / a + K; + var t2 = -K / 2; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -mathPow(-Y1, ONE_THIRD); + } else { + Y1 = mathPow(Y1, ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -mathPow(-Y2, ONE_THIRD); + } else { + Y2 = mathPow(Y2, ONE_THIRD); + } + var t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } else { + var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = mathSqrt(A); + var tmp = Math.cos(theta); + var t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a); + var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; + } + + function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + } + } else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; + } + + function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + var p0123 = (p123 - p012) * t + p012; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + + function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + _v0[0] = x; + _v0[1] = y; + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = cubicAt(x0, x1, x2, x3, _t); + _v1[1] = cubicAt(y0, y1, y2, y3, _t); + d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } else { + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } else { + interval *= 0.5; + } + } + } + if (out) { + out[0] = cubicAt(x0, x1, x2, x3, t); + out[1] = cubicAt(y0, y1, y2, y3, t); + } + return mathSqrt(d); + } + + function cubicLength(x0, y0, x1, y1, x2, y2, x3, y3, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = cubicAt(x0, x1, x2, x3, t); + var y = cubicAt(y0, y1, y2, y3, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; + } + + function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + + function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + + function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + var t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; + } + + function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + return 0.5; + } else { + return (p0 - p1) / divider; + } + } + + function quadraticSubdivide(p0, p1, p2, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p012 = (p12 - p01) * t + p01; + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p012; + out[4] = p12; + out[5] = p2; + } + + function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) { + var t; + var interval = 0.005; + var d = Infinity; + _v0[0] = x; + _v0[1] = y; + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = quadraticAt(x0, x1, x2, _t); + _v1[1] = quadraticAt(y0, y1, y2, _t); + var d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + var d1 = distSquare(_v1, _v0); + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } else { + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } else { + interval *= 0.5; + } + } + } + if (out) { + out[0] = quadraticAt(x0, x1, x2, t); + out[1] = quadraticAt(y0, y1, y2, t); + } + return mathSqrt(d); + } + + function quadraticLength(x0, y0, x1, y1, x2, y2, iteration) { + var px = x0; + var py = y0; + var d = 0; + var step = 1 / iteration; + for (var i = 1; i <= iteration; i++) { + var t = i * step; + var x = quadraticAt(x0, x1, x2, t); + var y = quadraticAt(y0, y1, y2, t); + var dx = x - px; + var dy = y - py; + d += Math.sqrt(dx * dx + dy * dy); + px = x; + py = y; + } + return d; + } + + var regexp = /cubic-bezier\(([0-9,\.e ]+)\)/; + + function createCubicEasingFunc(cubicEasingStr) { + var cubic = cubicEasingStr && regexp.exec(cubicEasingStr); + if (cubic) { + var points = cubic[1].split(','); + var a_1 = +trim(points[0]); + var b_1 = +trim(points[1]); + var c_1 = +trim(points[2]); + var d_1 = +trim(points[3]); + if (isNaN(a_1 + b_1 + c_1 + d_1)) { + return; + } + var roots_1 = []; + return function (p) { + return p <= 0 + ? 0 : p >= 1 + ? 1 + : cubicRootAt(0, a_1, c_1, 1, p, roots_1) && cubicAt(0, b_1, d_1, 1, roots_1[0]); + }; + } + } + + var Clip = (function () { + function Clip(opts) { + this._inited = false; + this._startTime = 0; + this._pausedTime = 0; + this._paused = false; + this._life = opts.life || 1000; + this._delay = opts.delay || 0; + this.loop = opts.loop || false; + this.onframe = opts.onframe || noop; + this.ondestroy = opts.ondestroy || noop; + this.onrestart = opts.onrestart || noop; + opts.easing && this.setEasing(opts.easing); + } + + Clip.prototype.step = function (globalTime, deltaTime) { + if (!this._inited) { + this._startTime = globalTime + this._delay; + this._inited = true; + } + if (this._paused) { + this._pausedTime += deltaTime; + return; + } + var life = this._life; + var elapsedTime = globalTime - this._startTime - this._pausedTime; + var percent = elapsedTime / life; + if (percent < 0) { + percent = 0; + } + percent = Math.min(percent, 1); + var easingFunc = this.easingFunc; + var schedule = easingFunc ? easingFunc(percent) : percent; + this.onframe(schedule); + if (percent === 1) { + if (this.loop) { + var remainder = elapsedTime % life; + this._startTime = globalTime - remainder; + this._pausedTime = 0; + this.onrestart(); + } else { + return true; + } + } + return false; + }; + Clip.prototype.pause = function () { + this._paused = true; + }; + Clip.prototype.resume = function () { + this._paused = false; + }; + Clip.prototype.setEasing = function (easing) { + this.easing = easing; + this.easingFunc = isFunction(easing) + ? easing + : easingFuncs[easing] || createCubicEasingFunc(easing); + }; + return Clip; + }()); + + var Entry = (function () { + function Entry(val) { + this.value = val; + } + + return Entry; + }()); + var LinkedList = (function () { + function LinkedList() { + this._len = 0; + } + + LinkedList.prototype.insert = function (val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; + }; + LinkedList.prototype.insertEntry = function (entry) { + if (!this.head) { + this.head = this.tail = entry; + } else { + this.tail.next = entry; + entry.prev = this.tail; + entry.next = null; + this.tail = entry; + } + this._len++; + }; + LinkedList.prototype.remove = function (entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } else { + this.head = next; + } + if (next) { + next.prev = prev; + } else { + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; + }; + LinkedList.prototype.len = function () { + return this._len; + }; + LinkedList.prototype.clear = function () { + this.head = this.tail = null; + this._len = 0; + }; + return LinkedList; + }()); + var LRU = (function () { + function LRU(maxSize) { + this._list = new LinkedList(); + this._maxSize = 10; + this._map = {}; + this._maxSize = maxSize; + } + + LRU.prototype.put = function (key, value) { + var list = this._list; + var map = this._map; + var removed = null; + if (map[key] == null) { + var len = list.len(); + var entry = this._lastRemovedEntry; + if (len >= this._maxSize && len > 0) { + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + removed = leastUsedEntry.value; + this._lastRemovedEntry = leastUsedEntry; + } + if (entry) { + entry.value = value; + } else { + entry = new Entry(value); + } + entry.key = key; + list.insertEntry(entry); + map[key] = entry; + } + return removed; + }; + LRU.prototype.get = function (key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + return entry.value; + } + }; + LRU.prototype.clear = function () { + this._list.clear(); + this._map = {}; + }; + LRU.prototype.len = function () { + return this._list.len(); + }; + return LRU; + }()); + + var kCSSColorTable = { + 'transparent': [0, 0, 0, 0], 'aliceblue': [240, 248, 255, 1], + 'antiquewhite': [250, 235, 215, 1], 'aqua': [0, 255, 255, 1], + 'aquamarine': [127, 255, 212, 1], 'azure': [240, 255, 255, 1], + 'beige': [245, 245, 220, 1], 'bisque': [255, 228, 196, 1], + 'black': [0, 0, 0, 1], 'blanchedalmond': [255, 235, 205, 1], + 'blue': [0, 0, 255, 1], 'blueviolet': [138, 43, 226, 1], + 'brown': [165, 42, 42, 1], 'burlywood': [222, 184, 135, 1], + 'cadetblue': [95, 158, 160, 1], 'chartreuse': [127, 255, 0, 1], + 'chocolate': [210, 105, 30, 1], 'coral': [255, 127, 80, 1], + 'cornflowerblue': [100, 149, 237, 1], 'cornsilk': [255, 248, 220, 1], + 'crimson': [220, 20, 60, 1], 'cyan': [0, 255, 255, 1], + 'darkblue': [0, 0, 139, 1], 'darkcyan': [0, 139, 139, 1], + 'darkgoldenrod': [184, 134, 11, 1], 'darkgray': [169, 169, 169, 1], + 'darkgreen': [0, 100, 0, 1], 'darkgrey': [169, 169, 169, 1], + 'darkkhaki': [189, 183, 107, 1], 'darkmagenta': [139, 0, 139, 1], + 'darkolivegreen': [85, 107, 47, 1], 'darkorange': [255, 140, 0, 1], + 'darkorchid': [153, 50, 204, 1], 'darkred': [139, 0, 0, 1], + 'darksalmon': [233, 150, 122, 1], 'darkseagreen': [143, 188, 143, 1], + 'darkslateblue': [72, 61, 139, 1], 'darkslategray': [47, 79, 79, 1], + 'darkslategrey': [47, 79, 79, 1], 'darkturquoise': [0, 206, 209, 1], + 'darkviolet': [148, 0, 211, 1], 'deeppink': [255, 20, 147, 1], + 'deepskyblue': [0, 191, 255, 1], 'dimgray': [105, 105, 105, 1], + 'dimgrey': [105, 105, 105, 1], 'dodgerblue': [30, 144, 255, 1], + 'firebrick': [178, 34, 34, 1], 'floralwhite': [255, 250, 240, 1], + 'forestgreen': [34, 139, 34, 1], 'fuchsia': [255, 0, 255, 1], + 'gainsboro': [220, 220, 220, 1], 'ghostwhite': [248, 248, 255, 1], + 'gold': [255, 215, 0, 1], 'goldenrod': [218, 165, 32, 1], + 'gray': [128, 128, 128, 1], 'green': [0, 128, 0, 1], + 'greenyellow': [173, 255, 47, 1], 'grey': [128, 128, 128, 1], + 'honeydew': [240, 255, 240, 1], 'hotpink': [255, 105, 180, 1], + 'indianred': [205, 92, 92, 1], 'indigo': [75, 0, 130, 1], + 'ivory': [255, 255, 240, 1], 'khaki': [240, 230, 140, 1], + 'lavender': [230, 230, 250, 1], 'lavenderblush': [255, 240, 245, 1], + 'lawngreen': [124, 252, 0, 1], 'lemonchiffon': [255, 250, 205, 1], + 'lightblue': [173, 216, 230, 1], 'lightcoral': [240, 128, 128, 1], + 'lightcyan': [224, 255, 255, 1], 'lightgoldenrodyellow': [250, 250, 210, 1], + 'lightgray': [211, 211, 211, 1], 'lightgreen': [144, 238, 144, 1], + 'lightgrey': [211, 211, 211, 1], 'lightpink': [255, 182, 193, 1], + 'lightsalmon': [255, 160, 122, 1], 'lightseagreen': [32, 178, 170, 1], + 'lightskyblue': [135, 206, 250, 1], 'lightslategray': [119, 136, 153, 1], + 'lightslategrey': [119, 136, 153, 1], 'lightsteelblue': [176, 196, 222, 1], + 'lightyellow': [255, 255, 224, 1], 'lime': [0, 255, 0, 1], + 'limegreen': [50, 205, 50, 1], 'linen': [250, 240, 230, 1], + 'magenta': [255, 0, 255, 1], 'maroon': [128, 0, 0, 1], + 'mediumaquamarine': [102, 205, 170, 1], 'mediumblue': [0, 0, 205, 1], + 'mediumorchid': [186, 85, 211, 1], 'mediumpurple': [147, 112, 219, 1], + 'mediumseagreen': [60, 179, 113, 1], 'mediumslateblue': [123, 104, 238, 1], + 'mediumspringgreen': [0, 250, 154, 1], 'mediumturquoise': [72, 209, 204, 1], + 'mediumvioletred': [199, 21, 133, 1], 'midnightblue': [25, 25, 112, 1], + 'mintcream': [245, 255, 250, 1], 'mistyrose': [255, 228, 225, 1], + 'moccasin': [255, 228, 181, 1], 'navajowhite': [255, 222, 173, 1], + 'navy': [0, 0, 128, 1], 'oldlace': [253, 245, 230, 1], + 'olive': [128, 128, 0, 1], 'olivedrab': [107, 142, 35, 1], + 'orange': [255, 165, 0, 1], 'orangered': [255, 69, 0, 1], + 'orchid': [218, 112, 214, 1], 'palegoldenrod': [238, 232, 170, 1], + 'palegreen': [152, 251, 152, 1], 'paleturquoise': [175, 238, 238, 1], + 'palevioletred': [219, 112, 147, 1], 'papayawhip': [255, 239, 213, 1], + 'peachpuff': [255, 218, 185, 1], 'peru': [205, 133, 63, 1], + 'pink': [255, 192, 203, 1], 'plum': [221, 160, 221, 1], + 'powderblue': [176, 224, 230, 1], 'purple': [128, 0, 128, 1], + 'red': [255, 0, 0, 1], 'rosybrown': [188, 143, 143, 1], + 'royalblue': [65, 105, 225, 1], 'saddlebrown': [139, 69, 19, 1], + 'salmon': [250, 128, 114, 1], 'sandybrown': [244, 164, 96, 1], + 'seagreen': [46, 139, 87, 1], 'seashell': [255, 245, 238, 1], + 'sienna': [160, 82, 45, 1], 'silver': [192, 192, 192, 1], + 'skyblue': [135, 206, 235, 1], 'slateblue': [106, 90, 205, 1], + 'slategray': [112, 128, 144, 1], 'slategrey': [112, 128, 144, 1], + 'snow': [255, 250, 250, 1], 'springgreen': [0, 255, 127, 1], + 'steelblue': [70, 130, 180, 1], 'tan': [210, 180, 140, 1], + 'teal': [0, 128, 128, 1], 'thistle': [216, 191, 216, 1], + 'tomato': [255, 99, 71, 1], 'turquoise': [64, 224, 208, 1], + 'violet': [238, 130, 238, 1], 'wheat': [245, 222, 179, 1], + 'white': [255, 255, 255, 1], 'whitesmoke': [245, 245, 245, 1], + 'yellow': [255, 255, 0, 1], 'yellowgreen': [154, 205, 50, 1] + }; + + function clampCssByte(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 255 ? 255 : i; + } + + function clampCssAngle(i) { + i = Math.round(i); + return i < 0 ? 0 : i > 360 ? 360 : i; + } + + function clampCssFloat(f) { + return f < 0 ? 0 : f > 1 ? 1 : f; + } + + function parseCssInt(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); + } + + function parseCssFloat(val) { + var str = val; + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssFloat(parseFloat(str) / 100); + } + return clampCssFloat(parseFloat(str)); + } + + function cssHueToRgb(m1, m2, h) { + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + } + return m1; + } + + function lerpNumber(a, b, p) { + return a + (b - a) * p; + } + + function setRgba(out, r, g, b, a) { + out[0] = r; + out[1] = g; + out[2] = b; + out[3] = a; + return out; + } + + function copyRgba(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + + var colorCache = new LRU(20); + var lastRemovedArr = null; + + function putToCache(colorStr, rgbaArr) { + if (lastRemovedArr) { + copyRgba(lastRemovedArr, rgbaArr); + } + lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice())); + } + + function parse(colorStr, rgbaArr) { + if (!colorStr) { + return; + } + rgbaArr = rgbaArr || []; + var cached = colorCache.get(colorStr); + if (cached) { + return copyRgba(rgbaArr, cached); + } + colorStr = colorStr + ''; + var str = colorStr.replace(/ /g, '').toLowerCase(); + if (str in kCSSColorTable) { + copyRgba(rgbaArr, kCSSColorTable[str]); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + var strLen = str.length; + if (str.charAt(0) === '#') { + if (strLen === 4 || strLen === 5) { + var iv = parseInt(str.slice(1, 4), 16); + if (!(iv >= 0 && iv <= 0xfff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), strLen === 5 ? parseInt(str.slice(4), 16) / 0xf : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } else if (strLen === 7 || strLen === 9) { + var iv = parseInt(str.slice(1, 7), 16); + if (!(iv >= 0 && iv <= 0xffffff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, strLen === 9 ? parseInt(str.slice(7), 16) / 0xff : 1); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + return; + } + var op = str.indexOf('('); + var ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === strLen) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; + switch (fname) { + case 'rgba': + if (params.length !== 4) { + return params.length === 3 + ? setRgba(rgbaArr, +params[0], +params[1], +params[2], 1) + : setRgba(rgbaArr, 0, 0, 0, 1); + } + alpha = parseCssFloat(params.pop()); + case 'rgb': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), alpha); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsla': + if (params.length !== 4) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + params[3] = parseCssFloat(params[3]); + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsl': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + default: + return; + } + } + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + + function hsla2rgba(hsla, rgba) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; + var s = parseCssFloat(hsla[1]); + var l = parseCssFloat(hsla[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + rgba = rgba || []; + setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1); + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + return rgba; + } + + function rgba2hsla(rgba) { + if (!rgba) { + return; + } + var R = rgba[0] / 255; + var G = rgba[1] / 255; + var B = rgba[2] / 255; + var vMin = Math.min(R, G, B); + var vMax = Math.max(R, G, B); + var delta = vMax - vMin; + var L = (vMax + vMin) / 2; + var H; + var S; + if (delta === 0) { + H = 0; + S = 0; + } else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } else { + S = delta / (2 - vMax - vMin); + } + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + if (R === vMax) { + H = deltaB - deltaG; + } else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + if (H < 0) { + H += 1; + } + if (H > 1) { + H -= 1; + } + } + var hsla = [H * 360, S, L]; + if (rgba[3] != null) { + hsla.push(rgba[3]); + } + return hsla; + } + + function lift(color, level) { + var colorArr = parse(color); + if (colorArr) { + for (var i = 0; i < 3; i++) { + if (level < 0) { + colorArr[i] = colorArr[i] * (1 - level) | 0; + } else { + colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0; + } + if (colorArr[i] > 255) { + colorArr[i] = 255; + } else if (colorArr[i] < 0) { + colorArr[i] = 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } + } + + function toHex(color) { + var colorArr = parse(color); + if (colorArr) { + return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1); + } + } + + function fastLerp(normalizedValue, colors, out) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1)) { + return; + } + out = out || []; + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = colors[leftIndex]; + var rightColor = colors[rightIndex]; + var dv = value - leftIndex; + out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)); + out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)); + out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)); + out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)); + return out; + } + + var fastMapToColor = fastLerp; + + function lerp$1(normalizedValue, colors, fullOutput) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1)) { + return; + } + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = parse(colors[leftIndex]); + var rightColor = parse(colors[rightIndex]); + var dv = value - leftIndex; + var color = stringify([ + clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)), + clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)), + clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)) + ], 'rgba'); + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; + } + + var mapToColor = lerp$1; + + function modifyHSL(color, h, s, l) { + var colorArr = parse(color); + if (color) { + colorArr = rgba2hsla(colorArr); + h != null && (colorArr[0] = clampCssAngle(h)); + s != null && (colorArr[1] = parseCssFloat(s)); + l != null && (colorArr[2] = parseCssFloat(l)); + return stringify(hsla2rgba(colorArr), 'rgba'); + } + } + + function modifyAlpha(color, alpha) { + var colorArr = parse(color); + if (colorArr && alpha != null) { + colorArr[3] = clampCssFloat(alpha); + return stringify(colorArr, 'rgba'); + } + } + + function stringify(arrColor, type) { + if (!arrColor || !arrColor.length) { + return; + } + var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2]; + if (type === 'rgba' || type === 'hsva' || type === 'hsla') { + colorStr += ',' + arrColor[3]; + } + return type + '(' + colorStr + ')'; + } + + function lum(color, backgroundLum) { + var arr = parse(color); + return arr + ? (0.299 * arr[0] + 0.587 * arr[1] + 0.114 * arr[2]) * arr[3] / 255 + + (1 - arr[3]) * backgroundLum + : 0; + } + + function random() { + return stringify([ + Math.round(Math.random() * 255), + Math.round(Math.random() * 255), + Math.round(Math.random() * 255) + ], 'rgb'); + } + + var color = /*#__PURE__*/Object.freeze({ + __proto__: null, + parse: parse, + lift: lift, + toHex: toHex, + fastLerp: fastLerp, + fastMapToColor: fastMapToColor, + lerp: lerp$1, + mapToColor: mapToColor, + modifyHSL: modifyHSL, + modifyAlpha: modifyAlpha, + stringify: stringify, + lum: lum, + random: random + }); + + var mathRound = Math.round; + + function normalizeColor(color) { + var opacity; + if (!color || color === 'transparent') { + color = 'none'; + } else if (typeof color === 'string' && color.indexOf('rgba') > -1) { + var arr = parse(color); + if (arr) { + color = 'rgb(' + arr[0] + ',' + arr[1] + ',' + arr[2] + ')'; + opacity = arr[3]; + } + } + return { + color: color, + opacity: opacity == null ? 1 : opacity + }; + } + + var EPSILON$1 = 1e-4; + + function isAroundZero$1(transform) { + return transform < EPSILON$1 && transform > -EPSILON$1; + } + + function round3(transform) { + return mathRound(transform * 1e3) / 1e3; + } + + function round4(transform) { + return mathRound(transform * 1e4) / 1e4; + } + + function getMatrixStr(m) { + return 'matrix(' + + round3(m[0]) + ',' + + round3(m[1]) + ',' + + round3(m[2]) + ',' + + round3(m[3]) + ',' + + round4(m[4]) + ',' + + round4(m[5]) + + ')'; + } + + var TEXT_ALIGN_TO_ANCHOR = { + left: 'start', + right: 'end', + center: 'middle', + middle: 'middle' + }; + + function adjustTextY(y, lineHeight, textBaseline) { + if (textBaseline === 'top') { + y += lineHeight / 2; + } else if (textBaseline === 'bottom') { + y -= lineHeight / 2; + } + return y; + } + + function hasShadow(style) { + return style + && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY); + } + + function getShadowKey(displayable) { + var style = displayable.style; + var globalScale = displayable.getGlobalScale(); + return [ + style.shadowColor, + (style.shadowBlur || 0).toFixed(2), + (style.shadowOffsetX || 0).toFixed(2), + (style.shadowOffsetY || 0).toFixed(2), + globalScale[0], + globalScale[1] + ].join(','); + } + + function isImagePattern(val) { + return val && (!!val.image); + } + + function isSVGPattern(val) { + return val && (!!val.svgElement); + } + + function isPattern(val) { + return isImagePattern(val) || isSVGPattern(val); + } + + function isLinearGradient(val) { + return val.type === 'linear'; + } + + function isRadialGradient(val) { + return val.type === 'radial'; + } + + function isGradient(val) { + return val && (val.type === 'linear' + || val.type === 'radial'); + } + + function getIdURL(id) { + return "url(#" + id + ")"; + } + + function getPathPrecision(el) { + var scale = el.getGlobalScale(); + var size = Math.max(scale[0], scale[1]); + return Math.max(Math.ceil(Math.log(size) / Math.log(10)), 1); + } + + function getSRTTransformString(transform) { + var x = transform.x || 0; + var y = transform.y || 0; + var rotation = (transform.rotation || 0) * RADIAN_TO_DEGREE; + var scaleX = retrieve2(transform.scaleX, 1); + var scaleY = retrieve2(transform.scaleY, 1); + var skewX = transform.skewX || 0; + var skewY = transform.skewY || 0; + var res = []; + if (x || y) { + res.push("translate(" + x + "px," + y + "px)"); + } + if (rotation) { + res.push("rotate(" + rotation + ")"); + } + if (scaleX !== 1 || scaleY !== 1) { + res.push("scale(" + scaleX + "," + scaleY + ")"); + } + if (skewX || skewY) { + res.push("skew(" + mathRound(skewX * RADIAN_TO_DEGREE) + "deg, " + mathRound(skewY * RADIAN_TO_DEGREE) + "deg)"); + } + return res.join(' '); + } + + var encodeBase64 = (function () { + if (env.hasGlobalWindow && isFunction(window.btoa)) { + return function (str) { + return window.btoa(unescape(str)); + }; + } + if (typeof Buffer !== 'undefined') { + return function (str) { + return Buffer.from(str).toString('base64'); + }; + } + return function (str) { + if ("development" !== 'production') { + logError('Base64 isn\'t natively supported in the current environment.'); + } + return null; + }; + })(); + + var arraySlice = Array.prototype.slice; + + function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + + function interpolate1DArray(out, p0, p1, percent) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber(p0[i], p1[i], percent); + } + return out; + } + + function interpolate2DArray(out, p0, p1, percent) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent); + } + } + return out; + } + + function add1DArray(out, p0, p1, sign) { + var len = p0.length; + for (var i = 0; i < len; i++) { + out[i] = p0[i] + p1[i] * sign; + } + return out; + } + + function add2DArray(out, p0, p1, sign) { + var len = p0.length; + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + if (!out[i]) { + out[i] = []; + } + for (var j = 0; j < len2; j++) { + out[i][j] = p0[i][j] + p1[i][j] * sign; + } + } + return out; + } + + function fillColorStops(val0, val1) { + var len0 = val0.length; + var len1 = val1.length; + var shorterArr = len0 > len1 ? val1 : val0; + var shorterLen = Math.min(len0, len1); + var last = shorterArr[shorterLen - 1] || {color: [0, 0, 0, 0], offset: 0}; + for (var i = shorterLen; i < Math.max(len0, len1); i++) { + shorterArr.push({ + offset: last.offset, + color: last.color.slice() + }); + } + } + + function fillArray(val0, val1, arrDim) { + var arr0 = val0; + var arr1 = val1; + if (!arr0.push || !arr1.push) { + return; + } + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len !== arr1Len) { + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + arr0.length = arr1Len; + } else { + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i])); + } + } + } + var len2 = arr0[0] && arr0[0].length; + for (var i = 0; i < arr0.length; i++) { + if (arrDim === 1) { + if (isNaN(arr0[i])) { + arr0[i] = arr1[i]; + } + } else { + for (var j = 0; j < len2; j++) { + if (isNaN(arr0[i][j])) { + arr0[i][j] = arr1[i][j]; + } + } + } + } + } + + function cloneValue(value) { + if (isArrayLike(value)) { + var len = value.length; + if (isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } + return arraySlice.call(value); + } + return value; + } + + function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]) || 0; + rgba[1] = Math.floor(rgba[1]) || 0; + rgba[2] = Math.floor(rgba[2]) || 0; + rgba[3] = rgba[3] == null ? 1 : rgba[3]; + return 'rgba(' + rgba.join(',') + ')'; + } + + function guessArrayDim(value) { + return isArrayLike(value && value[0]) ? 2 : 1; + } + + var VALUE_TYPE_NUMBER = 0; + var VALUE_TYPE_1D_ARRAY = 1; + var VALUE_TYPE_2D_ARRAY = 2; + var VALUE_TYPE_COLOR = 3; + var VALUE_TYPE_LINEAR_GRADIENT = 4; + var VALUE_TYPE_RADIAL_GRADIENT = 5; + var VALUE_TYPE_UNKOWN = 6; + + function isGradientValueType(valType) { + return valType === VALUE_TYPE_LINEAR_GRADIENT || valType === VALUE_TYPE_RADIAL_GRADIENT; + } + + function isArrayValueType(valType) { + return valType === VALUE_TYPE_1D_ARRAY || valType === VALUE_TYPE_2D_ARRAY; + } + + var tmpRgba = [0, 0, 0, 0]; + var Track = (function () { + function Track(propName) { + this.keyframes = []; + this.discrete = false; + this._invalid = false; + this._needsSort = false; + this._lastFr = 0; + this._lastFrP = 0; + this.propName = propName; + } + + Track.prototype.isFinished = function () { + return this._finished; + }; + Track.prototype.setFinished = function () { + this._finished = true; + if (this._additiveTrack) { + this._additiveTrack.setFinished(); + } + }; + Track.prototype.needsAnimate = function () { + return this.keyframes.length >= 1; + }; + Track.prototype.getAdditiveTrack = function () { + return this._additiveTrack; + }; + Track.prototype.addKeyframe = function (time, rawValue, easing) { + this._needsSort = true; + var keyframes = this.keyframes; + var len = keyframes.length; + var discrete = false; + var valType = VALUE_TYPE_UNKOWN; + var value = rawValue; + if (isArrayLike(rawValue)) { + var arrayDim = guessArrayDim(rawValue); + valType = arrayDim; + if (arrayDim === 1 && !isNumber(rawValue[0]) + || arrayDim === 2 && !isNumber(rawValue[0][0])) { + discrete = true; + } + } else { + if (isNumber(rawValue) && !eqNaN(rawValue)) { + valType = VALUE_TYPE_NUMBER; + } else if (isString(rawValue)) { + if (!isNaN(+rawValue)) { + valType = VALUE_TYPE_NUMBER; + } else { + var colorArray = parse(rawValue); + if (colorArray) { + value = colorArray; + valType = VALUE_TYPE_COLOR; + } + } + } else if (isGradientObject(rawValue)) { + var parsedGradient = extend({}, value); + parsedGradient.colorStops = map(rawValue.colorStops, function (colorStop) { + return ({ + offset: colorStop.offset, + color: parse(colorStop.color) + }); + }); + if (isLinearGradient(rawValue)) { + valType = VALUE_TYPE_LINEAR_GRADIENT; + } else if (isRadialGradient(rawValue)) { + valType = VALUE_TYPE_RADIAL_GRADIENT; + } + value = parsedGradient; + } + } + if (len === 0) { + this.valType = valType; + } else if (valType !== this.valType || valType === VALUE_TYPE_UNKOWN) { + discrete = true; + } + this.discrete = this.discrete || discrete; + var kf = { + time: time, + value: value, + rawValue: rawValue, + percent: 0 + }; + if (easing) { + kf.easing = easing; + kf.easingFunc = isFunction(easing) + ? easing + : easingFuncs[easing] || createCubicEasingFunc(easing); + } + keyframes.push(kf); + return kf; + }; + Track.prototype.prepare = function (maxTime, additiveTrack) { + var kfs = this.keyframes; + if (this._needsSort) { + kfs.sort(function (a, b) { + return a.time - b.time; + }); + } + var valType = this.valType; + var kfsLen = kfs.length; + var lastKf = kfs[kfsLen - 1]; + var isDiscrete = this.discrete; + var isArr = isArrayValueType(valType); + var isGradient = isGradientValueType(valType); + for (var i = 0; i < kfsLen; i++) { + var kf = kfs[i]; + var value = kf.value; + var lastValue = lastKf.value; + kf.percent = kf.time / maxTime; + if (!isDiscrete) { + if (isArr && i !== kfsLen - 1) { + fillArray(value, lastValue, valType); + } else if (isGradient) { + fillColorStops(value.colorStops, lastValue.colorStops); + } + } + } + if (!isDiscrete + && valType !== VALUE_TYPE_RADIAL_GRADIENT + && additiveTrack + && this.needsAnimate() + && additiveTrack.needsAnimate() + && valType === additiveTrack.valType + && !additiveTrack._finished) { + this._additiveTrack = additiveTrack; + var startValue = kfs[0].value; + for (var i = 0; i < kfsLen; i++) { + if (valType === VALUE_TYPE_NUMBER) { + kfs[i].additiveValue = kfs[i].value - startValue; + } else if (valType === VALUE_TYPE_COLOR) { + kfs[i].additiveValue = + add1DArray([], kfs[i].value, startValue, -1); + } else if (isArrayValueType(valType)) { + kfs[i].additiveValue = valType === VALUE_TYPE_1D_ARRAY + ? add1DArray([], kfs[i].value, startValue, -1) + : add2DArray([], kfs[i].value, startValue, -1); + } + } + } + }; + Track.prototype.step = function (target, percent) { + if (this._finished) { + return; + } + if (this._additiveTrack && this._additiveTrack._finished) { + this._additiveTrack = null; + } + var isAdditive = this._additiveTrack != null; + var valueKey = isAdditive ? 'additiveValue' : 'value'; + var valType = this.valType; + var keyframes = this.keyframes; + var kfsNum = keyframes.length; + var propName = this.propName; + var isValueColor = valType === VALUE_TYPE_COLOR; + var frameIdx; + var lastFrame = this._lastFr; + var mathMin = Math.min; + var frame; + var nextFrame; + if (kfsNum === 1) { + frame = nextFrame = keyframes[0]; + } else { + if (percent < 0) { + frameIdx = 0; + } else if (percent < this._lastFrP) { + var start = mathMin(lastFrame + 1, kfsNum - 1); + for (frameIdx = start; frameIdx >= 0; frameIdx--) { + if (keyframes[frameIdx].percent <= percent) { + break; + } + } + frameIdx = mathMin(frameIdx, kfsNum - 2); + } else { + for (frameIdx = lastFrame; frameIdx < kfsNum; frameIdx++) { + if (keyframes[frameIdx].percent > percent) { + break; + } + } + frameIdx = mathMin(frameIdx - 1, kfsNum - 2); + } + nextFrame = keyframes[frameIdx + 1]; + frame = keyframes[frameIdx]; + } + if (!(frame && nextFrame)) { + return; + } + this._lastFr = frameIdx; + this._lastFrP = percent; + var interval = (nextFrame.percent - frame.percent); + var w = interval === 0 ? 1 : mathMin((percent - frame.percent) / interval, 1); + if (nextFrame.easingFunc) { + w = nextFrame.easingFunc(w); + } + var targetArr = isAdditive ? this._additiveValue + : (isValueColor ? tmpRgba : target[propName]); + if ((isArrayValueType(valType) || isValueColor) && !targetArr) { + targetArr = this._additiveValue = []; + } + if (this.discrete) { + target[propName] = w < 1 ? frame.rawValue : nextFrame.rawValue; + } else if (isArrayValueType(valType)) { + valType === VALUE_TYPE_1D_ARRAY + ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w) + : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + } else if (isGradientValueType(valType)) { + var val = frame[valueKey]; + var nextVal_1 = nextFrame[valueKey]; + var isLinearGradient_1 = valType === VALUE_TYPE_LINEAR_GRADIENT; + target[propName] = { + type: isLinearGradient_1 ? 'linear' : 'radial', + x: interpolateNumber(val.x, nextVal_1.x, w), + y: interpolateNumber(val.y, nextVal_1.y, w), + colorStops: map(val.colorStops, function (colorStop, idx) { + var nextColorStop = nextVal_1.colorStops[idx]; + return { + offset: interpolateNumber(colorStop.offset, nextColorStop.offset, w), + color: rgba2String(interpolate1DArray([], colorStop.color, nextColorStop.color, w)) + }; + }), + global: nextVal_1.global + }; + if (isLinearGradient_1) { + target[propName].x2 = interpolateNumber(val.x2, nextVal_1.x2, w); + target[propName].y2 = interpolateNumber(val.y2, nextVal_1.y2, w); + } else { + target[propName].r = interpolateNumber(val.r, nextVal_1.r, w); + } + } else if (isValueColor) { + interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); + if (!isAdditive) { + target[propName] = rgba2String(targetArr); + } + } else { + var value = interpolateNumber(frame[valueKey], nextFrame[valueKey], w); + if (isAdditive) { + this._additiveValue = value; + } else { + target[propName] = value; + } + } + if (isAdditive) { + this._addToTarget(target); + } + }; + Track.prototype._addToTarget = function (target) { + var valType = this.valType; + var propName = this.propName; + var additiveValue = this._additiveValue; + if (valType === VALUE_TYPE_NUMBER) { + target[propName] = target[propName] + additiveValue; + } else if (valType === VALUE_TYPE_COLOR) { + parse(target[propName], tmpRgba); + add1DArray(tmpRgba, tmpRgba, additiveValue, 1); + target[propName] = rgba2String(tmpRgba); + } else if (valType === VALUE_TYPE_1D_ARRAY) { + add1DArray(target[propName], target[propName], additiveValue, 1); + } else if (valType === VALUE_TYPE_2D_ARRAY) { + add2DArray(target[propName], target[propName], additiveValue, 1); + } + }; + return Track; + }()); + var Animator = (function () { + function Animator(target, loop, allowDiscreteAnimation, additiveTo) { + this._tracks = {}; + this._trackKeys = []; + this._maxTime = 0; + this._started = 0; + this._clip = null; + this._target = target; + this._loop = loop; + if (loop && additiveTo) { + logError('Can\' use additive animation on looped animation.'); + return; + } + this._additiveAnimators = additiveTo; + this._allowDiscrete = allowDiscreteAnimation; + } + + Animator.prototype.getMaxTime = function () { + return this._maxTime; + }; + Animator.prototype.getDelay = function () { + return this._delay; + }; + Animator.prototype.getLoop = function () { + return this._loop; + }; + Animator.prototype.getTarget = function () { + return this._target; + }; + Animator.prototype.changeTarget = function (target) { + this._target = target; + }; + Animator.prototype.when = function (time, props, easing) { + return this.whenWithKeys(time, props, keys(props), easing); + }; + Animator.prototype.whenWithKeys = function (time, props, propNames, easing) { + var tracks = this._tracks; + for (var i = 0; i < propNames.length; i++) { + var propName = propNames[i]; + var track = tracks[propName]; + if (!track) { + track = tracks[propName] = new Track(propName); + var initialValue = void 0; + var additiveTrack = this._getAdditiveTrack(propName); + if (additiveTrack) { + var addtiveTrackKfs = additiveTrack.keyframes; + var lastFinalKf = addtiveTrackKfs[addtiveTrackKfs.length - 1]; + initialValue = lastFinalKf && lastFinalKf.value; + if (additiveTrack.valType === VALUE_TYPE_COLOR && initialValue) { + initialValue = rgba2String(initialValue); + } + } else { + initialValue = this._target[propName]; + } + if (initialValue == null) { + continue; + } + if (time > 0) { + track.addKeyframe(0, cloneValue(initialValue), easing); + } + this._trackKeys.push(propName); + } + track.addKeyframe(time, cloneValue(props[propName]), easing); + } + this._maxTime = Math.max(this._maxTime, time); + return this; + }; + Animator.prototype.pause = function () { + this._clip.pause(); + this._paused = true; + }; + Animator.prototype.resume = function () { + this._clip.resume(); + this._paused = false; + }; + Animator.prototype.isPaused = function () { + return !!this._paused; + }; + Animator.prototype.duration = function (duration) { + this._maxTime = duration; + this._force = true; + return this; + }; + Animator.prototype._doneCallback = function () { + this._setTracksFinished(); + this._clip = null; + var doneList = this._doneCbs; + if (doneList) { + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + } + }; + Animator.prototype._abortedCallback = function () { + this._setTracksFinished(); + var animation = this.animation; + var abortedList = this._abortedCbs; + if (animation) { + animation.removeClip(this._clip); + } + this._clip = null; + if (abortedList) { + for (var i = 0; i < abortedList.length; i++) { + abortedList[i].call(this); + } + } + }; + Animator.prototype._setTracksFinished = function () { + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < tracksKeys.length; i++) { + tracks[tracksKeys[i]].setFinished(); + } + }; + Animator.prototype._getAdditiveTrack = function (trackName) { + var additiveTrack; + var additiveAnimators = this._additiveAnimators; + if (additiveAnimators) { + for (var i = 0; i < additiveAnimators.length; i++) { + var track = additiveAnimators[i].getTrack(trackName); + if (track) { + additiveTrack = track; + } + } + } + return additiveTrack; + }; + Animator.prototype.start = function (easing) { + if (this._started > 0) { + return; + } + this._started = 1; + var self = this; + var tracks = []; + var maxTime = this._maxTime || 0; + for (var i = 0; i < this._trackKeys.length; i++) { + var propName = this._trackKeys[i]; + var track = this._tracks[propName]; + var additiveTrack = this._getAdditiveTrack(propName); + var kfs = track.keyframes; + var kfsNum = kfs.length; + track.prepare(maxTime, additiveTrack); + if (track.needsAnimate()) { + if (!this._allowDiscrete && track.discrete) { + var lastKf = kfs[kfsNum - 1]; + if (lastKf) { + self._target[track.propName] = lastKf.rawValue; + } + track.setFinished(); + } else { + tracks.push(track); + } + } + } + if (tracks.length || this._force) { + var clip = new Clip({ + life: maxTime, + loop: this._loop, + delay: this._delay || 0, + onframe: function (percent) { + self._started = 2; + var additiveAnimators = self._additiveAnimators; + if (additiveAnimators) { + var stillHasAdditiveAnimator = false; + for (var i = 0; i < additiveAnimators.length; i++) { + if (additiveAnimators[i]._clip) { + stillHasAdditiveAnimator = true; + break; + } + } + if (!stillHasAdditiveAnimator) { + self._additiveAnimators = null; + } + } + for (var i = 0; i < tracks.length; i++) { + tracks[i].step(self._target, percent); + } + var onframeList = self._onframeCbs; + if (onframeList) { + for (var i = 0; i < onframeList.length; i++) { + onframeList[i](self._target, percent); + } + } + }, + ondestroy: function () { + self._doneCallback(); + } + }); + this._clip = clip; + if (this.animation) { + this.animation.addClip(clip); + } + if (easing) { + clip.setEasing(easing); + } + } else { + this._doneCallback(); + } + return this; + }; + Animator.prototype.stop = function (forwardToLast) { + if (!this._clip) { + return; + } + var clip = this._clip; + if (forwardToLast) { + clip.onframe(1); + } + this._abortedCallback(); + }; + Animator.prototype.delay = function (time) { + this._delay = time; + return this; + }; + Animator.prototype.during = function (cb) { + if (cb) { + if (!this._onframeCbs) { + this._onframeCbs = []; + } + this._onframeCbs.push(cb); + } + return this; + }; + Animator.prototype.done = function (cb) { + if (cb) { + if (!this._doneCbs) { + this._doneCbs = []; + } + this._doneCbs.push(cb); + } + return this; + }; + Animator.prototype.aborted = function (cb) { + if (cb) { + if (!this._abortedCbs) { + this._abortedCbs = []; + } + this._abortedCbs.push(cb); + } + return this; + }; + Animator.prototype.getClip = function () { + return this._clip; + }; + Animator.prototype.getTrack = function (propName) { + return this._tracks[propName]; + }; + Animator.prototype.getTracks = function () { + var _this = this; + return map(this._trackKeys, function (key) { + return _this._tracks[key]; + }); + }; + Animator.prototype.stopTracks = function (propNames, forwardToLast) { + if (!propNames.length || !this._clip) { + return true; + } + var tracks = this._tracks; + var tracksKeys = this._trackKeys; + for (var i = 0; i < propNames.length; i++) { + var track = tracks[propNames[i]]; + if (track && !track.isFinished()) { + if (forwardToLast) { + track.step(this._target, 1); + } else if (this._started === 1) { + track.step(this._target, 0); + } + track.setFinished(); + } + } + var allAborted = true; + for (var i = 0; i < tracksKeys.length; i++) { + if (!tracks[tracksKeys[i]].isFinished()) { + allAborted = false; + break; + } + } + if (allAborted) { + this._abortedCallback(); + } + return allAborted; + }; + Animator.prototype.saveTo = function (target, trackKeys, firstOrLast) { + if (!target) { + return; + } + trackKeys = trackKeys || this._trackKeys; + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track || track.isFinished()) { + continue; + } + var kfs = track.keyframes; + var kf = kfs[firstOrLast ? 0 : kfs.length - 1]; + if (kf) { + target[propName] = cloneValue(kf.rawValue); + } + } + }; + Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) { + trackKeys = trackKeys || keys(finalProps); + for (var i = 0; i < trackKeys.length; i++) { + var propName = trackKeys[i]; + var track = this._tracks[propName]; + if (!track) { + continue; + } + var kfs = track.keyframes; + if (kfs.length > 1) { + var lastKf = kfs.pop(); + track.addKeyframe(lastKf.time, finalProps[propName]); + track.prepare(this._maxTime, track.getAdditiveTrack()); + } + } + }; + return Animator; + }()); + + function getTime() { + return new Date().getTime(); + } + + var Animation = (function (_super) { + __extends(Animation, _super); + + function Animation(opts) { + var _this = _super.call(this) || this; + _this._running = false; + _this._time = 0; + _this._pausedTime = 0; + _this._pauseStart = 0; + _this._paused = false; + opts = opts || {}; + _this.stage = opts.stage || {}; + return _this; + } + + Animation.prototype.addClip = function (clip) { + if (clip.animation) { + this.removeClip(clip); + } + if (!this._head) { + this._head = this._tail = clip; + } else { + this._tail.next = clip; + clip.prev = this._tail; + clip.next = null; + this._tail = clip; + } + clip.animation = this; + }; + Animation.prototype.addAnimator = function (animator) { + animator.animation = this; + var clip = animator.getClip(); + if (clip) { + this.addClip(clip); + } + }; + Animation.prototype.removeClip = function (clip) { + if (!clip.animation) { + return; + } + var prev = clip.prev; + var next = clip.next; + if (prev) { + prev.next = next; + } else { + this._head = next; + } + if (next) { + next.prev = prev; + } else { + this._tail = prev; + } + clip.next = clip.prev = clip.animation = null; + }; + Animation.prototype.removeAnimator = function (animator) { + var clip = animator.getClip(); + if (clip) { + this.removeClip(clip); + } + animator.animation = null; + }; + Animation.prototype.update = function (notTriggerFrameAndStageUpdate) { + var time = getTime() - this._pausedTime; + var delta = time - this._time; + var clip = this._head; + while (clip) { + var nextClip = clip.next; + var finished = clip.step(time, delta); + if (finished) { + clip.ondestroy(); + this.removeClip(clip); + clip = nextClip; + } else { + clip = nextClip; + } + } + this._time = time; + if (!notTriggerFrameAndStageUpdate) { + this.trigger('frame', delta); + this.stage.update && this.stage.update(); + } + }; + Animation.prototype._startLoop = function () { + var self = this; + this._running = true; + + function step() { + if (self._running) { + requestAnimationFrame$1(step); + !self._paused && self.update(); + } + } + + requestAnimationFrame$1(step); + }; + Animation.prototype.start = function () { + if (this._running) { + return; + } + this._time = getTime(); + this._pausedTime = 0; + this._startLoop(); + }; + Animation.prototype.stop = function () { + this._running = false; + }; + Animation.prototype.pause = function () { + if (!this._paused) { + this._pauseStart = getTime(); + this._paused = true; + } + }; + Animation.prototype.resume = function () { + if (this._paused) { + this._pausedTime += getTime() - this._pauseStart; + this._paused = false; + } + }; + Animation.prototype.clear = function () { + var clip = this._head; + while (clip) { + var nextClip = clip.next; + clip.prev = clip.next = clip.animation = null; + clip = nextClip; + } + this._head = this._tail = null; + }; + Animation.prototype.isFinished = function () { + return this._head == null; + }; + Animation.prototype.animate = function (target, options) { + options = options || {}; + this.start(); + var animator = new Animator(target, options.loop); + this.addAnimator(animator); + return animator; + }; + return Animation; + }(Eventful)); + + var TOUCH_CLICK_DELAY = 300; + var globalEventSupported = env.domSupported; + var localNativeListenerNames = (function () { + var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' + ]; + var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' + ]; + var pointerEventNameMap = { + pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1 + }; + var pointerHandlerNames = map(mouseHandlerNames, function (name) { + var nm = name.replace('mouse', 'pointer'); + return pointerEventNameMap.hasOwnProperty(nm) ? nm : name; + }); + return { + mouse: mouseHandlerNames, + touch: touchHandlerNames, + pointer: pointerHandlerNames + }; + })(); + var globalNativeListenerNames = { + mouse: ['mousemove', 'mouseup'], + pointer: ['pointermove', 'pointerup'] + }; + var wheelEventSupported = false; + + function isPointerFromTouch(event) { + var pointerType = event.pointerType; + return pointerType === 'pen' || pointerType === 'touch'; + } + + function setTouchTimer(scope) { + scope.touching = true; + if (scope.touchTimer != null) { + clearTimeout(scope.touchTimer); + scope.touchTimer = null; + } + scope.touchTimer = setTimeout(function () { + scope.touching = false; + scope.touchTimer = null; + }, 700); + } + + function markTouch(event) { + event && (event.zrByTouch = true); + } + + function normalizeGlobalEvent(instance, event) { + return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true); + } + + function isLocalEl(instance, el) { + var elTmp = el; + var isLocal = false; + while (elTmp && elTmp.nodeType !== 9 + && !(isLocal = elTmp.domBelongToZr + || (elTmp !== el && elTmp === instance.painterRoot))) { + elTmp = elTmp.parentNode; + } + return isLocal; + } + + var FakeGlobalEvent = (function () { + function FakeGlobalEvent(instance, event) { + this.stopPropagation = noop; + this.stopImmediatePropagation = noop; + this.preventDefault = noop; + this.type = event.type; + this.target = this.currentTarget = instance.dom; + this.pointerType = event.pointerType; + this.clientX = event.clientX; + this.clientY = event.clientY; + } + + return FakeGlobalEvent; + }()); + var localDOMHandlers = { + mousedown: function (event) { + event = normalizeEvent(this.dom, event); + this.__mayPointerCapture = [event.zrX, event.zrY]; + this.trigger('mousedown', event); + }, + mousemove: function (event) { + event = normalizeEvent(this.dom, event); + var downPoint = this.__mayPointerCapture; + if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) { + this.__togglePointerCapture(true); + } + this.trigger('mousemove', event); + }, + mouseup: function (event) { + event = normalizeEvent(this.dom, event); + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + }, + mouseout: function (event) { + event = normalizeEvent(this.dom, event); + var element = event.toElement || event.relatedTarget; + if (!isLocalEl(this, element)) { + if (this.__pointerCapturing) { + event.zrEventControl = 'no_globalout'; + } + this.trigger('mouseout', event); + } + }, + wheel: function (event) { + wheelEventSupported = true; + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + mousewheel: function (event) { + if (wheelEventSupported) { + return; + } + event = normalizeEvent(this.dom, event); + this.trigger('mousewheel', event); + }, + touchstart: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.__lastTouchMoment = new Date(); + this.handler.processGesture(event, 'start'); + localDOMHandlers.mousemove.call(this, event); + localDOMHandlers.mousedown.call(this, event); + }, + touchmove: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'change'); + localDOMHandlers.mousemove.call(this, event); + }, + touchend: function (event) { + event = normalizeEvent(this.dom, event); + markTouch(event); + this.handler.processGesture(event, 'end'); + localDOMHandlers.mouseup.call(this, event); + if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) { + localDOMHandlers.click.call(this, event); + } + }, + pointerdown: function (event) { + localDOMHandlers.mousedown.call(this, event); + }, + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + localDOMHandlers.mouseup.call(this, event); + }, + pointerout: function (event) { + if (!isPointerFromTouch(event)) { + localDOMHandlers.mouseout.call(this, event); + } + } + }; + each(['click', 'dblclick', 'contextmenu'], function (name) { + localDOMHandlers[name] = function (event) { + event = normalizeEvent(this.dom, event); + this.trigger(name, event); + }; + }); + var globalDOMHandlers = { + pointermove: function (event) { + if (!isPointerFromTouch(event)) { + globalDOMHandlers.mousemove.call(this, event); + } + }, + pointerup: function (event) { + globalDOMHandlers.mouseup.call(this, event); + }, + mousemove: function (event) { + this.trigger('mousemove', event); + }, + mouseup: function (event) { + var pointerCaptureReleasing = this.__pointerCapturing; + this.__togglePointerCapture(false); + this.trigger('mouseup', event); + if (pointerCaptureReleasing) { + event.zrEventControl = 'only_globalout'; + this.trigger('mouseout', event); + } + } + }; + + function mountLocalDOMEventListeners(instance, scope) { + var domHandlers = scope.domHandlers; + if (env.pointerEventsSupported) { + each(localNativeListenerNames.pointer, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + }); + }); + } else { + if (env.touchEventsSupported) { + each(localNativeListenerNames.touch, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + domHandlers[nativeEventName].call(instance, event); + setTouchTimer(scope); + }); + }); + } + each(localNativeListenerNames.mouse, function (nativeEventName) { + mountSingleDOMEventListener(scope, nativeEventName, function (event) { + event = getNativeEvent(event); + if (!scope.touching) { + domHandlers[nativeEventName].call(instance, event); + } + }); + }); + } + } + + function mountGlobalDOMEventListeners(instance, scope) { + if (env.pointerEventsSupported) { + each(globalNativeListenerNames.pointer, mount); + } else if (!env.touchEventsSupported) { + each(globalNativeListenerNames.mouse, mount); + } + + function mount(nativeEventName) { + function nativeEventListener(event) { + event = getNativeEvent(event); + if (!isLocalEl(instance, event.target)) { + event = normalizeGlobalEvent(instance, event); + scope.domHandlers[nativeEventName].call(instance, event); + } + } + + mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, {capture: true}); + } + } + + function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) { + scope.mounted[nativeEventName] = listener; + scope.listenerOpts[nativeEventName] = opt; + addEventListener(scope.domTarget, nativeEventName, listener, opt); + } + + function unmountDOMEventListeners(scope) { + var mounted = scope.mounted; + for (var nativeEventName in mounted) { + if (mounted.hasOwnProperty(nativeEventName)) { + removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]); + } + } + scope.mounted = {}; + } + + var DOMHandlerScope = (function () { + function DOMHandlerScope(domTarget, domHandlers) { + this.mounted = {}; + this.listenerOpts = {}; + this.touching = false; + this.domTarget = domTarget; + this.domHandlers = domHandlers; + } + + return DOMHandlerScope; + }()); + var HandlerDomProxy = (function (_super) { + __extends(HandlerDomProxy, _super); + + function HandlerDomProxy(dom, painterRoot) { + var _this = _super.call(this) || this; + _this.__pointerCapturing = false; + _this.dom = dom; + _this.painterRoot = painterRoot; + _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers); + if (globalEventSupported) { + _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers); + } + mountLocalDOMEventListeners(_this, _this._localHandlerScope); + return _this; + } + + HandlerDomProxy.prototype.dispose = function () { + unmountDOMEventListeners(this._localHandlerScope); + if (globalEventSupported) { + unmountDOMEventListeners(this._globalHandlerScope); + } + }; + HandlerDomProxy.prototype.setCursor = function (cursorStyle) { + this.dom.style && (this.dom.style.cursor = cursorStyle || 'default'); + }; + HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) { + this.__mayPointerCapture = null; + if (globalEventSupported + && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) { + this.__pointerCapturing = isPointerCapturing; + var globalHandlerScope = this._globalHandlerScope; + isPointerCapturing + ? mountGlobalDOMEventListeners(this, globalHandlerScope) + : unmountDOMEventListeners(globalHandlerScope); + } + }; + return HandlerDomProxy; + }(Eventful)); + + var dpr = 1; + if (env.hasGlobalWindow) { + dpr = Math.max(window.devicePixelRatio + || (window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI) + || 1, 1); + } + var devicePixelRatio = dpr; + var DARK_MODE_THRESHOLD = 0.4; + var DARK_LABEL_COLOR = '#333'; + var LIGHT_LABEL_COLOR = '#ccc'; + var LIGHTER_LABEL_COLOR = '#eee'; + + function create$1() { + return [1, 0, 0, 1, 0, 0]; + } + + function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + } + + function copy$1(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; + } + + function mul$1(out, m1, m2) { + var out0 = m1[0] * m2[0] + m1[2] * m2[1]; + var out1 = m1[1] * m2[0] + m1[3] * m2[1]; + var out2 = m1[0] * m2[2] + m1[2] * m2[3]; + var out3 = m1[1] * m2[2] + m1[3] * m2[3]; + var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = out3; + out[4] = out4; + out[5] = out5; + return out; + } + + function translate(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; + } + + function rotate(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; + } + + function scale$1(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; + } + + function invert(out, a) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + + function clone$2(a) { + var b = create$1(); + copy$1(b, a); + return b; + } + + var matrix = /*#__PURE__*/Object.freeze({ + __proto__: null, + create: create$1, + identity: identity, + copy: copy$1, + mul: mul$1, + translate: translate, + rotate: rotate, + scale: scale$1, + invert: invert, + clone: clone$2 + }); + + var mIdentity = identity; + var EPSILON$2 = 5e-5; + + function isNotAroundZero$1(val) { + return val > EPSILON$2 || val < -EPSILON$2; + } + + var scaleTmp = []; + var tmpTransform = []; + var originTransform = create$1(); + var abs = Math.abs; + var Transformable = (function () { + function Transformable() { + } + + Transformable.prototype.getLocalTransform = function (m) { + return Transformable.getLocalTransform(this, m); + }; + Transformable.prototype.setPosition = function (arr) { + this.x = arr[0]; + this.y = arr[1]; + }; + Transformable.prototype.setScale = function (arr) { + this.scaleX = arr[0]; + this.scaleY = arr[1]; + }; + Transformable.prototype.setSkew = function (arr) { + this.skewX = arr[0]; + this.skewY = arr[1]; + }; + Transformable.prototype.setOrigin = function (arr) { + this.originX = arr[0]; + this.originY = arr[1]; + }; + Transformable.prototype.needLocalTransform = function () { + return isNotAroundZero$1(this.rotation) + || isNotAroundZero$1(this.x) + || isNotAroundZero$1(this.y) + || isNotAroundZero$1(this.scaleX - 1) + || isNotAroundZero$1(this.scaleY - 1) + || isNotAroundZero$1(this.skewX) + || isNotAroundZero$1(this.skewY); + }; + Transformable.prototype.updateTransform = function () { + var parentTransform = this.parent && this.parent.transform; + var needLocalTransform = this.needLocalTransform(); + var m = this.transform; + if (!(needLocalTransform || parentTransform)) { + m && mIdentity(m); + return; + } + m = m || create$1(); + if (needLocalTransform) { + this.getLocalTransform(m); + } else { + mIdentity(m); + } + if (parentTransform) { + if (needLocalTransform) { + mul$1(m, parentTransform, m); + } else { + copy$1(m, parentTransform); + } + } + this.transform = m; + this._resolveGlobalScaleRatio(m); + }; + Transformable.prototype._resolveGlobalScaleRatio = function (m) { + var globalScaleRatio = this.globalScaleRatio; + if (globalScaleRatio != null && globalScaleRatio !== 1) { + this.getGlobalScale(scaleTmp); + var relX = scaleTmp[0] < 0 ? -1 : 1; + var relY = scaleTmp[1] < 0 ? -1 : 1; + var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0; + var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0; + m[0] *= sx; + m[1] *= sx; + m[2] *= sy; + m[3] *= sy; + } + this.invTransform = this.invTransform || create$1(); + invert(this.invTransform, m); + }; + Transformable.prototype.getComputedTransform = function () { + var transformNode = this; + var ancestors = []; + while (transformNode) { + ancestors.push(transformNode); + transformNode = transformNode.parent; + } + while (transformNode = ancestors.pop()) { + transformNode.updateTransform(); + } + return this.transform; + }; + Transformable.prototype.setLocalTransform = function (m) { + if (!m) { + return; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + var rotation = Math.atan2(m[1], m[0]); + var shearX = Math.PI / 2 + rotation - Math.atan2(m[3], m[2]); + sy = Math.sqrt(sy) * Math.cos(shearX); + sx = Math.sqrt(sx); + this.skewX = shearX; + this.skewY = 0; + this.rotation = -rotation; + this.x = +m[4]; + this.y = +m[5]; + this.scaleX = sx; + this.scaleY = sy; + this.originX = 0; + this.originY = 0; + }; + Transformable.prototype.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + mul$1(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var ox = this.originX; + var oy = this.originY; + if (ox || oy) { + originTransform[4] = ox; + originTransform[5] = oy; + mul$1(tmpTransform, m, originTransform); + tmpTransform[4] -= ox; + tmpTransform[5] -= oy; + m = tmpTransform; + } + this.setLocalTransform(m); + }; + Transformable.prototype.getGlobalScale = function (out) { + var m = this.transform; + out = out || []; + if (!m) { + out[0] = 1; + out[1] = 1; + return out; + } + out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]); + out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]); + if (m[0] < 0) { + out[0] = -out[0]; + } + if (m[3] < 0) { + out[1] = -out[1]; + } + return out; + }; + Transformable.prototype.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + applyTransform(v2, v2, invTransform); + } + return v2; + }; + Transformable.prototype.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + applyTransform(v2, v2, transform); + } + return v2; + }; + Transformable.prototype.getLineScale = function () { + var m = this.transform; + return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 + ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) + : 1; + }; + Transformable.prototype.copyTransform = function (source) { + copyTransform(this, source); + }; + Transformable.getLocalTransform = function (target, m) { + m = m || []; + var ox = target.originX || 0; + var oy = target.originY || 0; + var sx = target.scaleX; + var sy = target.scaleY; + var ax = target.anchorX; + var ay = target.anchorY; + var rotation = target.rotation || 0; + var x = target.x; + var y = target.y; + var skewX = target.skewX ? Math.tan(target.skewX) : 0; + var skewY = target.skewY ? Math.tan(-target.skewY) : 0; + if (ox || oy || ax || ay) { + var dx = ox + ax; + var dy = oy + ay; + m[4] = -dx * sx - skewX * dy * sy; + m[5] = -dy * sy - skewY * dx * sx; + } else { + m[4] = m[5] = 0; + } + m[0] = sx; + m[3] = sy; + m[1] = skewY * sx; + m[2] = skewX * sy; + rotation && rotate(m, m, rotation); + m[4] += ox + x; + m[5] += oy + y; + return m; + }; + Transformable.initDefaultProps = (function () { + var proto = Transformable.prototype; + proto.scaleX = + proto.scaleY = + proto.globalScaleRatio = 1; + proto.x = + proto.y = + proto.originX = + proto.originY = + proto.skewX = + proto.skewY = + proto.rotation = + proto.anchorX = + proto.anchorY = 0; + })(); + return Transformable; + }()); + var TRANSFORMABLE_PROPS = [ + 'x', 'y', 'originX', 'originY', 'anchorX', 'anchorY', 'rotation', 'scaleX', 'scaleY', 'skewX', 'skewY' + ]; + + function copyTransform(target, source) { + for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) { + var propName = TRANSFORMABLE_PROPS[i]; + target[propName] = source[propName]; + } + } + + var Point = (function () { + function Point(x, y) { + this.x = x || 0; + this.y = y || 0; + } + + Point.prototype.copy = function (other) { + this.x = other.x; + this.y = other.y; + return this; + }; + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; + Point.prototype.set = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + Point.prototype.equal = function (other) { + return other.x === this.x && other.y === this.y; + }; + Point.prototype.add = function (other) { + this.x += other.x; + this.y += other.y; + return this; + }; + Point.prototype.scale = function (scalar) { + this.x *= scalar; + this.y *= scalar; + }; + Point.prototype.scaleAndAdd = function (other, scalar) { + this.x += other.x * scalar; + this.y += other.y * scalar; + }; + Point.prototype.sub = function (other) { + this.x -= other.x; + this.y -= other.y; + return this; + }; + Point.prototype.dot = function (other) { + return this.x * other.x + this.y * other.y; + }; + Point.prototype.len = function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }; + Point.prototype.lenSquare = function () { + return this.x * this.x + this.y * this.y; + }; + Point.prototype.normalize = function () { + var len = this.len(); + this.x /= len; + this.y /= len; + return this; + }; + Point.prototype.distance = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return Math.sqrt(dx * dx + dy * dy); + }; + Point.prototype.distanceSquare = function (other) { + var dx = this.x - other.x; + var dy = this.y - other.y; + return dx * dx + dy * dy; + }; + Point.prototype.negate = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Point.prototype.transform = function (m) { + if (!m) { + return; + } + var x = this.x; + var y = this.y; + this.x = m[0] * x + m[2] * y + m[4]; + this.y = m[1] * x + m[3] * y + m[5]; + return this; + }; + Point.prototype.toArray = function (out) { + out[0] = this.x; + out[1] = this.y; + return out; + }; + Point.prototype.fromArray = function (input) { + this.x = input[0]; + this.y = input[1]; + }; + Point.set = function (p, x, y) { + p.x = x; + p.y = y; + }; + Point.copy = function (p, p2) { + p.x = p2.x; + p.y = p2.y; + }; + Point.len = function (p) { + return Math.sqrt(p.x * p.x + p.y * p.y); + }; + Point.lenSquare = function (p) { + return p.x * p.x + p.y * p.y; + }; + Point.dot = function (p0, p1) { + return p0.x * p1.x + p0.y * p1.y; + }; + Point.add = function (out, p0, p1) { + out.x = p0.x + p1.x; + out.y = p0.y + p1.y; + }; + Point.sub = function (out, p0, p1) { + out.x = p0.x - p1.x; + out.y = p0.y - p1.y; + }; + Point.scale = function (out, p0, scalar) { + out.x = p0.x * scalar; + out.y = p0.y * scalar; + }; + Point.scaleAndAdd = function (out, p0, p1, scalar) { + out.x = p0.x + p1.x * scalar; + out.y = p0.y + p1.y * scalar; + }; + Point.lerp = function (out, p0, p1, t) { + var onet = 1 - t; + out.x = onet * p0.x + t * p1.x; + out.y = onet * p0.y + t * p1.y; + }; + return Point; + }()); + + var mathMin = Math.min; + var mathMax = Math.max; + var lt = new Point(); + var rb = new Point(); + var lb = new Point(); + var rt = new Point(); + var minTv = new Point(); + var maxTv = new Point(); + var BoundingRect = (function () { + function BoundingRect(x, y, width, height) { + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + BoundingRect.prototype.union = function (other) { + var x = mathMin(other.x, this.x); + var y = mathMin(other.y, this.y); + if (isFinite(this.x) && isFinite(this.width)) { + this.width = mathMax(other.x + other.width, this.x + this.width) - x; + } else { + this.width = other.width; + } + if (isFinite(this.y) && isFinite(this.height)) { + this.height = mathMax(other.y + other.height, this.y + this.height) - y; + } else { + this.height = other.height; + } + this.x = x; + this.y = y; + }; + BoundingRect.prototype.applyTransform = function (m) { + BoundingRect.applyTransform(this, this, m); + }; + BoundingRect.prototype.calculateTransform = function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + var m = create$1(); + translate(m, m, [-a.x, -a.y]); + scale$1(m, m, [sx, sy]); + translate(m, m, [b.x, b.y]); + return m; + }; + BoundingRect.prototype.intersect = function (b, mtv) { + if (!b) { + return false; + } + if (!(b instanceof BoundingRect)) { + b = BoundingRect.create(b); + } + var a = this; + var ax0 = a.x; + var ax1 = a.x + a.width; + var ay0 = a.y; + var ay1 = a.y + a.height; + var bx0 = b.x; + var bx1 = b.x + b.width; + var by0 = b.y; + var by1 = b.y + b.height; + var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + if (mtv) { + var dMin = Infinity; + var dMax = 0; + var d0 = Math.abs(ax1 - bx0); + var d1 = Math.abs(bx1 - ax0); + var d2 = Math.abs(ay1 - by0); + var d3 = Math.abs(by1 - ay0); + var dx = Math.min(d0, d1); + var dy = Math.min(d2, d3); + if (ax1 < bx0 || bx1 < ax0) { + if (dx > dMax) { + dMax = dx; + if (d0 < d1) { + Point.set(maxTv, -d0, 0); + } else { + Point.set(maxTv, d1, 0); + } + } + } else { + if (dx < dMin) { + dMin = dx; + if (d0 < d1) { + Point.set(minTv, d0, 0); + } else { + Point.set(minTv, -d1, 0); + } + } + } + if (ay1 < by0 || by1 < ay0) { + if (dy > dMax) { + dMax = dy; + if (d2 < d3) { + Point.set(maxTv, 0, -d2); + } else { + Point.set(maxTv, 0, d3); + } + } + } else { + if (dx < dMin) { + dMin = dx; + if (d2 < d3) { + Point.set(minTv, 0, d2); + } else { + Point.set(minTv, 0, -d3); + } + } + } + } + if (mtv) { + Point.copy(mtv, overlap ? minTv : maxTv); + } + return overlap; + }; + BoundingRect.prototype.contain = function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }; + BoundingRect.prototype.clone = function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }; + BoundingRect.prototype.copy = function (other) { + BoundingRect.copy(this, other); + }; + BoundingRect.prototype.plain = function () { + return { + x: this.x, + y: this.y, + width: this.width, + height: this.height + }; + }; + BoundingRect.prototype.isFinite = function () { + return isFinite(this.x) + && isFinite(this.y) + && isFinite(this.width) + && isFinite(this.height); + }; + BoundingRect.prototype.isZero = function () { + return this.width === 0 || this.height === 0; + }; + BoundingRect.create = function (rect) { + return new BoundingRect(rect.x, rect.y, rect.width, rect.height); + }; + BoundingRect.copy = function (target, source) { + target.x = source.x; + target.y = source.y; + target.width = source.width; + target.height = source.height; + }; + BoundingRect.applyTransform = function (target, source, m) { + if (!m) { + if (target !== source) { + BoundingRect.copy(target, source); + } + return; + } + if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) { + var sx = m[0]; + var sy = m[3]; + var tx = m[4]; + var ty = m[5]; + target.x = source.x * sx + tx; + target.y = source.y * sy + ty; + target.width = source.width * sx; + target.height = source.height * sy; + if (target.width < 0) { + target.x += target.width; + target.width = -target.width; + } + if (target.height < 0) { + target.y += target.height; + target.height = -target.height; + } + return; + } + lt.x = lb.x = source.x; + lt.y = rt.y = source.y; + rb.x = rt.x = source.x + source.width; + rb.y = lb.y = source.y + source.height; + lt.transform(m); + rt.transform(m); + rb.transform(m); + lb.transform(m); + target.x = mathMin(lt.x, rb.x, lb.x, rt.x); + target.y = mathMin(lt.y, rb.y, lb.y, rt.y); + var maxX = mathMax(lt.x, rb.x, lb.x, rt.x); + var maxY = mathMax(lt.y, rb.y, lb.y, rt.y); + target.width = maxX - target.x; + target.height = maxY - target.y; + }; + return BoundingRect; + }()); + + var textWidthCache = {}; + + function getWidth(text, font) { + font = font || DEFAULT_FONT; + var cacheOfFont = textWidthCache[font]; + if (!cacheOfFont) { + cacheOfFont = textWidthCache[font] = new LRU(500); + } + var width = cacheOfFont.get(text); + if (width == null) { + width = platformApi.measureText(text, font).width; + cacheOfFont.put(text, width); + } + return width; + } + + function innerGetBoundingRect(text, font, textAlign, textBaseline) { + var width = getWidth(text, font); + var height = getLineHeight(font); + var x = adjustTextX(0, width, textAlign); + var y = adjustTextY$1(0, height, textBaseline); + var rect = new BoundingRect(x, y, width, height); + return rect; + } + + function getBoundingRect(text, font, textAlign, textBaseline) { + var textLines = ((text || '') + '').split('\n'); + var len = textLines.length; + if (len === 1) { + return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline); + } else { + var uniondRect = new BoundingRect(0, 0, 0, 0); + for (var i = 0; i < textLines.length; i++) { + var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline); + i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect); + } + return uniondRect; + } + } + + function adjustTextX(x, width, textAlign) { + if (textAlign === 'right') { + x -= width; + } else if (textAlign === 'center') { + x -= width / 2; + } + return x; + } + + function adjustTextY$1(y, height, verticalAlign) { + if (verticalAlign === 'middle') { + y -= height / 2; + } else if (verticalAlign === 'bottom') { + y -= height; + } + return y; + } + + function getLineHeight(font) { + return getWidth('国', font); + } + + function parsePercent(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + } + + function calculateTextPosition(out, opts, rect) { + var textPosition = opts.position || 'inside'; + var distance = opts.distance != null ? opts.distance : 5; + var height = rect.height; + var width = rect.width; + var halfHeight = height / 2; + var x = rect.x; + var y = rect.y; + var textAlign = 'left'; + var textVerticalAlign = 'top'; + if (textPosition instanceof Array) { + x += parsePercent(textPosition[0], rect.width); + y += parsePercent(textPosition[1], rect.height); + textAlign = null; + textVerticalAlign = null; + } else { + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'top': + x += width / 2; + y -= distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - distance; + textVerticalAlign = 'bottom'; + break; + case 'insideBottomRight': + x += width - distance; + y += height - distance; + textAlign = 'right'; + textVerticalAlign = 'bottom'; + break; + } + } + out = out || {}; + out.x = x; + out.y = y; + out.align = textAlign; + out.verticalAlign = textVerticalAlign; + return out; + } + + var PRESERVED_NORMAL_STATE = '__zr_normal__'; + var PRIMARY_STATES_KEYS = TRANSFORMABLE_PROPS.concat(['ignore']); + var DEFAULT_ANIMATABLE_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) { + obj[key] = true; + return obj; + }, {ignore: false}); + var tmpTextPosCalcRes = {}; + var tmpBoundingRect = new BoundingRect(0, 0, 0, 0); + var Element = (function () { + function Element(props) { + this.id = guid(); + this.animators = []; + this.currentStates = []; + this.states = {}; + this._init(props); + } + + Element.prototype._init = function (props) { + this.attr(props); + }; + Element.prototype.drift = function (dx, dy, e) { + switch (this.draggable) { + case 'horizontal': + dy = 0; + break; + case 'vertical': + dx = 0; + break; + } + var m = this.transform; + if (!m) { + m = this.transform = [1, 0, 0, 1, 0, 0]; + } + m[4] += dx; + m[5] += dy; + this.decomposeTransform(); + this.markRedraw(); + }; + Element.prototype.beforeUpdate = function () { + }; + Element.prototype.afterUpdate = function () { + }; + Element.prototype.update = function () { + this.updateTransform(); + if (this.__dirty) { + this.updateInnerText(); + } + }; + Element.prototype.updateInnerText = function (forceUpdate) { + var textEl = this._textContent; + if (textEl && (!textEl.ignore || forceUpdate)) { + if (!this.textConfig) { + this.textConfig = {}; + } + var textConfig = this.textConfig; + var isLocal = textConfig.local; + var innerTransformable = textEl.innerTransformable; + var textAlign = void 0; + var textVerticalAlign = void 0; + var textStyleChanged = false; + innerTransformable.parent = isLocal ? this : null; + var innerOrigin = false; + innerTransformable.copyTransform(textEl); + if (textConfig.position != null) { + var layoutRect = tmpBoundingRect; + if (textConfig.layoutRect) { + layoutRect.copy(textConfig.layoutRect); + } else { + layoutRect.copy(this.getBoundingRect()); + } + if (!isLocal) { + layoutRect.applyTransform(this.transform); + } + if (this.calculateTextPosition) { + this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } else { + calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect); + } + innerTransformable.x = tmpTextPosCalcRes.x; + innerTransformable.y = tmpTextPosCalcRes.y; + textAlign = tmpTextPosCalcRes.align; + textVerticalAlign = tmpTextPosCalcRes.verticalAlign; + var textOrigin = textConfig.origin; + if (textOrigin && textConfig.rotation != null) { + var relOriginX = void 0; + var relOriginY = void 0; + if (textOrigin === 'center') { + relOriginX = layoutRect.width * 0.5; + relOriginY = layoutRect.height * 0.5; + } else { + relOriginX = parsePercent(textOrigin[0], layoutRect.width); + relOriginY = parsePercent(textOrigin[1], layoutRect.height); + } + innerOrigin = true; + innerTransformable.originX = -innerTransformable.x + relOriginX + (isLocal ? 0 : layoutRect.x); + innerTransformable.originY = -innerTransformable.y + relOriginY + (isLocal ? 0 : layoutRect.y); + } + } + if (textConfig.rotation != null) { + innerTransformable.rotation = textConfig.rotation; + } + var textOffset = textConfig.offset; + if (textOffset) { + innerTransformable.x += textOffset[0]; + innerTransformable.y += textOffset[1]; + if (!innerOrigin) { + innerTransformable.originX = -textOffset[0]; + innerTransformable.originY = -textOffset[1]; + } + } + var isInside = textConfig.inside == null + ? (typeof textConfig.position === 'string' && textConfig.position.indexOf('inside') >= 0) + : textConfig.inside; + var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {}); + var textFill = void 0; + var textStroke = void 0; + var autoStroke = void 0; + if (isInside && this.canBeInsideText()) { + textFill = textConfig.insideFill; + textStroke = textConfig.insideStroke; + if (textFill == null || textFill === 'auto') { + textFill = this.getInsideTextFill(); + } + if (textStroke == null || textStroke === 'auto') { + textStroke = this.getInsideTextStroke(textFill); + autoStroke = true; + } + } else { + textFill = textConfig.outsideFill; + textStroke = textConfig.outsideStroke; + if (textFill == null || textFill === 'auto') { + textFill = this.getOutsideFill(); + } + if (textStroke == null || textStroke === 'auto') { + textStroke = this.getOutsideStroke(textFill); + autoStroke = true; + } + } + textFill = textFill || '#000'; + if (textFill !== innerTextDefaultStyle.fill + || textStroke !== innerTextDefaultStyle.stroke + || autoStroke !== innerTextDefaultStyle.autoStroke + || textAlign !== innerTextDefaultStyle.align + || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) { + textStyleChanged = true; + innerTextDefaultStyle.fill = textFill; + innerTextDefaultStyle.stroke = textStroke; + innerTextDefaultStyle.autoStroke = autoStroke; + innerTextDefaultStyle.align = textAlign; + innerTextDefaultStyle.verticalAlign = textVerticalAlign; + textEl.setDefaultTextStyle(innerTextDefaultStyle); + } + textEl.__dirty |= REDRAW_BIT; + if (textStyleChanged) { + textEl.dirtyStyle(true); + } + } + }; + Element.prototype.canBeInsideText = function () { + return true; + }; + Element.prototype.getInsideTextFill = function () { + return '#fff'; + }; + Element.prototype.getInsideTextStroke = function (textFill) { + return '#000'; + }; + Element.prototype.getOutsideFill = function () { + return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR; + }; + Element.prototype.getOutsideStroke = function (textFill) { + var backgroundColor = this.__zr && this.__zr.getBackgroundColor(); + var colorArr = typeof backgroundColor === 'string' && parse(backgroundColor); + if (!colorArr) { + colorArr = [255, 255, 255, 1]; + } + var alpha = colorArr[3]; + var isDark = this.__zr.isDarkMode(); + for (var i = 0; i < 3; i++) { + colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha); + } + colorArr[3] = 1; + return stringify(colorArr, 'rgba'); + }; + Element.prototype.traverse = function (cb, context) { + }; + Element.prototype.attrKV = function (key, value) { + if (key === 'textConfig') { + this.setTextConfig(value); + } else if (key === 'textContent') { + this.setTextContent(value); + } else if (key === 'clipPath') { + this.setClipPath(value); + } else if (key === 'extra') { + this.extra = this.extra || {}; + extend(this.extra, value); + } else { + this[key] = value; + } + }; + Element.prototype.hide = function () { + this.ignore = true; + this.markRedraw(); + }; + Element.prototype.show = function () { + this.ignore = false; + this.markRedraw(); + }; + Element.prototype.attr = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.attrKV(keyOrObj, value); + } else if (isObject(keyOrObj)) { + var obj = keyOrObj; + var keysArr = keys(obj); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + this.attrKV(key, keyOrObj[key]); + } + } + this.markRedraw(); + return this; + }; + Element.prototype.saveCurrentToNormalState = function (toState) { + this._innerSaveToNormal(toState); + var normalState = this._normalState; + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var fromStateTransition = animator.__fromStateTransition; + if (animator.getLoop() || fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) { + continue; + } + var targetName = animator.targetName; + var target = targetName + ? normalState[targetName] : normalState; + animator.saveTo(target); + } + }; + Element.prototype._innerSaveToNormal = function (toState) { + var normalState = this._normalState; + if (!normalState) { + normalState = this._normalState = {}; + } + if (toState.textConfig && !normalState.textConfig) { + normalState.textConfig = this.textConfig; + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS); + }; + Element.prototype._savePrimaryToNormal = function (toState, normalState, primaryKeys) { + for (var i = 0; i < primaryKeys.length; i++) { + var key = primaryKeys[i]; + if (toState[key] != null && !(key in normalState)) { + normalState[key] = this[key]; + } + } + }; + Element.prototype.hasState = function () { + return this.currentStates.length > 0; + }; + Element.prototype.getState = function (name) { + return this.states[name]; + }; + Element.prototype.ensureState = function (name) { + var states = this.states; + if (!states[name]) { + states[name] = {}; + } + return states[name]; + }; + Element.prototype.clearStates = function (noAnimation) { + this.useState(PRESERVED_NORMAL_STATE, false, noAnimation); + }; + Element.prototype.useState = function (stateName, keepCurrentStates, noAnimation, forceUseHoverLayer) { + var toNormalState = stateName === PRESERVED_NORMAL_STATE; + var hasStates = this.hasState(); + if (!hasStates && toNormalState) { + return; + } + var currentStates = this.currentStates; + var animationCfg = this.stateTransition; + if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) { + return; + } + var state; + if (this.stateProxy && !toNormalState) { + state = this.stateProxy(stateName); + } + if (!state) { + state = (this.states && this.states[stateName]); + } + if (!state && !toNormalState) { + logError("State " + stateName + " not exists."); + return; + } + if (!toNormalState) { + this.saveCurrentToNormalState(state); + } + var useHoverLayer = !!((state && state.hoverLayer) || forceUseHoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); + } + if (textGuide) { + textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer); + } + if (toNormalState) { + this.currentStates = []; + this._normalState = {}; + } else { + if (!keepCurrentStates) { + this.currentStates = [stateName]; + } else { + this.currentStates.push(stateName); + } + } + this._updateAnimationTargets(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= ~REDRAW_BIT; + } + return state; + }; + Element.prototype.useStates = function (states, noAnimation, forceUseHoverLayer) { + if (!states.length) { + this.clearStates(); + } else { + var stateObjects = []; + var currentStates = this.currentStates; + var len = states.length; + var notChange = len === currentStates.length; + if (notChange) { + for (var i = 0; i < len; i++) { + if (states[i] !== currentStates[i]) { + notChange = false; + break; + } + } + } + if (notChange) { + return; + } + for (var i = 0; i < len; i++) { + var stateName = states[i]; + var stateObj = void 0; + if (this.stateProxy) { + stateObj = this.stateProxy(stateName, states); + } + if (!stateObj) { + stateObj = this.states[stateName]; + } + if (stateObj) { + stateObjects.push(stateObj); + } + } + var lastStateObj = stateObjects[len - 1]; + var useHoverLayer = !!((lastStateObj && lastStateObj.hoverLayer) || forceUseHoverLayer); + if (useHoverLayer) { + this._toggleHoverLayerFlag(true); + } + var mergedState = this._mergeStates(stateObjects); + var animationCfg = this.stateTransition; + this.saveCurrentToNormalState(mergedState); + this._applyStateObj(states.join(','), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg); + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.useStates(states, noAnimation, useHoverLayer); + } + if (textGuide) { + textGuide.useStates(states, noAnimation, useHoverLayer); + } + this._updateAnimationTargets(); + this.currentStates = states.slice(); + this.markRedraw(); + if (!useHoverLayer && this.__inHover) { + this._toggleHoverLayerFlag(false); + this.__dirty &= ~REDRAW_BIT; + } + } + }; + Element.prototype._updateAnimationTargets = function () { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + if (animator.targetName) { + animator.changeTarget(this[animator.targetName]); + } + } + }; + Element.prototype.removeState = function (state) { + var idx = indexOf(this.currentStates, state); + if (idx >= 0) { + var currentStates = this.currentStates.slice(); + currentStates.splice(idx, 1); + this.useStates(currentStates); + } + }; + Element.prototype.replaceState = function (oldState, newState, forceAdd) { + var currentStates = this.currentStates.slice(); + var idx = indexOf(currentStates, oldState); + var newStateExists = indexOf(currentStates, newState) >= 0; + if (idx >= 0) { + if (!newStateExists) { + currentStates[idx] = newState; + } else { + currentStates.splice(idx, 1); + } + } else if (forceAdd && !newStateExists) { + currentStates.push(newState); + } + this.useStates(currentStates); + }; + Element.prototype.toggleState = function (state, enable) { + if (enable) { + this.useState(state, true); + } else { + this.removeState(state); + } + }; + Element.prototype._mergeStates = function (states) { + var mergedState = {}; + var mergedTextConfig; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + extend(mergedState, state); + if (state.textConfig) { + mergedTextConfig = mergedTextConfig || {}; + extend(mergedTextConfig, state.textConfig); + } + } + if (mergedTextConfig) { + mergedState.textConfig = mergedTextConfig; + } + return mergedState; + }; + Element.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + var needsRestoreToNormal = !(state && keepCurrentStates); + if (state && state.textConfig) { + this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig); + extend(this.textConfig, state.textConfig); + } else if (needsRestoreToNormal) { + if (normalState.textConfig) { + this.textConfig = normalState.textConfig; + } + } + var transitionTarget = {}; + var hasTransition = false; + for (var i = 0; i < PRIMARY_STATES_KEYS.length; i++) { + var key = PRIMARY_STATES_KEYS[i]; + var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key]; + if (state && state[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = state[key]; + } else { + this[key] = state[key]; + } + } else if (needsRestoreToNormal) { + if (normalState[key] != null) { + if (propNeedsTransition) { + hasTransition = true; + transitionTarget[key] = normalState[key]; + } else { + this[key] = normalState[key]; + } + } + } + } + if (!transition) { + for (var i = 0; i < this.animators.length; i++) { + var animator = this.animators[i]; + var targetName = animator.targetName; + if (!animator.getLoop()) { + animator.__changeFinalValue(targetName + ? (state || normalState)[targetName] + : (state || normalState)); + } + } + } + if (hasTransition) { + this._transitionState(stateName, transitionTarget, animationCfg); + } + }; + Element.prototype._attachComponent = function (componentEl) { + if (componentEl.__zr && !componentEl.__hostTarget) { + if ("development" !== 'production') { + throw new Error('Text element has been added to zrender.'); + } + return; + } + if (componentEl === this) { + if ("development" !== 'production') { + throw new Error('Recursive component attachment.'); + } + return; + } + var zr = this.__zr; + if (zr) { + componentEl.addSelfToZr(zr); + } + componentEl.__zr = zr; + componentEl.__hostTarget = this; + }; + Element.prototype._detachComponent = function (componentEl) { + if (componentEl.__zr) { + componentEl.removeSelfFromZr(componentEl.__zr); + } + componentEl.__zr = null; + componentEl.__hostTarget = null; + }; + Element.prototype.getClipPath = function () { + return this._clipPath; + }; + Element.prototype.setClipPath = function (clipPath) { + if (this._clipPath && this._clipPath !== clipPath) { + this.removeClipPath(); + } + this._attachComponent(clipPath); + this._clipPath = clipPath; + this.markRedraw(); + }; + Element.prototype.removeClipPath = function () { + var clipPath = this._clipPath; + if (clipPath) { + this._detachComponent(clipPath); + this._clipPath = null; + this.markRedraw(); + } + }; + Element.prototype.getTextContent = function () { + return this._textContent; + }; + Element.prototype.setTextContent = function (textEl) { + var previousTextContent = this._textContent; + if (previousTextContent === textEl) { + return; + } + if (previousTextContent && previousTextContent !== textEl) { + this.removeTextContent(); + } + if ("development" !== 'production') { + if (textEl.__zr && !textEl.__hostTarget) { + throw new Error('Text element has been added to zrender.'); + } + } + textEl.innerTransformable = new Transformable(); + this._attachComponent(textEl); + this._textContent = textEl; + this.markRedraw(); + }; + Element.prototype.setTextConfig = function (cfg) { + if (!this.textConfig) { + this.textConfig = {}; + } + extend(this.textConfig, cfg); + this.markRedraw(); + }; + Element.prototype.removeTextConfig = function () { + this.textConfig = null; + this.markRedraw(); + }; + Element.prototype.removeTextContent = function () { + var textEl = this._textContent; + if (textEl) { + textEl.innerTransformable = null; + this._detachComponent(textEl); + this._textContent = null; + this._innerTextDefaultStyle = null; + this.markRedraw(); + } + }; + Element.prototype.getTextGuideLine = function () { + return this._textGuide; + }; + Element.prototype.setTextGuideLine = function (guideLine) { + if (this._textGuide && this._textGuide !== guideLine) { + this.removeTextGuideLine(); + } + this._attachComponent(guideLine); + this._textGuide = guideLine; + this.markRedraw(); + }; + Element.prototype.removeTextGuideLine = function () { + var textGuide = this._textGuide; + if (textGuide) { + this._detachComponent(textGuide); + this._textGuide = null; + this.markRedraw(); + } + }; + Element.prototype.markRedraw = function () { + this.__dirty |= REDRAW_BIT; + var zr = this.__zr; + if (zr) { + if (this.__inHover) { + zr.refreshHover(); + } else { + zr.refresh(); + } + } + if (this.__hostTarget) { + this.__hostTarget.markRedraw(); + } + }; + Element.prototype.dirty = function () { + this.markRedraw(); + }; + Element.prototype._toggleHoverLayerFlag = function (inHover) { + this.__inHover = inHover; + var textContent = this._textContent; + var textGuide = this._textGuide; + if (textContent) { + textContent.__inHover = inHover; + } + if (textGuide) { + textGuide.__inHover = inHover; + } + }; + Element.prototype.addSelfToZr = function (zr) { + if (this.__zr === zr) { + return; + } + this.__zr = zr; + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.addAnimator(animators[i]); + } + } + if (this._clipPath) { + this._clipPath.addSelfToZr(zr); + } + if (this._textContent) { + this._textContent.addSelfToZr(zr); + } + if (this._textGuide) { + this._textGuide.addSelfToZr(zr); + } + }; + Element.prototype.removeSelfFromZr = function (zr) { + if (!this.__zr) { + return; + } + this.__zr = null; + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.removeAnimator(animators[i]); + } + } + if (this._clipPath) { + this._clipPath.removeSelfFromZr(zr); + } + if (this._textContent) { + this._textContent.removeSelfFromZr(zr); + } + if (this._textGuide) { + this._textGuide.removeSelfFromZr(zr); + } + }; + Element.prototype.animate = function (key, loop, allowDiscreteAnimation) { + var target = key ? this[key] : this; + if ("development" !== 'production') { + if (!target) { + logError('Property "' + + key + + '" is not existed in element ' + + this.id); + return; + } + } + var animator = new Animator(target, loop, allowDiscreteAnimation); + key && (animator.targetName = key); + this.addAnimator(animator, key); + return animator; + }; + Element.prototype.addAnimator = function (animator, key) { + var zr = this.__zr; + var el = this; + animator.during(function () { + el.updateDuringAnimation(key); + }).done(function () { + var animators = el.animators; + var idx = indexOf(animators, animator); + if (idx >= 0) { + animators.splice(idx, 1); + } + }); + this.animators.push(animator); + if (zr) { + zr.animation.addAnimator(animator); + } + zr && zr.wakeUp(); + }; + Element.prototype.updateDuringAnimation = function (key) { + this.markRedraw(); + }; + Element.prototype.stopAnimation = function (scope, forwardToLast) { + var animators = this.animators; + var len = animators.length; + var leftAnimators = []; + for (var i = 0; i < len; i++) { + var animator = animators[i]; + if (!scope || scope === animator.scope) { + animator.stop(forwardToLast); + } else { + leftAnimators.push(animator); + } + } + this.animators = leftAnimators; + return this; + }; + Element.prototype.animateTo = function (target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps); + }; + Element.prototype.animateFrom = function (target, cfg, animationProps) { + animateTo(this, target, cfg, animationProps, true); + }; + Element.prototype._transitionState = function (stateName, target, cfg, animationProps) { + var animators = animateTo(this, target, cfg, animationProps); + for (var i = 0; i < animators.length; i++) { + animators[i].__fromStateTransition = stateName; + } + }; + Element.prototype.getBoundingRect = function () { + return null; + }; + Element.prototype.getPaintRect = function () { + return null; + }; + Element.initDefaultProps = (function () { + var elProto = Element.prototype; + elProto.type = 'element'; + elProto.name = ''; + elProto.ignore = + elProto.silent = + elProto.isGroup = + elProto.draggable = + elProto.dragging = + elProto.ignoreClip = + elProto.__inHover = false; + elProto.__dirty = REDRAW_BIT; + var logs = {}; + + function logDeprecatedError(key, xKey, yKey) { + if (!logs[key + xKey + yKey]) { + console.warn("DEPRECATED: '" + key + "' has been deprecated. use '" + xKey + "', '" + yKey + "' instead"); + logs[key + xKey + yKey] = true; + } + } + + function createLegacyProperty(key, privateKey, xKey, yKey) { + Object.defineProperty(elProto, key, { + get: function () { + if ("development" !== 'production') { + logDeprecatedError(key, xKey, yKey); + } + if (!this[privateKey]) { + var pos = this[privateKey] = []; + enhanceArray(this, pos); + } + return this[privateKey]; + }, + set: function (pos) { + if ("development" !== 'production') { + logDeprecatedError(key, xKey, yKey); + } + this[xKey] = pos[0]; + this[yKey] = pos[1]; + this[privateKey] = pos; + enhanceArray(this, pos); + } + }); + + function enhanceArray(self, pos) { + Object.defineProperty(pos, 0, { + get: function () { + return self[xKey]; + }, + set: function (val) { + self[xKey] = val; + } + }); + Object.defineProperty(pos, 1, { + get: function () { + return self[yKey]; + }, + set: function (val) { + self[yKey] = val; + } + }); + } + } + + if (Object.defineProperty) { + createLegacyProperty('position', '_legacyPos', 'x', 'y'); + createLegacyProperty('scale', '_legacyScale', 'scaleX', 'scaleY'); + createLegacyProperty('origin', '_legacyOrigin', 'originX', 'originY'); + } + })(); + return Element; + }()); + mixin(Element, Eventful); + mixin(Element, Transformable); + + function animateTo(animatable, target, cfg, animationProps, reverse) { + cfg = cfg || {}; + var animators = []; + animateToShallow(animatable, '', animatable, target, cfg, animationProps, animators, reverse); + var finishCount = animators.length; + var doneHappened = false; + var cfgDone = cfg.done; + var cfgAborted = cfg.aborted; + var doneCb = function () { + doneHappened = true; + finishCount--; + if (finishCount <= 0) { + doneHappened + ? (cfgDone && cfgDone()) + : (cfgAborted && cfgAborted()); + } + }; + var abortedCb = function () { + finishCount--; + if (finishCount <= 0) { + doneHappened + ? (cfgDone && cfgDone()) + : (cfgAborted && cfgAborted()); + } + }; + if (!finishCount) { + cfgDone && cfgDone(); + } + if (animators.length > 0 && cfg.during) { + animators[0].during(function (target, percent) { + cfg.during(percent); + }); + } + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; + if (doneCb) { + animator.done(doneCb); + } + if (abortedCb) { + animator.aborted(abortedCb); + } + if (cfg.force) { + animator.duration(cfg.duration); + } + animator.start(cfg.easing); + } + return animators; + } + + function copyArrShallow(source, target, len) { + for (var i = 0; i < len; i++) { + source[i] = target[i]; + } + } + + function is2DArray(value) { + return isArrayLike(value[0]); + } + + function copyValue(target, source, key) { + if (isArrayLike(source[key])) { + if (!isArrayLike(target[key])) { + target[key] = []; + } + if (isTypedArray(source[key])) { + var len = source[key].length; + if (target[key].length !== len) { + target[key] = new (source[key].constructor)(len); + copyArrShallow(target[key], source[key], len); + } + } else { + var sourceArr = source[key]; + var targetArr = target[key]; + var len0 = sourceArr.length; + if (is2DArray(sourceArr)) { + var len1 = sourceArr[0].length; + for (var i = 0; i < len0; i++) { + if (!targetArr[i]) { + targetArr[i] = Array.prototype.slice.call(sourceArr[i]); + } else { + copyArrShallow(targetArr[i], sourceArr[i], len1); + } + } + } else { + copyArrShallow(targetArr, sourceArr, len0); + } + targetArr.length = sourceArr.length; + } + } else { + target[key] = source[key]; + } + } + + function isValueSame(val1, val2) { + return val1 === val2 + || isArrayLike(val1) && isArrayLike(val2) && is1DArraySame(val1, val2); + } + + function is1DArraySame(arr0, arr1) { + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + return true; + } + + function animateToShallow(animatable, topKey, animateObj, target, cfg, animationProps, animators, reverse) { + var targetKeys = keys(target); + var duration = cfg.duration; + var delay = cfg.delay; + var additive = cfg.additive; + var setToFinal = cfg.setToFinal; + var animateAll = !isObject(animationProps); + var existsAnimators = animatable.animators; + var animationKeys = []; + for (var k = 0; k < targetKeys.length; k++) { + var innerKey = targetKeys[k]; + var targetVal = target[innerKey]; + if (targetVal != null && animateObj[innerKey] != null + && (animateAll || animationProps[innerKey])) { + if (isObject(targetVal) + && !isArrayLike(targetVal) + && !isGradientObject(targetVal)) { + if (topKey) { + if (!reverse) { + animateObj[innerKey] = targetVal; + animatable.updateDuringAnimation(topKey); + } + continue; + } + animateToShallow(animatable, innerKey, animateObj[innerKey], targetVal, cfg, animationProps && animationProps[innerKey], animators, reverse); + } else { + animationKeys.push(innerKey); + } + } else if (!reverse) { + animateObj[innerKey] = targetVal; + animatable.updateDuringAnimation(topKey); + animationKeys.push(innerKey); + } + } + var keyLen = animationKeys.length; + if (!additive && keyLen) { + for (var i = 0; i < existsAnimators.length; i++) { + var animator = existsAnimators[i]; + if (animator.targetName === topKey) { + var allAborted = animator.stopTracks(animationKeys); + if (allAborted) { + var idx = indexOf(existsAnimators, animator); + existsAnimators.splice(idx, 1); + } + } + } + } + if (!cfg.force) { + animationKeys = filter(animationKeys, function (key) { + return !isValueSame(target[key], animateObj[key]); + }); + keyLen = animationKeys.length; + } + if (keyLen > 0 + || (cfg.force && !animators.length)) { + var revertedSource = void 0; + var reversedTarget = void 0; + var sourceClone = void 0; + if (reverse) { + reversedTarget = {}; + if (setToFinal) { + revertedSource = {}; + } + for (var i = 0; i < keyLen; i++) { + var innerKey = animationKeys[i]; + reversedTarget[innerKey] = animateObj[innerKey]; + if (setToFinal) { + revertedSource[innerKey] = target[innerKey]; + } else { + animateObj[innerKey] = target[innerKey]; + } + } + } else if (setToFinal) { + sourceClone = {}; + for (var i = 0; i < keyLen; i++) { + var innerKey = animationKeys[i]; + sourceClone[innerKey] = cloneValue(animateObj[innerKey]); + copyValue(animateObj, target, innerKey); + } + } + var animator = new Animator(animateObj, false, false, additive ? filter(existsAnimators, function (animator) { + return animator.targetName === topKey; + }) : null); + animator.targetName = topKey; + if (cfg.scope) { + animator.scope = cfg.scope; + } + if (setToFinal && revertedSource) { + animator.whenWithKeys(0, revertedSource, animationKeys); + } + if (sourceClone) { + animator.whenWithKeys(0, sourceClone, animationKeys); + } + animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animationKeys).delay(delay || 0); + animatable.addAnimator(animator, topKey); + animators.push(animator); + } + } + + var Group = (function (_super) { + __extends(Group, _super); + + function Group(opts) { + var _this = _super.call(this) || this; + _this.isGroup = true; + _this._children = []; + _this.attr(opts); + return _this; + } + + Group.prototype.childrenRef = function () { + return this._children; + }; + Group.prototype.children = function () { + return this._children.slice(); + }; + Group.prototype.childAt = function (idx) { + return this._children[idx]; + }; + Group.prototype.childOfName = function (name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }; + Group.prototype.childCount = function () { + return this._children.length; + }; + Group.prototype.add = function (child) { + if (child) { + if (child !== this && child.parent !== this) { + this._children.push(child); + this._doAdd(child); + } + if ("development" !== 'production') { + if (child.__hostTarget) { + throw 'This elemenet has been used as an attachment'; + } + } + } + return this; + }; + Group.prototype.addBefore = function (child, nextSibling) { + if (child && child !== this && child.parent !== this + && nextSibling && nextSibling.parent === this) { + var children = this._children; + var idx = children.indexOf(nextSibling); + if (idx >= 0) { + children.splice(idx, 0, child); + this._doAdd(child); + } + } + return this; + }; + Group.prototype.replace = function (oldChild, newChild) { + var idx = indexOf(this._children, oldChild); + if (idx >= 0) { + this.replaceAt(newChild, idx); + } + return this; + }; + Group.prototype.replaceAt = function (child, index) { + var children = this._children; + var old = children[index]; + if (child && child !== this && child.parent !== this && child !== old) { + children[index] = child; + old.parent = null; + var zr = this.__zr; + if (zr) { + old.removeSelfFromZr(zr); + } + this._doAdd(child); + } + return this; + }; + Group.prototype._doAdd = function (child) { + if (child.parent) { + child.parent.remove(child); + } + child.parent = this; + var zr = this.__zr; + if (zr && zr !== child.__zr) { + child.addSelfToZr(zr); + } + zr && zr.refresh(); + }; + Group.prototype.remove = function (child) { + var zr = this.__zr; + var children = this._children; + var idx = indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + child.parent = null; + if (zr) { + child.removeSelfFromZr(zr); + } + zr && zr.refresh(); + return this; + }; + Group.prototype.removeAll = function () { + var children = this._children; + var zr = this.__zr; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (zr) { + child.removeSelfFromZr(zr); + } + child.parent = null; + } + children.length = 0; + return this; + }; + Group.prototype.eachChild = function (cb, context) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + cb.call(context, child, i); + } + return this; + }; + Group.prototype.traverse = function (cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + var stopped = cb.call(context, child); + if (child.isGroup && !stopped) { + child.traverse(cb, context); + } + } + return this; + }; + Group.prototype.addSelfToZr = function (zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.addSelfToZr(zr); + } + }; + Group.prototype.removeSelfFromZr = function (zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.removeSelfFromZr(zr); + } + }; + Group.prototype.getBoundingRect = function (includeChildren) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.ignore || child.invisible) { + continue; + } + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + BoundingRect.applyTransform(tmpRect, childRect, transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + }; + return Group; + }(Element)); + Group.prototype.type = 'group'; + + /*! + * ZRender, a high performance 2d drawing library. + * + * Copyright (c) 2013, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt + */ + var painterCtors = {}; + var instances = {}; + + function delInstance(id) { + delete instances[id]; + } + + function isDarkMode(backgroundColor) { + if (!backgroundColor) { + return false; + } + if (typeof backgroundColor === 'string') { + return lum(backgroundColor, 1) < DARK_MODE_THRESHOLD; + } else if (backgroundColor.colorStops) { + var colorStops = backgroundColor.colorStops; + var totalLum = 0; + var len = colorStops.length; + for (var i = 0; i < len; i++) { + totalLum += lum(colorStops[i].color, 1); + } + totalLum /= len; + return totalLum < DARK_MODE_THRESHOLD; + } + return false; + } + + var ZRender = (function () { + function ZRender(id, dom, opts) { + var _this = this; + this._sleepAfterStill = 10; + this._stillFrameAccum = 0; + this._needsRefresh = true; + this._needsRefreshHover = true; + this._darkMode = false; + opts = opts || {}; + this.dom = dom; + this.id = id; + var storage = new Storage(); + var rendererType = opts.renderer || 'canvas'; + if (!painterCtors[rendererType]) { + rendererType = keys(painterCtors)[0]; + } + if ("development" !== 'production') { + if (!painterCtors[rendererType]) { + throw new Error("Renderer '" + rendererType + "' is not imported. Please import it first."); + } + } + opts.useDirtyRect = opts.useDirtyRect == null + ? false + : opts.useDirtyRect; + var painter = new painterCtors[rendererType](dom, storage, opts, id); + var ssrMode = opts.ssr || painter.ssrOnly; + this.storage = storage; + this.painter = painter; + var handerProxy = (!env.node && !env.worker && !ssrMode) + ? new HandlerDomProxy(painter.getViewportRoot(), painter.root) + : null; + this.handler = new Handler(storage, painter, handerProxy, painter.root); + this.animation = new Animation({ + stage: { + update: ssrMode ? null : function () { + return _this._flush(true); + } + } + }); + if (!ssrMode) { + this.animation.start(); + } + } + + ZRender.prototype.add = function (el) { + if (!el) { + return; + } + this.storage.addRoot(el); + el.addSelfToZr(this); + this.refresh(); + }; + ZRender.prototype.remove = function (el) { + if (!el) { + return; + } + this.storage.delRoot(el); + el.removeSelfFromZr(this); + this.refresh(); + }; + ZRender.prototype.configLayer = function (zLevel, config) { + if (this.painter.configLayer) { + this.painter.configLayer(zLevel, config); + } + this.refresh(); + }; + ZRender.prototype.setBackgroundColor = function (backgroundColor) { + if (this.painter.setBackgroundColor) { + this.painter.setBackgroundColor(backgroundColor); + } + this.refresh(); + this._backgroundColor = backgroundColor; + this._darkMode = isDarkMode(backgroundColor); + }; + ZRender.prototype.getBackgroundColor = function () { + return this._backgroundColor; + }; + ZRender.prototype.setDarkMode = function (darkMode) { + this._darkMode = darkMode; + }; + ZRender.prototype.isDarkMode = function () { + return this._darkMode; + }; + ZRender.prototype.refreshImmediately = function (fromInside) { + if (!fromInside) { + this.animation.update(true); + } + this._needsRefresh = false; + this.painter.refresh(); + this._needsRefresh = false; + }; + ZRender.prototype.refresh = function () { + this._needsRefresh = true; + this.animation.start(); + }; + ZRender.prototype.flush = function () { + this._flush(false); + }; + ZRender.prototype._flush = function (fromInside) { + var triggerRendered; + var start = getTime(); + if (this._needsRefresh) { + triggerRendered = true; + this.refreshImmediately(fromInside); + } + if (this._needsRefreshHover) { + triggerRendered = true; + this.refreshHoverImmediately(); + } + var end = getTime(); + if (triggerRendered) { + this._stillFrameAccum = 0; + this.trigger('rendered', { + elapsedTime: end - start + }); + } else if (this._sleepAfterStill > 0) { + this._stillFrameAccum++; + if (this._stillFrameAccum > this._sleepAfterStill) { + this.animation.stop(); + } + } + }; + ZRender.prototype.setSleepAfterStill = function (stillFramesCount) { + this._sleepAfterStill = stillFramesCount; + }; + ZRender.prototype.wakeUp = function () { + this.animation.start(); + this._stillFrameAccum = 0; + }; + ZRender.prototype.refreshHover = function () { + this._needsRefreshHover = true; + }; + ZRender.prototype.refreshHoverImmediately = function () { + this._needsRefreshHover = false; + if (this.painter.refreshHover && this.painter.getType() === 'canvas') { + this.painter.refreshHover(); + } + }; + ZRender.prototype.resize = function (opts) { + opts = opts || {}; + this.painter.resize(opts.width, opts.height); + this.handler.resize(); + }; + ZRender.prototype.clearAnimation = function () { + this.animation.clear(); + }; + ZRender.prototype.getWidth = function () { + return this.painter.getWidth(); + }; + ZRender.prototype.getHeight = function () { + return this.painter.getHeight(); + }; + ZRender.prototype.setCursorStyle = function (cursorStyle) { + this.handler.setCursorStyle(cursorStyle); + }; + ZRender.prototype.findHover = function (x, y) { + return this.handler.findHover(x, y); + }; + ZRender.prototype.on = function (eventName, eventHandler, context) { + this.handler.on(eventName, eventHandler, context); + return this; + }; + ZRender.prototype.off = function (eventName, eventHandler) { + this.handler.off(eventName, eventHandler); + }; + ZRender.prototype.trigger = function (eventName, event) { + this.handler.trigger(eventName, event); + }; + ZRender.prototype.clear = function () { + var roots = this.storage.getRoots(); + for (var i = 0; i < roots.length; i++) { + if (roots[i] instanceof Group) { + roots[i].removeSelfFromZr(this); + } + } + this.storage.delAllRoots(); + this.painter.clear(); + }; + ZRender.prototype.dispose = function () { + this.animation.stop(); + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler.dispose(); + this.animation = + this.storage = + this.painter = + this.handler = null; + delInstance(this.id); + }; + return ZRender; + }()); + + function init(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances[zr.id] = zr; + return zr; + } + + function dispose(zr) { + zr.dispose(); + } + + function disposeAll() { + for (var key in instances) { + if (instances.hasOwnProperty(key)) { + instances[key].dispose(); + } + } + instances = {}; + } + + function getInstance(id) { + return instances[id]; + } + + function registerPainter(name, Ctor) { + painterCtors[name] = Ctor; + } + + var version = '5.3.0'; + + var zrender = /*#__PURE__*/Object.freeze({ + __proto__: null, + init: init, + dispose: dispose, + disposeAll: disposeAll, + getInstance: getInstance, + registerPainter: registerPainter, + version: version + }); + + var RADIAN_EPSILON = 1e-4; // Although chrome already enlarge this number to 100 for `toFixed`, but + // we sill follow the spec for compatibility. + + var ROUND_SUPPORTED_PRECISION_MAX = 20; + + function _trim(str) { + return str.replace(/^\s+|\s+$/g, ''); + } + + /** + * Linear mapping a value from domain to range + * @param val + * @param domain Domain extent domain[0] can be bigger than domain[1] + * @param range Range extent range[0] can be bigger than range[1] + * @param clamp Default to be false + */ + + + function linearMap(val, domain, range, clamp) { + var d0 = domain[0]; + var d1 = domain[1]; + var r0 = range[0]; + var r1 = range[1]; + var subDomain = d1 - d0; + var subRange = r1 - r0; + + if (subDomain === 0) { + return subRange === 0 ? r0 : (r0 + r1) / 2; + } // Avoid accuracy problem in edge, such as + // 146.39 - 62.83 === 83.55999999999999. + // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError + // It is a little verbose for efficiency considering this method + // is a hotspot. + + + if (clamp) { + if (subDomain > 0) { + if (val <= d0) { + return r0; + } else if (val >= d1) { + return r1; + } + } else { + if (val >= d0) { + return r0; + } else if (val <= d1) { + return r1; + } + } + } else { + if (val === d0) { + return r0; + } + + if (val === d1) { + return r1; + } + } + + return (val - d0) / subDomain * subRange + r0; + } + + /** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + */ + + function parsePercent$1(percent, all) { + switch (percent) { + case 'center': + case 'middle': + percent = '50%'; + break; + + case 'left': + case 'top': + percent = '0%'; + break; + + case 'right': + case 'bottom': + percent = '100%'; + break; + } + + if (isString(percent)) { + if (_trim(percent).match(/%$/)) { + return parseFloat(percent) / 100 * all; + } + + return parseFloat(percent); + } + + return percent == null ? NaN : +percent; + } + + function round(x, precision, returnStr) { + if (precision == null) { + precision = 10; + } // Avoid range error + + + precision = Math.min(Math.max(0, precision), ROUND_SUPPORTED_PRECISION_MAX); // PENDING: 1.005.toFixed(2) is '1.00' rather than '1.01' + + x = (+x).toFixed(precision); + return returnStr ? x : +x; + } + + /** + * Inplacd asc sort arr. + * The input arr will be modified. + */ + + function asc(arr) { + arr.sort(function (a, b) { + return a - b; + }); + return arr; + } + + /** + * Get precision. + */ + + function getPrecision(val) { + val = +val; + + if (isNaN(val)) { + return 0; + } // It is much faster than methods converting number to string as follows + // let tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + // Notice: + // (1) If the loop count is over about 20, it is slower than `getPrecisionSafe`. + // (see https://jsbench.me/2vkpcekkvw/1) + // (2) If the val is less than for example 1e-15, the result may be incorrect. + // (see test/ut/spec/util/number.test.ts `getPrecision_equal_random`) + + + if (val > 1e-14) { + var e = 1; + + for (var i = 0; i < 15; i++, e *= 10) { + if (Math.round(val * e) / e === val) { + return i; + } + } + } + + return getPrecisionSafe(val); + } + + /** + * Get precision with slow but safe method + */ + + function getPrecisionSafe(val) { + // toLowerCase for: '3.4E-12' + var str = val.toString().toLowerCase(); // Consider scientific notation: '3.4e-12' '3.4e+12' + + var eIndex = str.indexOf('e'); + var exp = eIndex > 0 ? +str.slice(eIndex + 1) : 0; + var significandPartLen = eIndex > 0 ? eIndex : str.length; + var dotIndex = str.indexOf('.'); + var decimalPartLen = dotIndex < 0 ? 0 : significandPartLen - 1 - dotIndex; + return Math.max(0, decimalPartLen - exp); + } + + /** + * Minimal dicernible data precisioin according to a single pixel. + */ + + function getPixelPrecision(dataExtent, pixelExtent) { + var log = Math.log; + var LN10 = Math.LN10; + var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); + var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); // toFixed() digits argument must be between 0 and 20. + + var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20); + return !isFinite(precision) ? 20 : precision; + } + + /** + * Get a data of given precision, assuring the sum of percentages + * in valueList is 1. + * The largest remainer method is used. + * https://en.wikipedia.org/wiki/Largest_remainder_method + * + * @param valueList a list of all data + * @param idx index of the data to be processed in valueList + * @param precision integer number showing digits of precision + * @return percent ranging from 0 to 100 + */ + + function getPercentWithPrecision(valueList, idx, precision) { + if (!valueList[idx]) { + return 0; + } + + var sum = reduce(valueList, function (acc, val) { + return acc + (isNaN(val) ? 0 : val); + }, 0); + + if (sum === 0) { + return 0; + } + + var digits = Math.pow(10, precision); + var votesPerQuota = map(valueList, function (val) { + return (isNaN(val) ? 0 : val) / sum * digits * 100; + }); + var targetSeats = digits * 100; + var seats = map(votesPerQuota, function (votes) { + // Assign automatic seats. + return Math.floor(votes); + }); + var currentSum = reduce(seats, function (acc, val) { + return acc + val; + }, 0); + var remainder = map(votesPerQuota, function (votes, idx) { + return votes - seats[idx]; + }); // Has remainding votes. + + while (currentSum < targetSeats) { + // Find next largest remainder. + var max = Number.NEGATIVE_INFINITY; + var maxId = null; + + for (var i = 0, len = remainder.length; i < len; ++i) { + if (remainder[i] > max) { + max = remainder[i]; + maxId = i; + } + } // Add a vote to max remainder. + + + ++seats[maxId]; + remainder[maxId] = 0; + ++currentSum; + } + + return seats[idx] / digits; + } + + /** + * Solve the floating point adding problem like 0.1 + 0.2 === 0.30000000000000004 + * See + */ + + function addSafe(val0, val1) { + var maxPrecision = Math.max(getPrecision(val0), getPrecision(val1)); // const multiplier = Math.pow(10, maxPrecision); + // return (Math.round(val0 * multiplier) + Math.round(val1 * multiplier)) / multiplier; + + var sum = val0 + val1; // // PENDING: support more? + + return maxPrecision > ROUND_SUPPORTED_PRECISION_MAX ? sum : round(sum, maxPrecision); + } // Number.MAX_SAFE_INTEGER, ie do not support. + + var MAX_SAFE_INTEGER = 9007199254740991; + + /** + * To 0 - 2 * PI, considering negative radian. + */ + + function remRadian(radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; + } + + /** + * @param {type} radian + * @return {boolean} + */ + + function isRadianAroundZero(val) { + return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; + } // eslint-disable-next-line + + var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line + + /** + * @param value valid type: number | string | Date, otherwise return `new Date(NaN)` + * These values can be accepted: + * + An instance of Date, represent a time in its own time zone. + * + Or string in a subset of ISO 8601, only including: + * + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06', + * + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123', + * + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00', + * all of which will be treated as local time if time zone is not specified + * (see ). + * + Or other string format, including (all of which will be treated as loacal time): + * '2012', '2012-3-1', '2012/3/1', '2012/03/01', + * '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123' + * + a timestamp, which represent a time in UTC. + * @return date Never be null/undefined. If invalid, return `new Date(NaN)`. + */ + + function parseDate(value) { + if (value instanceof Date) { + return value; + } else if (isString(value)) { + // Different browsers parse date in different way, so we parse it manually. + // Some other issues: + // new Date('1970-01-01') is UTC, + // new Date('1970/01/01') and new Date('1970-1-01') is local. + // See issue #3623 + var match = TIME_REG.exec(value); + + if (!match) { + // return Invalid Date. + return new Date(NaN); + } // Use local time when no timezone offset specifed. + + + if (!match[8]) { + // match[n] can only be string or undefined. + // But take care of '12' + 1 => '121'. + return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0); + } // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time, + // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment). + // For example, system timezone is set as "Time Zone: America/Toronto", + // then these code will get different result: + // `new Date(1478411999999).getTimezoneOffset(); // get 240` + // `new Date(1478412000000).getTimezoneOffset(); // get 300` + // So we should not use `new Date`, but use `Date.UTC`. + else { + var hour = +match[4] || 0; + + if (match[8].toUpperCase() !== 'Z') { + hour -= +match[8].slice(0, 3); + } + + return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0)); + } + } else if (value == null) { + return new Date(NaN); + } + + return new Date(Math.round(value)); + } + + /** + * Quantity of a number. e.g. 0.1, 1, 10, 100 + * + * @param val + * @return + */ + + function quantity(val) { + return Math.pow(10, quantityExponent(val)); + } + + /** + * Exponent of the quantity of a number + * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3 + * + * @param val non-negative value + * @return + */ + + function quantityExponent(val) { + if (val === 0) { + return 0; + } + + var exp = Math.floor(Math.log(val) / Math.LN10); + /** + * exp is expected to be the rounded-down result of the base-10 log of val. + * But due to the precision loss with Math.log(val), we need to restore it + * using 10^exp to make sure we can get val back from exp. #11249 + */ + + if (val / Math.pow(10, exp) >= 10) { + exp++; + } + + return exp; + } + + /** + * find a “nice” number approximately equal to x. Round the number if round = true, + * take ceiling if round = false. The primary observation is that the “nicest” + * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers. + * + * See "Nice Numbers for Graph Labels" of Graphic Gems. + * + * @param val Non-negative value. + * @param round + * @return Niced number + */ + + function nice(val, round) { + var exponent = quantityExponent(val); + var exp10 = Math.pow(10, exponent); + var f = val / exp10; // 1 <= f < 10 + + var nf; + + if (round) { + if (f < 1.5) { + nf = 1; + } else if (f < 2.5) { + nf = 2; + } else if (f < 4) { + nf = 3; + } else if (f < 7) { + nf = 5; + } else { + nf = 10; + } + } else { + if (f < 1) { + nf = 1; + } else if (f < 2) { + nf = 2; + } else if (f < 3) { + nf = 3; + } else if (f < 5) { + nf = 5; + } else { + nf = 10; + } + } + + val = nf * exp10; // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754). + // 20 is the uppper bound of toFixed. + + return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val; + } + + /** + * This code was copied from "d3.js" + * . + * See the license statement at the head of this file. + * @param ascArr + */ + + function quantile(ascArr, p) { + var H = (ascArr.length - 1) * p + 1; + var h = Math.floor(H); + var v = +ascArr[h - 1]; + var e = H - h; + return e ? v + e * (ascArr[h] - v) : v; + } + + /** + * Order intervals asc, and split them when overlap. + * expect(numberUtil.reformIntervals([ + * {interval: [18, 62], close: [1, 1]}, + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [1, 1]}, + * {interval: [62, 150], close: [1, 1]}, + * {interval: [106, 150], close: [1, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ])).toEqual([ + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [0, 1]}, + * {interval: [18, 62], close: [0, 1]}, + * {interval: [62, 150], close: [0, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ]); + * @param list, where `close` mean open or close + * of the interval, and Infinity can be used. + * @return The origin list, which has been reformed. + */ + + function reformIntervals(list) { + list.sort(function (a, b) { + return littleThan(a, b, 0) ? -1 : 1; + }); + var curr = -Infinity; + var currClose = 1; + + for (var i = 0; i < list.length;) { + var interval = list[i].interval; + var close_1 = list[i].close; + + for (var lg = 0; lg < 2; lg++) { + if (interval[lg] <= curr) { + interval[lg] = curr; + close_1[lg] = !lg ? 1 - currClose : 1; + } + + curr = interval[lg]; + currClose = close_1[lg]; + } + + if (interval[0] === interval[1] && close_1[0] * close_1[1] !== 1) { + list.splice(i, 1); + } else { + i++; + } + } + + return list; + + function littleThan(a, b, lg) { + return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1)); + } + } + + /** + * [Numberic is defined as]: + * `parseFloat(val) == val` + * For example: + * numeric: + * typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity, + * and they rounded by white-spaces or line-terminal like ' -123 \n ' (see es spec) + * not-numeric: + * null, undefined, [], {}, true, false, 'NaN', NaN, '123ab', + * empty string, string with only white-spaces or line-terminal (see es spec), + * 0x12, '0x12', '-0x12', 012, '012', '-012', + * non-string, ... + * + * @test See full test cases in `test/ut/spec/util/number.js`. + * @return Must be a typeof number. If not numeric, return NaN. + */ + + function numericToNumber(val) { + var valFloat = parseFloat(val); + return valFloat == val // eslint-disable-line eqeqeq + && (valFloat !== 0 || !isString(val) || val.indexOf('x') <= 0) // For case ' 0x0 '. + ? valFloat : NaN; + } + + /** + * Definition of "numeric": see `numericToNumber`. + */ + + function isNumeric(val) { + return !isNaN(numericToNumber(val)); + } + + /** + * Use random base to prevent users hard code depending on + * this auto generated marker id. + * @return An positive integer. + */ + + function getRandomIdBase() { + return Math.round(Math.random() * 9); + } + + /** + * Get the greatest common dividor + * + * @param {number} a one number + * @param {number} b the other number + */ + + function getGreatestCommonDividor(a, b) { + if (b === 0) { + return a; + } + + return getGreatestCommonDividor(b, a % b); + } + + /** + * Get the least common multiple + * + * @param {number} a one number + * @param {number} b the other number + */ + + function getLeastCommonMultiple(a, b) { + if (a == null) { + return b; + } + + if (b == null) { + return a; + } + + return a * b / getGreatestCommonDividor(a, b); + } + + var ECHARTS_PREFIX = '[ECharts] '; + var storedLogs = {}; + var hasConsole = typeof console !== 'undefined' // eslint-disable-next-line + && console.warn && console.log; + + function outputLog(type, str, onlyOnce) { + if (hasConsole) { + if (onlyOnce) { + if (storedLogs[str]) { + return; + } + + storedLogs[str] = true; + } // eslint-disable-next-line + + + console[type](ECHARTS_PREFIX + str); + } + } + + function log(str, onlyOnce) { + outputLog('log', str, onlyOnce); + } + + function warn(str, onlyOnce) { + outputLog('warn', str, onlyOnce); + } + + function error(str, onlyOnce) { + outputLog('error', str, onlyOnce); + } + + function deprecateLog(str) { + if ("development" !== 'production') { + // Not display duplicate message. + outputLog('warn', 'DEPRECATED: ' + str, true); + } + } + + function deprecateReplaceLog(oldOpt, newOpt, scope) { + if ("development" !== 'production') { + deprecateLog((scope ? "[" + scope + "]" : '') + (oldOpt + " is deprecated, use " + newOpt + " instead.")); + } + } + + /** + * If in __DEV__ environment, get console printable message for users hint. + * Parameters are separated by ' '. + * @usuage + * makePrintable('This is an error on', someVar, someObj); + * + * @param hintInfo anything about the current execution context to hint users. + * @throws Error + */ + + function makePrintable() { + var hintInfo = []; + + for (var _i = 0; _i < arguments.length; _i++) { + hintInfo[_i] = arguments[_i]; + } + + var msg = ''; + + if ("development" !== 'production') { + // Fuzzy stringify for print. + // This code only exist in dev environment. + var makePrintableStringIfPossible_1 = function (val) { + return val === void 0 ? 'undefined' : val === Infinity ? 'Infinity' : val === -Infinity ? '-Infinity' : eqNaN(val) ? 'NaN' : val instanceof Date ? 'Date(' + val.toISOString() + ')' : isFunction(val) ? 'function () { ... }' : isRegExp(val) ? val + '' : null; + }; + + msg = map(hintInfo, function (arg) { + if (isString(arg)) { + // Print without quotation mark for some statement. + return arg; + } else { + var printableStr = makePrintableStringIfPossible_1(arg); + + if (printableStr != null) { + return printableStr; + } else if (typeof JSON !== 'undefined' && JSON.stringify) { + try { + return JSON.stringify(arg, function (n, val) { + var printableStr = makePrintableStringIfPossible_1(val); + return printableStr == null ? val : printableStr; + }); // In most cases the info object is small, so do not line break. + } catch (err) { + return '?'; + } + } else { + return '?'; + } + } + }).join(' '); + } + + return msg; + } + + /** + * @throws Error + */ + + function throwError(msg) { + throw new Error(msg); + } + + function interpolateNumber$1(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + + /** + * Make the name displayable. But we should + * make sure it is not duplicated with user + * specified name, so use '\0'; + */ + + + var DUMMY_COMPONENT_NAME_PREFIX = 'series\0'; + var INTERNAL_COMPONENT_ID_PREFIX = '\0_ec_\0'; + + /** + * If value is not array, then translate it to array. + * @param {*} value + * @return {Array} [value] or value + */ + + function normalizeToArray(value) { + return value instanceof Array ? value : value == null ? [] : [value]; + } + + /** + * Sync default option between normal and emphasis like `position` and `show` + * In case some one will write code like + * label: { + * show: false, + * position: 'outside', + * fontSize: 18 + * }, + * emphasis: { + * label: { show: true } + * } + */ + + function defaultEmphasis(opt, key, subOpts) { + // Caution: performance sensitive. + if (opt) { + opt[key] = opt[key] || {}; + opt.emphasis = opt.emphasis || {}; + opt.emphasis[key] = opt.emphasis[key] || {}; // Default emphasis option from normal + + for (var i = 0, len = subOpts.length; i < len; i++) { + var subOptName = subOpts[i]; + + if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) { + opt.emphasis[key][subOptName] = opt[key][subOptName]; + } + } + } + } + + var TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding']; // modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([ + // 'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter', + // 'fontStyle', 'fontWeight', 'fontSize', 'fontFamily', + // // FIXME: deprecated, check and remove it. + // 'textStyle' + // ]); + + /** + * The method do not ensure performance. + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method retieves value from data. + */ + + function getDataItemValue(dataItem) { + return isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem; + } + + /** + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method determine if dataItem has extra option besides value + */ + + function isDataItemOption(dataItem) { + return isObject(dataItem) && !(dataItem instanceof Array); // // markLine data can be array + // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array)); + } + + /** + * Mapping to existings for merge. + * + * Mode "normalMege": + * The mapping result (merge result) will keep the order of the existing + * component, rather than the order of new option. Because we should ensure + * some specified index reference (like xAxisIndex) keep work. + * And in most cases, "merge option" is used to update partial option but not + * be expected to change the order. + * + * Mode "replaceMege": + * (1) Only the id mapped components will be merged. + * (2) Other existing components (except internal compoonets) will be removed. + * (3) Other new options will be used to create new component. + * (4) The index of the existing compoents will not be modified. + * That means their might be "hole" after the removal. + * The new components are created first at those available index. + * + * Mode "replaceAll": + * This mode try to support that reproduce an echarts instance from another + * echarts instance (via `getOption`) in some simple cases. + * In this senario, the `result` index are exactly the consistent with the `newCmptOptions`, + * which ensures the compoennt index referring (like `xAxisIndex: ?`) corrent. That is, + * the "hole" in `newCmptOptions` will also be kept. + * On the contrary, other modes try best to eliminate holes. + * PENDING: This is an experimental mode yet. + * + * @return See the comment of . + */ + + function mappingToExists(existings, newCmptOptions, mode) { + var isNormalMergeMode = mode === 'normalMerge'; + var isReplaceMergeMode = mode === 'replaceMerge'; + var isReplaceAllMode = mode === 'replaceAll'; + existings = existings || []; + newCmptOptions = (newCmptOptions || []).slice(); + var existingIdIdxMap = createHashMap(); // Validate id and name on user input option. + + each(newCmptOptions, function (cmptOption, index) { + if (!isObject(cmptOption)) { + newCmptOptions[index] = null; + return; + } + + if ("development" !== 'production') { + // There is some legacy case that name is set as `false`. + // But should work normally rather than throw error. + if (cmptOption.id != null && !isValidIdOrName(cmptOption.id)) { + warnInvalidateIdOrName(cmptOption.id); + } + + if (cmptOption.name != null && !isValidIdOrName(cmptOption.name)) { + warnInvalidateIdOrName(cmptOption.name); + } + } + }); + var result = prepareResult(existings, existingIdIdxMap, mode); + + if (isNormalMergeMode || isReplaceMergeMode) { + mappingById(result, existings, existingIdIdxMap, newCmptOptions); + } + + if (isNormalMergeMode) { + mappingByName(result, newCmptOptions); + } + + if (isNormalMergeMode || isReplaceMergeMode) { + mappingByIndex(result, newCmptOptions, isReplaceMergeMode); + } else if (isReplaceAllMode) { + mappingInReplaceAllMode(result, newCmptOptions); + } + + makeIdAndName(result); // The array `result` MUST NOT contain elided items, otherwise the + // forEach will ommit those items and result in incorrect result. + + return result; + } + + function prepareResult(existings, existingIdIdxMap, mode) { + var result = []; + + if (mode === 'replaceAll') { + return result; + } // Do not use native `map` to in case that the array `existings` + // contains elided items, which will be ommited. + + + for (var index = 0; index < existings.length; index++) { + var existing = existings[index]; // Because of replaceMerge, `existing` may be null/undefined. + + if (existing && existing.id != null) { + existingIdIdxMap.set(existing.id, index); + } // For non-internal-componnets: + // Mode "normalMerge": all existings kept. + // Mode "replaceMerge": all existing removed unless mapped by id. + // For internal-components: + // go with "replaceMerge" approach in both mode. + + + result.push({ + existing: mode === 'replaceMerge' || isComponentIdInternal(existing) ? null : existing, + newOption: null, + keyInfo: null, + brandNew: null + }); + } + + return result; + } + + function mappingById(result, existings, existingIdIdxMap, newCmptOptions) { + // Mapping by id if specified. + each(newCmptOptions, function (cmptOption, index) { + if (!cmptOption || cmptOption.id == null) { + return; + } + + var optionId = makeComparableKey(cmptOption.id); + var existingIdx = existingIdIdxMap.get(optionId); + + if (existingIdx != null) { + var resultItem = result[existingIdx]; + assert(!resultItem.newOption, 'Duplicated option on id "' + optionId + '".'); + resultItem.newOption = cmptOption; // In both mode, if id matched, new option will be merged to + // the existings rather than creating new component model. + + resultItem.existing = existings[existingIdx]; + newCmptOptions[index] = null; + } + }); + } + + function mappingByName(result, newCmptOptions) { + // Mapping by name if specified. + each(newCmptOptions, function (cmptOption, index) { + if (!cmptOption || cmptOption.name == null) { + return; + } + + for (var i = 0; i < result.length; i++) { + var existing = result[i].existing; + + if (!result[i].newOption // Consider name: two map to one. + // Can not match when both ids existing but different. + && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual('name', existing, cmptOption)) { + result[i].newOption = cmptOption; + newCmptOptions[index] = null; + return; + } + } + }); + } + + function mappingByIndex(result, newCmptOptions, brandNew) { + each(newCmptOptions, function (cmptOption) { + if (!cmptOption) { + return; + } // Find the first place that not mapped by id and not internal component (consider the "hole"). + + + var resultItem; + var nextIdx = 0; + + while ( // Be `!resultItem` only when `nextIdx >= result.length`. + (resultItem = result[nextIdx]) && ( // (1) Existing models that already have id should be able to mapped to. Because + // after mapping performed, model will always be assigned with an id if user not given. + // After that all models have id. + // (2) If new option has id, it can only set to a hole or append to the last. It should + // not be merged to the existings with different id. Because id should not be overwritten. + // (3) Name can be overwritten, because axis use name as 'show label text'. + resultItem.newOption || isComponentIdInternal(resultItem.existing) || // In mode "replaceMerge", here no not-mapped-non-internal-existing. + resultItem.existing && cmptOption.id != null && !keyExistAndEqual('id', cmptOption, resultItem.existing))) { + nextIdx++; + } + + if (resultItem) { + resultItem.newOption = cmptOption; + resultItem.brandNew = brandNew; + } else { + result.push({ + newOption: cmptOption, + brandNew: brandNew, + existing: null, + keyInfo: null + }); + } + + nextIdx++; + }); + } + + function mappingInReplaceAllMode(result, newCmptOptions) { + each(newCmptOptions, function (cmptOption) { + // The feature "reproduce" requires "hole" will also reproduced + // in case that compoennt index referring are broken. + result.push({ + newOption: cmptOption, + brandNew: true, + existing: null, + keyInfo: null + }); + }); + } + + /** + * Make id and name for mapping result (result of mappingToExists) + * into `keyInfo` field. + */ + + + function makeIdAndName(mapResult) { + // We use this id to hash component models and view instances + // in echarts. id can be specified by user, or auto generated. + // The id generation rule ensures new view instance are able + // to mapped to old instance when setOption are called in + // no-merge mode. So we generate model id by name and plus + // type in view id. + // name can be duplicated among components, which is convenient + // to specify multi components (like series) by one name. + // Ensure that each id is distinct. + var idMap = createHashMap(); + each(mapResult, function (item) { + var existing = item.existing; + existing && idMap.set(existing.id, item); + }); + each(mapResult, function (item) { + var opt = item.newOption; // Force ensure id not duplicated. + + assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id)); + opt && opt.id != null && idMap.set(opt.id, item); + !item.keyInfo && (item.keyInfo = {}); + }); // Make name and id. + + each(mapResult, function (item, index) { + var existing = item.existing; + var opt = item.newOption; + var keyInfo = item.keyInfo; + + if (!isObject(opt)) { + return; + } // name can be overwitten. Consider case: axis.name = '20km'. + // But id generated by name will not be changed, which affect + // only in that case: setOption with 'not merge mode' and view + // instance will be recreated, which can be accepted. + + + keyInfo.name = opt.name != null ? makeComparableKey(opt.name) : existing ? existing.name // Avoid diffferent series has the same name, + // because name may be used like in color pallet. + : DUMMY_COMPONENT_NAME_PREFIX + index; + + if (existing) { + keyInfo.id = makeComparableKey(existing.id); + } else if (opt.id != null) { + keyInfo.id = makeComparableKey(opt.id); + } else { + // Consider this situatoin: + // optionA: [{name: 'a'}, {name: 'a'}, {..}] + // optionB [{..}, {name: 'a'}, {name: 'a'}] + // Series with the same name between optionA and optionB + // should be mapped. + var idNum = 0; + + do { + keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++; + } while (idMap.get(keyInfo.id)); + } + + idMap.set(keyInfo.id, item); + }); + } + + function keyExistAndEqual(attr, obj1, obj2) { + var key1 = convertOptionIdName(obj1[attr], null); + var key2 = convertOptionIdName(obj2[attr], null); // See `MappingExistingItem`. `id` and `name` trade string equals to number. + + return key1 != null && key2 != null && key1 === key2; + } + + /** + * @return return null if not exist. + */ + + + function makeComparableKey(val) { + if ("development" !== 'production') { + if (val == null) { + throw new Error(); + } + } + + return convertOptionIdName(val, ''); + } + + function convertOptionIdName(idOrName, defaultValue) { + if (idOrName == null) { + return defaultValue; + } + + return isString(idOrName) ? idOrName : isNumber(idOrName) || isStringSafe(idOrName) ? idOrName + '' : defaultValue; + } + + function warnInvalidateIdOrName(idOrName) { + if ("development" !== 'production') { + warn('`' + idOrName + '` is invalid id or name. Must be a string or number.'); + } + } + + function isValidIdOrName(idOrName) { + return isStringSafe(idOrName) || isNumeric(idOrName); + } + + function isNameSpecified(componentModel) { + var name = componentModel.name; // Is specified when `indexOf` get -1 or > 0. + + return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX)); + } + + /** + * @public + * @param {Object} cmptOption + * @return {boolean} + */ + + function isComponentIdInternal(cmptOption) { + return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0; + } + + function makeInternalComponentId(idSuffix) { + return INTERNAL_COMPONENT_ID_PREFIX + idSuffix; + } + + function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) { + // Set mainType and complete subType. + each(mappingResult, function (item) { + var newOption = item.newOption; + + if (isObject(newOption)) { + item.keyInfo.mainType = mainType; + item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor); + } + }); + } + + function determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) { + var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType // Use determineSubType only when there is no existComponent. + : componentModelCtor.determineSubType(mainType, newCmptOption); // tooltip, markline, markpoint may always has no subType + + return subType; + } + + /** + * A helper for removing duplicate items between batchA and batchB, + * and in themselves, and categorize by series. + * + * @param batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @param batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @return result: [resultBatchA, resultBatchB] + */ + + + function compressBatches(batchA, batchB) { + var mapA = {}; + var mapB = {}; + makeMap(batchA || [], mapA); + makeMap(batchB || [], mapB, mapA); + return [mapToArray(mapA), mapToArray(mapB)]; + + function makeMap(sourceBatch, map, otherMap) { + for (var i = 0, len = sourceBatch.length; i < len; i++) { + var seriesId = convertOptionIdName(sourceBatch[i].seriesId, null); + + if (seriesId == null) { + return; + } + + var dataIndices = normalizeToArray(sourceBatch[i].dataIndex); + var otherDataIndices = otherMap && otherMap[seriesId]; + + for (var j = 0, lenj = dataIndices.length; j < lenj; j++) { + var dataIndex = dataIndices[j]; + + if (otherDataIndices && otherDataIndices[dataIndex]) { + otherDataIndices[dataIndex] = null; + } else { + (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1; + } + } + } + } + + function mapToArray(map, isData) { + var result = []; + + for (var i in map) { + if (map.hasOwnProperty(i) && map[i] != null) { + if (isData) { + result.push(+i); + } else { + var dataIndices = mapToArray(map[i], true); + dataIndices.length && result.push({ + seriesId: i, + dataIndex: dataIndices + }); + } + } + } + + return result; + } + } + + /** + * @param payload Contains dataIndex (means rawIndex) / dataIndexInside / name + * each of which can be Array or primary type. + * @return dataIndex If not found, return undefined/null. + */ + + function queryDataIndex(data, payload) { + if (payload.dataIndexInside != null) { + return payload.dataIndexInside; + } else if (payload.dataIndex != null) { + return isArray(payload.dataIndex) ? map(payload.dataIndex, function (value) { + return data.indexOfRawIndex(value); + }) : data.indexOfRawIndex(payload.dataIndex); + } else if (payload.name != null) { + return isArray(payload.name) ? map(payload.name, function (value) { + return data.indexOfName(value); + }) : data.indexOfName(payload.name); + } + } + + /** + * Enable property storage to any host object. + * Notice: Serialization is not supported. + * + * For example: + * let inner = zrUitl.makeInner(); + * + * function some1(hostObj) { + * inner(hostObj).someProperty = 1212; + * ... + * } + * function some2() { + * let fields = inner(this); + * fields.someProperty1 = 1212; + * fields.someProperty2 = 'xx'; + * ... + * } + * + * @return {Function} + */ + + function makeInner() { + var key = '__ec_inner_' + innerUniqueIndex++; + return function (hostObj) { + return hostObj[key] || (hostObj[key] = {}); + }; + } + + var innerUniqueIndex = getRandomIdBase(); + + /** + * The same behavior as `component.getReferringComponents`. + */ + + function parseFinder(ecModel, finderInput, opt) { + var _a = preParseFinder(finderInput, opt), + mainTypeSpecified = _a.mainTypeSpecified, + queryOptionMap = _a.queryOptionMap, + others = _a.others; + + var result = others; + var defaultMainType = opt ? opt.defaultMainType : null; + + if (!mainTypeSpecified && defaultMainType) { + queryOptionMap.set(defaultMainType, {}); + } + + queryOptionMap.each(function (queryOption, mainType) { + var queryResult = queryReferringComponents(ecModel, mainType, queryOption, { + useDefault: defaultMainType === mainType, + enableAll: opt && opt.enableAll != null ? opt.enableAll : true, + enableNone: opt && opt.enableNone != null ? opt.enableNone : true + }); + result[mainType + 'Models'] = queryResult.models; + result[mainType + 'Model'] = queryResult.models[0]; + }); + return result; + } + + function preParseFinder(finderInput, opt) { + var finder; + + if (isString(finderInput)) { + var obj = {}; + obj[finderInput + 'Index'] = 0; + finder = obj; + } else { + finder = finderInput; + } + + var queryOptionMap = createHashMap(); + var others = {}; + var mainTypeSpecified = false; + each(finder, function (value, key) { + // Exclude 'dataIndex' and other illgal keys. + if (key === 'dataIndex' || key === 'dataIndexInside') { + others[key] = value; + return; + } + + var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || []; + var mainType = parsedKey[1]; + var queryType = (parsedKey[2] || '').toLowerCase(); + + if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) { + return; + } + + mainTypeSpecified = mainTypeSpecified || !!mainType; + var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {}); + queryOption[queryType] = value; + }); + return { + mainTypeSpecified: mainTypeSpecified, + queryOptionMap: queryOptionMap, + others: others + }; + } + + var SINGLE_REFERRING = { + useDefault: true, + enableAll: false, + enableNone: false + }; + var MULTIPLE_REFERRING = { + useDefault: false, + enableAll: true, + enableNone: true + }; + + function queryReferringComponents(ecModel, mainType, userOption, opt) { + opt = opt || SINGLE_REFERRING; + var indexOption = userOption.index; + var idOption = userOption.id; + var nameOption = userOption.name; + var result = { + models: null, + specified: indexOption != null || idOption != null || nameOption != null + }; + + if (!result.specified) { + // Use the first as default if `useDefault`. + var firstCmpt = void 0; + result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : []; + return result; + } + + if (indexOption === 'none' || indexOption === false) { + assert(opt.enableNone, '`"none"` or `false` is not a valid value on index option.'); + result.models = []; + return result; + } // `queryComponents` will return all components if + // both all of index/id/name are null/undefined. + + + if (indexOption === 'all') { + assert(opt.enableAll, '`"all"` is not a valid value on index option.'); + indexOption = idOption = nameOption = null; + } + + result.models = ecModel.queryComponents({ + mainType: mainType, + index: indexOption, + id: idOption, + name: nameOption + }); + return result; + } + + function setAttribute(dom, key, value) { + dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value; + } + + function getAttribute(dom, key) { + return dom.getAttribute ? dom.getAttribute(key) : dom[key]; + } + + function getTooltipRenderMode(renderModeOption) { + if (renderModeOption === 'auto') { + // Using html when `document` exists, use richText otherwise + return env.domSupported ? 'html' : 'richText'; + } else { + return renderModeOption || 'html'; + } + } + + /** + * Group a list by key. + */ + + function groupData(array, getKey // return key + ) { + var buckets = createHashMap(); + var keys = []; + each(array, function (item) { + var key = getKey(item); + (buckets.get(key) || (keys.push(key), buckets.set(key, []))).push(item); + }); + return { + keys: keys, + buckets: buckets + }; + } + + /** + * Interpolate raw values of a series with percent + * + * @param data data + * @param labelModel label model of the text element + * @param sourceValue start value. May be null/undefined when init. + * @param targetValue end value + * @param percent 0~1 percentage; 0 uses start value while 1 uses end value + * @return interpolated values + * If `sourceValue` and `targetValue` are `number`, return `number`. + * If `sourceValue` and `targetValue` are `string`, return `string`. + * If `sourceValue` and `targetValue` are `(string | number)[]`, return `(string | number)[]`. + * Other cases do not supported. + */ + + function interpolateRawValues(data, precision, sourceValue, targetValue, percent) { + var isAutoPrecision = precision == null || precision === 'auto'; + + if (targetValue == null) { + return targetValue; + } + + if (isNumber(targetValue)) { + var value = interpolateNumber$1(sourceValue || 0, targetValue, percent); + return round(value, isAutoPrecision ? Math.max(getPrecision(sourceValue || 0), getPrecision(targetValue)) : precision); + } else if (isString(targetValue)) { + return percent < 1 ? sourceValue : targetValue; + } else { + var interpolated = []; + var leftArr = sourceValue; + var rightArr = targetValue; + var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length); + + for (var i = 0; i < length_1; ++i) { + var info = data.getDimensionInfo(i); // Don't interpolate ordinal dims + + if (info && info.type === 'ordinal') { + // In init, there is no `sourceValue`, but should better not to get undefined result. + interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i]; + } else { + var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0; + var rightVal = rightArr[i]; + var value = interpolateNumber$1(leftVal, rightVal, percent); + interpolated[i] = round(value, isAutoPrecision ? Math.max(getPrecision(leftVal), getPrecision(rightVal)) : precision); + } + } + + return interpolated; + } + } + + var TYPE_DELIMITER = '.'; + var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___'; + var IS_EXTENDED_CLASS = '___EC__EXTENDED_CLASS___'; + + /** + * Notice, parseClassType('') should returns {main: '', sub: ''} + * @public + */ + + function parseClassType(componentType) { + var ret = { + main: '', + sub: '' + }; + + if (componentType) { + var typeArr = componentType.split(TYPE_DELIMITER); + ret.main = typeArr[0] || ''; + ret.sub = typeArr[1] || ''; + } + + return ret; + } + + /** + * @public + */ + + function checkClassType(componentType) { + assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType "' + componentType + '" illegal'); + } + + function isExtendedClass(clz) { + return !!(clz && clz[IS_EXTENDED_CLASS]); + } + + /** + * Implements `ExtendableConstructor` for `rootClz`. + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & ExtendableConstructor + * enableClassExtend(Xxx as XxxConstructor); + * ``` + */ + + function enableClassExtend(rootClz, mandatoryMethods) { + rootClz.$constructor = rootClz; // FIXME: not necessary? + + rootClz.extend = function (proto) { + if ("development" !== 'production') { + each(mandatoryMethods, function (method) { + if (!proto[method]) { + console.warn('Method `' + method + '` should be implemented' + (proto.type ? ' in ' + proto.type : '') + '.'); + } + }); + } + + var superClass = this; + var ExtendedClass; + + if (isESClass(superClass)) { + ExtendedClass = + /** @class */ + function (_super) { + __extends(class_1, _super); + + function class_1() { + return _super.apply(this, arguments) || this; + } + + return class_1; + }(superClass); + } else { + // For backward compat, we both support ts class inheritance and this + // "extend" approach. + // The constructor should keep the same behavior as ts class inheritance: + // If this constructor/$constructor is not declared, auto invoke the super + // constructor. + // If this constructor/$constructor is declared, it is responsible for + // calling the super constructor. + ExtendedClass = function () { + (proto.$constructor || superClass).apply(this, arguments); + }; + + inherits(ExtendedClass, this); + } + + extend(ExtendedClass.prototype, proto); + ExtendedClass[IS_EXTENDED_CLASS] = true; + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + ExtendedClass.superClass = superClass; + return ExtendedClass; + }; + } + + function isESClass(fn) { + return isFunction(fn) && /^class\s/.test(Function.prototype.toString.call(fn)); + } + + /** + * A work around to both support ts extend and this extend mechanism. + * on sub-class. + * @usage + * ```ts + * class Component { ... } + * classUtil.enableClassExtend(Component); + * classUtil.enableClassManagement(Component, {registerWhenExtend: true}); + * + * class Series extends Component { ... } + * // Without calling `markExtend`, `registerWhenExtend` will not work. + * Component.markExtend(Series); + * ``` + */ + + + function mountExtend(SubClz, SupperClz) { + SubClz.extend = SupperClz.extend; + } // A random offset. + + var classBase = Math.round(Math.random() * 10); + + /** + * Implements `CheckableConstructor` for `target`. + * Can not use instanceof, consider different scope by + * cross domain or es module import in ec extensions. + * Mount a method "isInstance()" to Clz. + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & CheckableConstructor; + * enableClassCheck(Xxx as XxxConstructor) + * ``` + */ + + function enableClassCheck(target) { + var classAttr = ['__\0is_clz', classBase++].join('_'); + target.prototype[classAttr] = true; + + if ("development" !== 'production') { + assert(!target.isInstance, 'The method "is" can not be defined.'); + } + + target.isInstance = function (obj) { + return !!(obj && obj[classAttr]); + }; + } // superCall should have class info, which can not be fetch from 'this'. + // Consider this case: + // class A has method f, + // class B inherits class A, overrides method f, f call superApply('f'), + // class C inherits class B, do not overrides method f, + // then when method of class C is called, dead loop occured. + + function superCall(context, methodName) { + var args = []; + + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + + return this.superClass.prototype[methodName].apply(context, args); + } + + function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); + } + + /** + * Implements `ClassManager` for `target` + * + * @usage + * ```ts + * class Xxx {} + * type XxxConstructor = typeof Xxx & ClassManager + * enableClassManagement(Xxx as XxxConstructor); + * ``` + */ + + + function enableClassManagement(target) { + /** + * Component model classes + * key: componentType, + * value: + * componentClass, when componentType is 'xxx' + * or Object., when componentType is 'xxx.yy' + */ + var storage = {}; + + target.registerClass = function (clz) { + // `type` should not be a "instance memeber". + // If using TS class, should better declared as `static type = 'series.pie'`. + // otherwise users have to mount `type` on prototype manually. + // For backward compat and enable instance visit type via `this.type`, + // we stil support fetch `type` from prototype. + var componentFullType = clz.type || clz.prototype.type; + + if (componentFullType) { + checkClassType(componentFullType); // If only static type declared, we assign it to prototype mandatorily. + + clz.prototype.type = componentFullType; + var componentTypeInfo = parseClassType(componentFullType); + + if (!componentTypeInfo.sub) { + if ("development" !== 'production') { + if (storage[componentTypeInfo.main]) { + console.warn(componentTypeInfo.main + ' exists.'); + } + } + + storage[componentTypeInfo.main] = clz; + } else if (componentTypeInfo.sub !== IS_CONTAINER) { + var container = makeContainer(componentTypeInfo); + container[componentTypeInfo.sub] = clz; + } + } + + return clz; + }; + + target.getClass = function (mainType, subType, throwWhenNotFound) { + var clz = storage[mainType]; + + if (clz && clz[IS_CONTAINER]) { + clz = subType ? clz[subType] : null; + } + + if (throwWhenNotFound && !clz) { + throw new Error(!subType ? mainType + '.' + 'type should be specified.' : 'Component ' + mainType + '.' + (subType || '') + ' is used but not imported.'); + } + + return clz; + }; + + target.getClassesByMainType = function (componentType) { + var componentTypeInfo = parseClassType(componentType); + var result = []; + var obj = storage[componentTypeInfo.main]; + + if (obj && obj[IS_CONTAINER]) { + each(obj, function (o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } else { + result.push(obj); + } + + return result; + }; + + target.hasClass = function (componentType) { + // Just consider componentType.main. + var componentTypeInfo = parseClassType(componentType); + return !!storage[componentTypeInfo.main]; + }; + /** + * @return Like ['aa', 'bb'], but can not be ['aa.xx'] + */ + + + target.getAllClassMainTypes = function () { + var types = []; + each(storage, function (obj, type) { + types.push(type); + }); + return types; + }; + /** + * If a main type is container and has sub types + */ + + + target.hasSubTypes = function (componentType) { + var componentTypeInfo = parseClassType(componentType); + var obj = storage[componentTypeInfo.main]; + return obj && obj[IS_CONTAINER]; + }; + + function makeContainer(componentTypeInfo) { + var container = storage[componentTypeInfo.main]; + + if (!container || !container[IS_CONTAINER]) { + container = storage[componentTypeInfo.main] = {}; + container[IS_CONTAINER] = true; + } + + return container; + } + } // /** + // * @param {string|Array.} properties + // */ + // export function setReadOnly(obj, properties) { + // FIXME It seems broken in IE8 simulation of IE11 + // if (!zrUtil.isArray(properties)) { + // properties = properties != null ? [properties] : []; + // } + // zrUtil.each(properties, function (prop) { + // let value = obj[prop]; + // Object.defineProperty + // && Object.defineProperty(obj, prop, { + // value: value, writable: false + // }); + // zrUtil.isArray(obj[prop]) + // && Object.freeze + // && Object.freeze(obj[prop]); + // }); + // } + + function makeStyleMapper(properties, ignoreParent) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + + ignoreParent = ignoreParent || false; + return function (model, excludes, includes) { + var style = {}; + + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + + if (excludes && indexOf(excludes, propName) >= 0 || includes && indexOf(includes, propName) < 0) { + continue; + } + + var val = model.getShallow(propName, ignoreParent); + + if (val != null) { + style[properties[i][0]] = val; + } + } // TODO Text or image? + + + return style; + }; + } + + var AREA_STYLE_KEY_MAP = [['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getAreaStyle = makeStyleMapper(AREA_STYLE_KEY_MAP); + + var AreaStyleMixin = + /** @class */ + function () { + function AreaStyleMixin() { + } + + AreaStyleMixin.prototype.getAreaStyle = function (excludes, includes) { + return getAreaStyle(this, excludes, includes); + }; + + return AreaStyleMixin; + }(); + + var globalImageCache = new LRU(50); + + function findExistImage(newImageOrSrc) { + if (typeof newImageOrSrc === 'string') { + var cachedImgObj = globalImageCache.get(newImageOrSrc); + return cachedImgObj && cachedImgObj.image; + } else { + return newImageOrSrc; + } + } + + function createOrUpdateImage(newImageOrSrc, image, hostEl, onload, cbPayload) { + if (!newImageOrSrc) { + return image; + } else if (typeof newImageOrSrc === 'string') { + if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) { + return image; + } + var cachedImgObj = globalImageCache.get(newImageOrSrc); + var pendingWrap = {hostEl: hostEl, cb: onload, cbPayload: cbPayload}; + if (cachedImgObj) { + image = cachedImgObj.image; + !isImageReady(image) && cachedImgObj.pending.push(pendingWrap); + } else { + var image_1 = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad); + image_1.__zrImageSrc = newImageOrSrc; + globalImageCache.put(newImageOrSrc, image_1.__cachedImgObj = { + image: image_1, + pending: [pendingWrap] + }); + } + return image; + } else { + return newImageOrSrc; + } + } + + function imageOnLoad() { + var cachedImgObj = this.__cachedImgObj; + this.onload = this.onerror = this.__cachedImgObj = null; + for (var i = 0; i < cachedImgObj.pending.length; i++) { + var pendingWrap = cachedImgObj.pending[i]; + var cb = pendingWrap.cb; + cb && cb(this, pendingWrap.cbPayload); + pendingWrap.hostEl.dirty(); + } + cachedImgObj.pending.length = 0; + } + + function isImageReady(image) { + return image && image.width && image.height; + } + + var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g; + + function truncateText(text, containerWidth, font, ellipsis, options) { + if (!containerWidth) { + return ''; + } + var textLines = (text + '').split('\n'); + options = prepareTruncateOptions(containerWidth, font, ellipsis, options); + for (var i = 0, len = textLines.length; i < len; i++) { + textLines[i] = truncateSingleLine(textLines[i], options); + } + return textLines.join('\n'); + } + + function prepareTruncateOptions(containerWidth, font, ellipsis, options) { + options = options || {}; + var preparedOpts = extend({}, options); + preparedOpts.font = font; + ellipsis = retrieve2(ellipsis, '...'); + preparedOpts.maxIterations = retrieve2(options.maxIterations, 2); + var minChar = preparedOpts.minChar = retrieve2(options.minChar, 0); + preparedOpts.cnCharWidth = getWidth('国', font); + var ascCharWidth = preparedOpts.ascCharWidth = getWidth('a', font); + preparedOpts.placeholder = retrieve2(options.placeholder, ''); + var contentWidth = containerWidth = Math.max(0, containerWidth - 1); + for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) { + contentWidth -= ascCharWidth; + } + var ellipsisWidth = getWidth(ellipsis, font); + if (ellipsisWidth > contentWidth) { + ellipsis = ''; + ellipsisWidth = 0; + } + contentWidth = containerWidth - ellipsisWidth; + preparedOpts.ellipsis = ellipsis; + preparedOpts.ellipsisWidth = ellipsisWidth; + preparedOpts.contentWidth = contentWidth; + preparedOpts.containerWidth = containerWidth; + return preparedOpts; + } + + function truncateSingleLine(textLine, options) { + var containerWidth = options.containerWidth; + var font = options.font; + var contentWidth = options.contentWidth; + if (!containerWidth) { + return ''; + } + var lineWidth = getWidth(textLine, font); + if (lineWidth <= containerWidth) { + return textLine; + } + for (var j = 0; ; j++) { + if (lineWidth <= contentWidth || j >= options.maxIterations) { + textLine += options.ellipsis; + break; + } + var subLength = j === 0 + ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth) + : lineWidth > 0 + ? Math.floor(textLine.length * contentWidth / lineWidth) + : 0; + textLine = textLine.substr(0, subLength); + lineWidth = getWidth(textLine, font); + } + if (textLine === '') { + textLine = options.placeholder; + } + return textLine; + } + + function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < contentWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth; + } + return i; + } + + function parsePlainText(text, style) { + text != null && (text += ''); + var overflow = style.overflow; + var padding = style.padding; + var font = style.font; + var truncate = overflow === 'truncate'; + var calculatedLineHeight = getLineHeight(font); + var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight); + var bgColorDrawn = !!(style.backgroundColor); + var truncateLineOverflow = style.lineOverflow === 'truncate'; + var width = style.width; + var lines; + if (width != null && (overflow === 'break' || overflow === 'breakAll')) { + lines = text ? wrapText(text, style.font, width, overflow === 'breakAll', 0).lines : []; + } else { + lines = text ? text.split('\n') : []; + } + var contentHeight = lines.length * lineHeight; + var height = retrieve2(style.height, contentHeight); + if (contentHeight > height && truncateLineOverflow) { + var lineCount = Math.floor(height / lineHeight); + lines = lines.slice(0, lineCount); + } + if (text && truncate && width != null) { + var options = prepareTruncateOptions(width, font, style.ellipsis, { + minChar: style.truncateMinChar, + placeholder: style.placeholder + }); + for (var i = 0; i < lines.length; i++) { + lines[i] = truncateSingleLine(lines[i], options); + } + } + var outerHeight = height; + var contentWidth = 0; + for (var i = 0; i < lines.length; i++) { + contentWidth = Math.max(getWidth(lines[i], font), contentWidth); + } + if (width == null) { + width = contentWidth; + } + var outerWidth = contentWidth; + if (padding) { + outerHeight += padding[0] + padding[2]; + outerWidth += padding[1] + padding[3]; + width += padding[1] + padding[3]; + } + if (bgColorDrawn) { + outerWidth = width; + } + return { + lines: lines, + height: height, + outerWidth: outerWidth, + outerHeight: outerHeight, + lineHeight: lineHeight, + calculatedLineHeight: calculatedLineHeight, + contentWidth: contentWidth, + contentHeight: contentHeight, + width: width + }; + } + + var RichTextToken = (function () { + function RichTextToken() { + } + + return RichTextToken; + }()); + var RichTextLine = (function () { + function RichTextLine(tokens) { + this.tokens = []; + if (tokens) { + this.tokens = tokens; + } + } + + return RichTextLine; + }()); + var RichTextContentBlock = (function () { + function RichTextContentBlock() { + this.width = 0; + this.height = 0; + this.contentWidth = 0; + this.contentHeight = 0; + this.outerWidth = 0; + this.outerHeight = 0; + this.lines = []; + } + + return RichTextContentBlock; + }()); + + function parseRichText(text, style) { + var contentBlock = new RichTextContentBlock(); + text != null && (text += ''); + if (!text) { + return contentBlock; + } + var topWidth = style.width; + var topHeight = style.height; + var overflow = style.overflow; + var wrapInfo = (overflow === 'break' || overflow === 'breakAll') && topWidth != null + ? {width: topWidth, accumWidth: 0, breakAll: overflow === 'breakAll'} + : null; + var lastIndex = STYLE_REG.lastIndex = 0; + var result; + while ((result = STYLE_REG.exec(text)) != null) { + var matchedIndex = result.index; + if (matchedIndex > lastIndex) { + pushTokens(contentBlock, text.substring(lastIndex, matchedIndex), style, wrapInfo); + } + pushTokens(contentBlock, result[2], style, wrapInfo, result[1]); + lastIndex = STYLE_REG.lastIndex; + } + if (lastIndex < text.length) { + pushTokens(contentBlock, text.substring(lastIndex, text.length), style, wrapInfo); + } + var pendingList = []; + var calculatedHeight = 0; + var calculatedWidth = 0; + var stlPadding = style.padding; + var truncate = overflow === 'truncate'; + var truncateLine = style.lineOverflow === 'truncate'; + + function finishLine(line, lineWidth, lineHeight) { + line.width = lineWidth; + line.lineHeight = lineHeight; + calculatedHeight += lineHeight; + calculatedWidth = Math.max(calculatedWidth, lineWidth); + } + + outer: for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var lineHeight = 0; + var lineWidth = 0; + for (var j = 0; j < line.tokens.length; j++) { + var token = line.tokens[j]; + var tokenStyle = token.styleName && style.rich[token.styleName] || {}; + var textPadding = token.textPadding = tokenStyle.padding; + var paddingH = textPadding ? textPadding[1] + textPadding[3] : 0; + var font = token.font = tokenStyle.font || style.font; + token.contentHeight = getLineHeight(font); + var tokenHeight = retrieve2(tokenStyle.height, token.contentHeight); + token.innerHeight = tokenHeight; + textPadding && (tokenHeight += textPadding[0] + textPadding[2]); + token.height = tokenHeight; + token.lineHeight = retrieve3(tokenStyle.lineHeight, style.lineHeight, tokenHeight); + token.align = tokenStyle && tokenStyle.align || style.align; + token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle'; + if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) { + if (j > 0) { + line.tokens = line.tokens.slice(0, j); + finishLine(line, lineWidth, lineHeight); + contentBlock.lines = contentBlock.lines.slice(0, i + 1); + } else { + contentBlock.lines = contentBlock.lines.slice(0, i); + } + break outer; + } + var styleTokenWidth = tokenStyle.width; + var tokenWidthNotSpecified = styleTokenWidth == null || styleTokenWidth === 'auto'; + if (typeof styleTokenWidth === 'string' && styleTokenWidth.charAt(styleTokenWidth.length - 1) === '%') { + token.percentWidth = styleTokenWidth; + pendingList.push(token); + token.contentWidth = getWidth(token.text, font); + } else { + if (tokenWidthNotSpecified) { + var textBackgroundColor = tokenStyle.backgroundColor; + var bgImg = textBackgroundColor && textBackgroundColor.image; + if (bgImg) { + bgImg = findExistImage(bgImg); + if (isImageReady(bgImg)) { + token.width = Math.max(token.width, bgImg.width * tokenHeight / bgImg.height); + } + } + } + var remainTruncWidth = truncate && topWidth != null + ? topWidth - lineWidth : null; + if (remainTruncWidth != null && remainTruncWidth < token.width) { + if (!tokenWidthNotSpecified || remainTruncWidth < paddingH) { + token.text = ''; + token.width = token.contentWidth = 0; + } else { + token.text = truncateText(token.text, remainTruncWidth - paddingH, font, style.ellipsis, {minChar: style.truncateMinChar}); + token.width = token.contentWidth = getWidth(token.text, font); + } + } else { + token.contentWidth = getWidth(token.text, font); + } + } + token.width += paddingH; + lineWidth += token.width; + tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight)); + } + finishLine(line, lineWidth, lineHeight); + } + contentBlock.outerWidth = contentBlock.width = retrieve2(topWidth, calculatedWidth); + contentBlock.outerHeight = contentBlock.height = retrieve2(topHeight, calculatedHeight); + contentBlock.contentHeight = calculatedHeight; + contentBlock.contentWidth = calculatedWidth; + if (stlPadding) { + contentBlock.outerWidth += stlPadding[1] + stlPadding[3]; + contentBlock.outerHeight += stlPadding[0] + stlPadding[2]; + } + for (var i = 0; i < pendingList.length; i++) { + var token = pendingList[i]; + var percentWidth = token.percentWidth; + token.width = parseInt(percentWidth, 10) / 100 * contentBlock.width; + } + return contentBlock; + } + + function pushTokens(block, str, style, wrapInfo, styleName) { + var isEmptyStr = str === ''; + var tokenStyle = styleName && style.rich[styleName] || {}; + var lines = block.lines; + var font = tokenStyle.font || style.font; + var newLine = false; + var strLines; + var linesWidths; + if (wrapInfo) { + var tokenPadding = tokenStyle.padding; + var tokenPaddingH = tokenPadding ? tokenPadding[1] + tokenPadding[3] : 0; + if (tokenStyle.width != null && tokenStyle.width !== 'auto') { + var outerWidth_1 = parsePercent(tokenStyle.width, wrapInfo.width) + tokenPaddingH; + if (lines.length > 0) { + if (outerWidth_1 + wrapInfo.accumWidth > wrapInfo.width) { + strLines = str.split('\n'); + newLine = true; + } + } + wrapInfo.accumWidth = outerWidth_1; + } else { + var res = wrapText(str, font, wrapInfo.width, wrapInfo.breakAll, wrapInfo.accumWidth); + wrapInfo.accumWidth = res.accumWidth + tokenPaddingH; + linesWidths = res.linesWidths; + strLines = res.lines; + } + } else { + strLines = str.split('\n'); + } + for (var i = 0; i < strLines.length; i++) { + var text = strLines[i]; + var token = new RichTextToken(); + token.styleName = styleName; + token.text = text; + token.isLineHolder = !text && !isEmptyStr; + if (typeof tokenStyle.width === 'number') { + token.width = tokenStyle.width; + } else { + token.width = linesWidths + ? linesWidths[i] + : getWidth(text, font); + } + if (!i && !newLine) { + var tokens = (lines[lines.length - 1] || (lines[0] = new RichTextLine())).tokens; + var tokensLen = tokens.length; + (tokensLen === 1 && tokens[0].isLineHolder) + ? (tokens[0] = token) + : ((text || !tokensLen || isEmptyStr) && tokens.push(token)); + } else { + lines.push(new RichTextLine([token])); + } + } + } + + function isLatin(ch) { + var code = ch.charCodeAt(0); + return code >= 0x21 && code <= 0x17F; + } + + var breakCharMap = reduce(',&?/;] '.split(''), function (obj, ch) { + obj[ch] = true; + return obj; + }, {}); + + function isWordBreakChar(ch) { + if (isLatin(ch)) { + if (breakCharMap[ch]) { + return true; + } + return false; + } + return true; + } + + function wrapText(text, font, lineWidth, isBreakAll, lastAccumWidth) { + var lines = []; + var linesWidths = []; + var line = ''; + var currentWord = ''; + var currentWordWidth = 0; + var accumWidth = 0; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch === '\n') { + if (currentWord) { + line += currentWord; + accumWidth += currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ''; + currentWord = ''; + currentWordWidth = 0; + accumWidth = 0; + continue; + } + var chWidth = getWidth(ch, font); + var inWord = isBreakAll ? false : !isWordBreakChar(ch); + if (!lines.length + ? lastAccumWidth + accumWidth + chWidth > lineWidth + : accumWidth + chWidth > lineWidth) { + if (!accumWidth) { + if (inWord) { + lines.push(currentWord); + linesWidths.push(currentWordWidth); + currentWord = ch; + currentWordWidth = chWidth; + } else { + lines.push(ch); + linesWidths.push(chWidth); + } + } else if (line || currentWord) { + if (inWord) { + if (!line) { + line = currentWord; + currentWord = ''; + currentWordWidth = 0; + accumWidth = currentWordWidth; + } + lines.push(line); + linesWidths.push(accumWidth - currentWordWidth); + currentWord += ch; + currentWordWidth += chWidth; + line = ''; + accumWidth = currentWordWidth; + } else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + lines.push(line); + linesWidths.push(accumWidth); + line = ch; + accumWidth = chWidth; + } + } + continue; + } + accumWidth += chWidth; + if (inWord) { + currentWord += ch; + currentWordWidth += chWidth; + } else { + if (currentWord) { + line += currentWord; + currentWord = ''; + currentWordWidth = 0; + } + line += ch; + } + } + if (!lines.length && !line) { + line = text; + currentWord = ''; + currentWordWidth = 0; + } + if (currentWord) { + line += currentWord; + } + if (line) { + lines.push(line); + linesWidths.push(accumWidth); + } + if (lines.length === 1) { + accumWidth += lastAccumWidth; + } + return { + accumWidth: accumWidth, + lines: lines, + linesWidths: linesWidths + }; + } + + var STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10)); + var DEFAULT_COMMON_STYLE = { + shadowBlur: 0, + shadowOffsetX: 0, + shadowOffsetY: 0, + shadowColor: '#000', + opacity: 1, + blend: 'source-over' + }; + var DEFAULT_COMMON_ANIMATION_PROPS = { + style: { + shadowBlur: true, + shadowOffsetX: true, + shadowOffsetY: true, + shadowColor: true, + opacity: true + } + }; + DEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true; + var PRIMARY_STATES_KEYS$1 = ['z', 'z2', 'invisible']; + var PRIMARY_STATES_KEYS_IN_HOVER_LAYER = ['invisible']; + var Displayable = (function (_super) { + __extends(Displayable, _super); + + function Displayable(props) { + return _super.call(this, props) || this; + } + + Displayable.prototype._init = function (props) { + var keysArr = keys(props); + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + if (key === 'style') { + this.useStyle(props[key]); + } else { + _super.prototype.attrKV.call(this, key, props[key]); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Displayable.prototype.beforeBrush = function () { + }; + Displayable.prototype.afterBrush = function () { + }; + Displayable.prototype.innerBeforeBrush = function () { + }; + Displayable.prototype.innerAfterBrush = function () { + }; + Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) { + var m = this.transform; + if (this.ignore + || this.invisible + || this.style.opacity === 0 + || (this.culling + && isDisplayableCulled(this, viewWidth, viewHeight)) + || (m && !m[0] && !m[3])) { + return false; + } + if (considerClipPath && this.__clipPaths) { + for (var i = 0; i < this.__clipPaths.length; ++i) { + if (this.__clipPaths[i].isZeroArea()) { + return false; + } + } + } + if (considerAncestors && this.parent) { + var parent_1 = this.parent; + while (parent_1) { + if (parent_1.ignore) { + return false; + } + parent_1 = parent_1.parent; + } + } + return true; + }; + Displayable.prototype.contain = function (x, y) { + return this.rectContain(x, y); + }; + Displayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + Displayable.prototype.rectContain = function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }; + Displayable.prototype.getPaintRect = function () { + var rect = this._paintRect; + if (!this._paintRect || this.__dirty) { + var transform = this.transform; + var elRect = this.getBoundingRect(); + var style = this.style; + var shadowSize = style.shadowBlur || 0; + var shadowOffsetX = style.shadowOffsetX || 0; + var shadowOffsetY = style.shadowOffsetY || 0; + rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0)); + if (transform) { + BoundingRect.applyTransform(rect, elRect, transform); + } else { + rect.copy(elRect); + } + if (shadowSize || shadowOffsetX || shadowOffsetY) { + rect.width += shadowSize * 2 + Math.abs(shadowOffsetX); + rect.height += shadowSize * 2 + Math.abs(shadowOffsetY); + rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize); + rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize); + } + var tolerance = this.dirtyRectTolerance; + if (!rect.isZero()) { + rect.x = Math.floor(rect.x - tolerance); + rect.y = Math.floor(rect.y - tolerance); + rect.width = Math.ceil(rect.width + 1 + tolerance * 2); + rect.height = Math.ceil(rect.height + 1 + tolerance * 2); + } + } + return rect; + }; + Displayable.prototype.setPrevPaintRect = function (paintRect) { + if (paintRect) { + this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0); + this._prevPaintRect.copy(paintRect); + } else { + this._prevPaintRect = null; + } + }; + Displayable.prototype.getPrevPaintRect = function () { + return this._prevPaintRect; + }; + Displayable.prototype.animateStyle = function (loop) { + return this.animate('style', loop); + }; + Displayable.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } else { + this.markRedraw(); + } + }; + Displayable.prototype.attrKV = function (key, value) { + if (key !== 'style') { + _super.prototype.attrKV.call(this, key, value); + } else { + if (!this.style) { + this.useStyle(value); + } else { + this.setStyle(value); + } + } + }; + Displayable.prototype.setStyle = function (keyOrObj, value) { + if (typeof keyOrObj === 'string') { + this.style[keyOrObj] = value; + } else { + extend(this.style, keyOrObj); + } + this.dirtyStyle(); + return this; + }; + Displayable.prototype.dirtyStyle = function (notRedraw) { + if (!notRedraw) { + this.markRedraw(); + } + this.__dirty |= STYLE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + }; + Displayable.prototype.dirty = function () { + this.dirtyStyle(); + }; + Displayable.prototype.styleChanged = function () { + return !!(this.__dirty & STYLE_CHANGED_BIT); + }; + Displayable.prototype.styleUpdated = function () { + this.__dirty &= ~STYLE_CHANGED_BIT; + }; + Displayable.prototype.createStyle = function (obj) { + return createObject(DEFAULT_COMMON_STYLE, obj); + }; + Displayable.prototype.useStyle = function (obj) { + if (!obj[STYLE_MAGIC_KEY]) { + obj = this.createStyle(obj); + } + if (this.__inHover) { + this.__hoverStyle = obj; + } else { + this.style = obj; + } + this.dirtyStyle(); + }; + Displayable.prototype.isStyleObject = function (obj) { + return obj[STYLE_MAGIC_KEY]; + }; + Displayable.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.style && !normalState.style) { + normalState.style = this._mergeStyle(this.createStyle(), this.style); + } + this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS$1); + }; + Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetStyle; + if (state && state.style) { + if (transition) { + if (keepCurrentStates) { + targetStyle = state.style; + } else { + targetStyle = this._mergeStyle(this.createStyle(), normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } else { + targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style); + this._mergeStyle(targetStyle, state.style); + } + } else if (needsRestoreToNormal) { + targetStyle = normalState.style; + } + if (targetStyle) { + if (transition) { + var sourceStyle = this.style; + this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle); + if (needsRestoreToNormal) { + var changedKeys = keys(sourceStyle); + for (var i = 0; i < changedKeys.length; i++) { + var key = changedKeys[i]; + if (key in targetStyle) { + targetStyle[key] = targetStyle[key]; + this.style[key] = sourceStyle[key]; + } + } + } + var targetKeys = keys(targetStyle); + for (var i = 0; i < targetKeys.length; i++) { + var key = targetKeys[i]; + this.style[key] = this.style[key]; + } + this._transitionState(stateName, { + style: targetStyle + }, animationCfg, this.getAnimationStyleProps()); + } else { + this.useStyle(targetStyle); + } + } + var statesKeys = this.__inHover ? PRIMARY_STATES_KEYS_IN_HOVER_LAYER : PRIMARY_STATES_KEYS$1; + for (var i = 0; i < statesKeys.length; i++) { + var key = statesKeys[i]; + if (state && state[key] != null) { + this[key] = state[key]; + } else if (needsRestoreToNormal) { + if (normalState[key] != null) { + this[key] = normalState[key]; + } + } + } + }; + Displayable.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedStyle; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.style) { + mergedStyle = mergedStyle || {}; + this._mergeStyle(mergedStyle, state.style); + } + } + if (mergedStyle) { + mergedState.style = mergedStyle; + } + return mergedState; + }; + Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) { + extend(targetStyle, sourceStyle); + return targetStyle; + }; + Displayable.prototype.getAnimationStyleProps = function () { + return DEFAULT_COMMON_ANIMATION_PROPS; + }; + Displayable.initDefaultProps = (function () { + var dispProto = Displayable.prototype; + dispProto.type = 'displayable'; + dispProto.invisible = false; + dispProto.z = 0; + dispProto.z2 = 0; + dispProto.zlevel = 0; + dispProto.culling = false; + dispProto.cursor = 'pointer'; + dispProto.rectHover = false; + dispProto.incremental = false; + dispProto._rect = null; + dispProto.dirtyRectTolerance = 0; + dispProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT; + })(); + return Displayable; + }(Element)); + var tmpRect = new BoundingRect(0, 0, 0, 0); + var viewRect = new BoundingRect(0, 0, 0, 0); + + function isDisplayableCulled(el, width, height) { + tmpRect.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect.applyTransform(el.transform); + } + viewRect.width = width; + viewRect.height = height; + return !tmpRect.intersect(viewRect); + } + + var mathMin$1 = Math.min; + var mathMax$1 = Math.max; + var mathSin = Math.sin; + var mathCos = Math.cos; + var PI2 = Math.PI * 2; + var start = create(); + var end = create(); + var extremity = create(); + + function fromPoints(points, min, max) { + if (points.length === 0) { + return; + } + var p = points[0]; + var left = p[0]; + var right = p[0]; + var top = p[1]; + var bottom = p[1]; + for (var i = 1; i < points.length; i++) { + p = points[i]; + left = mathMin$1(left, p[0]); + right = mathMax$1(right, p[0]); + top = mathMin$1(top, p[1]); + bottom = mathMax$1(bottom, p[1]); + } + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + } + + function fromLine(x0, y0, x1, y1, min, max) { + min[0] = mathMin$1(x0, x1); + min[1] = mathMin$1(y0, y1); + max[0] = mathMax$1(x0, x1); + max[1] = mathMax$1(y0, y1); + } + + var xDim = []; + var yDim = []; + + function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) { + var cubicExtrema$1 = cubicExtrema; + var cubicAt$1 = cubicAt; + var n = cubicExtrema$1(x0, x1, x2, x3, xDim); + min[0] = Infinity; + min[1] = Infinity; + max[0] = -Infinity; + max[1] = -Infinity; + for (var i = 0; i < n; i++) { + var x = cubicAt$1(x0, x1, x2, x3, xDim[i]); + min[0] = mathMin$1(x, min[0]); + max[0] = mathMax$1(x, max[0]); + } + n = cubicExtrema$1(y0, y1, y2, y3, yDim); + for (var i = 0; i < n; i++) { + var y = cubicAt$1(y0, y1, y2, y3, yDim[i]); + min[1] = mathMin$1(y, min[1]); + max[1] = mathMax$1(y, max[1]); + } + min[0] = mathMin$1(x0, min[0]); + max[0] = mathMax$1(x0, max[0]); + min[0] = mathMin$1(x3, min[0]); + max[0] = mathMax$1(x3, max[0]); + min[1] = mathMin$1(y0, min[1]); + max[1] = mathMax$1(y0, max[1]); + min[1] = mathMin$1(y3, min[1]); + max[1] = mathMax$1(y3, max[1]); + } + + function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) { + var quadraticExtremum$1 = quadraticExtremum; + var quadraticAt$1 = quadraticAt; + var tx = mathMax$1(mathMin$1(quadraticExtremum$1(x0, x1, x2), 1), 0); + var ty = mathMax$1(mathMin$1(quadraticExtremum$1(y0, y1, y2), 1), 0); + var x = quadraticAt$1(x0, x1, x2, tx); + var y = quadraticAt$1(y0, y1, y2, ty); + min[0] = mathMin$1(x0, x2, x); + min[1] = mathMin$1(y0, y2, y); + max[0] = mathMax$1(x0, x2, x); + max[1] = mathMax$1(y0, y2, y); + } + + function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min$1, max$1) { + var vec2Min = min; + var vec2Max = max; + var diff = Math.abs(startAngle - endAngle); + if (diff % PI2 < 1e-4 && diff > 1e-4) { + min$1[0] = x - rx; + min$1[1] = y - ry; + max$1[0] = x + rx; + max$1[1] = y + ry; + return; + } + start[0] = mathCos(startAngle) * rx + x; + start[1] = mathSin(startAngle) * ry + y; + end[0] = mathCos(endAngle) * rx + x; + end[1] = mathSin(endAngle) * ry + y; + vec2Min(min$1, start, end); + vec2Max(max$1, start, end); + startAngle = startAngle % (PI2); + if (startAngle < 0) { + startAngle = startAngle + PI2; + } + endAngle = endAngle % (PI2); + if (endAngle < 0) { + endAngle = endAngle + PI2; + } + if (startAngle > endAngle && !anticlockwise) { + endAngle += PI2; + } else if (startAngle < endAngle && anticlockwise) { + startAngle += PI2; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = mathCos(angle) * rx + x; + extremity[1] = mathSin(angle) * ry + y; + vec2Min(min$1, extremity, min$1); + vec2Max(max$1, extremity, max$1); + } + } + } + + var CMD = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + R: 7 + }; + var tmpOutX = []; + var tmpOutY = []; + var min$1 = []; + var max$1 = []; + var min2 = []; + var max2 = []; + var mathMin$2 = Math.min; + var mathMax$2 = Math.max; + var mathCos$1 = Math.cos; + var mathSin$1 = Math.sin; + var mathAbs = Math.abs; + var PI = Math.PI; + var PI2$1 = PI * 2; + var hasTypedArray = typeof Float32Array !== 'undefined'; + var tmpAngles = []; + + function modPI2(radian) { + var n = Math.round(radian / PI * 1e8) / 1e8; + return (n % 2) * PI; + } + + function normalizeArcAngles(angles, anticlockwise) { + var newStartAngle = modPI2(angles[0]); + if (newStartAngle < 0) { + newStartAngle += PI2$1; + } + var delta = newStartAngle - angles[0]; + var newEndAngle = angles[1]; + newEndAngle += delta; + if (!anticlockwise && newEndAngle - newStartAngle >= PI2$1) { + newEndAngle = newStartAngle + PI2$1; + } else if (anticlockwise && newStartAngle - newEndAngle >= PI2$1) { + newEndAngle = newStartAngle - PI2$1; + } else if (!anticlockwise && newStartAngle > newEndAngle) { + newEndAngle = newStartAngle + (PI2$1 - modPI2(newStartAngle - newEndAngle)); + } else if (anticlockwise && newStartAngle < newEndAngle) { + newEndAngle = newStartAngle - (PI2$1 - modPI2(newEndAngle - newStartAngle)); + } + angles[0] = newStartAngle; + angles[1] = newEndAngle; + } + + var PathProxy = (function () { + function PathProxy(notSaveData) { + this.dpr = 1; + this._xi = 0; + this._yi = 0; + this._x0 = 0; + this._y0 = 0; + this._len = 0; + if (notSaveData) { + this._saveData = false; + } + if (this._saveData) { + this.data = []; + } + } + + PathProxy.prototype.increaseVersion = function () { + this._version++; + }; + PathProxy.prototype.getVersion = function () { + return this._version; + }; + PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) { + segmentIgnoreThreshold = segmentIgnoreThreshold || 0; + if (segmentIgnoreThreshold > 0) { + this._ux = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sx) || 0; + this._uy = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sy) || 0; + } + }; + PathProxy.prototype.setDPR = function (dpr) { + this.dpr = dpr; + }; + PathProxy.prototype.setContext = function (ctx) { + this._ctx = ctx; + }; + PathProxy.prototype.getContext = function () { + return this._ctx; + }; + PathProxy.prototype.beginPath = function () { + this._ctx && this._ctx.beginPath(); + this.reset(); + return this; + }; + PathProxy.prototype.reset = function () { + if (this._saveData) { + this._len = 0; + } + if (this._pathSegLen) { + this._pathSegLen = null; + this._pathLen = 0; + } + this._version++; + }; + PathProxy.prototype.moveTo = function (x, y) { + this._drawPendingPt(); + this.addData(CMD.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + this._x0 = x; + this._y0 = y; + this._xi = x; + this._yi = y; + return this; + }; + PathProxy.prototype.lineTo = function (x, y) { + var dx = mathAbs(x - this._xi); + var dy = mathAbs(y - this._yi); + var exceedUnit = dx > this._ux || dy > this._uy; + this.addData(CMD.L, x, y); + if (this._ctx && exceedUnit) { + this._ctx.lineTo(x, y); + } + if (exceedUnit) { + this._xi = x; + this._yi = y; + this._pendingPtDist = 0; + } else { + var d2 = dx * dx + dy * dy; + if (d2 > this._pendingPtDist) { + this._pendingPtX = x; + this._pendingPtY = y; + this._pendingPtDist = d2; + } + } + return this; + }; + PathProxy.prototype.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) { + this._drawPendingPt(); + this.addData(CMD.C, x1, y1, x2, y2, x3, y3); + if (this._ctx) { + this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + this._xi = x3; + this._yi = y3; + return this; + }; + PathProxy.prototype.quadraticCurveTo = function (x1, y1, x2, y2) { + this._drawPendingPt(); + this.addData(CMD.Q, x1, y1, x2, y2); + if (this._ctx) { + this._ctx.quadraticCurveTo(x1, y1, x2, y2); + } + this._xi = x2; + this._yi = y2; + return this; + }; + PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this._drawPendingPt(); + tmpAngles[0] = startAngle; + tmpAngles[1] = endAngle; + normalizeArcAngles(tmpAngles, anticlockwise); + startAngle = tmpAngles[0]; + endAngle = tmpAngles[1]; + var delta = endAngle - startAngle; + this.addData(CMD.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + this._xi = mathCos$1(endAngle) * r + cx; + this._yi = mathSin$1(endAngle) * r + cy; + return this; + }; + PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) { + this._drawPendingPt(); + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }; + PathProxy.prototype.rect = function (x, y, w, h) { + this._drawPendingPt(); + this._ctx && this._ctx.rect(x, y, w, h); + this.addData(CMD.R, x, y, w, h); + return this; + }; + PathProxy.prototype.closePath = function () { + this._drawPendingPt(); + this.addData(CMD.Z); + var ctx = this._ctx; + var x0 = this._x0; + var y0 = this._y0; + if (ctx) { + ctx.closePath(); + } + this._xi = x0; + this._yi = y0; + return this; + }; + PathProxy.prototype.fill = function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }; + PathProxy.prototype.stroke = function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }; + PathProxy.prototype.len = function () { + return this._len; + }; + PathProxy.prototype.setData = function (data) { + var len = data.length; + if (!(this.data && this.data.length === len) && hasTypedArray) { + this.data = new Float32Array(len); + } + for (var i = 0; i < len; i++) { + this.data[i] = data[i]; + } + this._len = len; + }; + PathProxy.prototype.appendPath = function (path) { + if (!(path instanceof Array)) { + path = [path]; + } + var len = path.length; + var appendSize = 0; + var offset = this._len; + for (var i = 0; i < len; i++) { + appendSize += path[i].len(); + } + if (hasTypedArray && (this.data instanceof Float32Array)) { + this.data = new Float32Array(offset + appendSize); + } + for (var i = 0; i < len; i++) { + var appendPathData = path[i].data; + for (var k = 0; k < appendPathData.length; k++) { + this.data[offset++] = appendPathData[k]; + } + } + this._len = offset; + }; + PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) { + if (!this._saveData) { + return; + } + var data = this.data; + if (this._len + arguments.length > data.length) { + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + }; + PathProxy.prototype._drawPendingPt = function () { + if (this._pendingPtDist > 0) { + this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY); + this._pendingPtDist = 0; + } + }; + PathProxy.prototype._expandData = function () { + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }; + PathProxy.prototype.toStatic = function () { + if (!this._saveData) { + return; + } + this._drawPendingPt(); + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray && this._len > 11) { + this.data = new Float32Array(data); + } + } + }; + PathProxy.prototype.getBoundingRect = function () { + min$1[0] = min$1[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max$1[0] = max$1[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var i; + for (i = 0; i < this._len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD.L: + fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2); + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD.Z: + xi = x0; + yi = y0; + break; + } + min(min$1, min$1, min2); + max(max$1, max$1, max2); + } + if (i === 0) { + min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0; + } + return new BoundingRect(min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1]); + }; + PathProxy.prototype._calculateLength = function () { + var data = this.data; + var len = this._len; + var ux = this._ux; + var uy = this._uy; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + if (!this._pathSegLen) { + this._pathSegLen = []; + } + var pathSegLen = this._pathSegLen; + var pathTotalLen = 0; + var segCount = 0; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + var l = -1; + switch (cmd) { + case CMD.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + break; + case CMD.L: { + var x2 = data[i++]; + var y2 = data[i++]; + var dx = x2 - xi; + var dy = y2 - yi; + if (mathAbs(dx) > ux || mathAbs(dy) > uy || i === len - 1) { + l = Math.sqrt(dx * dx + dy * dy); + xi = x2; + yi = y2; + } + break; + } + case CMD.C: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + var x3 = data[i++]; + var y3 = data[i++]; + l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10); + xi = x3; + yi = y3; + break; + } + case CMD.Q: { + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + l = quadraticLength(xi, yi, x1, y1, x2, y2, 10); + xi = x2; + yi = y2; + break; + } + case CMD.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var delta = data[i++]; + var endAngle = delta + startAngle; + i += 1; + var anticlockwise = !data[i++]; + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + l = mathMax$2(rx, ry) * mathMin$2(PI2$1, Math.abs(delta)); + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: { + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + l = width * 2 + height * 2; + break; + } + case CMD.Z: { + var dx = x0 - xi; + var dy = y0 - yi; + l = Math.sqrt(dx * dx + dy * dy); + xi = x0; + yi = y0; + break; + } + } + if (l >= 0) { + pathSegLen[segCount++] = l; + pathTotalLen += l; + } + } + this._pathLen = pathTotalLen; + return pathTotalLen; + }; + PathProxy.prototype.rebuildPath = function (ctx, percent) { + var d = this.data; + var ux = this._ux; + var uy = this._uy; + var len = this._len; + var x0; + var y0; + var xi; + var yi; + var x; + var y; + var drawPart = percent < 1; + var pathSegLen; + var pathTotalLen; + var accumLength = 0; + var segCount = 0; + var displayedLength; + var pendingPtDist = 0; + var pendingPtX; + var pendingPtY; + if (drawPart) { + if (!this._pathSegLen) { + this._calculateLength(); + } + pathSegLen = this._pathSegLen; + pathTotalLen = this._pathLen; + displayedLength = percent * pathTotalLen; + if (!displayedLength) { + return; + } + } + lo: for (var i = 0; i < len;) { + var cmd = d[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = d[i]; + yi = d[i + 1]; + x0 = xi; + y0 = yi; + } + if (cmd !== CMD.L && pendingPtDist > 0) { + ctx.lineTo(pendingPtX, pendingPtY); + pendingPtDist = 0; + } + switch (cmd) { + case CMD.M: + x0 = xi = d[i++]; + y0 = yi = d[i++]; + ctx.moveTo(xi, yi); + break; + case CMD.L: { + x = d[i++]; + y = d[i++]; + var dx = mathAbs(x - xi); + var dy = mathAbs(y - yi); + if (dx > ux || dy > uy) { + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t); + break lo; + } + accumLength += l; + } + ctx.lineTo(x, y); + xi = x; + yi = y; + pendingPtDist = 0; + } else { + var d2 = dx * dx + dy * dy; + if (d2 > pendingPtDist) { + pendingPtX = x; + pendingPtY = y; + pendingPtDist = d2; + } + } + break; + } + case CMD.C: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + var x3 = d[i++]; + var y3 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + cubicSubdivide(xi, x1, x2, x3, t, tmpOutX); + cubicSubdivide(yi, y1, y2, y3, t, tmpOutY); + ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]); + break lo; + } + accumLength += l; + } + ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + xi = x3; + yi = y3; + break; + } + case CMD.Q: { + var x1 = d[i++]; + var y1 = d[i++]; + var x2 = d[i++]; + var y2 = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + quadraticSubdivide(xi, x1, x2, t, tmpOutX); + quadraticSubdivide(yi, y1, y2, t, tmpOutY); + ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]); + break lo; + } + accumLength += l; + } + ctx.quadraticCurveTo(x1, y1, x2, y2); + xi = x2; + yi = y2; + break; + } + case CMD.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var startAngle = d[i++]; + var delta = d[i++]; + var psi = d[i++]; + var anticlockwise = !d[i++]; + var r = (rx > ry) ? rx : ry; + var isEllipse = mathAbs(rx - ry) > 1e-3; + var endAngle = startAngle + delta; + var breakBuild = false; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + endAngle = startAngle + delta * (displayedLength - accumLength) / l; + breakBuild = true; + } + accumLength += l; + } + if (isEllipse && ctx.ellipse) { + ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise); + } else { + ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + } + if (breakBuild) { + break lo; + } + if (isFirst) { + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = d[i]; + y0 = yi = d[i + 1]; + x = d[i++]; + y = d[i++]; + var width = d[i++]; + var height = d[i++]; + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var d_1 = displayedLength - accumLength; + ctx.moveTo(x, y); + ctx.lineTo(x + mathMin$2(d_1, width), y); + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x + width, y + mathMin$2(d_1, height)); + } + d_1 -= height; + if (d_1 > 0) { + ctx.lineTo(x + mathMax$2(width - d_1, 0), y + height); + } + d_1 -= width; + if (d_1 > 0) { + ctx.lineTo(x, y + mathMax$2(height - d_1, 0)); + } + break lo; + } + accumLength += l; + } + ctx.rect(x, y, width, height); + break; + case CMD.Z: + if (drawPart) { + var l = pathSegLen[segCount++]; + if (accumLength + l > displayedLength) { + var t = (displayedLength - accumLength) / l; + ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t); + break lo; + } + accumLength += l; + } + ctx.closePath(); + xi = x0; + yi = y0; + } + } + }; + PathProxy.prototype.clone = function () { + var newProxy = new PathProxy(); + var data = this.data; + newProxy.data = data.slice ? data.slice() + : Array.prototype.slice.call(data); + newProxy._len = this._len; + return newProxy; + }; + PathProxy.CMD = CMD; + PathProxy.initDefaultProps = (function () { + var proto = PathProxy.prototype; + proto._saveData = true; + proto._ux = 0; + proto._uy = 0; + proto._pendingPtDist = 0; + proto._version = 0; + })(); + return PathProxy; + }()); + + function containStroke(x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + if ((y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l)) { + return false; + } + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1); + } else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; + } + + function containStroke$1(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + if ((y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l)) { + return false; + } + var d = cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null); + return d <= _l / 2; + } + + function containStroke$2(x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + if ((y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l)) { + return false; + } + var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null); + return d <= _l / 2; + } + + var PI2$2 = Math.PI * 2; + + function normalizeRadian(angle) { + angle %= PI2$2; + if (angle < 0) { + angle += PI2$2; + } + return angle; + } + + var PI2$3 = Math.PI * 2; + + function containStroke$3(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) % PI2$3 < 1e-4) { + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2$3; + } + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2$3; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2$3 >= startAngle && angle + PI2$3 <= endAngle); + } + + function windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + if (y1 === y0) { + return 0; + } + var t = (y - y0) / (y1 - y0); + var dir = y1 < y0 ? 1 : -1; + if (t === 1 || t === 0) { + dir = y1 < y0 ? 0.5 : -0.5; + } + var x_ = t * (x1 - x0) + x0; + return x_ === x ? Infinity : x_ > x ? dir : 0; + } + + var CMD$1 = PathProxy.CMD; + var PI2$4 = Math.PI * 2; + var EPSILON$3 = 1e-4; + + function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON$3; + } + + var roots = [-1, -1, -1]; + var extrema = [-1, -1]; + + function swapExtrema() { + var tmp = extrema[0]; + extrema[0] = extrema[1]; + extrema[1] = tmp; + } + + function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + if ((y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3)) { + return 0; + } + var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } else { + var w = 0; + var nExtrema = -1; + var y0_ = void 0; + var y1_ = void 0; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var unit = (t === 0 || t === 1) ? 0.5 : 1; + var x_ = cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { + continue; + } + if (nExtrema < 0) { + nExtrema = cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema === 2) { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } else if (t < extrema[1]) { + w += y1_ < y0_ ? unit : -unit; + } else { + w += y3 < y1_ ? unit : -unit; + } + } else { + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } else { + w += y3 < y0_ ? unit : -unit; + } + } + } + return w; + } + } + + function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + if ((y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2)) { + return 0; + } + var nRoots = quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } else { + var t = quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? unit : -unit; + } else { + w += y2 < y_ ? unit : -unit; + } + } + return w; + } else { + var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1; + var x_ = quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { + return 0; + } + return y2 < y0 ? unit : -unit; + } + } + } + + function windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) { + y -= cy; + if (y > r || y < -r) { + return 0; + } + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + var dTheta = Math.abs(startAngle - endAngle); + if (dTheta < 1e-4) { + return 0; + } + if (dTheta >= PI2$4 - 1e-4) { + startAngle = 0; + endAngle = PI2$4; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } else { + return 0; + } + } + if (startAngle > endAngle) { + var tmp_1 = startAngle; + startAngle = endAngle; + endAngle = tmp_1; + } + if (startAngle < 0) { + startAngle += PI2$4; + endAngle += PI2$4; + } + var w = 0; + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + var dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2$4 + angle; + } + if ((angle >= startAngle && angle <= endAngle) + || (angle + PI2$4 >= startAngle && angle + PI2$4 <= endAngle)) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; + } + + function containPath(path, lineWidth, isStroke, x, y) { + var data = path.data; + var len = path.len(); + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (cmd === CMD$1.M && i > 1) { + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + } + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD$1.M: + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD$1.L: + if (isStroke) { + if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } else { + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.C: + if (isStroke) { + if (containStroke$1(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } else { + w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.Q: + if (isStroke) { + if (containStroke$2(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } else { + w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; + if (!isFirst) { + w += windingLine(xi, yi, x1, y1, x, y); + } else { + x0 = x1; + y0 = y1; + } + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (containStroke$3(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) { + return true; + } + } else { + w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case CMD$1.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + x1 = x0 + width; + y1 = y0 + height; + if (isStroke) { + if (containStroke(x0, y0, x1, y0, lineWidth, x, y) + || containStroke(x1, y0, x1, y1, lineWidth, x, y) + || containStroke(x1, y1, x0, y1, lineWidth, x, y) + || containStroke(x0, y1, x0, y0, lineWidth, x, y)) { + return true; + } + } else { + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD$1.Z: + if (isStroke) { + if (containStroke(xi, yi, x0, y0, lineWidth, x, y)) { + return true; + } + } else { + w += windingLine(xi, yi, x0, y0, x, y); + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; + } + + function contain(pathProxy, x, y) { + return containPath(pathProxy, 0, false, x, y); + } + + function containStroke$4(pathProxy, lineWidth, x, y) { + return containPath(pathProxy, lineWidth, true, x, y); + } + + var DEFAULT_PATH_STYLE = defaults({ + fill: '#000', + stroke: null, + strokePercent: 1, + fillOpacity: 1, + strokeOpacity: 1, + lineDashOffset: 0, + lineWidth: 1, + lineCap: 'butt', + miterLimit: 10, + strokeNoScale: false, + strokeFirst: false + }, DEFAULT_COMMON_STYLE); + var DEFAULT_PATH_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + strokePercent: true, + fillOpacity: true, + strokeOpacity: true, + lineDashOffset: true, + lineWidth: true, + miterLimit: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + var pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible', + 'culling', 'z', 'z2', 'zlevel', 'parent' + ]); + var Path = (function (_super) { + __extends(Path, _super); + + function Path(opts) { + return _super.call(this, opts) || this; + } + + Path.prototype.update = function () { + var _this = this; + _super.prototype.update.call(this); + var style = this.style; + if (style.decal) { + var decalEl = this._decalEl = this._decalEl || new Path(); + if (decalEl.buildPath === Path.prototype.buildPath) { + decalEl.buildPath = function (ctx) { + _this.buildPath(ctx, _this.shape); + }; + } + decalEl.silent = true; + var decalElStyle = decalEl.style; + for (var key in style) { + if (decalElStyle[key] !== style[key]) { + decalElStyle[key] = style[key]; + } + } + decalElStyle.fill = style.fill ? style.decal : null; + decalElStyle.decal = null; + decalElStyle.shadowColor = null; + style.strokeFirst && (decalElStyle.stroke = null); + for (var i = 0; i < pathCopyParams.length; ++i) { + decalEl[pathCopyParams[i]] = this[pathCopyParams[i]]; + } + decalEl.__dirty |= REDRAW_BIT; + } else if (this._decalEl) { + this._decalEl = null; + } + }; + Path.prototype.getDecalElement = function () { + return this._decalEl; + }; + Path.prototype._init = function (props) { + var keysArr = keys(props); + this.shape = this.getDefaultShape(); + var defaultStyle = this.getDefaultStyle(); + if (defaultStyle) { + this.useStyle(defaultStyle); + } + for (var i = 0; i < keysArr.length; i++) { + var key = keysArr[i]; + var value = props[key]; + if (key === 'style') { + if (!this.style) { + this.useStyle(value); + } else { + extend(this.style, value); + } + } else if (key === 'shape') { + extend(this.shape, value); + } else { + _super.prototype.attrKV.call(this, key, value); + } + } + if (!this.style) { + this.useStyle({}); + } + }; + Path.prototype.getDefaultStyle = function () { + return null; + }; + Path.prototype.getDefaultShape = function () { + return {}; + }; + Path.prototype.canBeInsideText = function () { + return this.hasFill(); + }; + Path.prototype.getInsideTextFill = function () { + var pathFill = this.style.fill; + if (pathFill !== 'none') { + if (isString(pathFill)) { + var fillLum = lum(pathFill, 0); + if (fillLum > 0.5) { + return DARK_LABEL_COLOR; + } else if (fillLum > 0.2) { + return LIGHTER_LABEL_COLOR; + } + return LIGHT_LABEL_COLOR; + } else if (pathFill) { + return LIGHT_LABEL_COLOR; + } + } + return DARK_LABEL_COLOR; + }; + Path.prototype.getInsideTextStroke = function (textFill) { + var pathFill = this.style.fill; + if (isString(pathFill)) { + var zr = this.__zr; + var isDarkMode = !!(zr && zr.isDarkMode()); + var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD; + if (isDarkMode === isDarkLabel) { + return pathFill; + } + } + }; + Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { + }; + Path.prototype.pathUpdated = function () { + this.__dirty &= ~SHAPE_CHANGED_BIT; + }; + Path.prototype.getUpdatedPathProxy = function (inBatch) { + !this.path && this.createPathProxy(); + this.path.beginPath(); + this.buildPath(this.path, this.shape, inBatch); + return this.path; + }; + Path.prototype.createPathProxy = function () { + this.path = new PathProxy(false); + }; + Path.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + }; + Path.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + Path.prototype.getBoundingRect = function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var firstInvoke = false; + if (!this.path) { + firstInvoke = true; + this.createPathProxy(); + } + var path = this.path; + if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) { + path.beginPath(); + this.buildPath(path, this.shape, false); + this.pathUpdated(); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + if (this.hasStroke() && this.path && this.path.len() > 0) { + var rectStroke = this._rectStroke || (this._rectStroke = rect.clone()); + if (this.__dirty || needsUpdateRect) { + rectStroke.copy(rect); + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + var w = style.lineWidth; + if (!this.hasFill()) { + var strokeContainThreshold = this.strokeContainThreshold; + w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold); + } + if (lineScale > 1e-10) { + rectStroke.width += w / lineScale; + rectStroke.height += w / lineScale; + rectStroke.x -= w / lineScale / 2; + rectStroke.y -= w / lineScale / 2; + } + } + return rectStroke; + } + return rect; + }; + Path.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + var style = this.style; + x = localPos[0]; + y = localPos[1]; + if (rect.contain(x, y)) { + var pathProxy = this.path; + if (this.hasStroke()) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + if (lineScale > 1e-10) { + if (!this.hasFill()) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (containStroke$4(pathProxy, lineWidth / lineScale, x, y)) { + return true; + } + } + } + if (this.hasFill()) { + return contain(pathProxy, x, y); + } + } + return false; + }; + Path.prototype.dirtyShape = function () { + this.__dirty |= SHAPE_CHANGED_BIT; + if (this._rect) { + this._rect = null; + } + if (this._decalEl) { + this._decalEl.dirtyShape(); + } + this.markRedraw(); + }; + Path.prototype.dirty = function () { + this.dirtyStyle(); + this.dirtyShape(); + }; + Path.prototype.animateShape = function (loop) { + return this.animate('shape', loop); + }; + Path.prototype.updateDuringAnimation = function (targetKey) { + if (targetKey === 'style') { + this.dirtyStyle(); + } else if (targetKey === 'shape') { + this.dirtyShape(); + } else { + this.markRedraw(); + } + }; + Path.prototype.attrKV = function (key, value) { + if (key === 'shape') { + this.setShape(value); + } else { + _super.prototype.attrKV.call(this, key, value); + } + }; + Path.prototype.setShape = function (keyOrObj, value) { + var shape = this.shape; + if (!shape) { + shape = this.shape = {}; + } + if (typeof keyOrObj === 'string') { + shape[keyOrObj] = value; + } else { + extend(shape, keyOrObj); + } + this.dirtyShape(); + return this; + }; + Path.prototype.shapeChanged = function () { + return !!(this.__dirty & SHAPE_CHANGED_BIT); + }; + Path.prototype.createStyle = function (obj) { + return createObject(DEFAULT_PATH_STYLE, obj); + }; + Path.prototype._innerSaveToNormal = function (toState) { + _super.prototype._innerSaveToNormal.call(this, toState); + var normalState = this._normalState; + if (toState.shape && !normalState.shape) { + normalState.shape = extend({}, this.shape); + } + }; + Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { + _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); + var needsRestoreToNormal = !(state && keepCurrentStates); + var targetShape; + if (state && state.shape) { + if (transition) { + if (keepCurrentStates) { + targetShape = state.shape; + } else { + targetShape = extend({}, normalState.shape); + extend(targetShape, state.shape); + } + } else { + targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape); + extend(targetShape, state.shape); + } + } else if (needsRestoreToNormal) { + targetShape = normalState.shape; + } + if (targetShape) { + if (transition) { + this.shape = extend({}, this.shape); + var targetShapePrimaryProps = {}; + var shapeKeys = keys(targetShape); + for (var i = 0; i < shapeKeys.length; i++) { + var key = shapeKeys[i]; + if (typeof targetShape[key] === 'object') { + this.shape[key] = targetShape[key]; + } else { + targetShapePrimaryProps[key] = targetShape[key]; + } + } + this._transitionState(stateName, { + shape: targetShapePrimaryProps + }, animationCfg); + } else { + this.shape = targetShape; + this.dirtyShape(); + } + } + }; + Path.prototype._mergeStates = function (states) { + var mergedState = _super.prototype._mergeStates.call(this, states); + var mergedShape; + for (var i = 0; i < states.length; i++) { + var state = states[i]; + if (state.shape) { + mergedShape = mergedShape || {}; + this._mergeStyle(mergedShape, state.shape); + } + } + if (mergedShape) { + mergedState.shape = mergedShape; + } + return mergedState; + }; + Path.prototype.getAnimationStyleProps = function () { + return DEFAULT_PATH_ANIMATION_PROPS; + }; + Path.prototype.isZeroArea = function () { + return false; + }; + Path.extend = function (defaultProps) { + var Sub = (function (_super) { + __extends(Sub, _super); + + function Sub(opts) { + var _this = _super.call(this, opts) || this; + defaultProps.init && defaultProps.init.call(_this, opts); + return _this; + } + + Sub.prototype.getDefaultStyle = function () { + return clone(defaultProps.style); + }; + Sub.prototype.getDefaultShape = function () { + return clone(defaultProps.shape); + }; + return Sub; + }(Path)); + for (var key in defaultProps) { + if (typeof defaultProps[key] === 'function') { + Sub.prototype[key] = defaultProps[key]; + } + } + return Sub; + }; + Path.initDefaultProps = (function () { + var pathProto = Path.prototype; + pathProto.type = 'path'; + pathProto.strokeContainThreshold = 5; + pathProto.segmentIgnoreThreshold = 0; + pathProto.subPixelOptimize = false; + pathProto.autoBatch = false; + pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT; + })(); + return Path; + }(Displayable)); + + var DEFAULT_TSPAN_STYLE = defaults({ + strokeFirst: true, + font: DEFAULT_FONT, + x: 0, + y: 0, + textAlign: 'left', + textBaseline: 'top', + miterLimit: 2 + }, DEFAULT_PATH_STYLE); + var TSpan = (function (_super) { + __extends(TSpan, _super); + + function TSpan() { + return _super !== null && _super.apply(this, arguments) || this; + } + + TSpan.prototype.hasStroke = function () { + var style = this.style; + var stroke = style.stroke; + return stroke != null && stroke !== 'none' && style.lineWidth > 0; + }; + TSpan.prototype.hasFill = function () { + var style = this.style; + var fill = style.fill; + return fill != null && fill !== 'none'; + }; + TSpan.prototype.createStyle = function (obj) { + return createObject(DEFAULT_TSPAN_STYLE, obj); + }; + TSpan.prototype.setBoundingRect = function (rect) { + this._rect = rect; + }; + TSpan.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + var text = style.text; + text != null ? (text += '') : (text = ''); + var rect = getBoundingRect(text, style.font, style.textAlign, style.textBaseline); + rect.x += style.x || 0; + rect.y += style.y || 0; + if (this.hasStroke()) { + var w = style.lineWidth; + rect.x -= w / 2; + rect.y -= w / 2; + rect.width += w; + rect.height += w; + } + this._rect = rect; + } + return this._rect; + }; + TSpan.initDefaultProps = (function () { + var tspanProto = TSpan.prototype; + tspanProto.dirtyRectTolerance = 10; + })(); + return TSpan; + }(Displayable)); + TSpan.prototype.type = 'tspan'; + + var DEFAULT_IMAGE_STYLE = defaults({ + x: 0, + y: 0 + }, DEFAULT_COMMON_STYLE); + var DEFAULT_IMAGE_ANIMATION_PROPS = { + style: defaults({ + x: true, + y: true, + width: true, + height: true, + sx: true, + sy: true, + sWidth: true, + sHeight: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + + function isImageLike(source) { + return !!(source + && typeof source !== 'string' + && source.width && source.height); + } + + var ZRImage = (function (_super) { + __extends(ZRImage, _super); + + function ZRImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + + ZRImage.prototype.createStyle = function (obj) { + return createObject(DEFAULT_IMAGE_STYLE, obj); + }; + ZRImage.prototype._getSize = function (dim) { + var style = this.style; + var size = style[dim]; + if (size != null) { + return size; + } + var imageSource = isImageLike(style.image) + ? style.image : this.__image; + if (!imageSource) { + return 0; + } + var otherDim = dim === 'width' ? 'height' : 'width'; + var otherDimSize = style[otherDim]; + if (otherDimSize == null) { + return imageSource[dim]; + } else { + return imageSource[dim] / imageSource[otherDim] * otherDimSize; + } + }; + ZRImage.prototype.getWidth = function () { + return this._getSize('width'); + }; + ZRImage.prototype.getHeight = function () { + return this._getSize('height'); + }; + ZRImage.prototype.getAnimationStyleProps = function () { + return DEFAULT_IMAGE_ANIMATION_PROPS; + }; + ZRImage.prototype.getBoundingRect = function () { + var style = this.style; + if (!this._rect) { + this._rect = new BoundingRect(style.x || 0, style.y || 0, this.getWidth(), this.getHeight()); + } + return this._rect; + }; + return ZRImage; + }(Displayable)); + ZRImage.prototype.type = 'image'; + + function buildPath(ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + var r = shape.r; + var r1; + var r2; + var r3; + var r4; + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } else { + r1 = r2 = r3 = r4 = 0; + } + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5); + } + + var round$1 = Math.round; + + function subPixelOptimizeLine(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var x1 = inputShape.x1; + var x2 = inputShape.x2; + var y1 = inputShape.y1; + var y2 = inputShape.y2; + outputShape.x1 = x1; + outputShape.x2 = x2; + outputShape.y1 = y1; + outputShape.y2 = y2; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + if (round$1(x1 * 2) === round$1(x2 * 2)) { + outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true); + } + if (round$1(y1 * 2) === round$1(y2 * 2)) { + outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true); + } + return outputShape; + } + + function subPixelOptimizeRect(outputShape, inputShape, style) { + if (!inputShape) { + return; + } + var originX = inputShape.x; + var originY = inputShape.y; + var originWidth = inputShape.width; + var originHeight = inputShape.height; + outputShape.x = originX; + outputShape.y = originY; + outputShape.width = originWidth; + outputShape.height = originHeight; + var lineWidth = style && style.lineWidth; + if (!lineWidth) { + return outputShape; + } + outputShape.x = subPixelOptimize(originX, lineWidth, true); + outputShape.y = subPixelOptimize(originY, lineWidth, true); + outputShape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1); + outputShape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1); + return outputShape; + } + + function subPixelOptimize(position, lineWidth, positiveOrNegative) { + if (!lineWidth) { + return position; + } + var doubledPosition = round$1(position * 2); + return (doubledPosition + round$1(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; + } + + var RectShape = (function () { + function RectShape() { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + } + + return RectShape; + }()); + var subPixelOptimizeOutputShape = {}; + var Rect = (function (_super) { + __extends(Rect, _super); + + function Rect(opts) { + return _super.call(this, opts) || this; + } + + Rect.prototype.getDefaultShape = function () { + return new RectShape(); + }; + Rect.prototype.buildPath = function (ctx, shape) { + var x; + var y; + var width; + var height; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeRect(subPixelOptimizeOutputShape, shape, this.style); + x = optimizedShape.x; + y = optimizedShape.y; + width = optimizedShape.width; + height = optimizedShape.height; + optimizedShape.r = shape.r; + shape = optimizedShape; + } else { + x = shape.x; + y = shape.y; + width = shape.width; + height = shape.height; + } + if (!shape.r) { + ctx.rect(x, y, width, height); + } else { + buildPath(ctx, shape); + } + }; + Rect.prototype.isZeroArea = function () { + return !this.shape.width || !this.shape.height; + }; + return Rect; + }(Path)); + Rect.prototype.type = 'rect'; + + var DEFAULT_RICH_TEXT_COLOR = { + fill: '#000' + }; + var DEFAULT_STROKE_LINE_WIDTH = 2; + var DEFAULT_TEXT_ANIMATION_PROPS = { + style: defaults({ + fill: true, + stroke: true, + fillOpacity: true, + strokeOpacity: true, + lineWidth: true, + fontSize: true, + lineHeight: true, + width: true, + height: true, + textShadowColor: true, + textShadowBlur: true, + textShadowOffsetX: true, + textShadowOffsetY: true, + backgroundColor: true, + padding: true, + borderColor: true, + borderWidth: true, + borderRadius: true + }, DEFAULT_COMMON_ANIMATION_PROPS.style) + }; + var ZRText = (function (_super) { + __extends(ZRText, _super); + + function ZRText(opts) { + var _this = _super.call(this) || this; + _this.type = 'text'; + _this._children = []; + _this._defaultStyle = DEFAULT_RICH_TEXT_COLOR; + _this.attr(opts); + return _this; + } + + ZRText.prototype.childrenRef = function () { + return this._children; + }; + ZRText.prototype.update = function () { + _super.prototype.update.call(this); + if (this.styleChanged()) { + this._updateSubTexts(); + } + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + child.zlevel = this.zlevel; + child.z = this.z; + child.z2 = this.z2; + child.culling = this.culling; + child.cursor = this.cursor; + child.invisible = this.invisible; + } + }; + ZRText.prototype.updateTransform = function () { + var innerTransformable = this.innerTransformable; + if (innerTransformable) { + innerTransformable.updateTransform(); + if (innerTransformable.transform) { + this.transform = innerTransformable.transform; + } + } else { + _super.prototype.updateTransform.call(this); + } + }; + ZRText.prototype.getLocalTransform = function (m) { + var innerTransformable = this.innerTransformable; + return innerTransformable + ? innerTransformable.getLocalTransform(m) + : _super.prototype.getLocalTransform.call(this, m); + }; + ZRText.prototype.getComputedTransform = function () { + if (this.__hostTarget) { + this.__hostTarget.getComputedTransform(); + this.__hostTarget.updateInnerText(true); + } + return _super.prototype.getComputedTransform.call(this); + }; + ZRText.prototype._updateSubTexts = function () { + this._childCursor = 0; + normalizeTextStyle(this.style); + this.style.rich + ? this._updateRichTexts() + : this._updatePlainTexts(); + this._children.length = this._childCursor; + this.styleUpdated(); + }; + ZRText.prototype.addSelfToZr = function (zr) { + _super.prototype.addSelfToZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = zr; + } + }; + ZRText.prototype.removeSelfFromZr = function (zr) { + _super.prototype.removeSelfFromZr.call(this, zr); + for (var i = 0; i < this._children.length; i++) { + this._children[i].__zr = null; + } + }; + ZRText.prototype.getBoundingRect = function () { + if (this.styleChanged()) { + this._updateSubTexts(); + } + if (!this._rect) { + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = this._children; + var tmpMat = []; + var rect = null; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + tmpRect.copy(childRect); + tmpRect.applyTransform(transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + this._rect = rect || tmpRect; + } + return this._rect; + }; + ZRText.prototype.setDefaultTextStyle = function (defaultTextStyle) { + this._defaultStyle = defaultTextStyle || DEFAULT_RICH_TEXT_COLOR; + }; + ZRText.prototype.setTextContent = function (textContent) { + if ("development" !== 'production') { + throw new Error('Can\'t attach text on another text'); + } + }; + ZRText.prototype._mergeStyle = function (targetStyle, sourceStyle) { + if (!sourceStyle) { + return targetStyle; + } + var sourceRich = sourceStyle.rich; + var targetRich = targetStyle.rich || (sourceRich && {}); + extend(targetStyle, sourceStyle); + if (sourceRich && targetRich) { + this._mergeRich(targetRich, sourceRich); + targetStyle.rich = targetRich; + } else if (targetRich) { + targetStyle.rich = targetRich; + } + return targetStyle; + }; + ZRText.prototype._mergeRich = function (targetRich, sourceRich) { + var richNames = keys(sourceRich); + for (var i = 0; i < richNames.length; i++) { + var richName = richNames[i]; + targetRich[richName] = targetRich[richName] || {}; + extend(targetRich[richName], sourceRich[richName]); + } + }; + ZRText.prototype.getAnimationStyleProps = function () { + return DEFAULT_TEXT_ANIMATION_PROPS; + }; + ZRText.prototype._getOrCreateChild = function (Ctor) { + var child = this._children[this._childCursor]; + if (!child || !(child instanceof Ctor)) { + child = new Ctor(); + } + this._children[this._childCursor++] = child; + child.__zr = this.__zr; + child.parent = this; + return child; + }; + ZRText.prototype._updatePlainTexts = function () { + var style = this.style; + var textFont = style.font || DEFAULT_FONT; + var textPadding = style.padding; + var text = getStyleText(style); + var contentBlock = parsePlainText(text, style); + var needDrawBg = needDrawBackground(style); + var bgColorDrawn = !!(style.backgroundColor); + var outerHeight = contentBlock.outerHeight; + var outerWidth = contentBlock.outerWidth; + var contentWidth = contentBlock.contentWidth; + var textLines = contentBlock.lines; + var lineHeight = contentBlock.lineHeight; + var defaultStyle = this._defaultStyle; + var baseX = style.x || 0; + var baseY = style.y || 0; + var textAlign = style.align || defaultStyle.align || 'left'; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign || 'top'; + var textX = baseX; + var textY = adjustTextY$1(baseY, contentBlock.contentHeight, verticalAlign); + if (needDrawBg || textPadding) { + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign); + needDrawBg && this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + textY += lineHeight / 2; + if (textPadding) { + textX = getTextXForPadding(baseX, textAlign, textPadding); + if (verticalAlign === 'top') { + textY += textPadding[0]; + } else if (verticalAlign === 'bottom') { + textY -= textPadding[2]; + } + } + var defaultLineWidth = 0; + var useDefaultFill = false; + var textFill = getFill('fill' in style + ? style.fill + : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke('stroke' in style + ? style.stroke + : (!bgColorDrawn + && (!defaultStyle.autoStroke || useDefaultFill)) + ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) + : null); + var hasShadow = style.textShadowBlur > 0; + var fixedBoundingRect = style.width != null + && (style.overflow === 'truncate' || style.overflow === 'break' || style.overflow === 'breakAll'); + var calculatedLineHeight = contentBlock.calculatedLineHeight; + for (var i = 0; i < textLines.length; i++) { + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + subElStyle.text = textLines[i]; + subElStyle.x = textX; + subElStyle.y = textY; + if (textAlign) { + subElStyle.textAlign = textAlign; + } + subElStyle.textBaseline = 'middle'; + subElStyle.opacity = style.opacity; + subElStyle.strokeFirst = true; + if (hasShadow) { + subElStyle.shadowBlur = style.textShadowBlur || 0; + subElStyle.shadowColor = style.textShadowColor || 'transparent'; + subElStyle.shadowOffsetX = style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = style.textShadowOffsetY || 0; + } + subElStyle.stroke = textStroke; + subElStyle.fill = textFill; + if (textStroke) { + subElStyle.lineWidth = style.lineWidth || defaultLineWidth; + subElStyle.lineDash = style.lineDash; + subElStyle.lineDashOffset = style.lineDashOffset || 0; + } + subElStyle.font = textFont; + setSeparateFont(subElStyle, style); + textY += lineHeight; + if (fixedBoundingRect) { + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, style.width, subElStyle.textAlign), adjustTextY$1(subElStyle.y, calculatedLineHeight, subElStyle.textBaseline), contentWidth, calculatedLineHeight)); + } + } + }; + ZRText.prototype._updateRichTexts = function () { + var style = this.style; + var text = getStyleText(style); + var contentBlock = parseRichText(text, style); + var contentWidth = contentBlock.width; + var outerWidth = contentBlock.outerWidth; + var outerHeight = contentBlock.outerHeight; + var textPadding = style.padding; + var baseX = style.x || 0; + var baseY = style.y || 0; + var defaultStyle = this._defaultStyle; + var textAlign = style.align || defaultStyle.align; + var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign; + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign); + var xLeft = boxX; + var lineTop = boxY; + if (textPadding) { + xLeft += textPadding[3]; + lineTop += textPadding[0]; + } + var xRight = xLeft + contentWidth; + if (needDrawBackground(style)) { + this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight); + } + var bgColorDrawn = !!(style.backgroundColor); + for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var tokens = line.tokens; + var tokenCount = tokens.length; + var lineHeight = line.lineHeight; + var remainedWidth = line.width; + var leftIndex = 0; + var lineXLeft = xLeft; + var lineXRight = xRight; + var rightIndex = tokenCount - 1; + var token = void 0; + while (leftIndex < tokenCount + && (token = tokens[leftIndex], !token.align || token.align === 'left')) { + this._placeToken(token, style, lineHeight, lineTop, lineXLeft, 'left', bgColorDrawn); + remainedWidth -= token.width; + lineXLeft += token.width; + leftIndex++; + } + while (rightIndex >= 0 + && (token = tokens[rightIndex], token.align === 'right')) { + this._placeToken(token, style, lineHeight, lineTop, lineXRight, 'right', bgColorDrawn); + remainedWidth -= token.width; + lineXRight -= token.width; + rightIndex--; + } + lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - remainedWidth) / 2; + while (leftIndex <= rightIndex) { + token = tokens[leftIndex]; + this._placeToken(token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center', bgColorDrawn); + lineXLeft += token.width; + leftIndex++; + } + lineTop += lineHeight; + } + }; + ZRText.prototype._placeToken = function (token, style, lineHeight, lineTop, x, textAlign, parentBgColorDrawn) { + var tokenStyle = style.rich[token.styleName] || {}; + tokenStyle.text = token.text; + var verticalAlign = token.verticalAlign; + var y = lineTop + lineHeight / 2; + if (verticalAlign === 'top') { + y = lineTop + token.height / 2; + } else if (verticalAlign === 'bottom') { + y = lineTop + lineHeight - token.height / 2; + } + var needDrawBg = !token.isLineHolder && needDrawBackground(tokenStyle); + needDrawBg && this._renderBackground(tokenStyle, style, textAlign === 'right' + ? x - token.width + : textAlign === 'center' + ? x - token.width / 2 + : x, y - token.height / 2, token.width, token.height); + var bgColorDrawn = !!tokenStyle.backgroundColor; + var textPadding = token.textPadding; + if (textPadding) { + x = getTextXForPadding(x, textAlign, textPadding); + y -= token.height / 2 - textPadding[0] - token.innerHeight / 2; + } + var el = this._getOrCreateChild(TSpan); + var subElStyle = el.createStyle(); + el.useStyle(subElStyle); + var defaultStyle = this._defaultStyle; + var useDefaultFill = false; + var defaultLineWidth = 0; + var textFill = getFill('fill' in tokenStyle ? tokenStyle.fill + : 'fill' in style ? style.fill + : (useDefaultFill = true, defaultStyle.fill)); + var textStroke = getStroke('stroke' in tokenStyle ? tokenStyle.stroke + : 'stroke' in style ? style.stroke + : (!bgColorDrawn + && !parentBgColorDrawn + && (!defaultStyle.autoStroke || useDefaultFill)) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke) + : null); + var hasShadow = tokenStyle.textShadowBlur > 0 + || style.textShadowBlur > 0; + subElStyle.text = token.text; + subElStyle.x = x; + subElStyle.y = y; + if (hasShadow) { + subElStyle.shadowBlur = tokenStyle.textShadowBlur || style.textShadowBlur || 0; + subElStyle.shadowColor = tokenStyle.textShadowColor || style.textShadowColor || 'transparent'; + subElStyle.shadowOffsetX = tokenStyle.textShadowOffsetX || style.textShadowOffsetX || 0; + subElStyle.shadowOffsetY = tokenStyle.textShadowOffsetY || style.textShadowOffsetY || 0; + } + subElStyle.textAlign = textAlign; + subElStyle.textBaseline = 'middle'; + subElStyle.font = token.font || DEFAULT_FONT; + subElStyle.opacity = retrieve3(tokenStyle.opacity, style.opacity, 1); + setSeparateFont(subElStyle, tokenStyle); + if (textStroke) { + subElStyle.lineWidth = retrieve3(tokenStyle.lineWidth, style.lineWidth, defaultLineWidth); + subElStyle.lineDash = retrieve2(tokenStyle.lineDash, style.lineDash); + subElStyle.lineDashOffset = style.lineDashOffset || 0; + subElStyle.stroke = textStroke; + } + if (textFill) { + subElStyle.fill = textFill; + } + var textWidth = token.contentWidth; + var textHeight = token.contentHeight; + el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, textWidth, subElStyle.textAlign), adjustTextY$1(subElStyle.y, textHeight, subElStyle.textBaseline), textWidth, textHeight)); + }; + ZRText.prototype._renderBackground = function (style, topStyle, x, y, width, height) { + var textBackgroundColor = style.backgroundColor; + var textBorderWidth = style.borderWidth; + var textBorderColor = style.borderColor; + var isImageBg = textBackgroundColor && textBackgroundColor.image; + var isPlainOrGradientBg = textBackgroundColor && !isImageBg; + var textBorderRadius = style.borderRadius; + var self = this; + var rectEl; + var imgEl; + if (isPlainOrGradientBg || style.lineHeight || (textBorderWidth && textBorderColor)) { + rectEl = this._getOrCreateChild(Rect); + rectEl.useStyle(rectEl.createStyle()); + rectEl.style.fill = null; + var rectShape = rectEl.shape; + rectShape.x = x; + rectShape.y = y; + rectShape.width = width; + rectShape.height = height; + rectShape.r = textBorderRadius; + rectEl.dirtyShape(); + } + if (isPlainOrGradientBg) { + var rectStyle = rectEl.style; + rectStyle.fill = textBackgroundColor || null; + rectStyle.fillOpacity = retrieve2(style.fillOpacity, 1); + } else if (isImageBg) { + imgEl = this._getOrCreateChild(ZRImage); + imgEl.onload = function () { + self.dirtyStyle(); + }; + var imgStyle = imgEl.style; + imgStyle.image = textBackgroundColor.image; + imgStyle.x = x; + imgStyle.y = y; + imgStyle.width = width; + imgStyle.height = height; + } + if (textBorderWidth && textBorderColor) { + var rectStyle = rectEl.style; + rectStyle.lineWidth = textBorderWidth; + rectStyle.stroke = textBorderColor; + rectStyle.strokeOpacity = retrieve2(style.strokeOpacity, 1); + rectStyle.lineDash = style.borderDash; + rectStyle.lineDashOffset = style.borderDashOffset || 0; + rectEl.strokeContainThreshold = 0; + if (rectEl.hasFill() && rectEl.hasStroke()) { + rectStyle.strokeFirst = true; + rectStyle.lineWidth *= 2; + } + } + var commonStyle = (rectEl || imgEl).style; + commonStyle.shadowBlur = style.shadowBlur || 0; + commonStyle.shadowColor = style.shadowColor || 'transparent'; + commonStyle.shadowOffsetX = style.shadowOffsetX || 0; + commonStyle.shadowOffsetY = style.shadowOffsetY || 0; + commonStyle.opacity = retrieve3(style.opacity, topStyle.opacity, 1); + }; + ZRText.makeFont = function (style) { + var font = ''; + if (hasSeparateFont(style)) { + font = [ + style.fontStyle, + style.fontWeight, + parseFontSize(style.fontSize), + style.fontFamily || 'sans-serif' + ].join(' '); + } + return font && trim(font) || style.textFont || style.font; + }; + return ZRText; + }(Displayable)); + var VALID_TEXT_ALIGN = {left: true, right: 1, center: 1}; + var VALID_TEXT_VERTICAL_ALIGN = {top: 1, bottom: 1, middle: 1}; + var FONT_PARTS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily']; + + function parseFontSize(fontSize) { + if (typeof fontSize === 'string' + && (fontSize.indexOf('px') !== -1 + || fontSize.indexOf('rem') !== -1 + || fontSize.indexOf('em') !== -1)) { + return fontSize; + } else if (!isNaN(+fontSize)) { + return fontSize + 'px'; + } else { + return DEFAULT_FONT_SIZE + 'px'; + } + } + + function setSeparateFont(targetStyle, sourceStyle) { + for (var i = 0; i < FONT_PARTS.length; i++) { + var fontProp = FONT_PARTS[i]; + var val = sourceStyle[fontProp]; + if (val != null) { + targetStyle[fontProp] = val; + } + } + } + + function hasSeparateFont(style) { + return style.fontSize != null || style.fontFamily || style.fontWeight; + } + + function normalizeTextStyle(style) { + normalizeStyle(style); + each(style.rich, normalizeStyle); + return style; + } + + function normalizeStyle(style) { + if (style) { + style.font = ZRText.makeFont(style); + var textAlign = style.align; + textAlign === 'middle' && (textAlign = 'center'); + style.align = (textAlign == null || VALID_TEXT_ALIGN[textAlign]) ? textAlign : 'left'; + var verticalAlign = style.verticalAlign; + verticalAlign === 'center' && (verticalAlign = 'middle'); + style.verticalAlign = (verticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[verticalAlign]) ? verticalAlign : 'top'; + var textPadding = style.padding; + if (textPadding) { + style.padding = normalizeCssArray(style.padding); + } + } + } + + function getStroke(stroke, lineWidth) { + return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none') + ? null + : (stroke.image || stroke.colorStops) + ? '#000' + : stroke; + } + + function getFill(fill) { + return (fill == null || fill === 'none') + ? null + : (fill.image || fill.colorStops) + ? '#000' + : fill; + } + + function getTextXForPadding(x, textAlign, textPadding) { + return textAlign === 'right' + ? (x - textPadding[1]) + : textAlign === 'center' + ? (x + textPadding[3] / 2 - textPadding[1] / 2) + : (x + textPadding[3]); + } + + function getStyleText(style) { + var text = style.text; + text != null && (text += ''); + return text; + } + + function needDrawBackground(style) { + return !!(style.backgroundColor + || style.lineHeight + || (style.borderWidth && style.borderColor)); + } + + var getECData = makeInner(); + var setCommonECData = function (seriesIndex, dataType, dataIdx, el) { + if (el) { + var ecData = getECData(el); // Add data index and series index for indexing the data by element + // Useful in tooltip + + ecData.dataIndex = dataIdx; + ecData.dataType = dataType; + ecData.seriesIndex = seriesIndex; // TODO: not store dataIndex on children. + + if (el.type === 'group') { + el.traverse(function (child) { + var childECData = getECData(child); + childECData.seriesIndex = seriesIndex; + childECData.dataIndex = dataIdx; + childECData.dataType = dataType; + }); + } + } + }; + + var _highlightNextDigit = 1; + var _highlightKeyMap = {}; + var getSavedStates = makeInner(); + var getComponentStates = makeInner(); + var HOVER_STATE_NORMAL = 0; + var HOVER_STATE_BLUR = 1; + var HOVER_STATE_EMPHASIS = 2; + var SPECIAL_STATES = ['emphasis', 'blur', 'select']; + var DISPLAY_STATES = ['normal', 'emphasis', 'blur', 'select']; + var Z2_EMPHASIS_LIFT = 10; + var Z2_SELECT_LIFT = 9; + var HIGHLIGHT_ACTION_TYPE = 'highlight'; + var DOWNPLAY_ACTION_TYPE = 'downplay'; + var SELECT_ACTION_TYPE = 'select'; + var UNSELECT_ACTION_TYPE = 'unselect'; + var TOGGLE_SELECT_ACTION_TYPE = 'toggleSelect'; + + function hasFillOrStroke(fillOrStroke) { + return fillOrStroke != null && fillOrStroke !== 'none'; + } // Most lifted color are duplicated. + + + var liftedColorCache = new LRU(100); + + function liftColor(color$1) { + if (isString(color$1)) { + var liftedColor = liftedColorCache.get(color$1); + + if (!liftedColor) { + liftedColor = lift(color$1, -0.1); + liftedColorCache.put(color$1, liftedColor); + } + + return liftedColor; + } else if (isGradientObject(color$1)) { + var ret = extend({}, color$1); + ret.colorStops = map(color$1.colorStops, function (stop) { + return { + offset: stop.offset, + color: lift(stop.color, -0.1) + }; + }); + return ret; + } // Change nothing. + + + return color$1; + } + + function doChangeHoverState(el, stateName, hoverStateEnum) { + if (el.onHoverStateChange && (el.hoverState || 0) !== hoverStateEnum) { + el.onHoverStateChange(stateName); + } + + el.hoverState = hoverStateEnum; + } + + function singleEnterEmphasis(el) { + // Only mark the flag. + // States will be applied in the echarts.ts in next frame. + doChangeHoverState(el, 'emphasis', HOVER_STATE_EMPHASIS); + } + + function singleLeaveEmphasis(el) { + // Only mark the flag. + // States will be applied in the echarts.ts in next frame. + if (el.hoverState === HOVER_STATE_EMPHASIS) { + doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL); + } + } + + function singleEnterBlur(el) { + doChangeHoverState(el, 'blur', HOVER_STATE_BLUR); + } + + function singleLeaveBlur(el) { + if (el.hoverState === HOVER_STATE_BLUR) { + doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL); + } + } + + function singleEnterSelect(el) { + el.selected = true; + } + + function singleLeaveSelect(el) { + el.selected = false; + } + + function updateElementState(el, updater, commonParam) { + updater(el, commonParam); + } + + function traverseUpdateState(el, updater, commonParam) { + updateElementState(el, updater, commonParam); + el.isGroup && el.traverse(function (child) { + updateElementState(child, updater, commonParam); + }); + } + + function setStatesFlag(el, stateName) { + switch (stateName) { + case 'emphasis': + el.hoverState = HOVER_STATE_EMPHASIS; + break; + + case 'normal': + el.hoverState = HOVER_STATE_NORMAL; + break; + + case 'blur': + el.hoverState = HOVER_STATE_BLUR; + break; + + case 'select': + el.selected = true; + } + } + + function getFromStateStyle(el, props, toStateName, defaultValue) { + var style = el.style; + var fromState = {}; + + for (var i = 0; i < props.length; i++) { + var propName = props[i]; + var val = style[propName]; + fromState[propName] = val == null ? defaultValue && defaultValue[propName] : val; + } + + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + + if (animator.__fromStateTransition // Dont consider the animation to emphasis state. + && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === 'style') { + animator.saveTo(fromState, props); + } + } + + return fromState; + } + + function createEmphasisDefaultState(el, stateName, targetStates, state) { + var hasSelect = targetStates && indexOf(targetStates, 'select') >= 0; + var cloned = false; + + if (el instanceof Path) { + var store = getSavedStates(el); + var fromFill = hasSelect ? store.selectFill || store.normalFill : store.normalFill; + var fromStroke = hasSelect ? store.selectStroke || store.normalStroke : store.normalStroke; + + if (hasFillOrStroke(fromFill) || hasFillOrStroke(fromStroke)) { + state = state || {}; + var emphasisStyle = state.style || {}; // inherit case + + if (emphasisStyle.fill === 'inherit') { + cloned = true; + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + emphasisStyle.fill = fromFill; + } // Apply default color lift + else if (!hasFillOrStroke(emphasisStyle.fill) && hasFillOrStroke(fromFill)) { + cloned = true; // Not modify the original value. + + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); // Already being applied 'emphasis'. DON'T lift color multiple times. + + emphasisStyle.fill = liftColor(fromFill); + } // Not highlight stroke if fill has been highlighted. + else if (!hasFillOrStroke(emphasisStyle.stroke) && hasFillOrStroke(fromStroke)) { + if (!cloned) { + state = extend({}, state); + emphasisStyle = extend({}, emphasisStyle); + } + + emphasisStyle.stroke = liftColor(fromStroke); + } + + state.style = emphasisStyle; + } + } + + if (state) { + // TODO Share with textContent? + if (state.z2 == null) { + if (!cloned) { + state = extend({}, state); + } + + var z2EmphasisLift = el.z2EmphasisLift; + state.z2 = el.z2 + (z2EmphasisLift != null ? z2EmphasisLift : Z2_EMPHASIS_LIFT); + } + } + + return state; + } + + function createSelectDefaultState(el, stateName, state) { + // const hasSelect = indexOf(el.currentStates, stateName) >= 0; + if (state) { + // TODO Share with textContent? + if (state.z2 == null) { + state = extend({}, state); + var z2SelectLift = el.z2SelectLift; + state.z2 = el.z2 + (z2SelectLift != null ? z2SelectLift : Z2_SELECT_LIFT); + } + } + + return state; + } + + function createBlurDefaultState(el, stateName, state) { + var hasBlur = indexOf(el.currentStates, stateName) >= 0; + var currentOpacity = el.style.opacity; + var fromState = !hasBlur ? getFromStateStyle(el, ['opacity'], stateName, { + opacity: 1 + }) : null; + state = state || {}; + var blurStyle = state.style || {}; + + if (blurStyle.opacity == null) { + // clone state + state = extend({}, state); + blurStyle = extend({ + // Already being applied 'emphasis'. DON'T mul opacity multiple times. + opacity: hasBlur ? currentOpacity : fromState.opacity * 0.1 + }, blurStyle); + state.style = blurStyle; + } + + return state; + } + + function elementStateProxy(stateName, targetStates) { + var state = this.states[stateName]; + + if (this.style) { + if (stateName === 'emphasis') { + return createEmphasisDefaultState(this, stateName, targetStates, state); + } else if (stateName === 'blur') { + return createBlurDefaultState(this, stateName, state); + } else if (stateName === 'select') { + return createSelectDefaultState(this, stateName, state); + } + } + + return state; + } + + /**FI + * Set hover style (namely "emphasis style") of element. + * @param el Should not be `zrender/graphic/Group`. + * @param focus 'self' | 'selfInSeries' | 'series' + */ + + + function setDefaultStateProxy(el) { + el.stateProxy = elementStateProxy; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + + if (textContent) { + textContent.stateProxy = elementStateProxy; + } + + if (textGuide) { + textGuide.stateProxy = elementStateProxy; + } + } + + function enterEmphasisWhenMouseOver(el, e) { + !shouldSilent(el, e) // "emphasis" event highlight has higher priority than mouse highlight. + && !el.__highByOuter && traverseUpdateState(el, singleEnterEmphasis); + } + + function leaveEmphasisWhenMouseOut(el, e) { + !shouldSilent(el, e) // "emphasis" event highlight has higher priority than mouse highlight. + && !el.__highByOuter && traverseUpdateState(el, singleLeaveEmphasis); + } + + function enterEmphasis(el, highlightDigit) { + el.__highByOuter |= 1 << (highlightDigit || 0); + traverseUpdateState(el, singleEnterEmphasis); + } + + function leaveEmphasis(el, highlightDigit) { + !(el.__highByOuter &= ~(1 << (highlightDigit || 0))) && traverseUpdateState(el, singleLeaveEmphasis); + } + + function enterBlur(el) { + traverseUpdateState(el, singleEnterBlur); + } + + function leaveBlur(el) { + traverseUpdateState(el, singleLeaveBlur); + } + + function enterSelect(el) { + traverseUpdateState(el, singleEnterSelect); + } + + function leaveSelect(el) { + traverseUpdateState(el, singleLeaveSelect); + } + + function shouldSilent(el, e) { + return el.__highDownSilentOnTouch && e.zrByTouch; + } + + function allLeaveBlur(api) { + var model = api.getModel(); + var leaveBlurredSeries = []; + var allComponentViews = []; + model.eachComponent(function (componentType, componentModel) { + var componentStates = getComponentStates(componentModel); + var isSeries = componentType === 'series'; + var view = isSeries ? api.getViewOfSeriesModel(componentModel) : api.getViewOfComponentModel(componentModel); + !isSeries && allComponentViews.push(view); + + if (componentStates.isBlured) { + // Leave blur anyway + view.group.traverse(function (child) { + singleLeaveBlur(child); + }); + isSeries && leaveBlurredSeries.push(componentModel); + } + + componentStates.isBlured = false; + }); + each(allComponentViews, function (view) { + if (view && view.toggleBlurSeries) { + view.toggleBlurSeries(leaveBlurredSeries, false, model); + } + }); + } + + function blurSeries(targetSeriesIndex, focus, blurScope, api) { + var ecModel = api.getModel(); + blurScope = blurScope || 'coordinateSystem'; + + function leaveBlurOfIndices(data, dataIndices) { + for (var i = 0; i < dataIndices.length; i++) { + var itemEl = data.getItemGraphicEl(dataIndices[i]); + itemEl && leaveBlur(itemEl); + } + } + + if (targetSeriesIndex == null) { + return; + } + + if (!focus || focus === 'none') { + return; + } + + var targetSeriesModel = ecModel.getSeriesByIndex(targetSeriesIndex); + var targetCoordSys = targetSeriesModel.coordinateSystem; + + if (targetCoordSys && targetCoordSys.master) { + targetCoordSys = targetCoordSys.master; + } + + var blurredSeries = []; + ecModel.eachSeries(function (seriesModel) { + var sameSeries = targetSeriesModel === seriesModel; + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.master) { + coordSys = coordSys.master; + } + + var sameCoordSys = coordSys && targetCoordSys ? coordSys === targetCoordSys : sameSeries; // If there is no coordinate system. use sameSeries instead. + + if (!( // Not blur other series if blurScope series + blurScope === 'series' && !sameSeries // Not blur other coordinate system if blurScope is coordinateSystem + || blurScope === 'coordinateSystem' && !sameCoordSys // Not blur self series if focus is series. + || focus === 'series' && sameSeries // TODO blurScope: coordinate system + )) { + var view = api.getViewOfSeriesModel(seriesModel); + view.group.traverse(function (child) { + singleEnterBlur(child); + }); + + if (isArrayLike(focus)) { + leaveBlurOfIndices(seriesModel.getData(), focus); + } else if (isObject(focus)) { + var dataTypes = keys(focus); + + for (var d = 0; d < dataTypes.length; d++) { + leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), focus[dataTypes[d]]); + } + } + + blurredSeries.push(seriesModel); + getComponentStates(seriesModel).isBlured = true; + } + }); + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType === 'series') { + return; + } + + var view = api.getViewOfComponentModel(componentModel); + + if (view && view.toggleBlurSeries) { + view.toggleBlurSeries(blurredSeries, true, ecModel); + } + }); + } + + function blurComponent(componentMainType, componentIndex, api) { + if (componentMainType == null || componentIndex == null) { + return; + } + + var componentModel = api.getModel().getComponent(componentMainType, componentIndex); + + if (!componentModel) { + return; + } + + getComponentStates(componentModel).isBlured = true; + var view = api.getViewOfComponentModel(componentModel); + + if (!view || !view.focusBlurEnabled) { + return; + } + + view.group.traverse(function (child) { + singleEnterBlur(child); + }); + } + + function blurSeriesFromHighlightPayload(seriesModel, payload, api) { + var seriesIndex = seriesModel.seriesIndex; + var data = seriesModel.getData(payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + var dataIndex = queryDataIndex(data, payload); // Pick the first one if there is multiple/none exists. + + dataIndex = (isArray(dataIndex) ? dataIndex[0] : dataIndex) || 0; + var el = data.getItemGraphicEl(dataIndex); + + if (!el) { + var count = data.count(); + var current = 0; // If data on dataIndex is NaN. + + while (!el && current < count) { + el = data.getItemGraphicEl(current++); + } + } + + if (el) { + var ecData = getECData(el); + blurSeries(seriesIndex, ecData.focus, ecData.blurScope, api); + } else { + // If there is no element put on the data. Try getting it from raw option + // TODO Should put it on seriesModel? + var focus_1 = seriesModel.get(['emphasis', 'focus']); + var blurScope = seriesModel.get(['emphasis', 'blurScope']); + + if (focus_1 != null) { + blurSeries(seriesIndex, focus_1, blurScope, api); + } + } + } + + function findComponentHighDownDispatchers(componentMainType, componentIndex, name, api) { + var ret = { + focusSelf: false, + dispatchers: null + }; + + if (componentMainType == null || componentMainType === 'series' || componentIndex == null || name == null) { + return ret; + } + + var componentModel = api.getModel().getComponent(componentMainType, componentIndex); + + if (!componentModel) { + return ret; + } + + var view = api.getViewOfComponentModel(componentModel); + + if (!view || !view.findHighDownDispatchers) { + return ret; + } + + var dispatchers = view.findHighDownDispatchers(name); // At presnet, the component (like Geo) only blur inside itself. + // So we do not use `blurScope` in component. + + var focusSelf; + + for (var i = 0; i < dispatchers.length; i++) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatchers[i])) { + error('param should be highDownDispatcher'); + } + + if (getECData(dispatchers[i]).focus === 'self') { + focusSelf = true; + break; + } + } + + return { + focusSelf: focusSelf, + dispatchers: dispatchers + }; + } + + function handleGlobalMouseOverForHighDown(dispatcher, e, api) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatcher)) { + error('param should be highDownDispatcher'); + } + + var ecData = getECData(dispatcher); + + var _a = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api), + dispatchers = _a.dispatchers, + focusSelf = _a.focusSelf; // If `findHighDownDispatchers` is supported on the component, + // highlight/downplay elements with the same name. + + + if (dispatchers) { + if (focusSelf) { + blurComponent(ecData.componentMainType, ecData.componentIndex, api); + } + + each(dispatchers, function (dispatcher) { + return enterEmphasisWhenMouseOver(dispatcher, e); + }); + } else { + // Try blur all in the related series. Then emphasis the hoverred. + // TODO. progressive mode. + blurSeries(ecData.seriesIndex, ecData.focus, ecData.blurScope, api); + + if (ecData.focus === 'self') { + blurComponent(ecData.componentMainType, ecData.componentIndex, api); + } // Other than series, component that not support `findHighDownDispatcher` will + // also use it. But in this case, highlight/downplay are only supported in + // mouse hover but not in dispatchAction. + + + enterEmphasisWhenMouseOver(dispatcher, e); + } + } + + function handleGlobalMouseOutForHighDown(dispatcher, e, api) { + if ("development" !== 'production' && !isHighDownDispatcher(dispatcher)) { + error('param should be highDownDispatcher'); + } + + allLeaveBlur(api); + var ecData = getECData(dispatcher); + var dispatchers = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api).dispatchers; + + if (dispatchers) { + each(dispatchers, function (dispatcher) { + return leaveEmphasisWhenMouseOut(dispatcher, e); + }); + } else { + leaveEmphasisWhenMouseOut(dispatcher, e); + } + } + + function toggleSelectionFromPayload(seriesModel, payload, api) { + if (!isSelectChangePayload(payload)) { + return; + } + + var dataType = payload.dataType; + var data = seriesModel.getData(dataType); + var dataIndex = queryDataIndex(data, payload); + + if (!isArray(dataIndex)) { + dataIndex = [dataIndex]; + } + + seriesModel[payload.type === TOGGLE_SELECT_ACTION_TYPE ? 'toggleSelect' : payload.type === SELECT_ACTION_TYPE ? 'select' : 'unselect'](dataIndex, dataType); + } + + function updateSeriesElementSelection(seriesModel) { + var allData = seriesModel.getAllData(); + each(allData, function (_a) { + var data = _a.data, + type = _a.type; + data.eachItemGraphicEl(function (el, idx) { + seriesModel.isSelected(idx, type) ? enterSelect(el) : leaveSelect(el); + }); + }); + } + + function getAllSelectedIndices(ecModel) { + var ret = []; + ecModel.eachSeries(function (seriesModel) { + var allData = seriesModel.getAllData(); + each(allData, function (_a) { + var data = _a.data, + type = _a.type; + var dataIndices = seriesModel.getSelectedDataIndices(); + + if (dataIndices.length > 0) { + var item = { + dataIndex: dataIndices, + seriesIndex: seriesModel.seriesIndex + }; + + if (type != null) { + item.dataType = type; + } + + ret.push(item); + } + }); + }); + return ret; + } + + /** + * Enable the function that mouseover will trigger the emphasis state. + * + * NOTE: + * This function should be used on the element with dataIndex, seriesIndex. + * + */ + + function enableHoverEmphasis(el, focus, blurScope) { + setAsHighDownDispatcher(el, true); + traverseUpdateState(el, setDefaultStateProxy); + enableHoverFocus(el, focus, blurScope); + } + + function disableHoverEmphasis(el) { + setAsHighDownDispatcher(el, false); + } + + function toggleHoverEmphasis(el, focus, blurScope, isDisabled) { + isDisabled ? disableHoverEmphasis(el) : enableHoverEmphasis(el, focus, blurScope); + } + + function enableHoverFocus(el, focus, blurScope) { + var ecData = getECData(el); + + if (focus != null) { + // TODO dataIndex may be set after this function. This check is not useful. + // if (ecData.dataIndex == null) { + // if (__DEV__) { + // console.warn('focus can only been set on element with dataIndex'); + // } + // } + // else { + ecData.focus = focus; + ecData.blurScope = blurScope; // } + } else if (ecData.focus) { + ecData.focus = null; + } + } + + var OTHER_STATES = ['emphasis', 'blur', 'select']; + var defaultStyleGetterMap = { + itemStyle: 'getItemStyle', + lineStyle: 'getLineStyle', + areaStyle: 'getAreaStyle' + }; + + /** + * Set emphasis/blur/selected states of element. + */ + + function setStatesStylesFromModel(el, itemModel, styleType, // default itemStyle + getter) { + styleType = styleType || 'itemStyle'; + + for (var i = 0; i < OTHER_STATES.length; i++) { + var stateName = OTHER_STATES[i]; + var model = itemModel.getModel([stateName, styleType]); + var state = el.ensureState(stateName); // Let it throw error if getterType is not found. + + state.style = getter ? getter(model) : model[defaultStyleGetterMap[styleType]](); + } + } + + /** + * + * Set element as highlight / downplay dispatcher. + * It will be checked when element recieved mouseover event or from highlight action. + * It's in change of all highlight/downplay behavior of it's children. + * + * @param el + * @param el.highDownSilentOnTouch + * In touch device, mouseover event will be trigger on touchstart event + * (see module:zrender/dom/HandlerProxy). By this mechanism, we can + * conveniently use hoverStyle when tap on touch screen without additional + * code for compatibility. + * But if the chart/component has select feature, which usually also use + * hoverStyle, there might be conflict between 'select-highlight' and + * 'hover-highlight' especially when roam is enabled (see geo for example). + * In this case, `highDownSilentOnTouch` should be used to disable + * hover-highlight on touch device. + * @param asDispatcher If `false`, do not set as "highDownDispatcher". + */ + + function setAsHighDownDispatcher(el, asDispatcher) { + var disable = asDispatcher === false; + var extendedEl = el; // Make `highDownSilentOnTouch` and `onStateChange` only work after + // `setAsHighDownDispatcher` called. Avoid it is modified by user unexpectedly. + + if (el.highDownSilentOnTouch) { + extendedEl.__highDownSilentOnTouch = el.highDownSilentOnTouch; + } // Simple optimize, since this method might be + // called for each elements of a group in some cases. + + + if (!disable || extendedEl.__highDownDispatcher) { + // Emphasis, normal can be triggered manually by API or other components like hover link. + // el[method]('emphasis', onElementEmphasisEvent)[method]('normal', onElementNormalEvent); + // Also keep previous record. + extendedEl.__highByOuter = extendedEl.__highByOuter || 0; + extendedEl.__highDownDispatcher = !disable; + } + } + + function isHighDownDispatcher(el) { + return !!(el && el.__highDownDispatcher); + } + + /** + * Enable component highlight/downplay features: + * + hover link (within the same name) + * + focus blur in component + */ + + function enableComponentHighDownFeatures(el, componentModel, componentHighDownName) { + var ecData = getECData(el); + ecData.componentMainType = componentModel.mainType; + ecData.componentIndex = componentModel.componentIndex; + ecData.componentHighDownName = componentHighDownName; + } + + /** + * Support hightlight/downplay record on each elements. + * For the case: hover highlight/downplay (legend, visualMap, ...) and + * user triggerred hightlight/downplay should not conflict. + * Only all of the highlightDigit cleared, return to normal. + * @param {string} highlightKey + * @return {number} highlightDigit + */ + + function getHighlightDigit(highlightKey) { + var highlightDigit = _highlightKeyMap[highlightKey]; + + if (highlightDigit == null && _highlightNextDigit <= 32) { + highlightDigit = _highlightKeyMap[highlightKey] = _highlightNextDigit++; + } + + return highlightDigit; + } + + function isSelectChangePayload(payload) { + var payloadType = payload.type; + return payloadType === SELECT_ACTION_TYPE || payloadType === UNSELECT_ACTION_TYPE || payloadType === TOGGLE_SELECT_ACTION_TYPE; + } + + function isHighDownPayload(payload) { + var payloadType = payload.type; + return payloadType === HIGHLIGHT_ACTION_TYPE || payloadType === DOWNPLAY_ACTION_TYPE; + } + + function savePathStates(el) { + var store = getSavedStates(el); + store.normalFill = el.style.fill; + store.normalStroke = el.style.stroke; + var selectState = el.states.select || {}; + store.selectFill = selectState.style && selectState.style.fill || null; + store.selectStroke = selectState.style && selectState.style.stroke || null; + } + + var CMD$2 = PathProxy.CMD; + var points = [[], [], []]; + var mathSqrt$1 = Math.sqrt; + var mathAtan2 = Math.atan2; + + function transformPath(path, m) { + if (!m) { + return; + } + var data = path.data; + var len = path.len(); + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + var M = CMD$2.M; + var C = CMD$2.C; + var L = CMD$2.L; + var R = CMD$2.R; + var A = CMD$2.A; + var Q = CMD$2.Q; + for (i = 0, j = 0; i < len;) { + cmd = data[i++]; + j = i; + nPoint = 0; + switch (cmd) { + case M: + nPoint = 1; + break; + case L: + nPoint = 1; + break; + case C: + nPoint = 3; + break; + case Q: + nPoint = 2; + break; + case A: + var x = m[4]; + var y = m[5]; + var sx = mathSqrt$1(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt$1(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + data[i] *= sx; + data[i++] += x; + data[i] *= sy; + data[i++] += y; + data[i++] *= sx; + data[i++] *= sy; + data[i++] += angle; + data[i++] += angle; + i += 2; + j = i; + break; + case R: + p[0] = data[i++]; + p[1] = data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + p[0] += data[i++]; + p[1] += data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + for (k = 0; k < nPoint; k++) { + var p_1 = points[k]; + p_1[0] = data[i++]; + p_1[1] = data[i++]; + applyTransform(p_1, p_1, m); + data[j++] = p_1[0]; + data[j++] = p_1[1]; + } + } + path.increaseVersion(); + } + + var mathSqrt$2 = Math.sqrt; + var mathSin$2 = Math.sin; + var mathCos$2 = Math.cos; + var PI$1 = Math.PI; + + function vMag(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); + } + + function vRatio(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); + } + + function vAngle(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) + * Math.acos(vRatio(u, v)); + } + + function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { + var psi = psiDeg * (PI$1 / 180.0); + var xp = mathCos$2(psi) * (x1 - x2) / 2.0 + + mathSin$2(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin$2(psi) * (x1 - x2) / 2.0 + + mathCos$2(psi) * (y1 - y2) / 2.0; + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + if (lambda > 1) { + rx *= mathSqrt$2(lambda); + ry *= mathSqrt$2(lambda); + } + var f = (fa === fs ? -1 : 1) + * mathSqrt$2((((rx * rx) * (ry * ry)) + - ((rx * rx) * (yp * yp)) + - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + + (ry * ry) * (xp * xp))) || 0; + var cxp = f * rx * yp / ry; + var cyp = f * -ry * xp / rx; + var cx = (x1 + x2) / 2.0 + + mathCos$2(psi) * cxp + - mathSin$2(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin$2(psi) * cxp + + mathCos$2(psi) * cyp; + var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]); + var u = [(xp - cxp) / rx, (yp - cyp) / ry]; + var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; + var dTheta = vAngle(u, v); + if (vRatio(u, v) <= -1) { + dTheta = PI$1; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (dTheta < 0) { + var n = Math.round(dTheta / PI$1 * 1e6) / 1e6; + dTheta = PI$1 * 2 + (n % 2) * PI$1; + } + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); + } + + var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig; + var numberReg = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + + function createPathProxyFromString(data) { + var path = new PathProxy(); + if (!data) { + return path; + } + var cpx = 0; + var cpy = 0; + var subpathX = cpx; + var subpathY = cpy; + var prevCmd; + var CMD = PathProxy.CMD; + var cmdList = data.match(commandReg); + if (!cmdList) { + return path; + } + for (var l = 0; l < cmdList.length; l++) { + var cmdText = cmdList[l]; + var cmdStr = cmdText.charAt(0); + var cmd = void 0; + var p = cmdText.match(numberReg) || []; + var pLen = p.length; + for (var i = 0; i < pLen; i++) { + p[i] = parseFloat(p[i]); + } + var off = 0; + while (off < pLen) { + var ctlPtx = void 0; + var ctlPty = void 0; + var rx = void 0; + var ry = void 0; + var psi = void 0; + var fa = void 0; + var fs = void 0; + var x1 = cpx; + var y1 = cpy; + var len = void 0; + var pathData = void 0; + switch (cmdStr) { + case 'l': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'L': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'm': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + subpathX = cpx; + subpathY = cpy; + cmdStr = 'L'; + break; + case 'h': + cpx += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'H': + cpx = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'v': + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'V': + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'C': + cmd = CMD.C; + path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]); + cpx = p[off - 2]; + cpy = p[off - 1]; + break; + case 'c': + cmd = CMD.C; + path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy); + cpx += p[off - 2]; + cpy += p[off - 1]; + break; + case 'S': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 's': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = cpx + p[off++]; + y1 = cpy + p[off++]; + cpx += p[off++]; + cpy += p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 'Q': + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'q': + x1 = p[off++] + cpx; + y1 = p[off++] + cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'T': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 't': + ctlPtx = cpx; + ctlPty = cpy; + len = path.len(); + pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 'A': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + x1 = cpx, y1 = cpy; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.A; + processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); + break; + case 'a': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + x1 = cpx, y1 = cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.A; + processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path); + break; + } + } + if (cmdStr === 'z' || cmdStr === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + cpx = subpathX; + cpy = subpathY; + } + prevCmd = cmd; + } + path.toStatic(); + return path; + } + + var SVGPath = (function (_super) { + __extends(SVGPath, _super); + + function SVGPath() { + return _super !== null && _super.apply(this, arguments) || this; + } + + SVGPath.prototype.applyTransform = function (m) { + }; + return SVGPath; + }(Path)); + + function isPathProxy(path) { + return path.setData != null; + } + + function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + var innerOpts = extend({}, opts); + innerOpts.buildPath = function (path) { + if (isPathProxy(path)) { + path.setData(pathProxy.data); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } else { + var ctx = path; + pathProxy.rebuildPath(ctx, 1); + } + }; + innerOpts.applyTransform = function (m) { + transformPath(pathProxy, m); + this.dirtyShape(); + }; + return innerOpts; + } + + function createFromString(str, opts) { + return new SVGPath(createPathOptions(str, opts)); + } + + function extendFromString(str, defaultOpts) { + var innerOpts = createPathOptions(str, defaultOpts); + var Sub = (function (_super) { + __extends(Sub, _super); + + function Sub(opts) { + var _this = _super.call(this, opts) || this; + _this.applyTransform = innerOpts.applyTransform; + _this.buildPath = innerOpts.buildPath; + return _this; + } + + return Sub; + }(SVGPath)); + return Sub; + } + + function mergePath(pathEls, opts) { + var pathList = []; + var len = pathEls.length; + for (var i = 0; i < len; i++) { + var pathEl = pathEls[i]; + pathList.push(pathEl.getUpdatedPathProxy(true)); + } + var pathBundle = new Path(opts); + pathBundle.createPathProxy(); + pathBundle.buildPath = function (path) { + if (isPathProxy(path)) { + path.appendPath(pathList); + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx, 1); + } + } + }; + return pathBundle; + } + + function clonePath(sourcePath, opts) { + opts = opts || {}; + var path = new Path(); + if (sourcePath.shape) { + path.setShape(sourcePath.shape); + } + path.setStyle(sourcePath.style); + if (opts.bakeTransform) { + transformPath(path.path, sourcePath.getComputedTransform()); + } else { + if (opts.toLocal) { + path.setLocalTransform(sourcePath.getComputedTransform()); + } else { + path.copyTransform(sourcePath); + } + } + path.buildPath = sourcePath.buildPath; + path.applyTransform = path.applyTransform; + path.z = sourcePath.z; + path.z2 = sourcePath.z2; + path.zlevel = sourcePath.zlevel; + return path; + } + + var CircleShape = (function () { + function CircleShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + } + + return CircleShape; + }()); + var Circle = (function (_super) { + __extends(Circle, _super); + + function Circle(opts) { + return _super.call(this, opts) || this; + } + + Circle.prototype.getDefaultShape = function () { + return new CircleShape(); + }; + Circle.prototype.buildPath = function (ctx, shape) { + ctx.moveTo(shape.cx + shape.r, shape.cy); + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2); + }; + return Circle; + }(Path)); + Circle.prototype.type = 'circle'; + + var EllipseShape = (function () { + function EllipseShape() { + this.cx = 0; + this.cy = 0; + this.rx = 0; + this.ry = 0; + } + + return EllipseShape; + }()); + var Ellipse = (function (_super) { + __extends(Ellipse, _super); + + function Ellipse(opts) { + return _super.call(this, opts) || this; + } + + Ellipse.prototype.getDefaultShape = function () { + return new EllipseShape(); + }; + Ellipse.prototype.buildPath = function (ctx, shape) { + var k = 0.5522848; + var x = shape.cx; + var y = shape.cy; + var a = shape.rx; + var b = shape.ry; + var ox = a * k; + var oy = b * k; + ctx.moveTo(x - a, y); + ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b); + ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y); + ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b); + ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y); + ctx.closePath(); + }; + return Ellipse; + }(Path)); + Ellipse.prototype.type = 'ellipse'; + + var PI$2 = Math.PI; + var PI2$5 = PI$2 * 2; + var mathSin$3 = Math.sin; + var mathCos$3 = Math.cos; + var mathACos = Math.acos; + var mathATan2 = Math.atan2; + var mathAbs$1 = Math.abs; + var mathSqrt$3 = Math.sqrt; + var mathMax$3 = Math.max; + var mathMin$3 = Math.min; + var e = 1e-4; + + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var dx10 = x1 - x0; + var dy10 = y1 - y0; + var dx32 = x3 - x2; + var dy32 = y3 - y2; + var t = dy32 * dx10 - dx32 * dy10; + if (t * t < e) { + return; + } + t = (dx32 * (y0 - y2) - dy32 * (x0 - x2)) / t; + return [x0 + t * dx10, y0 + t * dy10]; + } + + function computeCornerTangents(x0, y0, x1, y1, radius, cr, clockwise) { + var x01 = x0 - x1; + var y01 = y0 - y1; + var lo = (clockwise ? cr : -cr) / mathSqrt$3(x01 * x01 + y01 * y01); + var ox = lo * y01; + var oy = -lo * x01; + var x11 = x0 + ox; + var y11 = y0 + oy; + var x10 = x1 + ox; + var y10 = y1 + oy; + var x00 = (x11 + x10) / 2; + var y00 = (y11 + y10) / 2; + var dx = x10 - x11; + var dy = y10 - y11; + var d2 = dx * dx + dy * dy; + var r = radius - cr; + var s = x11 * y10 - x10 * y11; + var d = (dy < 0 ? -1 : 1) * mathSqrt$3(mathMax$3(0, r * r * d2 - s * s)); + var cx0 = (s * dy - dx * d) / d2; + var cy0 = (-s * dx - dy * d) / d2; + var cx1 = (s * dy + dx * d) / d2; + var cy1 = (-s * dx + dy * d) / d2; + var dx0 = cx0 - x00; + var dy0 = cy0 - y00; + var dx1 = cx1 - x00; + var dy1 = cy1 - y00; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) { + cx0 = cx1; + cy0 = cy1; + } + return { + cx: cx0, + cy: cy0, + x0: -ox, + y0: -oy, + x1: cx0 * (radius / r - 1), + y1: cy0 * (radius / r - 1) + }; + } + + function normalizeCornerRadius(cr) { + var arr; + if (isArray(cr)) { + var len = cr.length; + if (!len) { + return cr; + } + if (len === 1) { + arr = [cr[0], cr[0], 0, 0]; + } else if (len === 2) { + arr = [cr[0], cr[0], cr[1], cr[1]]; + } else if (len === 3) { + arr = cr.concat(cr[2]); + } else { + arr = cr; + } + } else { + arr = [cr, cr, cr, cr]; + } + return arr; + } + + function buildPath$1(ctx, shape) { + var _a; + var radius = mathMax$3(shape.r, 0); + var innerRadius = mathMax$3(shape.r0 || 0, 0); + var hasRadius = radius > 0; + var hasInnerRadius = innerRadius > 0; + if (!hasRadius && !hasInnerRadius) { + return; + } + if (!hasRadius) { + radius = innerRadius; + innerRadius = 0; + } + if (innerRadius > radius) { + var tmp = radius; + radius = innerRadius; + innerRadius = tmp; + } + var startAngle = shape.startAngle, endAngle = shape.endAngle; + if (isNaN(startAngle) || isNaN(endAngle)) { + return; + } + var cx = shape.cx, cy = shape.cy; + var clockwise = !!shape.clockwise; + var arc = mathAbs$1(endAngle - startAngle); + var mod = arc > PI2$5 && arc % PI2$5; + mod > e && (arc = mod); + if (!(radius > e)) { + ctx.moveTo(cx, cy); + } else if (arc > PI2$5 - e) { + ctx.moveTo(cx + radius * mathCos$3(startAngle), cy + radius * mathSin$3(startAngle)); + ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise); + if (innerRadius > e) { + ctx.moveTo(cx + innerRadius * mathCos$3(endAngle), cy + innerRadius * mathSin$3(endAngle)); + ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise); + } + } else { + var icrStart = void 0; + var icrEnd = void 0; + var ocrStart = void 0; + var ocrEnd = void 0; + var ocrs = void 0; + var ocre = void 0; + var icrs = void 0; + var icre = void 0; + var ocrMax = void 0; + var icrMax = void 0; + var limitedOcrMax = void 0; + var limitedIcrMax = void 0; + var xre = void 0; + var yre = void 0; + var xirs = void 0; + var yirs = void 0; + var xrs = radius * mathCos$3(startAngle); + var yrs = radius * mathSin$3(startAngle); + var xire = innerRadius * mathCos$3(endAngle); + var yire = innerRadius * mathSin$3(endAngle); + var hasArc = arc > e; + if (hasArc) { + var cornerRadius = shape.cornerRadius; + if (cornerRadius) { + _a = normalizeCornerRadius(cornerRadius), icrStart = _a[0], icrEnd = _a[1], ocrStart = _a[2], ocrEnd = _a[3]; + } + var halfRd = mathAbs$1(radius - innerRadius) / 2; + ocrs = mathMin$3(halfRd, ocrStart); + ocre = mathMin$3(halfRd, ocrEnd); + icrs = mathMin$3(halfRd, icrStart); + icre = mathMin$3(halfRd, icrEnd); + limitedOcrMax = ocrMax = mathMax$3(ocrs, ocre); + limitedIcrMax = icrMax = mathMax$3(icrs, icre); + if (ocrMax > e || icrMax > e) { + xre = radius * mathCos$3(endAngle); + yre = radius * mathSin$3(endAngle); + xirs = innerRadius * mathCos$3(startAngle); + yirs = innerRadius * mathSin$3(startAngle); + if (arc < PI$2) { + var it_1 = intersect(xrs, yrs, xirs, yirs, xre, yre, xire, yire); + if (it_1) { + var x0 = xrs - it_1[0]; + var y0 = yrs - it_1[1]; + var x1 = xre - it_1[0]; + var y1 = yre - it_1[1]; + var a = 1 / mathSin$3(mathACos((x0 * x1 + y0 * y1) / (mathSqrt$3(x0 * x0 + y0 * y0) * mathSqrt$3(x1 * x1 + y1 * y1))) / 2); + var b = mathSqrt$3(it_1[0] * it_1[0] + it_1[1] * it_1[1]); + limitedOcrMax = mathMin$3(ocrMax, (radius - b) / (a + 1)); + limitedIcrMax = mathMin$3(icrMax, (innerRadius - b) / (a - 1)); + } + } + } + } + if (!hasArc) { + ctx.moveTo(cx + xrs, cy + yrs); + } else if (limitedOcrMax > e) { + var crStart = mathMin$3(ocrStart, limitedOcrMax); + var crEnd = mathMin$3(ocrEnd, limitedOcrMax); + var ct0 = computeCornerTangents(xirs, yirs, xrs, yrs, radius, crStart, clockwise); + var ct1 = computeCornerTangents(xre, yre, xire, yire, radius, crEnd, clockwise); + ctx.moveTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0); + if (limitedOcrMax < ocrMax && crStart === crEnd) { + ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedOcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise); + } else { + crStart > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crStart, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise); + ctx.arc(cx, cy, radius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), !clockwise); + crEnd > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crEnd, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + } else { + ctx.moveTo(cx + xrs, cy + yrs); + ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise); + } + if (!(innerRadius > e) || !hasArc) { + ctx.lineTo(cx + xire, cy + yire); + } else if (limitedIcrMax > e) { + var crStart = mathMin$3(icrStart, limitedIcrMax); + var crEnd = mathMin$3(icrEnd, limitedIcrMax); + var ct0 = computeCornerTangents(xire, yire, xre, yre, innerRadius, -crEnd, clockwise); + var ct1 = computeCornerTangents(xrs, yrs, xirs, yirs, innerRadius, -crStart, clockwise); + ctx.lineTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0); + if (limitedIcrMax < icrMax && crStart === crEnd) { + ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedIcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise); + } else { + crEnd > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crEnd, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise); + ctx.arc(cx, cy, innerRadius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), clockwise); + crStart > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crStart, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise); + } + } else { + ctx.lineTo(cx + xire, cy + yire); + ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise); + } + } + ctx.closePath(); + } + + var SectorShape = (function () { + function SectorShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + this.cornerRadius = 0; + } + + return SectorShape; + }()); + var Sector = (function (_super) { + __extends(Sector, _super); + + function Sector(opts) { + return _super.call(this, opts) || this; + } + + Sector.prototype.getDefaultShape = function () { + return new SectorShape(); + }; + Sector.prototype.buildPath = function (ctx, shape) { + buildPath$1(ctx, shape); + }; + Sector.prototype.isZeroArea = function () { + return this.shape.startAngle === this.shape.endAngle + || this.shape.r === this.shape.r0; + }; + return Sector; + }(Path)); + Sector.prototype.type = 'sector'; + + var RingShape = (function () { + function RingShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.r0 = 0; + } + + return RingShape; + }()); + var Ring = (function (_super) { + __extends(Ring, _super); + + function Ring(opts) { + return _super.call(this, opts) || this; + } + + Ring.prototype.getDefaultShape = function () { + return new RingShape(); + }; + Ring.prototype.buildPath = function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var PI2 = Math.PI * 2; + ctx.moveTo(x + shape.r, y); + ctx.arc(x, y, shape.r, 0, PI2, false); + ctx.moveTo(x + shape.r0, y); + ctx.arc(x, y, shape.r0, 0, PI2, true); + }; + return Ring; + }(Path)); + Ring.prototype.type = 'ring'; + + function smoothBezier(points, smooth, isLoop, constraint) { + var cps = []; + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + var min$1; + var max$1; + if (constraint) { + min$1 = [Infinity, Infinity]; + max$1 = [-Infinity, -Infinity]; + for (var i = 0, len = points.length; i < len; i++) { + min(min$1, min$1, points[i]); + max(max$1, max$1, points[i]); + } + min(min$1, min$1, constraint[0]); + max(max$1, max$1, constraint[1]); + } + for (var i = 0, len = points.length; i < len; i++) { + var point = points[i]; + if (isLoop) { + prevPoint = points[i ? i - 1 : len - 1]; + nextPoint = points[(i + 1) % len]; + } else { + if (i === 0 || i === len - 1) { + cps.push(clone$1(points[i])); + continue; + } else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + sub(v, nextPoint, prevPoint); + scale(v, v, smooth); + var d0 = distance(point, prevPoint); + var d1 = distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + scale(v1, v, -d0); + scale(v2, v, d1); + var cp0 = add([], point, v1); + var cp1 = add([], point, v2); + if (constraint) { + max(cp0, cp0, min$1); + min(cp0, cp0, max$1); + max(cp1, cp1, min$1); + min(cp1, cp1, max$1); + } + cps.push(cp0); + cps.push(cp1); + } + if (isLoop) { + cps.push(cps.shift()); + } + return cps; + } + + function buildPath$2(ctx, shape, closePath) { + var smooth = shape.smooth; + var points = shape.points; + if (points && points.length >= 2) { + if (smooth) { + var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint); + ctx.moveTo(points[0][0], points[0][1]); + var len = points.length; + for (var i = 0; i < (closePath ? len : len - 1); i++) { + var cp1 = controlPoints[i * 2]; + var cp2 = controlPoints[i * 2 + 1]; + var p = points[(i + 1) % len]; + ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]); + } + } else { + ctx.moveTo(points[0][0], points[0][1]); + for (var i = 1, l = points.length; i < l; i++) { + ctx.lineTo(points[i][0], points[i][1]); + } + } + closePath && ctx.closePath(); + } + } + + var PolygonShape = (function () { + function PolygonShape() { + this.points = null; + this.smooth = 0; + this.smoothConstraint = null; + } + + return PolygonShape; + }()); + var Polygon = (function (_super) { + __extends(Polygon, _super); + + function Polygon(opts) { + return _super.call(this, opts) || this; + } + + Polygon.prototype.getDefaultShape = function () { + return new PolygonShape(); + }; + Polygon.prototype.buildPath = function (ctx, shape) { + buildPath$2(ctx, shape, true); + }; + return Polygon; + }(Path)); + Polygon.prototype.type = 'polygon'; + + var PolylineShape = (function () { + function PolylineShape() { + this.points = null; + this.percent = 1; + this.smooth = 0; + this.smoothConstraint = null; + } + + return PolylineShape; + }()); + var Polyline = (function (_super) { + __extends(Polyline, _super); + + function Polyline(opts) { + return _super.call(this, opts) || this; + } + + Polyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Polyline.prototype.getDefaultShape = function () { + return new PolylineShape(); + }; + Polyline.prototype.buildPath = function (ctx, shape) { + buildPath$2(ctx, shape, false); + }; + return Polyline; + }(Path)); + Polyline.prototype.type = 'polyline'; + + var subPixelOptimizeOutputShape$1 = {}; + var LineShape = (function () { + function LineShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + + return LineShape; + }()); + var Line = (function (_super) { + __extends(Line, _super); + + function Line(opts) { + return _super.call(this, opts) || this; + } + + Line.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Line.prototype.getDefaultShape = function () { + return new LineShape(); + }; + Line.prototype.buildPath = function (ctx, shape) { + var x1; + var y1; + var x2; + var y2; + if (this.subPixelOptimize) { + var optimizedShape = subPixelOptimizeLine(subPixelOptimizeOutputShape$1, shape, this.style); + x1 = optimizedShape.x1; + y1 = optimizedShape.y1; + x2 = optimizedShape.x2; + y2 = optimizedShape.y2; + } else { + x1 = shape.x1; + y1 = shape.y1; + x2 = shape.x2; + y2 = shape.y2; + } + var percent = shape.percent; + if (percent === 0) { + return; + } + ctx.moveTo(x1, y1); + if (percent < 1) { + x2 = x1 * (1 - percent) + x2 * percent; + y2 = y1 * (1 - percent) + y2 * percent; + } + ctx.lineTo(x2, y2); + }; + Line.prototype.pointAt = function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + }; + return Line; + }(Path)); + Line.prototype.type = 'line'; + + var out = []; + var BezierCurveShape = (function () { + function BezierCurveShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.percent = 1; + } + + return BezierCurveShape; + }()); + + function someVectorAt(shape, t, isTangent) { + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 != null || cpy2 != null) { + return [ + (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t), + (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t) + ]; + } else { + return [ + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t), + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t) + ]; + } + } + + var BezierCurve = (function (_super) { + __extends(BezierCurve, _super); + + function BezierCurve(opts) { + return _super.call(this, opts) || this; + } + + BezierCurve.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + BezierCurve.prototype.getDefaultShape = function () { + return new BezierCurveShape(); + }; + BezierCurve.prototype.buildPath = function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var cpx1 = shape.cpx1; + var cpy1 = shape.cpy1; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + var percent = shape.percent; + if (percent === 0) { + return; + } + ctx.moveTo(x1, y1); + if (cpx2 == null || cpy2 == null) { + if (percent < 1) { + quadraticSubdivide(x1, cpx1, x2, percent, out); + cpx1 = out[1]; + x2 = out[2]; + quadraticSubdivide(y1, cpy1, y2, percent, out); + cpy1 = out[1]; + y2 = out[2]; + } + ctx.quadraticCurveTo(cpx1, cpy1, x2, y2); + } else { + if (percent < 1) { + cubicSubdivide(x1, cpx1, cpx2, x2, percent, out); + cpx1 = out[1]; + cpx2 = out[2]; + x2 = out[3]; + cubicSubdivide(y1, cpy1, cpy2, y2, percent, out); + cpy1 = out[1]; + cpy2 = out[2]; + y2 = out[3]; + } + ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2); + } + }; + BezierCurve.prototype.pointAt = function (t) { + return someVectorAt(this.shape, t, false); + }; + BezierCurve.prototype.tangentAt = function (t) { + var p = someVectorAt(this.shape, t, true); + return normalize(p, p); + }; + return BezierCurve; + }(Path)); + BezierCurve.prototype.type = 'bezier-curve'; + + var ArcShape = (function () { + function ArcShape() { + this.cx = 0; + this.cy = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + + return ArcShape; + }()); + var Arc = (function (_super) { + __extends(Arc, _super); + + function Arc(opts) { + return _super.call(this, opts) || this; + } + + Arc.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + Arc.prototype.getDefaultShape = function () { + return new ArcShape(); + }; + Arc.prototype.buildPath = function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + ctx.moveTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + }; + return Arc; + }(Path)); + Arc.prototype.type = 'arc'; + + var CompoundPath = (function (_super) { + __extends(CompoundPath, _super); + + function CompoundPath() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.type = 'compound'; + return _this; + } + + CompoundPath.prototype._updatePathDirty = function () { + var paths = this.shape.paths; + var dirtyPath = this.shapeChanged(); + for (var i = 0; i < paths.length; i++) { + dirtyPath = dirtyPath || paths[i].shapeChanged(); + } + if (dirtyPath) { + this.dirtyShape(); + } + }; + CompoundPath.prototype.beforeBrush = function () { + this._updatePathDirty(); + var paths = this.shape.paths || []; + var scale = this.getGlobalScale(); + for (var i = 0; i < paths.length; i++) { + if (!paths[i].path) { + paths[i].createPathProxy(); + } + paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold); + } + }; + CompoundPath.prototype.buildPath = function (ctx, shape) { + var paths = shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].buildPath(ctx, paths[i].shape, true); + } + }; + CompoundPath.prototype.afterBrush = function () { + var paths = this.shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].pathUpdated(); + } + }; + CompoundPath.prototype.getBoundingRect = function () { + this._updatePathDirty.call(this); + return Path.prototype.getBoundingRect.call(this); + }; + return CompoundPath; + }(Path)); + + var Gradient = (function () { + function Gradient(colorStops) { + this.colorStops = colorStops || []; + } + + Gradient.prototype.addColorStop = function (offset, color) { + this.colorStops.push({ + offset: offset, + color: color + }); + }; + return Gradient; + }()); + + var LinearGradient = (function (_super) { + __extends(LinearGradient, _super); + + function LinearGradient(x, y, x2, y2, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0 : x; + _this.y = y == null ? 0 : y; + _this.x2 = x2 == null ? 1 : x2; + _this.y2 = y2 == null ? 0 : y2; + _this.type = 'linear'; + _this.global = globalCoord || false; + return _this; + } + + return LinearGradient; + }(Gradient)); + + var RadialGradient = (function (_super) { + __extends(RadialGradient, _super); + + function RadialGradient(x, y, r, colorStops, globalCoord) { + var _this = _super.call(this, colorStops) || this; + _this.x = x == null ? 0.5 : x; + _this.y = y == null ? 0.5 : y; + _this.r = r == null ? 0.5 : r; + _this.type = 'radial'; + _this.global = globalCoord || false; + return _this; + } + + return RadialGradient; + }(Gradient)); + + var extent = [0, 0]; + var extent2 = [0, 0]; + var minTv$1 = new Point(); + var maxTv$1 = new Point(); + var OrientedBoundingRect = (function () { + function OrientedBoundingRect(rect, transform) { + this._corners = []; + this._axes = []; + this._origin = [0, 0]; + for (var i = 0; i < 4; i++) { + this._corners[i] = new Point(); + } + for (var i = 0; i < 2; i++) { + this._axes[i] = new Point(); + } + if (rect) { + this.fromBoundingRect(rect, transform); + } + } + + OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) { + var corners = this._corners; + var axes = this._axes; + var x = rect.x; + var y = rect.y; + var x2 = x + rect.width; + var y2 = y + rect.height; + corners[0].set(x, y); + corners[1].set(x2, y); + corners[2].set(x2, y2); + corners[3].set(x, y2); + if (transform) { + for (var i = 0; i < 4; i++) { + corners[i].transform(transform); + } + } + Point.sub(axes[0], corners[1], corners[0]); + Point.sub(axes[1], corners[3], corners[0]); + axes[0].normalize(); + axes[1].normalize(); + for (var i = 0; i < 2; i++) { + this._origin[i] = axes[i].dot(corners[0]); + } + }; + OrientedBoundingRect.prototype.intersect = function (other, mtv) { + var overlapped = true; + var noMtv = !mtv; + minTv$1.set(Infinity, Infinity); + maxTv$1.set(0, 0); + if (!this._intersectCheckOneSide(this, other, minTv$1, maxTv$1, noMtv, 1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!this._intersectCheckOneSide(other, this, minTv$1, maxTv$1, noMtv, -1)) { + overlapped = false; + if (noMtv) { + return overlapped; + } + } + if (!noMtv) { + Point.copy(mtv, overlapped ? minTv$1 : maxTv$1); + } + return overlapped; + }; + OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) { + var overlapped = true; + for (var i = 0; i < 2; i++) { + var axis = this._axes[i]; + this._getProjMinMaxOnAxis(i, self._corners, extent); + this._getProjMinMaxOnAxis(i, other._corners, extent2); + if (extent[1] < extent2[0] || extent[0] > extent2[1]) { + overlapped = false; + if (noMtv) { + return overlapped; + } + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) > maxTv.len()) { + if (dist0 < dist1) { + Point.scale(maxTv, axis, -dist0 * inverse); + } else { + Point.scale(maxTv, axis, dist1 * inverse); + } + } + } else if (minTv) { + var dist0 = Math.abs(extent2[0] - extent[1]); + var dist1 = Math.abs(extent[0] - extent2[1]); + if (Math.min(dist0, dist1) < minTv.len()) { + if (dist0 < dist1) { + Point.scale(minTv, axis, dist0 * inverse); + } else { + Point.scale(minTv, axis, -dist1 * inverse); + } + } + } + } + return overlapped; + }; + OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) { + var axis = this._axes[dim]; + var origin = this._origin; + var proj = corners[0].dot(axis) + origin[dim]; + var min = proj; + var max = proj; + for (var i = 1; i < corners.length; i++) { + var proj_1 = corners[i].dot(axis) + origin[dim]; + min = Math.min(proj_1, min); + max = Math.max(proj_1, max); + } + out[0] = min; + out[1] = max; + }; + return OrientedBoundingRect; + }()); + + var m = []; + var IncrementalDisplayable = (function (_super) { + __extends(IncrementalDisplayable, _super); + + function IncrementalDisplayable() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.notClear = true; + _this.incremental = true; + _this._displayables = []; + _this._temporaryDisplayables = []; + _this._cursor = 0; + return _this; + } + + IncrementalDisplayable.prototype.traverse = function (cb, context) { + cb.call(context, this); + }; + IncrementalDisplayable.prototype.useStyle = function () { + this.style = {}; + }; + IncrementalDisplayable.prototype.getCursor = function () { + return this._cursor; + }; + IncrementalDisplayable.prototype.innerAfterBrush = function () { + this._cursor = this._displayables.length; + }; + IncrementalDisplayable.prototype.clearDisplaybles = function () { + this._displayables = []; + this._temporaryDisplayables = []; + this._cursor = 0; + this.markRedraw(); + this.notClear = false; + }; + IncrementalDisplayable.prototype.clearTemporalDisplayables = function () { + this._temporaryDisplayables = []; + }; + IncrementalDisplayable.prototype.addDisplayable = function (displayable, notPersistent) { + if (notPersistent) { + this._temporaryDisplayables.push(displayable); + } else { + this._displayables.push(displayable); + } + this.markRedraw(); + }; + IncrementalDisplayable.prototype.addDisplayables = function (displayables, notPersistent) { + notPersistent = notPersistent || false; + for (var i = 0; i < displayables.length; i++) { + this.addDisplayable(displayables[i], notPersistent); + } + }; + IncrementalDisplayable.prototype.getDisplayables = function () { + return this._displayables; + }; + IncrementalDisplayable.prototype.getTemporalDisplayables = function () { + return this._temporaryDisplayables; + }; + IncrementalDisplayable.prototype.eachPendingDisplayable = function (cb) { + for (var i = this._cursor; i < this._displayables.length; i++) { + cb && cb(this._displayables[i]); + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + cb && cb(this._temporaryDisplayables[i]); + } + }; + IncrementalDisplayable.prototype.update = function () { + this.updateTransform(); + for (var i = this._cursor; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + var displayable = this._temporaryDisplayables[i]; + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + }; + IncrementalDisplayable.prototype.getBoundingRect = function () { + if (!this._rect) { + var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity); + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + var childRect = displayable.getBoundingRect().clone(); + if (displayable.needLocalTransform()) { + childRect.applyTransform(displayable.getLocalTransform(m)); + } + rect.union(childRect); + } + this._rect = rect; + } + return this._rect; + }; + IncrementalDisplayable.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + if (rect.contain(localPos[0], localPos[1])) { + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + if (displayable.contain(x, y)) { + return true; + } + } + } + return false; + }; + return IncrementalDisplayable; + }(Displayable)); + + var transitionStore = makeInner(); + + /** + * Return null if animation is disabled. + */ + + function getAnimationConfig(animationType, animatableModel, dataIndex, // Extra opts can override the option in animatable model. + extraOpts, // TODO It's only for pictorial bar now. + extraDelayParams) { + var animationPayload; // Check if there is global animation configuration from dataZoom/resize can override the config in option. + // If animation is enabled. Will use this animation config in payload. + // If animation is disabled. Just ignore it. + + if (animatableModel && animatableModel.ecModel) { + var updatePayload = animatableModel.ecModel.getUpdatePayload(); + animationPayload = updatePayload && updatePayload.animation; + } + + var animationEnabled = animatableModel && animatableModel.isAnimationEnabled(); + var isUpdate = animationType === 'update'; + + if (animationEnabled) { + var duration = void 0; + var easing = void 0; + var delay = void 0; + + if (extraOpts) { + duration = retrieve2(extraOpts.duration, 200); + easing = retrieve2(extraOpts.easing, 'cubicOut'); + delay = 0; + } else { + duration = animatableModel.getShallow(isUpdate ? 'animationDurationUpdate' : 'animationDuration'); + easing = animatableModel.getShallow(isUpdate ? 'animationEasingUpdate' : 'animationEasing'); + delay = animatableModel.getShallow(isUpdate ? 'animationDelayUpdate' : 'animationDelay'); + } // animation from payload has highest priority. + + + if (animationPayload) { + animationPayload.duration != null && (duration = animationPayload.duration); + animationPayload.easing != null && (easing = animationPayload.easing); + animationPayload.delay != null && (delay = animationPayload.delay); + } + + if (isFunction(delay)) { + delay = delay(dataIndex, extraDelayParams); + } + + if (isFunction(duration)) { + duration = duration(dataIndex); + } + + var config = { + duration: duration || 0, + delay: delay, + easing: easing + }; + return config; + } else { + return null; + } + } + + function animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) { + var isFrom = false; + var removeOpt; + + if (isFunction(dataIndex)) { + during = cb; + cb = dataIndex; + dataIndex = null; + } else if (isObject(dataIndex)) { + cb = dataIndex.cb; + during = dataIndex.during; + isFrom = dataIndex.isFrom; + removeOpt = dataIndex.removeOpt; + dataIndex = dataIndex.dataIndex; + } + + var isRemove = animationType === 'leave'; + + if (!isRemove) { + // Must stop the remove animation. + el.stopAnimation('leave'); + } + + var animationConfig = getAnimationConfig(animationType, animatableModel, dataIndex, isRemove ? removeOpt || {} : null, animatableModel && animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null); + + if (animationConfig && animationConfig.duration > 0) { + var duration = animationConfig.duration; + var animationDelay = animationConfig.delay; + var animationEasing = animationConfig.easing; + var animateConfig = { + duration: duration, + delay: animationDelay || 0, + easing: animationEasing, + done: cb, + force: !!cb || !!during, + // Set to final state in update/init animation. + // So the post processing based on the path shape can be done correctly. + setToFinal: !isRemove, + scope: animationType, + during: during + }; + isFrom ? el.animateFrom(props, animateConfig) : el.animateTo(props, animateConfig); + } else { + el.stopAnimation(); // If `isFrom`, the props is the "from" props. + + !isFrom && el.attr(props); // Call during at least once. + + during && during(1); + cb && cb(); + } + } + + /** + * Update graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + * @example + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, dataIndex, function () { console.log('Animation done!'); }); + * // Or + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, function () { console.log('Animation done!'); }); + */ + + + function updateProps(el, props, // TODO: TYPE AnimatableModel + animatableModel, dataIndex, cb, during) { + animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during); + } + + /** + * Init graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + */ + + function initProps(el, props, animatableModel, dataIndex, cb, during) { + animateOrSetProps('enter', el, props, animatableModel, dataIndex, cb, during); + } + + /** + * If element is removed. + * It can determine if element is having remove animation. + */ + + function isElementRemoved(el) { + if (!el.__zr) { + return true; + } + + for (var i = 0; i < el.animators.length; i++) { + var animator = el.animators[i]; + + if (animator.scope === 'leave') { + return true; + } + } + + return false; + } + + /** + * Remove graphic element + */ + + function removeElement(el, props, animatableModel, dataIndex, cb, during) { + // Don't do remove animation twice. + if (isElementRemoved(el)) { + return; + } + + animateOrSetProps('leave', el, props, animatableModel, dataIndex, cb, during); + } + + function fadeOutDisplayable(el, animatableModel, dataIndex, done) { + el.removeTextContent(); + el.removeTextGuideLine(); + removeElement(el, { + style: { + opacity: 0 + } + }, animatableModel, dataIndex, done); + } + + function removeElementWithFadeOut(el, animatableModel, dataIndex) { + function doRemove() { + el.parent && el.parent.remove(el); + } // Hide label and labelLine first + // TODO Also use fade out animation? + + + if (!el.isGroup) { + fadeOutDisplayable(el, animatableModel, dataIndex, doRemove); + } else { + el.traverse(function (disp) { + if (!disp.isGroup) { + // Can invoke doRemove multiple times. + fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove); + } + }); + } + } + + /** + * Save old style for style transition in universalTransition module. + * It's used when element will be reused in each render. + * For chart like map, heatmap, which will always create new element. + * We don't need to save this because universalTransition can get old style from the old element + */ + + function saveOldStyle(el) { + transitionStore(el).oldStyle = el.style; + } + + function getOldStyle(el) { + return transitionStore(el).oldStyle; + } + + var mathMax$4 = Math.max; + var mathMin$4 = Math.min; + var _customShapeMap = {}; + + /** + * Extend shape with parameters + */ + + function extendShape(opts) { + return Path.extend(opts); + } + + var extendPathFromString = extendFromString; + + /** + * Extend path + */ + + function extendPath(pathData, opts) { + return extendPathFromString(pathData, opts); + } + + /** + * Register a user defined shape. + * The shape class can be fetched by `getShapeClass` + * This method will overwrite the registered shapes, including + * the registered built-in shapes, if using the same `name`. + * The shape can be used in `custom series` and + * `graphic component` by declaring `{type: name}`. + * + * @param name + * @param ShapeClass Can be generated by `extendShape`. + */ + + function registerShape(name, ShapeClass) { + _customShapeMap[name] = ShapeClass; + } + + /** + * Find shape class registered by `registerShape`. Usually used in + * fetching user defined shape. + * + * [Caution]: + * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared + * to use user registered shapes. + * Because the built-in shape (see `getBuiltInShape`) will be registered by + * `registerShape` by default. That enables users to get both built-in + * shapes as well as the shapes belonging to themsleves. But users can overwrite + * the built-in shapes by using names like 'circle', 'rect' via calling + * `registerShape`. So the echarts inner featrues should not fetch shapes from here + * in case that it is overwritten by users, except that some features, like + * `custom series`, `graphic component`, do it deliberately. + * + * (2) In the features like `custom series`, `graphic component`, the user input + * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic + * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names + * are reserved names, that is, if some user register a shape named `'image'`, + * the shape will not be used. If we intending to add some more reserved names + * in feature, that might bring break changes (disable some existing user shape + * names). But that case probably rearly happen. So we dont make more mechanism + * to resolve this issue here. + * + * @param name + * @return The shape class. If not found, return nothing. + */ + + function getShapeClass(name) { + if (_customShapeMap.hasOwnProperty(name)) { + return _customShapeMap[name]; + } + } + + /** + * Create a path element from path data string + * @param pathData + * @param opts + * @param rect + * @param layout 'center' or 'cover' default to be cover + */ + + function makePath(pathData, opts, rect, layout) { + var path = createFromString(pathData, opts); + + if (rect) { + if (layout === 'center') { + rect = centerGraphic(rect, path.getBoundingRect()); + } + + resizePath(path, rect); + } + + return path; + } + + /** + * Create a image element from image url + * @param imageUrl image url + * @param opts options + * @param rect constrain rect + * @param layout 'center' or 'cover'. Default to be 'cover' + */ + + function makeImage(imageUrl, rect, layout) { + var zrImg = new ZRImage({ + style: { + image: imageUrl, + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + onload: function (img) { + if (layout === 'center') { + var boundingRect = { + width: img.width, + height: img.height + }; + zrImg.setStyle(centerGraphic(rect, boundingRect)); + } + } + }); + return zrImg; + } + + /** + * Get position of centered element in bounding box. + * + * @param rect element local bounding box + * @param boundingRect constraint bounding box + * @return element position containing x, y, width, and height + */ + + function centerGraphic(rect, boundingRect) { + // Set rect to center, keep width / height ratio. + var aspect = boundingRect.width / boundingRect.height; + var width = rect.height * aspect; + var height; + + if (width <= rect.width) { + height = rect.height; + } else { + width = rect.width; + height = width / aspect; + } + + var cx = rect.x + rect.width / 2; + var cy = rect.y + rect.height / 2; + return { + x: cx - width / 2, + y: cy - height / 2, + width: width, + height: height + }; + } + + var mergePath$1 = mergePath; + + /** + * Resize a path to fit the rect + * @param path + * @param rect + */ + + function resizePath(path, rect) { + if (!path.applyTransform) { + return; + } + + var pathRect = path.getBoundingRect(); + var m = pathRect.calculateTransform(rect); + path.applyTransform(m); + } + + /** + * Sub pixel optimize line for canvas + */ + + function subPixelOptimizeLine$1(param) { + subPixelOptimizeLine(param.shape, param.shape, param.style); + return param; + } + + /** + * Sub pixel optimize rect for canvas + */ + + function subPixelOptimizeRect$1(param) { + subPixelOptimizeRect(param.shape, param.shape, param.style); + return param; + } + + /** + * Sub pixel optimize for canvas + * + * @param position Coordinate, such as x, y + * @param lineWidth Should be nonnegative integer. + * @param positiveOrNegative Default false (negative). + * @return Optimized position. + */ + + var subPixelOptimize$1 = subPixelOptimize; + + /** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param target + * @param [ancestor] + */ + + function getTransform(target, ancestor) { + var mat = identity([]); + + while (target && target !== ancestor) { + mul$1(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + return mat; + } + + /** + * Apply transform to an vertex. + * @param target [x, y] + * @param transform Can be: + * + Transform matrix: like [1, 0, 0, 1, 0, 0] + * + {position, rotation, scale}, the same as `zrender/Transformable`. + * @param invert Whether use invert matrix. + * @return [x, y] + */ + + function applyTransform$1(target, transform, invert$1) { + if (transform && !isArrayLike(transform)) { + transform = Transformable.getLocalTransform(transform); + } + + if (invert$1) { + transform = invert([], transform); + } + + return applyTransform([], target, transform); + } + + /** + * @param direction 'left' 'right' 'top' 'bottom' + * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param invert Whether use invert matrix. + * @return Transformed direction. 'left' 'right' 'top' 'bottom' + */ + + function transformDirection(direction, transform, invert) { + // Pick a base, ensure that transform result will not be (0, 0). + var hBase = transform[4] === 0 || transform[5] === 0 || transform[0] === 0 ? 1 : Math.abs(2 * transform[4] / transform[0]); + var vBase = transform[4] === 0 || transform[5] === 0 || transform[2] === 0 ? 1 : Math.abs(2 * transform[4] / transform[2]); + var vertex = [direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0]; + vertex = applyTransform$1(vertex, transform, invert); + return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top'; + } + + function isNotGroup(el) { + return !el.isGroup; + } + + function isPath(el) { + return el.shape != null; + } + + /** + * Apply group transition animation from g1 to g2. + * If no animatableModel, no animation. + */ + + + function groupTransition(g1, g2, animatableModel) { + if (!g1 || !g2) { + return; + } + + function getElMap(g) { + var elMap = {}; + g.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + elMap[el.anid] = el; + } + }); + return elMap; + } + + function getAnimatableProps(el) { + var obj = { + x: el.x, + y: el.y, + rotation: el.rotation + }; + + if (isPath(el)) { + obj.shape = extend({}, el.shape); + } + + return obj; + } + + var elMap1 = getElMap(g1); + g2.traverse(function (el) { + if (isNotGroup(el) && el.anid) { + var oldEl = elMap1[el.anid]; + + if (oldEl) { + var newProp = getAnimatableProps(el); + el.attr(getAnimatableProps(oldEl)); + updateProps(el, newProp, animatableModel, getECData(el).dataIndex); + } + } + }); + } + + function clipPointsByRect(points, rect) { + // FIXME: this way migth be incorrect when grpahic clipped by a corner. + // and when element have border. + return map(points, function (point) { + var x = point[0]; + x = mathMax$4(x, rect.x); + x = mathMin$4(x, rect.x + rect.width); + var y = point[1]; + y = mathMax$4(y, rect.y); + y = mathMin$4(y, rect.y + rect.height); + return [x, y]; + }); + } + + /** + * Return a new clipped rect. If rect size are negative, return undefined. + */ + + function clipRectByRect(targetRect, rect) { + var x = mathMax$4(targetRect.x, rect.x); + var x2 = mathMin$4(targetRect.x + targetRect.width, rect.x + rect.width); + var y = mathMax$4(targetRect.y, rect.y); + var y2 = mathMin$4(targetRect.y + targetRect.height, rect.y + rect.height); // If the total rect is cliped, nothing, including the border, + // should be painted. So return undefined. + + if (x2 >= x && y2 >= y) { + return { + x: x, + y: y, + width: x2 - x, + height: y2 - y + }; + } + } + + function createIcon(iconStr, // Support 'image://' or 'path://' or direct svg path. + opt, rect) { + var innerOpts = extend({ + rectHover: true + }, opt); + var style = innerOpts.style = { + strokeNoScale: true + }; + rect = rect || { + x: -1, + y: -1, + width: 2, + height: 2 + }; + + if (iconStr) { + return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace('path://', ''), innerOpts, rect, 'center'); + } + } + + /** + * Return `true` if the given line (line `a`) and the given polygon + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ + + function linePolygonIntersect(a1x, a1y, a2x, a2y, points) { + for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) { + var p = points[i]; + + if (lineLineIntersect(a1x, a1y, a2x, a2y, p[0], p[1], p2[0], p2[1])) { + return true; + } + + p2 = p; + } + } + + /** + * Return `true` if the given two lines (line `a` and line `b`) + * are intersect. + * Note that we do not count colinear as intersect here because no + * requirement for that. We could do that if required in future. + */ + + function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + // let `vec_m` to be `vec_a2 - vec_a1` and `vec_n` to be `vec_b2 - vec_b1`. + var mx = a2x - a1x; + var my = a2y - a1y; + var nx = b2x - b1x; + var ny = b2y - b1y; // `vec_m` and `vec_n` are parallel iff + // exising `k` such that `vec_m = k · vec_n`, equivalent to `vec_m X vec_n = 0`. + + var nmCrossProduct = crossProduct2d(nx, ny, mx, my); + + if (nearZero(nmCrossProduct)) { + return false; + } // `vec_m` and `vec_n` are intersect iff + // existing `p` and `q` in [0, 1] such that `vec_a1 + p * vec_m = vec_b1 + q * vec_n`, + // such that `q = ((vec_a1 - vec_b1) X vec_m) / (vec_n X vec_m)` + // and `p = ((vec_a1 - vec_b1) X vec_n) / (vec_n X vec_m)`. + + + var b1a1x = a1x - b1x; + var b1a1y = a1y - b1y; + var q = crossProduct2d(b1a1x, b1a1y, mx, my) / nmCrossProduct; + + if (q < 0 || q > 1) { + return false; + } + + var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct; + + if (p < 0 || p > 1) { + return false; + } + + return true; + } + + /** + * Cross product of 2-dimension vector. + */ + + function crossProduct2d(x1, y1, x2, y2) { + return x1 * y2 - x2 * y1; + } + + function nearZero(val) { + return val <= 1e-6 && val >= -1e-6; + } + + function setTooltipConfig(opt) { + var itemTooltipOption = opt.itemTooltipOption; + var componentModel = opt.componentModel; + var itemName = opt.itemName; + var itemTooltipOptionObj = isString(itemTooltipOption) ? { + formatter: itemTooltipOption + } : itemTooltipOption; + var mainType = componentModel.mainType; + var componentIndex = componentModel.componentIndex; + var formatterParams = { + componentType: mainType, + name: itemName, + $vars: ['name'] + }; + formatterParams[mainType + 'Index'] = componentIndex; + var formatterParamsExtra = opt.formatterParamsExtra; + + if (formatterParamsExtra) { + each(keys(formatterParamsExtra), function (key) { + if (!hasOwn(formatterParams, key)) { + formatterParams[key] = formatterParamsExtra[key]; + formatterParams.$vars.push(key); + } + }); + } + + var ecData = getECData(opt.el); + ecData.componentMainType = mainType; + ecData.componentIndex = componentIndex; + ecData.tooltipConfig = { + name: itemName, + option: defaults({ + content: itemName, + formatterParams: formatterParams + }, itemTooltipOptionObj) + }; + } + + function traverseElement(el, cb) { + var stopped; // TODO + // Polyfill for fixing zrender group traverse don't visit it's root issue. + + if (el.isGroup) { + stopped = cb(el); + } + + if (!stopped) { + el.traverse(cb); + } + } + + function traverseElements(els, cb) { + if (els) { + if (isArray(els)) { + for (var i = 0; i < els.length; i++) { + traverseElement(els[i], cb); + } + } else { + traverseElement(els, cb); + } + } + } // Register built-in shapes. These shapes might be overwirtten + // by users, although we do not recommend that. + + registerShape('circle', Circle); + registerShape('ellipse', Ellipse); + registerShape('sector', Sector); + registerShape('ring', Ring); + registerShape('polygon', Polygon); + registerShape('polyline', Polyline); + registerShape('rect', Rect); + registerShape('line', Line); + registerShape('bezierCurve', BezierCurve); + registerShape('arc', Arc); + + var graphic = /*#__PURE__*/Object.freeze({ + __proto__: null, + updateProps: updateProps, + initProps: initProps, + removeElement: removeElement, + removeElementWithFadeOut: removeElementWithFadeOut, + isElementRemoved: isElementRemoved, + extendShape: extendShape, + extendPath: extendPath, + registerShape: registerShape, + getShapeClass: getShapeClass, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath$1, + resizePath: resizePath, + subPixelOptimizeLine: subPixelOptimizeLine$1, + subPixelOptimizeRect: subPixelOptimizeRect$1, + subPixelOptimize: subPixelOptimize$1, + getTransform: getTransform, + applyTransform: applyTransform$1, + transformDirection: transformDirection, + groupTransition: groupTransition, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + createIcon: createIcon, + linePolygonIntersect: linePolygonIntersect, + lineLineIntersect: lineLineIntersect, + setTooltipConfig: setTooltipConfig, + traverseElements: traverseElements, + Group: Group, + Image: ZRImage, + Text: ZRText, + Circle: Circle, + Ellipse: Ellipse, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayable, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect, + OrientedBoundingRect: OrientedBoundingRect, + Point: Point, + Path: Path + }); + + var EMPTY_OBJ = {}; + + function setLabelText(label, labelTexts) { + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var text = labelTexts[stateName]; + var state = label.ensureState(stateName); + state.style = state.style || {}; + state.style.text = text; + } + + var oldStates = label.currentStates.slice(); + label.clearStates(true); + label.setStyle({ + text: labelTexts.normal + }); + label.useStates(oldStates, true); + } + + function getLabelText(opt, stateModels, interpolatedValue) { + var labelFetcher = opt.labelFetcher; + var labelDataIndex = opt.labelDataIndex; + var labelDimIndex = opt.labelDimIndex; + var normalModel = stateModels.normal; + var baseText; + + if (labelFetcher) { + baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex, normalModel && normalModel.get('formatter'), interpolatedValue != null ? { + interpolatedValue: interpolatedValue + } : null); + } + + if (baseText == null) { + baseText = isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt, interpolatedValue) : opt.defaultText; + } + + var statesText = { + normal: baseText + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = stateModels[stateName]; + statesText[stateName] = retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, stateName, null, labelDimIndex, stateModel && stateModel.get('formatter')) : null, baseText); + } + + return statesText; + } + + function setLabelStyle(targetEl, labelStatesModels, opt, stateSpecified // TODO specified position? + ) { + opt = opt || EMPTY_OBJ; + var isSetOnText = targetEl instanceof ZRText; + var needsCreateText = false; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateModel = labelStatesModels[DISPLAY_STATES[i]]; + + if (stateModel && stateModel.getShallow('show')) { + needsCreateText = true; + break; + } + } + + var textContent = isSetOnText ? targetEl : targetEl.getTextContent(); + + if (needsCreateText) { + if (!isSetOnText) { + // Reuse the previous + if (!textContent) { + textContent = new ZRText(); + targetEl.setTextContent(textContent); + } // Use same state proxy + + + if (targetEl.stateProxy) { + textContent.stateProxy = targetEl.stateProxy; + } + } + + var labelStatesTexts = getLabelText(opt, labelStatesModels); + var normalModel = labelStatesModels.normal; + var showNormal = !!normalModel.getShallow('show'); + var normalStyle = createTextStyle(normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText); + normalStyle.text = labelStatesTexts.normal; + + if (!isSetOnText) { + // Always create new + targetEl.setTextConfig(createTextConfig(normalModel, opt, false)); + } + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var stateModel = labelStatesModels[stateName]; + + if (stateModel) { + var stateObj = textContent.ensureState(stateName); + var stateShow = !!retrieve2(stateModel.getShallow('show'), showNormal); + + if (stateShow !== showNormal) { + stateObj.ignore = !stateShow; + } + + stateObj.style = createTextStyle(stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText); + stateObj.style.text = labelStatesTexts[stateName]; + + if (!isSetOnText) { + var targetElEmphasisState = targetEl.ensureState(stateName); + targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true); + } + } + } // PENDING: if there is many requirements that emphasis position + // need to be different from normal position, we might consider + // auto slient is those cases. + + + textContent.silent = !!normalModel.getShallow('silent'); // Keep x and y + + if (textContent.style.x != null) { + normalStyle.x = textContent.style.x; + } + + if (textContent.style.y != null) { + normalStyle.y = textContent.style.y; + } + + textContent.ignore = !showNormal; // Always create new style. + + textContent.useStyle(normalStyle); + textContent.dirty(); + + if (opt.enableTextSetter) { + labelInner(textContent).setLabelText = function (interpolatedValue) { + var labelStatesTexts = getLabelText(opt, labelStatesModels, interpolatedValue); + setLabelText(textContent, labelStatesTexts); + }; + } + } else if (textContent) { + // Not display rich text. + textContent.ignore = true; + } + + targetEl.dirty(); + } + + function getLabelStatesModels(itemModel, labelName) { + labelName = labelName || 'label'; + var statesModels = { + normal: itemModel.getModel(labelName) + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelName]); + } + + return statesModels; + } + + /** + * Set basic textStyle properties. + */ + + function createTextStyle(textStyleModel, specifiedTextStyle, // Fixed style in the code. Can't be set by model. + opt, isNotNormal, isAttached // If text is attached on an element. If so, auto color will handling in zrender. + ) { + var textStyle = {}; + setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached); + specifiedTextStyle && extend(textStyle, specifiedTextStyle); // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false); + + return textStyle; + } + + function createTextConfig(textStyleModel, opt, isNotNormal) { + opt = opt || {}; + var textConfig = {}; + var labelPosition; + var labelRotate = textStyleModel.getShallow('rotate'); + var labelDistance = retrieve2(textStyleModel.getShallow('distance'), isNotNormal ? null : 5); + var labelOffset = textStyleModel.getShallow('offset'); + labelPosition = textStyleModel.getShallow('position') || (isNotNormal ? null : 'inside'); // 'outside' is not a valid zr textPostion value, but used + // in bar series, and magric type should be considered. + + labelPosition === 'outside' && (labelPosition = opt.defaultOutsidePosition || 'top'); + + if (labelPosition != null) { + textConfig.position = labelPosition; + } + + if (labelOffset != null) { + textConfig.offset = labelOffset; + } + + if (labelRotate != null) { + labelRotate *= Math.PI / 180; + textConfig.rotation = labelRotate; + } + + if (labelDistance != null) { + textConfig.distance = labelDistance; + } // fill and auto is determined by the color of path fill if it's not specified by developers. + + + textConfig.outsideFill = textStyleModel.get('color') === 'inherit' ? opt.inheritColor || null : 'auto'; + return textConfig; + } + + /** + * The uniform entry of set text style, that is, retrieve style definitions + * from `model` and set to `textStyle` object. + * + * Never in merge mode, but in overwrite mode, that is, all of the text style + * properties will be set. (Consider the states of normal and emphasis and + * default value can be adopted, merge would make the logic too complicated + * to manage.) + */ + + function setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) { + // Consider there will be abnormal when merge hover style to normal style if given default value. + opt = opt || EMPTY_OBJ; + var ecModel = textStyleModel.ecModel; + var globalTextStyle = ecModel && ecModel.option.textStyle; // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + + var richItemNames = getRichItemNames(textStyleModel); + var richResult; + + if (richItemNames) { + richResult = {}; + + for (var name_1 in richItemNames) { + if (richItemNames.hasOwnProperty(name_1)) { + // Cascade is supported in rich. + var richTextStyle = textStyleModel.getModel(['rich', name_1]); // In rich, never `disableBox`. + // FIXME: consider `label: {formatter: '{a|xx}', color: 'blue', rich: {a: {}}}`, + // the default color `'blue'` will not be adopted if no color declared in `rich`. + // That might confuses users. So probably we should put `textStyleModel` as the + // root ancestor of the `richTextStyle`. But that would be a break change. + + setTokenTextStyle(richResult[name_1] = {}, richTextStyle, globalTextStyle, opt, isNotNormal, isAttached, false, true); + } + } + } + + if (richResult) { + textStyle.rich = richResult; + } + + var overflow = textStyleModel.get('overflow'); + + if (overflow) { + textStyle.overflow = overflow; + } + + var margin = textStyleModel.get('minMargin'); + + if (margin != null) { + textStyle.margin = margin; + } + + setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, true, false); + } // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + // TODO TextStyleModel + + + function getRichItemNames(textStyleModel) { + // Use object to remove duplicated names. + var richItemNameMap; + + while (textStyleModel && textStyleModel !== textStyleModel.ecModel) { + var rich = (textStyleModel.option || EMPTY_OBJ).rich; + + if (rich) { + richItemNameMap = richItemNameMap || {}; + var richKeys = keys(rich); + + for (var i = 0; i < richKeys.length; i++) { + var richKey = richKeys[i]; + richItemNameMap[richKey] = 1; + } + } + + textStyleModel = textStyleModel.parentModel; + } + + return richItemNameMap; + } + + var TEXT_PROPS_WITH_GLOBAL = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY']; + var TEXT_PROPS_SELF = ['align', 'lineHeight', 'width', 'height', 'tag', 'verticalAlign']; + var TEXT_PROPS_BOX = ['padding', 'borderWidth', 'borderRadius', 'borderDashOffset', 'backgroundColor', 'borderColor', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + + function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isNotNormal, isAttached, isBlock, inRich) { + // In merge mode, default value should not be given. + globalTextStyle = !isNotNormal && globalTextStyle || EMPTY_OBJ; + var inheritColor = opt && opt.inheritColor; + var fillColor = textStyleModel.getShallow('color'); + var strokeColor = textStyleModel.getShallow('textBorderColor'); + var opacity = retrieve2(textStyleModel.getShallow('opacity'), globalTextStyle.opacity); + + if (fillColor === 'inherit' || fillColor === 'auto') { + if ("development" !== 'production') { + if (fillColor === 'auto') { + deprecateReplaceLog('color: \'auto\'', 'color: \'inherit\''); + } + } + + if (inheritColor) { + fillColor = inheritColor; + } else { + fillColor = null; + } + } + + if (strokeColor === 'inherit' || strokeColor === 'auto') { + if ("development" !== 'production') { + if (strokeColor === 'auto') { + deprecateReplaceLog('color: \'auto\'', 'color: \'inherit\''); + } + } + + if (inheritColor) { + strokeColor = inheritColor; + } else { + strokeColor = null; + } + } + + if (!isAttached) { + // Only use default global textStyle.color if text is individual. + // Otherwise it will use the strategy of attached text color because text may be on a path. + fillColor = fillColor || globalTextStyle.color; + strokeColor = strokeColor || globalTextStyle.textBorderColor; + } + + if (fillColor != null) { + textStyle.fill = fillColor; + } + + if (strokeColor != null) { + textStyle.stroke = strokeColor; + } + + var textBorderWidth = retrieve2(textStyleModel.getShallow('textBorderWidth'), globalTextStyle.textBorderWidth); + + if (textBorderWidth != null) { + textStyle.lineWidth = textBorderWidth; + } + + var textBorderType = retrieve2(textStyleModel.getShallow('textBorderType'), globalTextStyle.textBorderType); + + if (textBorderType != null) { + textStyle.lineDash = textBorderType; + } + + var textBorderDashOffset = retrieve2(textStyleModel.getShallow('textBorderDashOffset'), globalTextStyle.textBorderDashOffset); + + if (textBorderDashOffset != null) { + textStyle.lineDashOffset = textBorderDashOffset; + } + + if (!isNotNormal && opacity == null && !inRich) { + opacity = opt && opt.defaultOpacity; + } + + if (opacity != null) { + textStyle.opacity = opacity; + } // TODO + + + if (!isNotNormal && !isAttached) { + // Set default finally. + if (textStyle.fill == null && opt.inheritColor) { + textStyle.fill = opt.inheritColor; + } + } // Do not use `getFont` here, because merge should be supported, where + // part of these properties may be changed in emphasis style, and the + // others should remain their original value got from normal style. + + + for (var i = 0; i < TEXT_PROPS_WITH_GLOBAL.length; i++) { + var key = TEXT_PROPS_WITH_GLOBAL[i]; + var val = retrieve2(textStyleModel.getShallow(key), globalTextStyle[key]); + + if (val != null) { + textStyle[key] = val; + } + } + + for (var i = 0; i < TEXT_PROPS_SELF.length; i++) { + var key = TEXT_PROPS_SELF[i]; + var val = textStyleModel.getShallow(key); + + if (val != null) { + textStyle[key] = val; + } + } + + if (textStyle.verticalAlign == null) { + var baseline = textStyleModel.getShallow('baseline'); + + if (baseline != null) { + textStyle.verticalAlign = baseline; + } + } + + if (!isBlock || !opt.disableBox) { + for (var i = 0; i < TEXT_PROPS_BOX.length; i++) { + var key = TEXT_PROPS_BOX[i]; + var val = textStyleModel.getShallow(key); + + if (val != null) { + textStyle[key] = val; + } + } + + var borderType = textStyleModel.getShallow('borderType'); + + if (borderType != null) { + textStyle.borderDash = borderType; + } + + if ((textStyle.backgroundColor === 'auto' || textStyle.backgroundColor === 'inherit') && inheritColor) { + if ("development" !== 'production') { + if (textStyle.backgroundColor === 'auto') { + deprecateReplaceLog('backgroundColor: \'auto\'', 'backgroundColor: \'inherit\''); + } + } + + textStyle.backgroundColor = inheritColor; + } + + if ((textStyle.borderColor === 'auto' || textStyle.borderColor === 'inherit') && inheritColor) { + if ("development" !== 'production') { + if (textStyle.borderColor === 'auto') { + deprecateReplaceLog('borderColor: \'auto\'', 'borderColor: \'inherit\''); + } + } + + textStyle.borderColor = inheritColor; + } + } + } + + function getFont(opt, ecModel) { + var gTextStyleModel = ecModel && ecModel.getModel('textStyle'); + return trim([// FIXME in node-canvas fontWeight is before fontStyle + opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'].join(' ')); + } + + var labelInner = makeInner(); + + function setLabelValueAnimation(label, labelStatesModels, value, getDefaultText) { + if (!label) { + return; + } + + var obj = labelInner(label); + obj.prevValue = obj.value; + obj.value = value; + var normalLabelModel = labelStatesModels.normal; + obj.valueAnimation = normalLabelModel.get('valueAnimation'); + + if (obj.valueAnimation) { + obj.precision = normalLabelModel.get('precision'); + obj.defaultInterpolatedText = getDefaultText; + obj.statesModels = labelStatesModels; + } + } + + function animateLabelValue(textEl, dataIndex, data, animatableModel, labelFetcher) { + var labelInnerStore = labelInner(textEl); + + if (!labelInnerStore.valueAnimation || labelInnerStore.prevValue === labelInnerStore.value) { + // Value not changed, no new label animation + return; + } + + var defaultInterpolatedText = labelInnerStore.defaultInterpolatedText; // Consider the case that being animating, do not use the `obj.value`, + // Otherwise it will jump to the `obj.value` when this new animation started. + + var currValue = retrieve2(labelInnerStore.interpolatedValue, labelInnerStore.prevValue); + var targetValue = labelInnerStore.value; + + function during(percent) { + var interpolated = interpolateRawValues(data, labelInnerStore.precision, currValue, targetValue, percent); + labelInnerStore.interpolatedValue = percent === 1 ? null : interpolated; + var labelText = getLabelText({ + labelDataIndex: dataIndex, + labelFetcher: labelFetcher, + defaultText: defaultInterpolatedText ? defaultInterpolatedText(interpolated) : interpolated + '' + }, labelInnerStore.statesModels, interpolated); + setLabelText(textEl, labelText); + } + + textEl.percent = 0; + (labelInnerStore.prevValue == null ? initProps : updateProps)(textEl, { + // percent is used to prevent animation from being aborted #15916 + percent: 1 + }, animatableModel, dataIndex, null, during); + } + + var PATH_COLOR = ['textStyle', 'color']; + var textStyleParams = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'padding', 'lineHeight', 'rich', 'width', 'height', 'overflow']; // TODO Performance improvement? + + var tmpText = new ZRText(); + + var TextStyleMixin = + /** @class */ + function () { + function TextStyleMixin() { + } + + /** + * Get color property or get color from option.textStyle.color + */ + // TODO Callback + + + TextStyleMixin.prototype.getTextColor = function (isEmphasis) { + var ecModel = this.ecModel; + return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null); + }; + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + + + TextStyleMixin.prototype.getFont = function () { + return getFont({ + fontStyle: this.getShallow('fontStyle'), + fontWeight: this.getShallow('fontWeight'), + fontSize: this.getShallow('fontSize'), + fontFamily: this.getShallow('fontFamily') + }, this.ecModel); + }; + + TextStyleMixin.prototype.getTextRect = function (text) { + var style = { + text: text, + verticalAlign: this.getShallow('verticalAlign') || this.getShallow('baseline') + }; + + for (var i = 0; i < textStyleParams.length; i++) { + style[textStyleParams[i]] = this.getShallow(textStyleParams[i]); + } + + tmpText.useStyle(style); + tmpText.update(); + return tmpText.getBoundingRect(); + }; + + return TextStyleMixin; + }(); + + var LINE_STYLE_KEY_MAP = [['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'type'], ['lineDashOffset', 'dashOffset'], ['lineCap', 'cap'], ['lineJoin', 'join'], ['miterLimit'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getLineStyle = makeStyleMapper(LINE_STYLE_KEY_MAP); + + var LineStyleMixin = + /** @class */ + function () { + function LineStyleMixin() { + } + + LineStyleMixin.prototype.getLineStyle = function (excludes) { + return getLineStyle(this, excludes); + }; + + return LineStyleMixin; + }(); + + var ITEM_STYLE_KEY_MAP = [['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'borderType'], ['lineDashOffset', 'borderDashOffset'], ['lineCap', 'borderCap'], ['lineJoin', 'borderJoin'], ['miterLimit', 'borderMiterLimit'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]; + var getItemStyle = makeStyleMapper(ITEM_STYLE_KEY_MAP); + + var ItemStyleMixin = + /** @class */ + function () { + function ItemStyleMixin() { + } + + ItemStyleMixin.prototype.getItemStyle = function (excludes, includes) { + return getItemStyle(this, excludes, includes); + }; + + return ItemStyleMixin; + }(); + + var Model = + /** @class */ + function () { + function Model(option, parentModel, ecModel) { + this.parentModel = parentModel; + this.ecModel = ecModel; + this.option = option; // Simple optimization + // if (this.init) { + // if (arguments.length <= 4) { + // this.init(option, parentModel, ecModel, extraOpt); + // } + // else { + // this.init.apply(this, arguments); + // } + // } + } + + Model.prototype.init = function (option, parentModel, ecModel) { + var rest = []; + + for (var _i = 3; _i < arguments.length; _i++) { + rest[_i - 3] = arguments[_i]; + } + }; + /** + * Merge the input option to me. + */ + + + Model.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + }; // `path` can be 'xxx.yyy.zzz', so the return value type have to be `ModelOption` + // TODO: TYPE strict key check? + // get(path: string | string[], ignoreParent?: boolean): ModelOption; + + + Model.prototype.get = function (path, ignoreParent) { + if (path == null) { + return this.option; + } + + return this._doGet(this.parsePath(path), !ignoreParent && this.parentModel); + }; + + Model.prototype.getShallow = function (key, ignoreParent) { + var option = this.option; + var val = option == null ? option : option[key]; + + if (val == null && !ignoreParent) { + var parentModel = this.parentModel; + + if (parentModel) { + // FIXME:TS do not know how to make it works + val = parentModel.getShallow(key); + } + } + + return val; + }; // `path` can be 'xxx.yyy.zzz', so the return value type have to be `Model` + // getModel(path: string | string[], parentModel?: Model): Model; + // TODO 'xxx.yyy.zzz' is deprecated + + + Model.prototype.getModel = function (path, parentModel) { + var hasPath = path != null; + var pathFinal = hasPath ? this.parsePath(path) : null; + var obj = hasPath ? this._doGet(pathFinal) : this.option; + parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal)); + return new Model(obj, parentModel, this.ecModel); + }; + /** + * If model has option + */ + + + Model.prototype.isEmpty = function () { + return this.option == null; + }; + + Model.prototype.restoreData = function () { + }; // Pending + + + Model.prototype.clone = function () { + var Ctor = this.constructor; + return new Ctor(clone(this.option)); + }; // setReadOnly(properties): void { + // clazzUtil.setReadOnly(this, properties); + // } + // If path is null/undefined, return null/undefined. + + + Model.prototype.parsePath = function (path) { + if (typeof path === 'string') { + return path.split('.'); + } + + return path; + }; // Resolve path for parent. Perhaps useful when parent use a different property. + // Default to be a identity resolver. + // Can be modified to a different resolver. + + + Model.prototype.resolveParentPath = function (path) { + return path; + }; // FIXME:TS check whether put this method here + + + Model.prototype.isAnimationEnabled = function () { + if (!env.node && this.option) { + if (this.option.animation != null) { + return !!this.option.animation; + } else if (this.parentModel) { + return this.parentModel.isAnimationEnabled(); + } + } + }; + + Model.prototype._doGet = function (pathArr, parentModel) { + var obj = this.option; + + if (!pathArr) { + return obj; + } + + for (var i = 0; i < pathArr.length; i++) { + // Ignore empty + if (!pathArr[i]) { + continue; + } // obj could be number/string/... (like 0) + + + obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null; + + if (obj == null) { + break; + } + } + + if (obj == null && parentModel) { + obj = parentModel._doGet(this.resolveParentPath(pathArr), parentModel.parentModel); + } + + return obj; + }; + + return Model; + }(); + + enableClassExtend(Model); + enableClassCheck(Model); + mixin(Model, LineStyleMixin); + mixin(Model, ItemStyleMixin); + mixin(Model, AreaStyleMixin); + mixin(Model, TextStyleMixin); + + var base = Math.round(Math.random() * 10); + + /** + * @public + * @param {string} type + * @return {string} + */ + + function getUID(type) { + // Considering the case of crossing js context, + // use Math.random to make id as unique as possible. + return [type || '', base++].join('_'); + } + + /** + * Implements `SubTypeDefaulterManager` for `target`. + */ + + function enableSubTypeDefaulter(target) { + var subTypeDefaulters = {}; + + target.registerSubTypeDefaulter = function (componentType, defaulter) { + var componentTypeInfo = parseClassType(componentType); + subTypeDefaulters[componentTypeInfo.main] = defaulter; + }; + + target.determineSubType = function (componentType, option) { + var type = option.type; + + if (!type) { + var componentTypeMain = parseClassType(componentType).main; + + if (target.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + + return type; + }; + } + + /** + * Implements `TopologicalTravelable` for `entity`. + * + * Topological travel on Activity Network (Activity On Vertices). + * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis']. + * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology. + * If there is circular dependencey, Error will be thrown. + */ + + function enableTopologicalTravel(entity, dependencyGetter) { + /** + * @param targetNameList Target Component type list. + * Can be ['aa', 'bb', 'aa.xx'] + * @param fullNameList By which we can build dependency graph. + * @param callback Params: componentType, dependencies. + * @param context Scope of callback. + */ + entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var noEntryList = result.noEntryList; + var targetNameSet = {}; + each(targetNameList, function (name) { + targetNameSet[name] = true; + }); + + while (noEntryList.length) { + var currComponentType = noEntryList.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + + each(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge); + } + + each(targetNameSet, function () { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('Circular dependency may exists: ', targetNameSet, targetNameList, fullNameList); + } + + throw new Error(errMsg); + }); + + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + + if (graph[succComponentType].entryCount === 0) { + noEntryList.push(succComponentType); + } + } // Consider this case: legend depends on series, and we call + // chart.setOption({series: [...]}), where only series is in option. + // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will + // not be called, but only sereis.mergeOption is called. Thus legend + // have no chance to update its local record about series (like which + // name of series is available in legend). + + + function removeEdgeAndAdd(succComponentType) { + targetNameSet[succComponentType] = true; + removeEdge(succComponentType); + } + }; + + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + each(fullNameList, function (name) { + var thisItem = createDependencyGraphItem(graph, name); + var originalDeps = thisItem.originalDeps = dependencyGetter(name); + var availableDeps = getAvailableDependencies(originalDeps, fullNameList); + thisItem.entryCount = availableDeps.length; + + if (thisItem.entryCount === 0) { + noEntryList.push(name); + } + + each(availableDeps, function (dependentName) { + if (indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + + var thatItem = createDependencyGraphItem(graph, dependentName); + + if (indexOf(thatItem.successor, dependentName) < 0) { + thatItem.successor.push(name); + } + }); + }); + return { + graph: graph, + noEntryList: noEntryList + }; + } + + function createDependencyGraphItem(graph, name) { + if (!graph[name]) { + graph[name] = { + predecessor: [], + successor: [] + }; + } + + return graph[name]; + } + + function getAvailableDependencies(originalDeps, fullNameList) { + var availableDeps = []; + each(originalDeps, function (dep) { + indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } + } + + function inheritDefaultOption(superOption, subOption) { + // See also `model/Component.ts#getDefaultOption` + return merge(merge({}, superOption, true), subOption, true); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * Language: English. + */ + var langEN = { + time: { + month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + monthAbbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayOfWeek: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayOfWeekAbbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] + }, + legend: { + selector: { + all: 'All', + inverse: 'Inv' + } + }, + toolbox: { + brush: { + title: { + rect: 'Box Select', + polygon: 'Lasso Select', + lineX: 'Horizontally Select', + lineY: 'Vertically Select', + keep: 'Keep Selections', + clear: 'Clear Selections' + } + }, + dataView: { + title: 'Data View', + lang: ['Data View', 'Close', 'Refresh'] + }, + dataZoom: { + title: { + zoom: 'Zoom', + back: 'Zoom Reset' + } + }, + magicType: { + title: { + line: 'Switch to Line Chart', + bar: 'Switch to Bar Chart', + stack: 'Stack', + tiled: 'Tile' + } + }, + restore: { + title: 'Restore' + }, + saveAsImage: { + title: 'Save as Image', + lang: ['Right Click to Save Image'] + } + }, + series: { + typeNames: { + pie: 'Pie chart', + bar: 'Bar chart', + line: 'Line chart', + scatter: 'Scatter plot', + effectScatter: 'Ripple scatter plot', + radar: 'Radar chart', + tree: 'Tree', + treemap: 'Treemap', + boxplot: 'Boxplot', + candlestick: 'Candlestick', + k: 'K line chart', + heatmap: 'Heat map', + map: 'Map', + parallel: 'Parallel coordinate map', + lines: 'Line graph', + graph: 'Relationship graph', + sankey: 'Sankey diagram', + funnel: 'Funnel chart', + gauge: 'Gauge', + pictorialBar: 'Pictorial bar', + themeRiver: 'Theme River Map', + sunburst: 'Sunburst' + } + }, + aria: { + general: { + withTitle: 'This is a chart about "{title}"', + withoutTitle: 'This is a chart' + }, + series: { + single: { + prefix: '', + withName: ' with type {seriesType} named {seriesName}.', + withoutName: ' with type {seriesType}.' + }, + multiple: { + prefix: '. It consists of {seriesCount} series count.', + withName: ' The {seriesId} series is a {seriesType} representing {seriesName}.', + withoutName: ' The {seriesId} series is a {seriesType}.', + separator: { + middle: '', + end: '' + } + } + }, + data: { + allData: 'The data is as follows: ', + partialData: 'The first {displayCnt} items are: ', + withName: 'the data for {name} is {value}', + withoutName: '{value}', + separator: { + middle: ', ', + end: '. ' + } + } + } + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var langZH = { + time: { + month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + monthAbbr: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + dayOfWeek: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + dayOfWeekAbbr: ['日', '一', '二', '三', '四', '五', '六'] + }, + legend: { + selector: { + all: '全选', + inverse: '反选' + } + }, + toolbox: { + brush: { + title: { + rect: '矩形选择', + polygon: '圈选', + lineX: '横向选择', + lineY: '纵向选择', + keep: '保持选择', + clear: '清除选择' + } + }, + dataView: { + title: '数据视图', + lang: ['数据视图', '关闭', '刷新'] + }, + dataZoom: { + title: { + zoom: '区域缩放', + back: '区域缩放还原' + } + }, + magicType: { + title: { + line: '切换为折线图', + bar: '切换为柱状图', + stack: '切换为堆叠', + tiled: '切换为平铺' + } + }, + restore: { + title: '还原' + }, + saveAsImage: { + title: '保存为图片', + lang: ['右键另存为图片'] + } + }, + series: { + typeNames: { + pie: '饼图', + bar: '柱状图', + line: '折线图', + scatter: '散点图', + effectScatter: '涟漪散点图', + radar: '雷达图', + tree: '树图', + treemap: '矩形树图', + boxplot: '箱型图', + candlestick: 'K线图', + k: 'K线图', + heatmap: '热力图', + map: '地图', + parallel: '平行坐标图', + lines: '线图', + graph: '关系图', + sankey: '桑基图', + funnel: '漏斗图', + gauge: '仪表盘图', + pictorialBar: '象形柱图', + themeRiver: '主题河流图', + sunburst: '旭日图' + } + }, + aria: { + general: { + withTitle: '这是一个关于“{title}”的图表。', + withoutTitle: '这是一个图表,' + }, + series: { + single: { + prefix: '', + withName: '图表类型是{seriesType},表示{seriesName}。', + withoutName: '图表类型是{seriesType}。' + }, + multiple: { + prefix: '它由{seriesCount}个图表系列组成。', + withName: '第{seriesId}个系列是一个表示{seriesName}的{seriesType},', + withoutName: '第{seriesId}个系列是一个{seriesType},', + separator: { + middle: ';', + end: '。' + } + } + }, + data: { + allData: '其数据是——', + partialData: '其中,前{displayCnt}项是——', + withName: '{name}的数据是{value}', + withoutName: '{value}', + separator: { + middle: ',', + end: '' + } + } + } + }; + + var LOCALE_ZH = 'ZH'; + var LOCALE_EN = 'EN'; + var DEFAULT_LOCALE = LOCALE_EN; + var localeStorage = {}; + var localeModels = {}; + var SYSTEM_LANG = !env.domSupported ? DEFAULT_LOCALE : function () { + var langStr = ( + /* eslint-disable-next-line */ + document.documentElement.lang || navigator.language || navigator.browserLanguage).toUpperCase(); + return langStr.indexOf(LOCALE_ZH) > -1 ? LOCALE_ZH : DEFAULT_LOCALE; + }(); + + function registerLocale(locale, localeObj) { + locale = locale.toUpperCase(); + localeModels[locale] = new Model(localeObj); + localeStorage[locale] = localeObj; + } // export function getLocale(locale: string) { + // return localeStorage[locale]; + // } + + function createLocaleObject(locale) { + if (isString(locale)) { + var localeObj = localeStorage[locale.toUpperCase()] || {}; + + if (locale === LOCALE_ZH || locale === LOCALE_EN) { + return clone(localeObj); + } else { + return merge(clone(localeObj), clone(localeStorage[DEFAULT_LOCALE]), false); + } + } else { + return merge(clone(locale), clone(localeStorage[DEFAULT_LOCALE]), false); + } + } + + function getLocaleModel(lang) { + return localeModels[lang]; + } + + function getDefaultLocaleModel() { + return localeModels[DEFAULT_LOCALE]; + } // Default locale + + registerLocale(LOCALE_EN, langEN); + registerLocale(LOCALE_ZH, langZH); + + var ONE_SECOND = 1000; + var ONE_MINUTE = ONE_SECOND * 60; + var ONE_HOUR = ONE_MINUTE * 60; + var ONE_DAY = ONE_HOUR * 24; + var ONE_YEAR = ONE_DAY * 365; + var defaultLeveledFormatter = { + year: '{yyyy}', + month: '{MMM}', + day: '{d}', + hour: '{HH}:{mm}', + minute: '{HH}:{mm}', + second: '{HH}:{mm}:{ss}', + millisecond: '{HH}:{mm}:{ss} {SSS}', + none: '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}' + }; + var fullDayFormatter = '{yyyy}-{MM}-{dd}'; + var fullLeveledFormatter = { + year: '{yyyy}', + month: '{yyyy}-{MM}', + day: fullDayFormatter, + hour: fullDayFormatter + ' ' + defaultLeveledFormatter.hour, + minute: fullDayFormatter + ' ' + defaultLeveledFormatter.minute, + second: fullDayFormatter + ' ' + defaultLeveledFormatter.second, + millisecond: defaultLeveledFormatter.none + }; + var primaryTimeUnits = ['year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond']; + var timeUnits = ['year', 'half-year', 'quarter', 'month', 'week', 'half-week', 'day', 'half-day', 'quarter-day', 'hour', 'minute', 'second', 'millisecond']; + + function pad(str, len) { + str += ''; + return '0000'.substr(0, len - str.length) + str; + } + + function getPrimaryTimeUnit(timeUnit) { + switch (timeUnit) { + case 'half-year': + case 'quarter': + return 'month'; + + case 'week': + case 'half-week': + return 'day'; + + case 'half-day': + case 'quarter-day': + return 'hour'; + + default: + // year, minutes, second, milliseconds + return timeUnit; + } + } + + function isPrimaryTimeUnit(timeUnit) { + return timeUnit === getPrimaryTimeUnit(timeUnit); + } + + function getDefaultFormatPrecisionOfInterval(timeUnit) { + switch (timeUnit) { + case 'year': + case 'month': + return 'day'; + + case 'millisecond': + return 'millisecond'; + + default: + // Also for day, hour, minute, second + return 'second'; + } + } + + function format( // Note: The result based on `isUTC` are totally different, which can not be just simply + // substituted by the result without `isUTC`. So we make the param `isUTC` mandatory. + time, template, isUTC, lang) { + var date = parseDate(time); + var y = date[fullYearGetterName(isUTC)](); + var M = date[monthGetterName(isUTC)]() + 1; + var q = Math.floor((M - 1) / 4) + 1; + var d = date[dateGetterName(isUTC)](); + var e = date['get' + (isUTC ? 'UTC' : '') + 'Day'](); + var H = date[hoursGetterName(isUTC)](); + var h = (H - 1) % 12 + 1; + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var localeModel = lang instanceof Model ? lang : getLocaleModel(lang || SYSTEM_LANG) || getDefaultLocaleModel(); + var timeModel = localeModel.getModel('time'); + var month = timeModel.get('month'); + var monthAbbr = timeModel.get('monthAbbr'); + var dayOfWeek = timeModel.get('dayOfWeek'); + var dayOfWeekAbbr = timeModel.get('dayOfWeekAbbr'); + return (template || '').replace(/{yyyy}/g, y + '').replace(/{yy}/g, y % 100 + '').replace(/{Q}/g, q + '').replace(/{MMMM}/g, month[M - 1]).replace(/{MMM}/g, monthAbbr[M - 1]).replace(/{MM}/g, pad(M, 2)).replace(/{M}/g, M + '').replace(/{dd}/g, pad(d, 2)).replace(/{d}/g, d + '').replace(/{eeee}/g, dayOfWeek[e]).replace(/{ee}/g, dayOfWeekAbbr[e]).replace(/{e}/g, e + '').replace(/{HH}/g, pad(H, 2)).replace(/{H}/g, H + '').replace(/{hh}/g, pad(h + '', 2)).replace(/{h}/g, h + '').replace(/{mm}/g, pad(m, 2)).replace(/{m}/g, m + '').replace(/{ss}/g, pad(s, 2)).replace(/{s}/g, s + '').replace(/{SSS}/g, pad(S, 3)).replace(/{S}/g, S + ''); + } + + function leveledFormat(tick, idx, formatter, lang, isUTC) { + var template = null; + + if (isString(formatter)) { + // Single formatter for all units at all levels + template = formatter; + } else if (isFunction(formatter)) { + // Callback formatter + template = formatter(tick.value, idx, { + level: tick.level + }); + } else { + var defaults$1 = extend({}, defaultLeveledFormatter); + + if (tick.level > 0) { + for (var i = 0; i < primaryTimeUnits.length; ++i) { + defaults$1[primaryTimeUnits[i]] = "{primary|" + defaults$1[primaryTimeUnits[i]] + "}"; + } + } + + var mergedFormatter = formatter ? formatter.inherit === false ? formatter // Use formatter with bigger units + : defaults(formatter, defaults$1) : defaults$1; + var unit = getUnitFromValue(tick.value, isUTC); + + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + } else if (mergedFormatter.inherit) { + // Unit formatter is not defined and should inherit from bigger units + var targetId = timeUnits.indexOf(unit); + + for (var i = targetId - 1; i >= 0; --i) { + if (mergedFormatter[unit]) { + template = mergedFormatter[unit]; + break; + } + } + + template = template || defaults$1.none; + } + + if (isArray(template)) { + var levelId = tick.level == null ? 0 : tick.level >= 0 ? tick.level : template.length + tick.level; + levelId = Math.min(levelId, template.length - 1); + template = template[levelId]; + } + } + + return format(new Date(tick.value), template, isUTC, lang); + } + + function getUnitFromValue(value, isUTC) { + var date = parseDate(value); + var M = date[monthGetterName(isUTC)]() + 1; + var d = date[dateGetterName(isUTC)](); + var h = date[hoursGetterName(isUTC)](); + var m = date[minutesGetterName(isUTC)](); + var s = date[secondsGetterName(isUTC)](); + var S = date[millisecondsGetterName(isUTC)](); + var isSecond = S === 0; + var isMinute = isSecond && s === 0; + var isHour = isMinute && m === 0; + var isDay = isHour && h === 0; + var isMonth = isDay && d === 1; + var isYear = isMonth && M === 1; + + if (isYear) { + return 'year'; + } else if (isMonth) { + return 'month'; + } else if (isDay) { + return 'day'; + } else if (isHour) { + return 'hour'; + } else if (isMinute) { + return 'minute'; + } else if (isSecond) { + return 'second'; + } else { + return 'millisecond'; + } + } + + function getUnitValue(value, unit, isUTC) { + var date = isNumber(value) ? parseDate(value) : value; + unit = unit || getUnitFromValue(value, isUTC); + + switch (unit) { + case 'year': + return date[fullYearGetterName(isUTC)](); + + case 'half-year': + return date[monthGetterName(isUTC)]() >= 6 ? 1 : 0; + + case 'quarter': + return Math.floor((date[monthGetterName(isUTC)]() + 1) / 4); + + case 'month': + return date[monthGetterName(isUTC)](); + + case 'day': + return date[dateGetterName(isUTC)](); + + case 'half-day': + return date[hoursGetterName(isUTC)]() / 24; + + case 'hour': + return date[hoursGetterName(isUTC)](); + + case 'minute': + return date[minutesGetterName(isUTC)](); + + case 'second': + return date[secondsGetterName(isUTC)](); + + case 'millisecond': + return date[millisecondsGetterName(isUTC)](); + } + } + + function fullYearGetterName(isUTC) { + return isUTC ? 'getUTCFullYear' : 'getFullYear'; + } + + function monthGetterName(isUTC) { + return isUTC ? 'getUTCMonth' : 'getMonth'; + } + + function dateGetterName(isUTC) { + return isUTC ? 'getUTCDate' : 'getDate'; + } + + function hoursGetterName(isUTC) { + return isUTC ? 'getUTCHours' : 'getHours'; + } + + function minutesGetterName(isUTC) { + return isUTC ? 'getUTCMinutes' : 'getMinutes'; + } + + function secondsGetterName(isUTC) { + return isUTC ? 'getUTCSeconds' : 'getSeconds'; + } + + function millisecondsGetterName(isUTC) { + return isUTC ? 'getUTCMilliseconds' : 'getMilliseconds'; + } + + function fullYearSetterName(isUTC) { + return isUTC ? 'setUTCFullYear' : 'setFullYear'; + } + + function monthSetterName(isUTC) { + return isUTC ? 'setUTCMonth' : 'setMonth'; + } + + function dateSetterName(isUTC) { + return isUTC ? 'setUTCDate' : 'setDate'; + } + + function hoursSetterName(isUTC) { + return isUTC ? 'setUTCHours' : 'setHours'; + } + + function minutesSetterName(isUTC) { + return isUTC ? 'setUTCMinutes' : 'setMinutes'; + } + + function secondsSetterName(isUTC) { + return isUTC ? 'setUTCSeconds' : 'setSeconds'; + } + + function millisecondsSetterName(isUTC) { + return isUTC ? 'setUTCMilliseconds' : 'setMilliseconds'; + } + + function getTextRect(text, font, align, verticalAlign, padding, rich, truncate, lineHeight) { + var textEl = new ZRText({ + style: { + text: text, + font: font, + align: align, + verticalAlign: verticalAlign, + padding: padding, + rich: rich, + overflow: truncate ? 'truncate' : null, + lineHeight: lineHeight + } + }); + return textEl.getBoundingRect(); + } + + /** + * Add a comma each three digit. + */ + + function addCommas(x) { + if (!isNumeric(x)) { + return isString(x) ? x : '-'; + } + + var parts = (x + '').split('.'); + return parts[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,') + (parts.length > 1 ? '.' + parts[1] : ''); + } + + function toCamelCase(str, upperCaseFirst) { + str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) { + return group1.toUpperCase(); + }); + + if (upperCaseFirst && str) { + str = str.charAt(0).toUpperCase() + str.slice(1); + } + + return str; + } + + var normalizeCssArray$1 = normalizeCssArray; + var replaceReg = /([&<>"'])/g; + var replaceMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' + }; + + function encodeHTML(source) { + return source == null ? '' : (source + '').replace(replaceReg, function (str, c) { + return replaceMap[c]; + }); + } + + /** + * Make value user readable for tooltip and label. + * "User readable": + * Try to not print programmer-specific text like NaN, Infinity, null, undefined. + * Avoid to display an empty string, which users can not recognize there is + * a value and it might look like a bug. + */ + + function makeValueReadable(value, valueType, useUTC) { + var USER_READABLE_DEFUALT_TIME_PATTERN = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}'; + + function stringToUserReadable(str) { + return str && trim(str) ? str : '-'; + } + + function isNumberUserReadable(num) { + return !!(num != null && !isNaN(num) && isFinite(num)); + } + + var isTypeTime = valueType === 'time'; + var isValueDate = value instanceof Date; + + if (isTypeTime || isValueDate) { + var date = isTypeTime ? parseDate(value) : value; + + if (!isNaN(+date)) { + return format(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC); + } else if (isValueDate) { + return '-'; + } // In other cases, continue to try to display the value in the following code. + + } + + if (valueType === 'ordinal') { + return isStringSafe(value) ? stringToUserReadable(value) : isNumber(value) ? isNumberUserReadable(value) ? value + '' : '-' : '-'; + } // By default. + + + var numericResult = numericToNumber(value); + return isNumberUserReadable(numericResult) ? addCommas(numericResult) : isStringSafe(value) ? stringToUserReadable(value) : typeof value === 'boolean' ? value + '' : '-'; + } + + var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + + var wrapVar = function (varName, seriesIdx) { + return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}'; + }; + + /** + * Template formatter + * @param {Array.|Object} paramsList + */ + + + function formatTpl(tpl, paramsList, encode) { + if (!isArray(paramsList)) { + paramsList = [paramsList]; + } + + var seriesLen = paramsList.length; + + if (!seriesLen) { + return ''; + } + + var $vars = paramsList[0].$vars || []; + + for (var i = 0; i < $vars.length; i++) { + var alias = TPL_VAR_ALIAS[i]; + tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); + } + + for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { + for (var k = 0; k < $vars.length; k++) { + var val = paramsList[seriesIdx][$vars[k]]; + tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val); + } + } + + return tpl; + } + + /** + * simple Template formatter + */ + + function formatTplSimple(tpl, param, encode) { + each(param, function (value, key) { + tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value); + }); + return tpl; + } + + function getTooltipMarker(inOpt, extraCssText) { + var opt = isString(inOpt) ? { + color: inOpt, + extraCssText: extraCssText + } : inOpt || {}; + var color = opt.color; + var type = opt.type; + extraCssText = opt.extraCssText; + var renderMode = opt.renderMode || 'html'; + + if (!color) { + return ''; + } + + if (renderMode === 'html') { + return type === 'subItem' ? '' : ''; + } else { + // Should better not to auto generate style name by auto-increment number here. + // Because this util is usually called in tooltip formatter, which is probably + // called repeatly when mouse move and the auto-increment number increases fast. + // Users can make their own style name by theirselves, make it unique and readable. + var markerId = opt.markerId || 'markerX'; + return { + renderMode: renderMode, + content: '{' + markerId + '|} ', + style: type === 'subItem' ? { + width: 4, + height: 4, + borderRadius: 2, + backgroundColor: color + } : { + width: 10, + height: 10, + borderRadius: 5, + backgroundColor: color + } + }; + } + } + + /** + * @deprecated Use `time/format` instead. + * ISO Date format + * @param {string} tpl + * @param {number} value + * @param {boolean} [isUTC=false] Default in local time. + * see `module:echarts/scale/Time` + * and `module:echarts/util/number#parseDate`. + * @inner + */ + + function formatTime(tpl, value, isUTC) { + if ("development" !== 'production') { + deprecateReplaceLog('echarts.format.formatTime', 'echarts.time.format'); + } + + if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') { + tpl = 'MM-dd\nyyyy'; + } + + var date = parseDate(value); + var getUTC = isUTC ? 'getUTC' : 'get'; + var y = date[getUTC + 'FullYear'](); + var M = date[getUTC + 'Month']() + 1; + var d = date[getUTC + 'Date'](); + var h = date[getUTC + 'Hours'](); + var m = date[getUTC + 'Minutes'](); + var s = date[getUTC + 'Seconds'](); + var S = date[getUTC + 'Milliseconds'](); + tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', y % 100 + '').replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3)); + return tpl; + } + + /** + * Capital first + * @param {string} str + * @return {string} + */ + + function capitalFirst(str) { + return str ? str.charAt(0).toUpperCase() + str.substr(1) : str; + } + + /** + * @return Never be null/undefined. + */ + + function convertToColorString(color, defaultColor) { + defaultColor = defaultColor || 'transparent'; + return isString(color) ? color : isObject(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor; + } + + /** + * open new tab + * @param link url + * @param target blank or self + */ + + function windowOpen(link, target) { + /* global window */ + if (target === '_blank' || target === 'blank') { + var blank = window.open(); + blank.opener = null; + blank.location.href = link; + } else { + window.open(link, target); + } + } + + var each$1 = each; + /** + * @public + */ + + var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height']; + /** + * @public + */ + + var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']]; + + function boxLayout(orient, group, gap, maxWidth, maxHeight) { + var x = 0; + var y = 0; + + if (maxWidth == null) { + maxWidth = Infinity; + } + + if (maxHeight == null) { + maxHeight = Infinity; + } + + var currentLineMaxSize = 0; + group.eachChild(function (child, idx) { + var rect = child.getBoundingRect(); + var nextChild = group.childAt(idx + 1); + var nextChildRect = nextChild && nextChild.getBoundingRect(); + var nextX; + var nextY; + + if (orient === 'horizontal') { + var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0); + nextX = x + moveX; // Wrap when width exceeds maxWidth or meet a `newline` group + // FIXME compare before adding gap? + + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } else { + // FIXME: consider rect.y is not `0`? + currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); + } + } else { + var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0); + nextY = y + moveY; // Wrap when width exceeds maxHeight or meet a `newline` group + + if (nextY > maxHeight || child.newline) { + x += currentLineMaxSize + gap; + y = 0; + nextY = moveY; + currentLineMaxSize = rect.width; + } else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); + } + } + + if (child.newline) { + return; + } + + child.x = x; + child.y = y; + child.markRedraw(); + orient === 'horizontal' ? x = nextX + gap : y = nextY + gap; + }); + } + + /** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + + var box = boxLayout; + /** + * VBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + var vbox = curry(boxLayout, 'vertical'); + /** + * HBox layouting + * @param {module:zrender/graphic/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + + var hbox = curry(boxLayout, 'horizontal'); + + /** + * If x or x2 is not specified or 'center' 'left' 'right', + * the width would be as long as possible. + * If y or y2 is not specified or 'middle' 'top' 'bottom', + * the height would be as long as possible. + */ + + function getAvailableSize(positionInfo, containerRect, margin) { + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var x = parsePercent$1(positionInfo.left, containerWidth); + var y = parsePercent$1(positionInfo.top, containerHeight); + var x2 = parsePercent$1(positionInfo.right, containerWidth); + var y2 = parsePercent$1(positionInfo.bottom, containerHeight); + (isNaN(x) || isNaN(parseFloat(positionInfo.left))) && (x = 0); + (isNaN(x2) || isNaN(parseFloat(positionInfo.right))) && (x2 = containerWidth); + (isNaN(y) || isNaN(parseFloat(positionInfo.top))) && (y = 0); + (isNaN(y2) || isNaN(parseFloat(positionInfo.bottom))) && (y2 = containerHeight); + margin = normalizeCssArray$1(margin || 0); + return { + width: Math.max(x2 - x - margin[1] - margin[3], 0), + height: Math.max(y2 - y - margin[0] - margin[2], 0) + }; + } + + /** + * Parse position info. + */ + + function getLayoutRect(positionInfo, containerRect, margin) { + margin = normalizeCssArray$1(margin || 0); + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + var left = parsePercent$1(positionInfo.left, containerWidth); + var top = parsePercent$1(positionInfo.top, containerHeight); + var right = parsePercent$1(positionInfo.right, containerWidth); + var bottom = parsePercent$1(positionInfo.bottom, containerHeight); + var width = parsePercent$1(positionInfo.width, containerWidth); + var height = parsePercent$1(positionInfo.height, containerHeight); + var verticalMargin = margin[2] + margin[0]; + var horizontalMargin = margin[1] + margin[3]; + var aspect = positionInfo.aspect; // If width is not specified, calculate width from left and right + + if (isNaN(width)) { + width = containerWidth - right - horizontalMargin - left; + } + + if (isNaN(height)) { + height = containerHeight - bottom - verticalMargin - top; + } + + if (aspect != null) { + // If width and height are not given + // 1. Graph should not exceeds the container + // 2. Aspect must be keeped + // 3. Graph should take the space as more as possible + // FIXME + // Margin is not considered, because there is no case that both + // using margin and aspect so far. + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } else { + height = containerHeight * 0.8; + } + } // Calculate width or height with given aspect + + + if (isNaN(width)) { + width = aspect * height; + } + + if (isNaN(height)) { + height = width / aspect; + } + } // If left is not specified, calculate left from right and width + + + if (isNaN(left)) { + left = containerWidth - right - width - horizontalMargin; + } + + if (isNaN(top)) { + top = containerHeight - bottom - height - verticalMargin; + } // Align left and top + + + switch (positionInfo.left || positionInfo.right) { + case 'center': + left = containerWidth / 2 - width / 2 - margin[3]; + break; + + case 'right': + left = containerWidth - width - horizontalMargin; + break; + } + + switch (positionInfo.top || positionInfo.bottom) { + case 'middle': + case 'center': + top = containerHeight / 2 - height / 2 - margin[0]; + break; + + case 'bottom': + top = containerHeight - height - verticalMargin; + break; + } // If something is wrong and left, top, width, height are calculated as NaN + + + left = left || 0; + top = top || 0; + + if (isNaN(width)) { + // Width may be NaN if only one value is given except width + width = containerWidth - horizontalMargin - left - (right || 0); + } + + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - verticalMargin - top - (bottom || 0); + } + + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; + } + + /** + * Position a zr element in viewport + * Group position is specified by either + * {left, top}, {right, bottom} + * If all properties exists, right and bottom will be igonred. + * + * Logic: + * 1. Scale (against origin point in parent coord) + * 2. Rotate (against origin point in parent coord) + * 3. Traslate (with el.position by this method) + * So this method only fixes the last step 'Traslate', which does not affect + * scaling and rotating. + * + * If be called repeatly with the same input el, the same result will be gotten. + * + * Return true if the layout happend. + * + * @param el Should have `getBoundingRect` method. + * @param positionInfo + * @param positionInfo.left + * @param positionInfo.top + * @param positionInfo.right + * @param positionInfo.bottom + * @param positionInfo.width Only for opt.boundingModel: 'raw' + * @param positionInfo.height Only for opt.boundingModel: 'raw' + * @param containerRect + * @param margin + * @param opt + * @param opt.hv Only horizontal or only vertical. Default to be [1, 1] + * @param opt.boundingMode + * Specify how to calculate boundingRect when locating. + * 'all': Position the boundingRect that is transformed and uioned + * both itself and its descendants. + * This mode simplies confine the elements in the bounding + * of their container (e.g., using 'right: 0'). + * 'raw': Position the boundingRect that is not transformed and only itself. + * This mode is useful when you want a element can overflow its + * container. (Consider a rotated circle needs to be located in a corner.) + * In this mode positionInfo.width/height can only be number. + */ + + function positionElement(el, positionInfo, containerRect, margin, opt, out) { + var h = !opt || !opt.hv || opt.hv[0]; + var v = !opt || !opt.hv || opt.hv[1]; + var boundingMode = opt && opt.boundingMode || 'all'; + out = out || el; + out.x = el.x; + out.y = el.y; + + if (!h && !v) { + return false; + } + + var rect; + + if (boundingMode === 'raw') { + rect = el.type === 'group' ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect(); + } else { + rect = el.getBoundingRect(); + + if (el.needLocalTransform()) { + var transform = el.getLocalTransform(); // Notice: raw rect may be inner object of el, + // which should not be modified. + + rect = rect.clone(); + rect.applyTransform(transform); + } + } // The real width and height can not be specified but calculated by the given el. + + + var layoutRect = getLayoutRect(defaults({ + width: rect.width, + height: rect.height + }, positionInfo), containerRect, margin); // Because 'tranlate' is the last step in transform + // (see zrender/core/Transformable#getLocalTransform), + // we can just only modify el.position to get final result. + + var dx = h ? layoutRect.x - rect.x : 0; + var dy = v ? layoutRect.y - rect.y : 0; + + if (boundingMode === 'raw') { + out.x = dx; + out.y = dy; + } else { + out.x += dx; + out.y += dy; + } + + if (out === el) { + el.markRedraw(); + } + + return true; + } + + /** + * @param option Contains some of the properties in HV_NAMES. + * @param hvIdx 0: horizontal; 1: vertical. + */ + + function sizeCalculable(option, hvIdx) { + return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null; + } + + function fetchLayoutMode(ins) { + var layoutMode = ins.layoutMode || ins.constructor.layoutMode; + return isObject(layoutMode) ? layoutMode : layoutMode ? { + type: layoutMode + } : null; + } + + /** + * Consider Case: + * When default option has {left: 0, width: 100}, and we set {right: 0} + * through setOption or media query, using normal zrUtil.merge will cause + * {right: 0} does not take effect. + * + * @example + * ComponentModel.extend({ + * init: function () { + * ... + * let inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param targetOption + * @param newOption + * @param opt + */ + + function mergeLayoutParam(targetOption, newOption, opt) { + var ignoreSize = opt && opt.ignoreSize; + !isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]); + var hResult = merge(HV_NAMES[0], 0); + var vResult = merge(HV_NAMES[1], 1); + copy(HV_NAMES[0], targetOption, hResult); + copy(HV_NAMES[1], targetOption, vResult); + + function merge(names, hvIdx) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = 2; + each$1(names, function (name) { + merged[name] = targetOption[name]; + }); + each$1(names, function (name) { + // Consider case: newOption.width is null, which is + // set by user for removing width setting. + hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); + hasValue(newParams, name) && newValueCount++; + hasValue(merged, name) && mergedValueCount++; + }); + + if (ignoreSize[hvIdx]) { + // Only one of left/right is premitted to exist. + if (hasValue(newOption, names[1])) { + merged[names[2]] = null; + } else if (hasValue(newOption, names[2])) { + merged[names[1]] = null; + } + + return merged; + } // Case: newOption: {width: ..., right: ...}, + // or targetOption: {right: ...} and newOption: {width: ...}, + // There is no conflict when merged only has params count + // little than enoughParamNumber. + + + if (mergedValueCount === enoughParamNumber || !newValueCount) { + return merged; + } // Case: newOption: {width: ..., right: ...}, + // Than we can make sure user only want those two, and ignore + // all origin params in targetOption. + else if (newValueCount >= enoughParamNumber) { + return newParams; + } else { + // Chose another param from targetOption by priority. + for (var i = 0; i < names.length; i++) { + var name_1 = names[i]; + + if (!hasProp(newParams, name_1) && hasProp(targetOption, name_1)) { + newParams[name_1] = targetOption[name_1]; + break; + } + } + + return newParams; + } + } + + function hasProp(obj, name) { + return obj.hasOwnProperty(name); + } + + function hasValue(obj, name) { + return obj[name] != null && obj[name] !== 'auto'; + } + + function copy(names, target, source) { + each$1(names, function (name) { + target[name] = source[name]; + }); + } + } + + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + */ + + function getLayoutParams(source) { + return copyLayoutParams({}, source); + } + + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + + function copyLayoutParams(target, source) { + source && target && each$1(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; + } + + var inner = makeInner(); + + var ComponentModel = + /** @class */ + function (_super) { + __extends(ComponentModel, _super); + + function ComponentModel(option, parentModel, ecModel) { + var _this = _super.call(this, option, parentModel, ecModel) || this; + + _this.uid = getUID('ec_cpt_model'); + return _this; + } + + ComponentModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + + ComponentModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(this.mainType)); + merge(option, this.getDefaultOption()); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + ComponentModel.prototype.mergeOption = function (option, ecModel) { + merge(this.option, option, true); + var layoutMode = fetchLayoutMode(this); + + if (layoutMode) { + mergeLayoutParam(this.option, option, layoutMode); + } + }; + /** + * Called immediately after `init` or `mergeOption` of this instance called. + */ + + + ComponentModel.prototype.optionUpdated = function (newCptOption, isInit) { + }; + /** + * [How to declare defaultOption]: + * + * (A) If using class declaration in typescript (since echarts 5): + * ```ts + * import {ComponentOption} from '../model/option.js'; + * export interface XxxOption extends ComponentOption { + * aaa: number + * } + * export class XxxModel extends Component { + * static type = 'xxx'; + * static defaultOption: XxxOption = { + * aaa: 123 + * } + * } + * Component.registerClass(XxxModel); + * ``` + * ```ts + * import {inheritDefaultOption} from '../util/component.js'; + * import {XxxModel, XxxOption} from './XxxModel.js'; + * export interface XxxSubOption extends XxxOption { + * bbb: number + * } + * class XxxSubModel extends XxxModel { + * static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, { + * bbb: 456 + * }) + * fn() { + * let opt = this.getDefaultOption(); + * // opt is {aaa: 123, bbb: 456} + * } + * } + * ``` + * + * (B) If using class extend (previous approach in echarts 3 & 4): + * ```js + * let XxxComponent = Component.extend({ + * defaultOption: { + * xx: 123 + * } + * }) + * ``` + * ```js + * let XxxSubComponent = XxxComponent.extend({ + * defaultOption: { + * yy: 456 + * }, + * fn: function () { + * let opt = this.getDefaultOption(); + * // opt is {xx: 123, yy: 456} + * } + * }) + * ``` + */ + + + ComponentModel.prototype.getDefaultOption = function () { + var ctor = this.constructor; // If using class declaration, it is different to travel super class + // in legacy env and auto merge defaultOption. So if using class + // declaration, defaultOption should be merged manually. + + if (!isExtendedClass(ctor)) { + // When using ts class, defaultOption must be declared as static. + return ctor.defaultOption; + } // FIXME: remove this approach? + + + var fields = inner(this); + + if (!fields.defaultOption) { + var optList = []; + var clz = ctor; + + while (clz) { + var opt = clz.prototype.defaultOption; + opt && optList.push(opt); + clz = clz.superClass; + } + + var defaultOption = {}; + + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = merge(defaultOption, optList[i], true); + } + + fields.defaultOption = defaultOption; + } + + return fields.defaultOption; + }; + /** + * Notice: always force to input param `useDefault` in case that forget to consider it. + * The same behavior as `modelUtil.parseFinder`. + * + * @param useDefault In many cases like series refer axis and axis refer grid, + * If axis index / axis id not specified, use the first target as default. + * In other cases like dataZoom refer axis, if not specified, measn no refer. + */ + + + ComponentModel.prototype.getReferringComponents = function (mainType, opt) { + var indexKey = mainType + 'Index'; + var idKey = mainType + 'Id'; + return queryReferringComponents(this.ecModel, mainType, { + index: this.get(indexKey, true), + id: this.get(idKey, true) + }, opt); + }; + + ComponentModel.prototype.getBoxLayoutParams = function () { + // Consider itself having box layout configs. + var boxLayoutModel = this; + return { + left: boxLayoutModel.get('left'), + top: boxLayoutModel.get('top'), + right: boxLayoutModel.get('right'), + bottom: boxLayoutModel.get('bottom'), + width: boxLayoutModel.get('width'), + height: boxLayoutModel.get('height') + }; + }; + /** + * Get key for zlevel. + * If developers don't configure zlevel. We will assign zlevel to series based on the key. + * For example, lines with trail effect and progressive series will in an individual zlevel. + */ + + + ComponentModel.prototype.getZLevelKey = function () { + return ''; + }; + + ComponentModel.prototype.setZLevel = function (zlevel) { + this.option.zlevel = zlevel; + }; + + ComponentModel.protoInitialize = function () { + var proto = ComponentModel.prototype; + proto.type = 'component'; + proto.id = ''; + proto.name = ''; + proto.mainType = ''; + proto.subType = ''; + proto.componentIndex = 0; + }(); + + return ComponentModel; + }(Model); + + mountExtend(ComponentModel, Model); + enableClassManagement(ComponentModel); + enableSubTypeDefaulter(ComponentModel); + enableTopologicalTravel(ComponentModel, getDependencies); + + function getDependencies(componentType) { + var deps = []; + each(ComponentModel.getClassesByMainType(componentType), function (clz) { + deps = deps.concat(clz.dependencies || clz.prototype.dependencies || []); + }); // Ensure main type. + + deps = map(deps, function (type) { + return parseClassType(type).main; + }); // Hack dataset for convenience. + + if (componentType !== 'dataset' && indexOf(deps, 'dataset') <= 0) { + deps.unshift('dataset'); + } + + return deps; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var platform = ''; // Navigator not exists in node + + if (typeof navigator !== 'undefined') { + /* global navigator */ + platform = navigator.platform || ''; + } + + var decalColor = 'rgba(0, 0, 0, 0.2)'; + var globalDefault = { + darkMode: 'auto', + // backgroundColor: 'rgba(0,0,0,0)', + colorBy: 'series', + color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'], + gradientColor: ['#f6efa6', '#d88273', '#bf444c'], + aria: { + decal: { + decals: [{ + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [2, 5], + symbolSize: 1, + rotation: Math.PI / 6 + }, { + color: decalColor, + symbol: 'circle', + dashArrayX: [[8, 8], [0, 8, 8, 0]], + dashArrayY: [6, 0], + symbolSize: 0.8 + }, { + color: decalColor, + dashArrayX: [1, 0], + dashArrayY: [4, 3], + rotation: -Math.PI / 4 + }, { + color: decalColor, + dashArrayX: [[6, 6], [0, 6, 6, 0]], + dashArrayY: [6, 0] + }, { + color: decalColor, + dashArrayX: [[1, 0], [1, 6]], + dashArrayY: [1, 0, 6, 0], + rotation: Math.PI / 4 + }, { + color: decalColor, + symbol: 'triangle', + dashArrayX: [[9, 9], [0, 9, 9, 0]], + dashArrayY: [7, 2], + symbolSize: 0.75 + }] + } + }, + // If xAxis and yAxis declared, grid is created by default. + // grid: {}, + textStyle: { + // color: '#000', + // decoration: 'none', + // PENDING + fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif', + // fontFamily: 'Arial, Verdana, sans-serif', + fontSize: 12, + fontStyle: 'normal', + fontWeight: 'normal' + }, + // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/ + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation + // Default is source-over + blendMode: null, + stateAnimation: { + duration: 300, + easing: 'cubicOut' + }, + animation: 'auto', + animationDuration: 1000, + animationDurationUpdate: 500, + animationEasing: 'cubicInOut', + animationEasingUpdate: 'cubicInOut', + animationThreshold: 2000, + // Configuration for progressive/incremental rendering + progressiveThreshold: 3000, + progressive: 400, + // Threshold of if use single hover layer to optimize. + // It is recommended that `hoverLayerThreshold` is equivalent to or less than + // `progressiveThreshold`, otherwise hover will cause restart of progressive, + // which is unexpected. + // see example . + hoverLayerThreshold: 3000, + // See: module:echarts/scale/Time + useUTC: false + }; + + var VISUAL_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'itemGroupId', 'seriesName']); + var SOURCE_FORMAT_ORIGINAL = 'original'; + var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows'; + var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows'; + var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns'; + var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray'; + var SOURCE_FORMAT_UNKNOWN = 'unknown'; + var SERIES_LAYOUT_BY_COLUMN = 'column'; + var SERIES_LAYOUT_BY_ROW = 'row'; + + var BE_ORDINAL = { + Must: 1, + Might: 2, + Not: 3 // Other cases + + }; + var innerGlobalModel = makeInner(); + + /** + * MUST be called before mergeOption of all series. + */ + + function resetSourceDefaulter(ecModel) { + // `datasetMap` is used to make default encode. + innerGlobalModel(ecModel).datasetMap = createHashMap(); + } + + /** + * [The strategy of the arrengment of data dimensions for dataset]: + * "value way": all axes are non-category axes. So series one by one take + * several (the number is coordSysDims.length) dimensions from dataset. + * The result of data arrengment of data dimensions like: + * | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y | + * "category way": at least one axis is category axis. So the the first data + * dimension is always mapped to the first category axis and shared by + * all of the series. The other data dimensions are taken by series like + * "value way" does. + * The result of data arrengment of data dimensions like: + * | ser_shared_x | ser0_y | ser1_y | ser2_y | + * + * @return encode Never be `null/undefined`. + */ + + function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); // Currently only make default when using dataset, util more reqirements occur. + + if (!datasetModel || !coordDimensions) { + return encode; + } + + var encodeItemName = []; + var encodeSeriesName = []; + var ecModel = seriesModel.ecModel; + var datasetMap = innerGlobalModel(ecModel).datasetMap; + var key = datasetModel.uid + '_' + source.seriesLayoutBy; + var baseCategoryDimIndex; + var categoryWayValueDimStart; + coordDimensions = coordDimensions.slice(); + each(coordDimensions, function (coordDimInfoLoose, coordDimIdx) { + var coordDimInfo = isObject(coordDimInfoLoose) ? coordDimInfoLoose : coordDimensions[coordDimIdx] = { + name: coordDimInfoLoose + }; + + if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) { + baseCategoryDimIndex = coordDimIdx; + categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo); + } + + encode[coordDimInfo.name] = []; + }); + var datasetRecord = datasetMap.get(key) || datasetMap.set(key, { + categoryWayDim: categoryWayValueDimStart, + valueWayDim: 0 + }); // TODO + // Auto detect first time axis and do arrangement. + + each(coordDimensions, function (coordDimInfo, coordDimIdx) { + var coordDimName = coordDimInfo.name; + var count = getDataDimCountOnCoordDim(coordDimInfo); // In value way. + + if (baseCategoryDimIndex == null) { + var start = datasetRecord.valueWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.valueWayDim += count; // ??? TODO give a better default series name rule? + // especially when encode x y specified. + // consider: when mutiple series share one dimension + // category axis, series name should better use + // the other dimsion name. On the other hand, use + // both dimensions name. + } // In category way, the first category axis. + else if (baseCategoryDimIndex === coordDimIdx) { + pushDim(encode[coordDimName], 0, count); + pushDim(encodeItemName, 0, count); + } // In category way, the other axis. + else { + var start = datasetRecord.categoryWayDim; + pushDim(encode[coordDimName], start, count); + pushDim(encodeSeriesName, start, count); + datasetRecord.categoryWayDim += count; + } + }); + + function pushDim(dimIdxArr, idxFrom, idxCount) { + for (var i = 0; i < idxCount; i++) { + dimIdxArr.push(idxFrom + i); + } + } + + function getDataDimCountOnCoordDim(coordDimInfo) { + var dimsDef = coordDimInfo.dimsDef; + return dimsDef ? dimsDef.length : 1; + } + + encodeItemName.length && (encode.itemName = encodeItemName); + encodeSeriesName.length && (encode.seriesName = encodeSeriesName); + return encode; + } + + /** + * Work for data like [{name: ..., value: ...}, ...]. + * + * @return encode Never be `null/undefined`. + */ + + function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) { + var encode = {}; + var datasetModel = querySeriesUpstreamDatasetModel(seriesModel); // Currently only make default when using dataset, util more reqirements occur. + + if (!datasetModel) { + return encode; + } + + var sourceFormat = source.sourceFormat; + var dimensionsDefine = source.dimensionsDefine; + var potentialNameDimIndex; + + if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + each(dimensionsDefine, function (dim, idx) { + if ((isObject(dim) ? dim.name : dim) === 'name') { + potentialNameDimIndex = idx; + } + }); + } + + var idxResult = function () { + var idxRes0 = {}; + var idxRes1 = {}; + var guessRecords = []; // 5 is an experience value. + + for (var i = 0, len = Math.min(5, dimCount); i < len; i++) { + var guessResult = doGuessOrdinal(source.data, sourceFormat, source.seriesLayoutBy, dimensionsDefine, source.startIndex, i); + guessRecords.push(guessResult); + var isPureNumber = guessResult === BE_ORDINAL.Not; // [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim, + // and then find a name dim with the priority: + // "BE_ORDINAL.Might|BE_ORDINAL.Must" > "other dim" > "the value dim itself". + + if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) { + idxRes0.v = i; + } + + if (idxRes0.n == null || idxRes0.n === idxRes0.v || !isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not) { + idxRes0.n = i; + } + + if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) { + return idxRes0; + } // [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not), + // find the first BE_ORDINAL.Might as the value dim, + // and then find a name dim with the priority: + // "other dim" > "the value dim itself". + // That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be + // treated as number. + + + if (!isPureNumber) { + if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) { + idxRes1.v = i; + } + + if (idxRes1.n == null || idxRes1.n === idxRes1.v) { + idxRes1.n = i; + } + } + } + + function fulfilled(idxResult) { + return idxResult.v != null && idxResult.n != null; + } + + return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null; + }(); + + if (idxResult) { + encode.value = [idxResult.v]; // `potentialNameDimIndex` has highest priority. + + var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n; // By default, label use itemName in charts. + // So we dont set encodeLabel here. + + encode.itemName = [nameDimIndex]; + encode.seriesName = [nameDimIndex]; + } + + return encode; + } + + /** + * @return If return null/undefined, indicate that should not use datasetModel. + */ + + function querySeriesUpstreamDatasetModel(seriesModel) { + // Caution: consider the scenario: + // A dataset is declared and a series is not expected to use the dataset, + // and at the beginning `setOption({series: { noData })` (just prepare other + // option but no data), then `setOption({series: {data: [...]}); In this case, + // the user should set an empty array to avoid that dataset is used by default. + var thisData = seriesModel.get('data', true); + + if (!thisData) { + return queryReferringComponents(seriesModel.ecModel, 'dataset', { + index: seriesModel.get('datasetIndex', true), + id: seriesModel.get('datasetId', true) + }, SINGLE_REFERRING).models[0]; + } + } + + /** + * @return Always return an array event empty. + */ + + function queryDatasetUpstreamDatasetModels(datasetModel) { + // Only these attributes declared, we by defualt reference to `datasetIndex: 0`. + // Otherwise, no reference. + if (!datasetModel.get('transform', true) && !datasetModel.get('fromTransformResult', true)) { + return []; + } + + return queryReferringComponents(datasetModel.ecModel, 'dataset', { + index: datasetModel.get('fromDatasetIndex', true), + id: datasetModel.get('fromDatasetId', true) + }, SINGLE_REFERRING).models; + } + + /** + * The rule should not be complex, otherwise user might not + * be able to known where the data is wrong. + * The code is ugly, but how to make it neat? + */ + + function guessOrdinal(source, dimIndex) { + return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex); + } // dimIndex may be overflow source data. + // return {BE_ORDINAL} + + function doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) { + var result; // Experience value. + + var maxLoop = 5; + + if (isTypedArray(data)) { + return BE_ORDINAL.Not; + } // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine + // always exists in source. + + + var dimName; + var dimType; + + if (dimensionsDefine) { + var dimDefItem = dimensionsDefine[dimIndex]; + + if (isObject(dimDefItem)) { + dimName = dimDefItem.name; + dimType = dimDefItem.type; + } else if (isString(dimDefItem)) { + dimName = dimDefItem; + } + } + + if (dimType != null) { + return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; + + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + var sample = dataArrayRows[dimIndex]; + + for (var i = 0; i < (sample || []).length && i < maxLoop; i++) { + if ((result = detectValue(sample[startIndex + i])) != null) { + return result; + } + } + } else { + for (var i = 0; i < dataArrayRows.length && i < maxLoop; i++) { + var row = dataArrayRows[startIndex + i]; + + if (row && (result = detectValue(row[dimIndex])) != null) { + return result; + } + } + } + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var dataObjectRows = data; + + if (!dimName) { + return BE_ORDINAL.Not; + } + + for (var i = 0; i < dataObjectRows.length && i < maxLoop; i++) { + var item = dataObjectRows[i]; + + if (item && (result = detectValue(item[dimName])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + var dataKeyedColumns = data; + + if (!dimName) { + return BE_ORDINAL.Not; + } + + var sample = dataKeyedColumns[dimName]; + + if (!sample || isTypedArray(sample)) { + return BE_ORDINAL.Not; + } + + for (var i = 0; i < sample.length && i < maxLoop; i++) { + if ((result = detectValue(sample[i])) != null) { + return result; + } + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var dataOriginal = data; + + for (var i = 0; i < dataOriginal.length && i < maxLoop; i++) { + var item = dataOriginal[i]; + var val = getDataItemValue(item); + + if (!isArray(val)) { + return BE_ORDINAL.Not; + } + + if ((result = detectValue(val[dimIndex])) != null) { + return result; + } + } + } + + function detectValue(val) { + var beStr = isString(val); // Consider usage convenience, '1', '2' will be treated as "number". + // `isFinit('')` get `true`. + + if (val != null && isFinite(val) && val !== '') { + return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not; + } else if (beStr && val !== '-') { + return BE_ORDINAL.Must; + } + } + + return BE_ORDINAL.Not; + } + + var internalOptionCreatorMap = createHashMap(); + + function registerInternalOptionCreator(mainType, creator) { + assert(internalOptionCreatorMap.get(mainType) == null && creator); + internalOptionCreatorMap.set(mainType, creator); + } + + function concatInternalOptions(ecModel, mainType, newCmptOptionList) { + var internalOptionCreator = internalOptionCreatorMap.get(mainType); + + if (!internalOptionCreator) { + return newCmptOptionList; + } + + var internalOptions = internalOptionCreator(ecModel); + + if (!internalOptions) { + return newCmptOptionList; + } + + if ("development" !== 'production') { + for (var i = 0; i < internalOptions.length; i++) { + assert(isComponentIdInternal(internalOptions[i])); + } + } + + return newCmptOptionList.concat(internalOptions); + } + + var innerColor = makeInner(); + var innerDecal = makeInner(); + + var PaletteMixin = + /** @class */ + function () { + function PaletteMixin() { + } + + PaletteMixin.prototype.getColorFromPalette = function (name, scope, requestNum) { + var defaultPalette = normalizeToArray(this.get('color', true)); + var layeredPalette = this.get('colorLayer', true); + return getFromPalette(this, innerColor, defaultPalette, layeredPalette, name, scope, requestNum); + }; + + PaletteMixin.prototype.clearColorPalette = function () { + clearPalette(this, innerColor); + }; + + return PaletteMixin; + }(); + + function getDecalFromPalette(ecModel, name, scope, requestNum) { + var defaultDecals = normalizeToArray(ecModel.get(['aria', 'decal', 'decals'])); + return getFromPalette(ecModel, innerDecal, defaultDecals, null, name, scope, requestNum); + } + + function getNearestPalette(palettes, requestColorNum) { + var paletteNum = palettes.length; // TODO palettes must be in order + + for (var i = 0; i < paletteNum; i++) { + if (palettes[i].length > requestColorNum) { + return palettes[i]; + } + } + + return palettes[paletteNum - 1]; + } + + /** + * @param name MUST NOT be null/undefined. Otherwise call this function + * twise with the same parameters will get different result. + * @param scope default this. + * @return Can be null/undefined + */ + + + function getFromPalette(that, inner, defaultPalette, layeredPalette, name, scope, requestNum) { + scope = scope || that; + var scopeFields = inner(scope); + var paletteIdx = scopeFields.paletteIdx || 0; + var paletteNameMap = scopeFields.paletteNameMap = scopeFields.paletteNameMap || {}; // Use `hasOwnProperty` to avoid conflict with Object.prototype. + + if (paletteNameMap.hasOwnProperty(name)) { + return paletteNameMap[name]; + } + + var palette = requestNum == null || !layeredPalette ? defaultPalette : getNearestPalette(layeredPalette, requestNum); // In case can't find in layered color palette. + + palette = palette || defaultPalette; + + if (!palette || !palette.length) { + return; + } + + var pickedPaletteItem = palette[paletteIdx]; + + if (name) { + paletteNameMap[name] = pickedPaletteItem; + } + + scopeFields.paletteIdx = (paletteIdx + 1) % palette.length; + return pickedPaletteItem; + } + + function clearPalette(that, inner) { + inner(that).paletteIdx = 0; + inner(that).paletteNameMap = {}; + } + + // Internal method names: + // ----------------------- + + var reCreateSeriesIndices; + var assertSeriesInitialized; + var initBase; + var OPTION_INNER_KEY = '\0_ec_inner'; + var OPTION_INNER_VALUE = 1; + var BUITIN_COMPONENTS_MAP = { + grid: 'GridComponent', + polar: 'PolarComponent', + geo: 'GeoComponent', + singleAxis: 'SingleAxisComponent', + parallel: 'ParallelComponent', + calendar: 'CalendarComponent', + graphic: 'GraphicComponent', + toolbox: 'ToolboxComponent', + tooltip: 'TooltipComponent', + axisPointer: 'AxisPointerComponent', + brush: 'BrushComponent', + title: 'TitleComponent', + timeline: 'TimelineComponent', + markPoint: 'MarkPointComponent', + markLine: 'MarkLineComponent', + markArea: 'MarkAreaComponent', + legend: 'LegendComponent', + dataZoom: 'DataZoomComponent', + visualMap: 'VisualMapComponent', + // aria: 'AriaComponent', + // dataset: 'DatasetComponent', + // Dependencies + xAxis: 'GridComponent', + yAxis: 'GridComponent', + angleAxis: 'PolarComponent', + radiusAxis: 'PolarComponent' + }; + var BUILTIN_CHARTS_MAP = { + line: 'LineChart', + bar: 'BarChart', + pie: 'PieChart', + scatter: 'ScatterChart', + radar: 'RadarChart', + map: 'MapChart', + tree: 'TreeChart', + treemap: 'TreemapChart', + graph: 'GraphChart', + gauge: 'GaugeChart', + funnel: 'FunnelChart', + parallel: 'ParallelChart', + sankey: 'SankeyChart', + boxplot: 'BoxplotChart', + candlestick: 'CandlestickChart', + effectScatter: 'EffectScatterChart', + lines: 'LinesChart', + heatmap: 'HeatmapChart', + pictorialBar: 'PictorialBarChart', + themeRiver: 'ThemeRiverChart', + sunburst: 'SunburstChart', + custom: 'CustomChart' + }; + var componetsMissingLogPrinted = {}; + + function checkMissingComponents(option) { + each(option, function (componentOption, mainType) { + if (!ComponentModel.hasClass(mainType)) { + var componentImportName = BUITIN_COMPONENTS_MAP[mainType]; + + if (componentImportName && !componetsMissingLogPrinted[componentImportName]) { + error("Component " + mainType + " is used but not imported.\nimport { " + componentImportName + " } from 'echarts/components';\necharts.use([" + componentImportName + "]);"); + componetsMissingLogPrinted[componentImportName] = true; + } + } + }); + } + + var GlobalModel = + /** @class */ + function (_super) { + __extends(GlobalModel, _super); + + function GlobalModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + GlobalModel.prototype.init = function (option, parentModel, ecModel, theme, locale, optionManager) { + theme = theme || {}; + this.option = null; // Mark as not initialized. + + this._theme = new Model(theme); + this._locale = new Model(locale); + this._optionManager = optionManager; + }; + + GlobalModel.prototype.setOption = function (option, opts, optionPreprocessorFuncs) { + if ("development" !== 'production') { + assert(option != null, 'option is null/undefined'); + assert(option[OPTION_INNER_KEY] !== OPTION_INNER_VALUE, 'please use chart.getOption()'); + } + + var innerOpt = normalizeSetOptionInput(opts); + + this._optionManager.setOption(option, optionPreprocessorFuncs, innerOpt); + + this._resetOption(null, innerOpt); + }; + /** + * @param type null/undefined: reset all. + * 'recreate': force recreate all. + * 'timeline': only reset timeline option + * 'media': only reset media query option + * @return Whether option changed. + */ + + + GlobalModel.prototype.resetOption = function (type, opt) { + return this._resetOption(type, normalizeSetOptionInput(opt)); + }; + + GlobalModel.prototype._resetOption = function (type, opt) { + var optionChanged = false; + var optionManager = this._optionManager; + + if (!type || type === 'recreate') { + var baseOption = optionManager.mountOption(type === 'recreate'); + + if ("development" !== 'production') { + checkMissingComponents(baseOption); + } + + if (!this.option || type === 'recreate') { + initBase(this, baseOption); + } else { + this.restoreData(); + + this._mergeOption(baseOption, opt); + } + + optionChanged = true; + } + + if (type === 'timeline' || type === 'media') { + this.restoreData(); + } // By design, if `setOption(option2)` at the second time, and `option2` is a `ECUnitOption`, + // it should better not have the same props with `MediaUnit['option']`. + // Becuase either `option2` or `MediaUnit['option']` will be always merged to "current option" + // rather than original "baseOption". If they both override a prop, the result might be + // unexpected when media state changed after `setOption` called. + // If we really need to modify a props in each `MediaUnit['option']`, use the full version + // (`{baseOption, media}`) in `setOption`. + // For `timeline`, the case is the same. + + + if (!type || type === 'recreate' || type === 'timeline') { + var timelineOption = optionManager.getTimelineOption(this); + + if (timelineOption) { + optionChanged = true; + + this._mergeOption(timelineOption, opt); + } + } + + if (!type || type === 'recreate' || type === 'media') { + var mediaOptions = optionManager.getMediaOption(this); + + if (mediaOptions.length) { + each(mediaOptions, function (mediaOption) { + optionChanged = true; + + this._mergeOption(mediaOption, opt); + }, this); + } + } + + return optionChanged; + }; + + GlobalModel.prototype.mergeOption = function (option) { + this._mergeOption(option, null); + }; + + GlobalModel.prototype._mergeOption = function (newOption, opt) { + var option = this.option; + var componentsMap = this._componentsMap; + var componentsCount = this._componentsCount; + var newCmptTypes = []; + var newCmptTypeMap = createHashMap(); + var replaceMergeMainTypeMap = opt && opt.replaceMergeMainTypeMap; + resetSourceDefaulter(this); // If no component class, merge directly. + // For example: color, animaiton options, etc. + + each(newOption, function (componentOption, mainType) { + if (componentOption == null) { + return; + } + + if (!ComponentModel.hasClass(mainType)) { + // globalSettingTask.dirty(); + option[mainType] = option[mainType] == null ? clone(componentOption) : merge(option[mainType], componentOption, true); + } else if (mainType) { + newCmptTypes.push(mainType); + newCmptTypeMap.set(mainType, true); + } + }); + + if (replaceMergeMainTypeMap) { + // If there is a mainType `xxx` in `replaceMerge` but not declared in option, + // we trade it as it is declared in option as `{xxx: []}`. Because: + // (1) for normal merge, `{xxx: null/undefined}` are the same meaning as `{xxx: []}`. + // (2) some preprocessor may convert some of `{xxx: null/undefined}` to `{xxx: []}`. + replaceMergeMainTypeMap.each(function (val, mainTypeInReplaceMerge) { + if (ComponentModel.hasClass(mainTypeInReplaceMerge) && !newCmptTypeMap.get(mainTypeInReplaceMerge)) { + newCmptTypes.push(mainTypeInReplaceMerge); + newCmptTypeMap.set(mainTypeInReplaceMerge, true); + } + }); + } + + ComponentModel.topologicalTravel(newCmptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this); + + function visitComponent(mainType) { + var newCmptOptionList = concatInternalOptions(this, mainType, normalizeToArray(newOption[mainType])); + var oldCmptList = componentsMap.get(mainType); + var mergeMode = // `!oldCmptList` means init. See the comment in `mappingToExists` + !oldCmptList ? 'replaceAll' : replaceMergeMainTypeMap && replaceMergeMainTypeMap.get(mainType) ? 'replaceMerge' : 'normalMerge'; + var mappingResult = mappingToExists(oldCmptList, newCmptOptionList, mergeMode); // Set mainType and complete subType. + + setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel); // Empty it before the travel, in order to prevent `this._componentsMap` + // from being used in the `init`/`mergeOption`/`optionUpdated` of some + // components, which is probably incorrect logic. + + option[mainType] = null; + componentsMap.set(mainType, null); + componentsCount.set(mainType, 0); + var optionsByMainType = []; + var cmptsByMainType = []; + var cmptsCountByMainType = 0; + var tooltipExists; + var tooltipWarningLogged; + each(mappingResult, function (resultItem, index) { + var componentModel = resultItem.existing; + var newCmptOption = resultItem.newOption; + + if (!newCmptOption) { + if (componentModel) { + // Consider where is no new option and should be merged using {}, + // see removeEdgeAndAdd in topologicalTravel and + // ComponentModel.getAllClassMainTypes. + componentModel.mergeOption({}, this); + componentModel.optionUpdated({}, false); + } // If no both `resultItem.exist` and `resultItem.option`, + // either it is in `replaceMerge` and not matched by any id, + // or it has been removed in previous `replaceMerge` and left a "hole" in this component index. + + } else { + var isSeriesType = mainType === 'series'; + var ComponentModelClass = ComponentModel.getClass(mainType, resultItem.keyInfo.subType, !isSeriesType // Give a more detailed warn later if series don't exists + ); + + if (!ComponentModelClass) { + if ("development" !== 'production') { + var subType = resultItem.keyInfo.subType; + var seriesImportName = BUILTIN_CHARTS_MAP[subType]; + + if (!componetsMissingLogPrinted[subType]) { + componetsMissingLogPrinted[subType] = true; + + if (seriesImportName) { + error("Series " + subType + " is used but not imported.\nimport { " + seriesImportName + " } from 'echarts/charts';\necharts.use([" + seriesImportName + "]);"); + } else { + error("Unkown series " + subType); + } + } + } + + return; + } // TODO Before multiple tooltips get supported, we do this check to avoid unexpected exception. + + + if (mainType === 'tooltip') { + if (tooltipExists) { + if ("development" !== 'production') { + if (!tooltipWarningLogged) { + warn('Currently only one tooltip component is allowed.'); + tooltipWarningLogged = true; + } + } + + return; + } + + tooltipExists = true; + } + + if (componentModel && componentModel.constructor === ComponentModelClass) { + componentModel.name = resultItem.keyInfo.name; // componentModel.settingTask && componentModel.settingTask.dirty(); + + componentModel.mergeOption(newCmptOption, this); + componentModel.optionUpdated(newCmptOption, false); + } else { + // PENDING Global as parent ? + var extraOpt = extend({ + componentIndex: index + }, resultItem.keyInfo); + componentModel = new ComponentModelClass(newCmptOption, this, this, extraOpt); // Assign `keyInfo` + + extend(componentModel, extraOpt); + + if (resultItem.brandNew) { + componentModel.__requireNewView = true; + } + + componentModel.init(newCmptOption, this, this); // Call optionUpdated after init. + // newCmptOption has been used as componentModel.option + // and may be merged with theme and default, so pass null + // to avoid confusion. + + componentModel.optionUpdated(null, true); + } + } + + if (componentModel) { + optionsByMainType.push(componentModel.option); + cmptsByMainType.push(componentModel); + cmptsCountByMainType++; + } else { + // Always do assign to avoid elided item in array. + optionsByMainType.push(void 0); + cmptsByMainType.push(void 0); + } + }, this); + option[mainType] = optionsByMainType; + componentsMap.set(mainType, cmptsByMainType); + componentsCount.set(mainType, cmptsCountByMainType); // Backup series for filtering. + + if (mainType === 'series') { + reCreateSeriesIndices(this); + } + } // If no series declared, ensure `_seriesIndices` initialized. + + + if (!this._seriesIndices) { + reCreateSeriesIndices(this); + } + }; + /** + * Get option for output (cloned option and inner info removed) + */ + + + GlobalModel.prototype.getOption = function () { + var option = clone(this.option); + each(option, function (optInMainType, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = normalizeToArray(optInMainType); // Inner cmpts need to be removed. + // Inner cmpts might not be at last since ec5.0, but still + // compatible for users: if inner cmpt at last, splice the returned array. + + var realLen = opts.length; + var metNonInner = false; + + for (var i = realLen - 1; i >= 0; i--) { + // Remove options with inner id. + if (opts[i] && !isComponentIdInternal(opts[i])) { + metNonInner = true; + } else { + opts[i] = null; + !metNonInner && realLen--; + } + } + + opts.length = realLen; + option[mainType] = opts; + } + }); + delete option[OPTION_INNER_KEY]; + return option; + }; + + GlobalModel.prototype.getTheme = function () { + return this._theme; + }; + + GlobalModel.prototype.getLocaleModel = function () { + return this._locale; + }; + + GlobalModel.prototype.setUpdatePayload = function (payload) { + this._payload = payload; + }; + + GlobalModel.prototype.getUpdatePayload = function () { + return this._payload; + }; + /** + * @param idx If not specified, return the first one. + */ + + + GlobalModel.prototype.getComponent = function (mainType, idx) { + var list = this._componentsMap.get(mainType); + + if (list) { + var cmpt = list[idx || 0]; + + if (cmpt) { + return cmpt; + } else if (idx == null) { + for (var i = 0; i < list.length; i++) { + if (list[i]) { + return list[i]; + } + } + } + } + }; + /** + * @return Never be null/undefined. + */ + + + GlobalModel.prototype.queryComponents = function (condition) { + var mainType = condition.mainType; + + if (!mainType) { + return []; + } + + var index = condition.index; + var id = condition.id; + var name = condition.name; + + var cmpts = this._componentsMap.get(mainType); + + if (!cmpts || !cmpts.length) { + return []; + } + + var result; + + if (index != null) { + result = []; + each(normalizeToArray(index), function (idx) { + cmpts[idx] && result.push(cmpts[idx]); + }); + } else if (id != null) { + result = queryByIdOrName('id', id, cmpts); + } else if (name != null) { + result = queryByIdOrName('name', name, cmpts); + } else { + // Return all non-empty components in that mainType + result = filter(cmpts, function (cmpt) { + return !!cmpt; + }); + } + + return filterBySubType(result, condition); + }; + /** + * The interface is different from queryComponents, + * which is convenient for inner usage. + * + * @usage + * let result = findComponents( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}} + * ); + * let result = findComponents( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}} + * ); + * let result = findComponents( + * {mainType: 'series', + * filter: function (model, index) {...}} + * ); + * // result like [component0, componnet1, ...] + */ + + + GlobalModel.prototype.findComponents = function (condition) { + var query = condition.query; + var mainType = condition.mainType; + var queryCond = getQueryCond(query); + var result = queryCond ? this.queryComponents(queryCond) // Retrieve all non-empty components. + : filter(this._componentsMap.get(mainType), function (cmpt) { + return !!cmpt; + }); + return doFilter(filterBySubType(result, condition)); + + function getQueryCond(q) { + var indexAttr = mainType + 'Index'; + var idAttr = mainType + 'Id'; + var nameAttr = mainType + 'Name'; + return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? { + mainType: mainType, + // subType will be filtered finally. + index: q[indexAttr], + id: q[idAttr], + name: q[nameAttr] + } : null; + } + + function doFilter(res) { + return condition.filter ? filter(res, condition.filter) : res; + } + }; + + GlobalModel.prototype.eachComponent = function (mainType, cb, context) { + var componentsMap = this._componentsMap; + + if (isFunction(mainType)) { + var ctxForAll_1 = cb; + var cbForAll_1 = mainType; + componentsMap.each(function (cmpts, componentType) { + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cbForAll_1.call(ctxForAll_1, componentType, cmpt, cmpt.componentIndex); + } + }); + } else { + var cmpts = isString(mainType) ? componentsMap.get(mainType) : isObject(mainType) ? this.findComponents(mainType) : null; + + for (var i = 0; cmpts && i < cmpts.length; i++) { + var cmpt = cmpts[i]; + cmpt && cb.call(context, cmpt, cmpt.componentIndex); + } + } + }; + /** + * Get series list before filtered by name. + */ + + + GlobalModel.prototype.getSeriesByName = function (name) { + var nameStr = convertOptionIdName(name, null); + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries && nameStr != null && oneSeries.name === nameStr; + }); + }; + /** + * Get series list before filtered by index. + */ + + + GlobalModel.prototype.getSeriesByIndex = function (seriesIndex) { + return this._componentsMap.get('series')[seriesIndex]; + }; + /** + * Get series list before filtered by type. + * FIXME: rename to getRawSeriesByType? + */ + + + GlobalModel.prototype.getSeriesByType = function (subType) { + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries && oneSeries.subType === subType; + }); + }; + /** + * Get all series before filtered. + */ + + + GlobalModel.prototype.getSeries = function () { + return filter(this._componentsMap.get('series'), function (oneSeries) { + return !!oneSeries; + }); + }; + /** + * Count series before filtered. + */ + + + GlobalModel.prototype.getSeriesCount = function () { + return this._componentsCount.get('series'); + }; + /** + * After filtering, series may be different + * frome raw series. + */ + + + GlobalModel.prototype.eachSeries = function (cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + + cb.call(context, series, rawSeriesIndex); + }, this); + }; + /** + * Iterate raw series before filtered. + * + * @param {Function} cb + * @param {*} context + */ + + + GlobalModel.prototype.eachRawSeries = function (cb, context) { + each(this._componentsMap.get('series'), function (series) { + series && cb.call(context, series, series.componentIndex); + }); + }; + /** + * After filtering, series may be different. + * frome raw series. + */ + + + GlobalModel.prototype.eachSeriesByType = function (subType, cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }; + /** + * Iterate raw series before filtered of given type. + */ + + + GlobalModel.prototype.eachRawSeriesByType = function (subType, cb, context) { + return each(this.getSeriesByType(subType), cb, context); + }; + + GlobalModel.prototype.isSeriesFiltered = function (seriesModel) { + assertSeriesInitialized(this); + return this._seriesIndicesMap.get(seriesModel.componentIndex) == null; + }; + + GlobalModel.prototype.getCurrentSeriesIndices = function () { + return (this._seriesIndices || []).slice(); + }; + + GlobalModel.prototype.filterSeries = function (cb, context) { + assertSeriesInitialized(this); + var newSeriesIndices = []; + each(this._seriesIndices, function (seriesRawIdx) { + var series = this._componentsMap.get('series')[seriesRawIdx]; + + cb.call(context, series, seriesRawIdx) && newSeriesIndices.push(seriesRawIdx); + }, this); + this._seriesIndices = newSeriesIndices; + this._seriesIndicesMap = createHashMap(newSeriesIndices); + }; + + GlobalModel.prototype.restoreData = function (payload) { + reCreateSeriesIndices(this); + var componentsMap = this._componentsMap; + var componentTypes = []; + componentsMap.each(function (components, componentType) { + if (ComponentModel.hasClass(componentType)) { + componentTypes.push(componentType); + } + }); + ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function (componentType) { + each(componentsMap.get(componentType), function (component) { + if (component && (componentType !== 'series' || !isNotTargetSeries(component, payload))) { + component.restoreData(); + } + }); + }); + }; + + GlobalModel.internalField = function () { + reCreateSeriesIndices = function (ecModel) { + var seriesIndices = ecModel._seriesIndices = []; + each(ecModel._componentsMap.get('series'), function (series) { + // series may have been removed by `replaceMerge`. + series && seriesIndices.push(series.componentIndex); + }); + ecModel._seriesIndicesMap = createHashMap(seriesIndices); + }; + + assertSeriesInitialized = function (ecModel) { + // Components that use _seriesIndices should depends on series component, + // which make sure that their initialization is after series. + if ("development" !== 'production') { + if (!ecModel._seriesIndices) { + throw new Error('Option should contains series.'); + } + } + }; + + initBase = function (ecModel, baseOption) { + // Using OPTION_INNER_KEY to mark that this option can not be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbiden. + ecModel.option = {}; + ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE; // Init with series: [], in case of calling findSeries method + // before series initialized. + + ecModel._componentsMap = createHashMap({ + series: [] + }); + ecModel._componentsCount = createHashMap(); // If user spefied `option.aria`, aria will be enable. This detection should be + // performed before theme and globalDefault merge. + + var airaOption = baseOption.aria; + + if (isObject(airaOption) && airaOption.enabled == null) { + airaOption.enabled = true; + } + + mergeTheme(baseOption, ecModel._theme.option); // TODO Needs clone when merging to the unexisted property + + merge(baseOption, globalDefault, false); + + ecModel._mergeOption(baseOption, null); + }; + }(); + + return GlobalModel; + }(Model); + + function isNotTargetSeries(seriesModel, payload) { + if (payload) { + var index = payload.seriesIndex; + var id = payload.seriesId; + var name_1 = payload.seriesName; + return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name_1 != null && seriesModel.name !== name_1; + } + } + + function mergeTheme(option, theme) { + // PENDING + // NOT use `colorLayer` in theme if option has `color` + var notMergeColorLayer = option.color && !option.colorLayer; + each(theme, function (themeItem, name) { + if (name === 'colorLayer' && notMergeColorLayer) { + return; + } // If it is component model mainType, the model handles that merge later. + // otherwise, merge them here. + + + if (!ComponentModel.hasClass(name)) { + if (typeof themeItem === 'object') { + option[name] = !option[name] ? clone(themeItem) : merge(option[name], themeItem, false); + } else { + if (option[name] == null) { + option[name] = themeItem; + } + } + } + }); + } + + function queryByIdOrName(attr, idOrName, cmpts) { + // Here is a break from echarts4: string and number are + // treated as equal. + if (isArray(idOrName)) { + var keyMap_1 = createHashMap(); + each(idOrName, function (idOrNameItem) { + if (idOrNameItem != null) { + var idName = convertOptionIdName(idOrNameItem, null); + idName != null && keyMap_1.set(idOrNameItem, true); + } + }); + return filter(cmpts, function (cmpt) { + return cmpt && keyMap_1.get(cmpt[attr]); + }); + } else { + var idName_1 = convertOptionIdName(idOrName, null); + return filter(cmpts, function (cmpt) { + return cmpt && idName_1 != null && cmpt[attr] === idName_1; + }); + } + } + + function filterBySubType(components, condition) { + // Using hasOwnProperty for restrict. Consider + // subType is undefined in user payload. + return condition.hasOwnProperty('subType') ? filter(components, function (cmpt) { + return cmpt && cmpt.subType === condition.subType; + }) : components; + } + + function normalizeSetOptionInput(opts) { + var replaceMergeMainTypeMap = createHashMap(); + opts && each(normalizeToArray(opts.replaceMerge), function (mainType) { + if ("development" !== 'production') { + assert(ComponentModel.hasClass(mainType), '"' + mainType + '" is not valid component main type in "replaceMerge"'); + } + + replaceMergeMainTypeMap.set(mainType, true); + }); + return { + replaceMergeMainTypeMap: replaceMergeMainTypeMap + }; + } + + mixin(GlobalModel, PaletteMixin); + + var availableMethods = ['getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isSSR', 'isDisposed', 'on', 'off', 'getDataURL', 'getConnectedDataURL', // 'getModel', + 'getOption', // 'getViewOfComponentModel', + // 'getViewOfSeriesModel', + 'getId', 'updateLabelLayout']; + + var ExtensionAPI = + /** @class */ + function () { + function ExtensionAPI(ecInstance) { + each(availableMethods, function (methodName) { + this[methodName] = bind(ecInstance[methodName], ecInstance); + }, this); + } + + return ExtensionAPI; + }(); + + var coordinateSystemCreators = {}; + + var CoordinateSystemManager = + /** @class */ + function () { + function CoordinateSystemManager() { + this._coordinateSystems = []; + } + + CoordinateSystemManager.prototype.create = function (ecModel, api) { + var coordinateSystems = []; + each(coordinateSystemCreators, function (creater, type) { + var list = creater.create(ecModel, api); + coordinateSystems = coordinateSystems.concat(list || []); + }); + this._coordinateSystems = coordinateSystems; + }; + + CoordinateSystemManager.prototype.update = function (ecModel, api) { + each(this._coordinateSystems, function (coordSys) { + coordSys.update && coordSys.update(ecModel, api); + }); + }; + + CoordinateSystemManager.prototype.getCoordinateSystems = function () { + return this._coordinateSystems.slice(); + }; + + CoordinateSystemManager.register = function (type, creator) { + coordinateSystemCreators[type] = creator; + }; + + CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; + }; + + return CoordinateSystemManager; + }(); + + var QUERY_REG = /^(min|max)?(.+)$/; // Key: mainType + // type FakeComponentsMap = HashMap<(MappingExistingItem & { subType: string })[]>; + + /** + * TERM EXPLANATIONS: + * See `ECOption` and `ECUnitOption` in `src/util/types.ts`. + */ + + var OptionManager = + /** @class */ + function () { + // timeline.notMerge is not supported in ec3. Firstly there is rearly + // case that notMerge is needed. Secondly supporting 'notMerge' requires + // rawOption cloned and backuped when timeline changed, which does no + // good to performance. What's more, that both timeline and setOption + // method supply 'notMerge' brings complex and some problems. + // Consider this case: + // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false); + // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false); + function OptionManager(api) { + this._timelineOptions = []; + this._mediaList = []; + /** + * -1, means default. + * empty means no media. + */ + + this._currentMediaIndices = []; + this._api = api; + } + + OptionManager.prototype.setOption = function (rawOption, optionPreprocessorFuncs, opt) { + if (rawOption) { + // That set dat primitive is dangerous if user reuse the data when setOption again. + each(normalizeToArray(rawOption.series), function (series) { + series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data); + }); + each(normalizeToArray(rawOption.dataset), function (dataset) { + dataset && dataset.source && isTypedArray(dataset.source) && setAsPrimitive(dataset.source); + }); + } // Caution: some series modify option data, if do not clone, + // it should ensure that the repeat modify correctly + // (create a new object when modify itself). + + + rawOption = clone(rawOption); // FIXME + // If some property is set in timeline options or media option but + // not set in baseOption, a warning should be given. + + var optionBackup = this._optionBackup; + var newParsedOption = parseRawOption(rawOption, optionPreprocessorFuncs, !optionBackup); + this._newBaseOption = newParsedOption.baseOption; // For setOption at second time (using merge mode); + + if (optionBackup) { + // FIXME + // the restore merge solution is essentially incorrect. + // the mapping can not be 100% consistent with ecModel, which probably brings + // potential bug! + // The first merge is delayed, becuase in most cases, users do not call `setOption` twice. + // let fakeCmptsMap = this._fakeCmptsMap; + // if (!fakeCmptsMap) { + // fakeCmptsMap = this._fakeCmptsMap = createHashMap(); + // mergeToBackupOption(fakeCmptsMap, null, optionBackup.baseOption, null); + // } + // mergeToBackupOption( + // fakeCmptsMap, optionBackup.baseOption, newParsedOption.baseOption, opt + // ); + // For simplicity, timeline options and media options do not support merge, + // that is, if you `setOption` twice and both has timeline options, the latter + // timeline opitons will not be merged to the formers, but just substitude them. + if (newParsedOption.timelineOptions.length) { + optionBackup.timelineOptions = newParsedOption.timelineOptions; + } + + if (newParsedOption.mediaList.length) { + optionBackup.mediaList = newParsedOption.mediaList; + } + + if (newParsedOption.mediaDefault) { + optionBackup.mediaDefault = newParsedOption.mediaDefault; + } + } else { + this._optionBackup = newParsedOption; + } + }; + + OptionManager.prototype.mountOption = function (isRecreate) { + var optionBackup = this._optionBackup; + this._timelineOptions = optionBackup.timelineOptions; + this._mediaList = optionBackup.mediaList; + this._mediaDefault = optionBackup.mediaDefault; + this._currentMediaIndices = []; + return clone(isRecreate // this._optionBackup.baseOption, which is created at the first `setOption` + // called, and is merged into every new option by inner method `mergeToBackupOption` + // each time `setOption` called, can be only used in `isRecreate`, because + // its reliability is under suspicion. In other cases option merge is + // performed by `model.mergeOption`. + ? optionBackup.baseOption : this._newBaseOption); + }; + + OptionManager.prototype.getTimelineOption = function (ecModel) { + var option; + var timelineOptions = this._timelineOptions; + + if (timelineOptions.length) { + // getTimelineOption can only be called after ecModel inited, + // so we can get currentIndex from timelineModel. + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel) { + option = clone( // FIXME:TS as TimelineModel or quivlant interface + timelineOptions[timelineModel.getCurrentIndex()]); + } + } + + return option; + }; + + OptionManager.prototype.getMediaOption = function (ecModel) { + var ecWidth = this._api.getWidth(); + + var ecHeight = this._api.getHeight(); + + var mediaList = this._mediaList; + var mediaDefault = this._mediaDefault; + var indices = []; + var result = []; // No media defined. + + if (!mediaList.length && !mediaDefault) { + return result; + } // Multi media may be applied, the latter defined media has higher priority. + + + for (var i = 0, len = mediaList.length; i < len; i++) { + if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { + indices.push(i); + } + } // FIXME + // Whether mediaDefault should force users to provide? Otherwise + // the change by media query can not be recorvered. + + + if (!indices.length && mediaDefault) { + indices = [-1]; + } + + if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { + result = map(indices, function (index) { + return clone(index === -1 ? mediaDefault.option : mediaList[index].option); + }); + } // Otherwise return nothing. + + + this._currentMediaIndices = indices; + return result; + }; + + return OptionManager; + }(); + + /** + * [RAW_OPTION_PATTERNS] + * (Note: "series: []" represents all other props in `ECUnitOption`) + * + * (1) No prop "baseOption" declared: + * Root option is used as "baseOption" (except prop "options" and "media"). + * ```js + * option = { + * series: [], + * timeline: {}, + * options: [], + * }; + * option = { + * series: [], + * media: {}, + * }; + * option = { + * series: [], + * timeline: {}, + * options: [], + * media: {}, + * } + * ``` + * + * (2) Prop "baseOption" declared: + * If "baseOption" declared, `ECUnitOption` props can only be declared + * inside "baseOption" except prop "timeline" (compat ec2). + * ```js + * option = { + * baseOption: { + * timeline: {}, + * series: [], + * }, + * options: [] + * }; + * option = { + * baseOption: { + * series: [], + * }, + * media: [] + * }; + * option = { + * baseOption: { + * timeline: {}, + * series: [], + * }, + * options: [] + * media: [] + * }; + * option = { + * // ec3 compat ec2: allow (only) `timeline` declared + * // outside baseOption. Keep this setting for compat. + * timeline: {}, + * baseOption: { + * series: [], + * }, + * options: [], + * media: [] + * }; + * ``` + */ + + + function parseRawOption( // `rawOption` May be modified + rawOption, optionPreprocessorFuncs, isNew) { + var mediaList = []; + var mediaDefault; + var baseOption; + var declaredBaseOption = rawOption.baseOption; // Compatible with ec2, [RAW_OPTION_PATTERNS] above. + + var timelineOnRoot = rawOption.timeline; + var timelineOptionsOnRoot = rawOption.options; + var mediaOnRoot = rawOption.media; + var hasMedia = !!rawOption.media; + var hasTimeline = !!(timelineOptionsOnRoot || timelineOnRoot || declaredBaseOption && declaredBaseOption.timeline); + + if (declaredBaseOption) { + baseOption = declaredBaseOption; // For merge option. + + if (!baseOption.timeline) { + baseOption.timeline = timelineOnRoot; + } + } // For convenience, enable to use the root option as the `baseOption`: + // `{ ...normalOptionProps, media: [{ ... }, { ... }] }` + else { + if (hasTimeline || hasMedia) { + rawOption.options = rawOption.media = null; + } + + baseOption = rawOption; + } + + if (hasMedia) { + if (isArray(mediaOnRoot)) { + each(mediaOnRoot, function (singleMedia) { + if ("development" !== 'production') { + // Real case of wrong config. + if (singleMedia && !singleMedia.option && isObject(singleMedia.query) && isObject(singleMedia.query.option)) { + error('Illegal media option. Must be like { media: [ { query: {}, option: {} } ] }'); + } + } + + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } else if (!mediaDefault) { + // Use the first media default. + mediaDefault = singleMedia; + } + } + }); + } else { + if ("development" !== 'production') { + // Real case of wrong config. + error('Illegal media option. Must be an array. Like { media: [ {...}, {...} ] }'); + } + } + } + + doPreprocess(baseOption); + each(timelineOptionsOnRoot, function (option) { + return doPreprocess(option); + }); + each(mediaList, function (media) { + return doPreprocess(media.option); + }); + + function doPreprocess(option) { + each(optionPreprocessorFuncs, function (preProcess) { + preProcess(option, isNew); + }); + } + + return { + baseOption: baseOption, + timelineOptions: timelineOptionsOnRoot || [], + mediaDefault: mediaDefault, + mediaList: mediaList + }; + } + + /** + * @see + * Support: width, height, aspectRatio + * Can use max or min as prefix. + */ + + + function applyMediaQuery(query, ecWidth, ecHeight) { + var realMap = { + width: ecWidth, + height: ecHeight, + aspectratio: ecWidth / ecHeight // lowser case for convenientce. + + }; + var applicatable = true; + each(query, function (value, attr) { + var matched = attr.match(QUERY_REG); + + if (!matched || !matched[1] || !matched[2]) { + return; + } + + var operator = matched[1]; + var realAttr = matched[2].toLowerCase(); + + if (!compare(realMap[realAttr], value, operator)) { + applicatable = false; + } + }); + return applicatable; + } + + function compare(real, expect, operator) { + if (operator === 'min') { + return real >= expect; + } else if (operator === 'max') { + return real <= expect; + } else { + // Equals + return real === expect; + } + } + + function indicesEquals(indices1, indices2) { + // indices is always order by asc and has only finite number. + return indices1.join(',') === indices2.join(','); + } + + var each$2 = each; + var isObject$1 = isObject; + var POSSIBLE_STYLES = ['areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', 'chordStyle', 'label', 'labelLine']; + + function compatEC2ItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + + if (!itemStyleOpt) { + return; + } + + for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) { + var styleName = POSSIBLE_STYLES[i]; + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + if ("development" !== 'production') { + deprecateReplaceLog("itemStyle.normal." + styleName, styleName); + } + + opt[styleName] = opt[styleName] || {}; + + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } else { + merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + + normalItemStyleOpt[styleName] = null; + } + + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + if ("development" !== 'production') { + deprecateReplaceLog("itemStyle.emphasis." + styleName, "emphasis." + styleName); + } + + opt[styleName] = opt[styleName] || {}; + + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } else { + merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + + emphasisItemStyleOpt[styleName] = null; + } + } + } + + function convertNormalEmphasis(opt, optType, useExtend) { + if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) { + var normalOpt = opt[optType].normal; + var emphasisOpt = opt[optType].emphasis; + + if (normalOpt) { + if ("development" !== 'production') { + // eslint-disable-next-line max-len + deprecateLog("'normal' hierarchy in " + optType + " has been removed since 4.0. All style properties are configured in " + optType + " directly now."); + } // Timeline controlStyle has other properties besides normal and emphasis + + + if (useExtend) { + opt[optType].normal = opt[optType].emphasis = null; + defaults(opt[optType], normalOpt); + } else { + opt[optType] = normalOpt; + } + } + + if (emphasisOpt) { + if ("development" !== 'production') { + deprecateLog(optType + ".emphasis has been changed to emphasis." + optType + " since 4.0"); + } + + opt.emphasis = opt.emphasis || {}; + opt.emphasis[optType] = emphasisOpt; // Also compat the case user mix the style and focus together in ec3 style + // for example: { itemStyle: { normal: {}, emphasis: {focus, shadowBlur} } } + + if (emphasisOpt.focus) { + opt.emphasis.focus = emphasisOpt.focus; + } + + if (emphasisOpt.blurScope) { + opt.emphasis.blurScope = emphasisOpt.blurScope; + } + } + } + } + + function removeEC3NormalStatus(opt) { + convertNormalEmphasis(opt, 'itemStyle'); + convertNormalEmphasis(opt, 'lineStyle'); + convertNormalEmphasis(opt, 'areaStyle'); + convertNormalEmphasis(opt, 'label'); + convertNormalEmphasis(opt, 'labelLine'); // treemap + + convertNormalEmphasis(opt, 'upperLabel'); // graph + + convertNormalEmphasis(opt, 'edgeLabel'); + } + + function compatTextStyle(opt, propName) { + // Check whether is not object (string\null\undefined ...) + var labelOptSingle = isObject$1(opt) && opt[propName]; + var textStyle = isObject$1(labelOptSingle) && labelOptSingle.textStyle; + + if (textStyle) { + if ("development" !== 'production') { + // eslint-disable-next-line max-len + deprecateLog("textStyle hierarchy in " + propName + " has been removed since 4.0. All textStyle properties are configured in " + propName + " directly now."); + } + + for (var i = 0, len = TEXT_STYLE_OPTIONS.length; i < len; i++) { + var textPropName = TEXT_STYLE_OPTIONS[i]; + + if (textStyle.hasOwnProperty(textPropName)) { + labelOptSingle[textPropName] = textStyle[textPropName]; + } + } + } + } + + function compatEC3CommonStyles(opt) { + if (opt) { + removeEC3NormalStatus(opt); + compatTextStyle(opt, 'label'); + opt.emphasis && compatTextStyle(opt.emphasis, 'label'); + } + } + + function processSeries(seriesOpt) { + if (!isObject$1(seriesOpt)) { + return; + } + + compatEC2ItemStyle(seriesOpt); + removeEC3NormalStatus(seriesOpt); + compatTextStyle(seriesOpt, 'label'); // treemap + + compatTextStyle(seriesOpt, 'upperLabel'); // graph + + compatTextStyle(seriesOpt, 'edgeLabel'); + + if (seriesOpt.emphasis) { + compatTextStyle(seriesOpt.emphasis, 'label'); // treemap + + compatTextStyle(seriesOpt.emphasis, 'upperLabel'); // graph + + compatTextStyle(seriesOpt.emphasis, 'edgeLabel'); + } + + var markPoint = seriesOpt.markPoint; + + if (markPoint) { + compatEC2ItemStyle(markPoint); + compatEC3CommonStyles(markPoint); + } + + var markLine = seriesOpt.markLine; + + if (markLine) { + compatEC2ItemStyle(markLine); + compatEC3CommonStyles(markLine); + } + + var markArea = seriesOpt.markArea; + + if (markArea) { + compatEC3CommonStyles(markArea); + } + + var data = seriesOpt.data; // Break with ec3: if `setOption` again, there may be no `type` in option, + // then the backward compat based on option type will not be performed. + + if (seriesOpt.type === 'graph') { + data = data || seriesOpt.nodes; + var edgeData = seriesOpt.links || seriesOpt.edges; + + if (edgeData && !isTypedArray(edgeData)) { + for (var i = 0; i < edgeData.length; i++) { + compatEC3CommonStyles(edgeData[i]); + } + } + + each(seriesOpt.categories, function (opt) { + removeEC3NormalStatus(opt); + }); + } + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatEC3CommonStyles(data[i]); + } + } // mark point data + + + markPoint = seriesOpt.markPoint; + + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + + for (var i = 0; i < mpData.length; i++) { + compatEC3CommonStyles(mpData[i]); + } + } // mark line data + + + markLine = seriesOpt.markLine; + + if (markLine && markLine.data) { + var mlData = markLine.data; + + for (var i = 0; i < mlData.length; i++) { + if (isArray(mlData[i])) { + compatEC3CommonStyles(mlData[i][0]); + compatEC3CommonStyles(mlData[i][1]); + } else { + compatEC3CommonStyles(mlData[i]); + } + } + } // Series + + + if (seriesOpt.type === 'gauge') { + compatTextStyle(seriesOpt, 'axisLabel'); + compatTextStyle(seriesOpt, 'title'); + compatTextStyle(seriesOpt, 'detail'); + } else if (seriesOpt.type === 'treemap') { + convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle'); + each(seriesOpt.levels, function (opt) { + removeEC3NormalStatus(opt); + }); + } else if (seriesOpt.type === 'tree') { + removeEC3NormalStatus(seriesOpt.leaves); + } // sunburst starts from ec4, so it does not need to compat levels. + + } + + function toArr(o) { + return isArray(o) ? o : o ? [o] : []; + } + + function toObj(o) { + return (isArray(o) ? o[0] : o) || {}; + } + + function globalCompatStyle(option, isTheme) { + each$2(toArr(option.series), function (seriesOpt) { + isObject$1(seriesOpt) && processSeries(seriesOpt); + }); + var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar']; + isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis'); + each$2(axes, function (axisName) { + each$2(toArr(option[axisName]), function (axisOpt) { + if (axisOpt) { + compatTextStyle(axisOpt, 'axisLabel'); + compatTextStyle(axisOpt.axisPointer, 'label'); + } + }); + }); + each$2(toArr(option.parallel), function (parallelOpt) { + var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault; + compatTextStyle(parallelAxisDefault, 'axisLabel'); + compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, 'label'); + }); + each$2(toArr(option.calendar), function (calendarOpt) { + convertNormalEmphasis(calendarOpt, 'itemStyle'); + compatTextStyle(calendarOpt, 'dayLabel'); + compatTextStyle(calendarOpt, 'monthLabel'); + compatTextStyle(calendarOpt, 'yearLabel'); + }); // radar.name.textStyle + + each$2(toArr(option.radar), function (radarOpt) { + compatTextStyle(radarOpt, 'name'); // Use axisName instead of name because component has name property + + if (radarOpt.name && radarOpt.axisName == null) { + radarOpt.axisName = radarOpt.name; + delete radarOpt.name; + + if ("development" !== 'production') { + deprecateLog('name property in radar component has been changed to axisName'); + } + } + + if (radarOpt.nameGap != null && radarOpt.axisNameGap == null) { + radarOpt.axisNameGap = radarOpt.nameGap; + delete radarOpt.nameGap; + + if ("development" !== 'production') { + deprecateLog('nameGap property in radar component has been changed to axisNameGap'); + } + } + + if ("development" !== 'production') { + each$2(radarOpt.indicator, function (indicatorOpt) { + if (indicatorOpt.text) { + deprecateReplaceLog('text', 'name', 'radar.indicator'); + } + }); + } + }); + each$2(toArr(option.geo), function (geoOpt) { + if (isObject$1(geoOpt)) { + compatEC3CommonStyles(geoOpt); + each$2(toArr(geoOpt.regions), function (regionObj) { + compatEC3CommonStyles(regionObj); + }); + } + }); + each$2(toArr(option.timeline), function (timelineOpt) { + compatEC3CommonStyles(timelineOpt); + convertNormalEmphasis(timelineOpt, 'label'); + convertNormalEmphasis(timelineOpt, 'itemStyle'); + convertNormalEmphasis(timelineOpt, 'controlStyle', true); + var data = timelineOpt.data; + isArray(data) && each(data, function (item) { + if (isObject(item)) { + convertNormalEmphasis(item, 'label'); + convertNormalEmphasis(item, 'itemStyle'); + } + }); + }); + each$2(toArr(option.toolbox), function (toolboxOpt) { + convertNormalEmphasis(toolboxOpt, 'iconStyle'); + each$2(toolboxOpt.feature, function (featureOpt) { + convertNormalEmphasis(featureOpt, 'iconStyle'); + }); + }); + compatTextStyle(toObj(option.axisPointer), 'label'); + compatTextStyle(toObj(option.tooltip).axisPointer, 'label'); // Clean logs + // storedLogs = {}; + } + + function get(opt, path) { + var pathArr = path.split(','); + var obj = opt; + + for (var i = 0; i < pathArr.length; i++) { + obj = obj && obj[pathArr[i]]; + + if (obj == null) { + break; + } + } + + return obj; + } + + function set$1(opt, path, val, overwrite) { + var pathArr = path.split(','); + var obj = opt; + var key; + var i = 0; + + for (; i < pathArr.length - 1; i++) { + key = pathArr[i]; + + if (obj[key] == null) { + obj[key] = {}; + } + + obj = obj[key]; + } + + if (overwrite || obj[pathArr[i]] == null) { + obj[pathArr[i]] = val; + } + } + + function compatLayoutProperties(option) { + option && each(LAYOUT_PROPERTIES, function (prop) { + if (prop[0] in option && !(prop[1] in option)) { + option[prop[1]] = option[prop[0]]; + } + }); + } + + var LAYOUT_PROPERTIES = [['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']]; + var COMPATITABLE_COMPONENTS = ['grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline']; + var BAR_ITEM_STYLE_MAP = [['borderRadius', 'barBorderRadius'], ['borderColor', 'barBorderColor'], ['borderWidth', 'barBorderWidth']]; + + function compatBarItemStyle(option) { + var itemStyle = option && option.itemStyle; + + if (itemStyle) { + for (var i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) { + var oldName = BAR_ITEM_STYLE_MAP[i][1]; + var newName = BAR_ITEM_STYLE_MAP[i][0]; + + if (itemStyle[oldName] != null) { + itemStyle[newName] = itemStyle[oldName]; + + if ("development" !== 'production') { + deprecateReplaceLog(oldName, newName); + } + } + } + } + } + + function compatPieLabel(option) { + if (!option) { + return; + } + + if (option.alignTo === 'edge' && option.margin != null && option.edgeDistance == null) { + if ("development" !== 'production') { + deprecateReplaceLog('label.margin', 'label.edgeDistance', 'pie'); + } + + option.edgeDistance = option.margin; + } + } + + function compatSunburstState(option) { + if (!option) { + return; + } + + if (option.downplay && !option.blur) { + option.blur = option.downplay; + + if ("development" !== 'production') { + deprecateReplaceLog('downplay', 'blur', 'sunburst'); + } + } + } + + function compatGraphFocus(option) { + if (!option) { + return; + } + + if (option.focusNodeAdjacency != null) { + option.emphasis = option.emphasis || {}; + + if (option.emphasis.focus == null) { + if ("development" !== 'production') { + deprecateReplaceLog('focusNodeAdjacency', 'emphasis: { focus: \'adjacency\'}', 'graph/sankey'); + } + + option.emphasis.focus = 'adjacency'; + } + } + } + + function traverseTree(data, cb) { + if (data) { + for (var i = 0; i < data.length; i++) { + cb(data[i]); + data[i] && traverseTree(data[i].children, cb); + } + } + } + + function globalBackwardCompat(option, isTheme) { + globalCompatStyle(option, isTheme); // Make sure series array for model initialization. + + option.series = normalizeToArray(option.series); + each(option.series, function (seriesOpt) { + if (!isObject(seriesOpt)) { + return; + } + + var seriesType = seriesOpt.type; + + if (seriesType === 'line') { + if (seriesOpt.clipOverflow != null) { + seriesOpt.clip = seriesOpt.clipOverflow; + + if ("development" !== 'production') { + deprecateReplaceLog('clipOverflow', 'clip', 'line'); + } + } + } else if (seriesType === 'pie' || seriesType === 'gauge') { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + + if ("development" !== 'production') { + deprecateReplaceLog('clockWise', 'clockwise'); + } + } + + compatPieLabel(seriesOpt.label); + var data = seriesOpt.data; + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatPieLabel(data[i]); + } + } + + if (seriesOpt.hoverOffset != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (seriesOpt.emphasis.scaleSize = null) { + if ("development" !== 'production') { + deprecateReplaceLog('hoverOffset', 'emphasis.scaleSize'); + } + + seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset; + } + } + } else if (seriesType === 'gauge') { + var pointerColor = get(seriesOpt, 'pointer.color'); + pointerColor != null && set$1(seriesOpt, 'itemStyle.color', pointerColor); + } else if (seriesType === 'bar') { + compatBarItemStyle(seriesOpt); + compatBarItemStyle(seriesOpt.backgroundStyle); + compatBarItemStyle(seriesOpt.emphasis); + var data = seriesOpt.data; + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + if (typeof data[i] === 'object') { + compatBarItemStyle(data[i]); + compatBarItemStyle(data[i] && data[i].emphasis); + } + } + } + } else if (seriesType === 'sunburst') { + var highlightPolicy = seriesOpt.highlightPolicy; + + if (highlightPolicy) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (!seriesOpt.emphasis.focus) { + seriesOpt.emphasis.focus = highlightPolicy; + + if ("development" !== 'production') { + deprecateReplaceLog('highlightPolicy', 'emphasis.focus', 'sunburst'); + } + } + } + + compatSunburstState(seriesOpt); + traverseTree(seriesOpt.data, compatSunburstState); + } else if (seriesType === 'graph' || seriesType === 'sankey') { + compatGraphFocus(seriesOpt); // TODO nodes, edges? + } else if (seriesType === 'map') { + if (seriesOpt.mapType && !seriesOpt.map) { + if ("development" !== 'production') { + deprecateReplaceLog('mapType', 'map', 'map'); + } + + seriesOpt.map = seriesOpt.mapType; + } + + if (seriesOpt.mapLocation) { + if ("development" !== 'production') { + deprecateLog('`mapLocation` is not used anymore.'); + } + + defaults(seriesOpt, seriesOpt.mapLocation); + } + } + + if (seriesOpt.hoverAnimation != null) { + seriesOpt.emphasis = seriesOpt.emphasis || {}; + + if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) { + if ("development" !== 'production') { + deprecateReplaceLog('hoverAnimation', 'emphasis.scale'); + } + + seriesOpt.emphasis.scale = seriesOpt.hoverAnimation; + } + } + + compatLayoutProperties(seriesOpt); + }); // dataRange has changed to visualMap + + if (option.dataRange) { + option.visualMap = option.dataRange; + } + + each(COMPATITABLE_COMPONENTS, function (componentName) { + var options = option[componentName]; + + if (options) { + if (!isArray(options)) { + options = [options]; + } + + each(options, function (option) { + compatLayoutProperties(option); + }); + } + }); + } + + // data processing stage is blocked in stream. + // See + // (2) Only register once when import repeatly. + // Should be executed after series filtered and before stack calculation. + + function dataStack(ecModel) { + var stackInfoMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var stack = seriesModel.get('stack'); // Compatibal: when `stack` is set as '', do not stack. + + if (stack) { + var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []); + var data = seriesModel.getData(); + var stackInfo = { + // Used for calculate axis extent automatically. + // TODO: Type getCalculationInfo return more specific type? + stackResultDimension: data.getCalculationInfo('stackResultDimension'), + stackedOverDimension: data.getCalculationInfo('stackedOverDimension'), + stackedDimension: data.getCalculationInfo('stackedDimension'), + stackedByDimension: data.getCalculationInfo('stackedByDimension'), + isStackedByIndex: data.getCalculationInfo('isStackedByIndex'), + data: data, + seriesModel: seriesModel + }; // If stacked on axis that do not support data stack. + + if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) { + return; + } + + stackInfoList.length && data.setCalculationInfo('stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel); + stackInfoList.push(stackInfo); + } + }); + stackInfoMap.each(calculateStack); + } + + function calculateStack(stackInfoList) { + each(stackInfoList, function (targetStackInfo, idxInStack) { + var resultVal = []; + var resultNaN = [NaN, NaN]; + var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension]; + var targetData = targetStackInfo.data; + var isStackedByIndex = targetStackInfo.isStackedByIndex; // Should not write on raw data, because stack series model list changes + // depending on legend selection. + + targetData.modify(dims, function (v0, v1, dataIndex) { + var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex); // Consider `connectNulls` of line area, if value is NaN, stackedOver + // should also be NaN, to draw a appropriate belt area. + + if (isNaN(sum)) { + return resultNaN; + } + + var byValue; + var stackedDataRawIndex; + + if (isStackedByIndex) { + stackedDataRawIndex = targetData.getRawIndex(dataIndex); + } else { + byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex); + } // If stackOver is NaN, chart view will render point on value start. + + + var stackedOver = NaN; + + for (var j = idxInStack - 1; j >= 0; j--) { + var stackInfo = stackInfoList[j]; // Has been optimized by inverted indices on `stackedByDimension`. + + if (!isStackedByIndex) { + stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue); + } + + if (stackedDataRawIndex >= 0) { + var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); // Considering positive stack, negative stack and empty data + + if (sum >= 0 && val > 0 || // Positive stack + sum <= 0 && val < 0 // Negative stack + ) { + // The sum should be as less as possible to be effected + // by floating arithmetic problem. A wrong result probably + // filtered incorrectly by axis min/max. + sum = addSafe(sum, val); + stackedOver = val; + break; + } + } + } + + resultVal[0] = sum; + resultVal[1] = stackedOver; + return resultVal; + }); + }); + } + + var SourceImpl = + /** @class */ + function () { + function SourceImpl(fields) { + this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []); + this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN; // Visit config + + this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN; + this.startIndex = fields.startIndex || 0; + this.dimensionsDetectedCount = fields.dimensionsDetectedCount; + this.metaRawOption = fields.metaRawOption; + var dimensionsDefine = this.dimensionsDefine = fields.dimensionsDefine; + + if (dimensionsDefine) { + for (var i = 0; i < dimensionsDefine.length; i++) { + var dim = dimensionsDefine[i]; + + if (dim.type == null) { + if (guessOrdinal(this, i) === BE_ORDINAL.Must) { + dim.type = 'ordinal'; + } + } + } + } + } + + return SourceImpl; + }(); + + function isSourceInstance(val) { + return val instanceof SourceImpl; + } + + /** + * Create a source from option. + * NOTE: Created source is immutable. Don't change any properties in it. + */ + + function createSource(sourceData, thisMetaRawOption, // can be null. If not provided, auto detect it from `sourceData`. + sourceFormat) { + sourceFormat = sourceFormat || detectSourceFormat(sourceData); + var seriesLayoutBy = thisMetaRawOption.seriesLayoutBy; + var determined = determineSourceDimensions(sourceData, sourceFormat, seriesLayoutBy, thisMetaRawOption.sourceHeader, thisMetaRawOption.dimensions); + var source = new SourceImpl({ + data: sourceData, + sourceFormat: sourceFormat, + seriesLayoutBy: seriesLayoutBy, + dimensionsDefine: determined.dimensionsDefine, + startIndex: determined.startIndex, + dimensionsDetectedCount: determined.dimensionsDetectedCount, + metaRawOption: clone(thisMetaRawOption) + }); + return source; + } + + /** + * Wrap original series data for some compatibility cases. + */ + + function createSourceFromSeriesDataOption(data) { + return new SourceImpl({ + data: data, + sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL + }); + } + + /** + * Clone source but excludes source data. + */ + + function cloneSourceShallow(source) { + return new SourceImpl({ + data: source.data, + sourceFormat: source.sourceFormat, + seriesLayoutBy: source.seriesLayoutBy, + dimensionsDefine: clone(source.dimensionsDefine), + startIndex: source.startIndex, + dimensionsDetectedCount: source.dimensionsDetectedCount + }); + } + + /** + * Note: An empty array will be detected as `SOURCE_FORMAT_ARRAY_ROWS`. + */ + + function detectSourceFormat(data) { + var sourceFormat = SOURCE_FORMAT_UNKNOWN; + + if (isTypedArray(data)) { + sourceFormat = SOURCE_FORMAT_TYPED_ARRAY; + } else if (isArray(data)) { + // FIXME Whether tolerate null in top level array? + if (data.length === 0) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + } + + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i]; + + if (item == null) { + continue; + } else if (isArray(item)) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + break; + } else if (isObject(item)) { + sourceFormat = SOURCE_FORMAT_OBJECT_ROWS; + break; + } + } + } else if (isObject(data)) { + for (var key in data) { + if (hasOwn(data, key) && isArrayLike(data[key])) { + sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS; + break; + } + } + } + + return sourceFormat; + } + + /** + * Determine the source definitions from data standalone dimensions definitions + * are not specified. + */ + + function determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader, // standalone raw dimensions definition, like: + // { + // dimensions: ['aa', 'bb', { name: 'cc', type: 'time' }] + // } + // in `dataset` or `series` + dimensionsDefine) { + var dimensionsDetectedCount; + var startIndex; // PEDING: could data be null/undefined here? + // currently, if `dataset.source` not specified, error thrown. + // if `series.data` not specified, nothing rendered without error thrown. + // Should test these cases. + + if (!data) { + return { + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + startIndex: startIndex, + dimensionsDetectedCount: dimensionsDetectedCount + }; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var dataArrayRows = data; // Rule: Most of the first line are string: it is header. + // Caution: consider a line with 5 string and 1 number, + // it still can not be sure it is a head, because the + // 5 string may be 5 values of category columns. + + if (sourceHeader === 'auto' || sourceHeader == null) { + arrayRowsTravelFirst(function (val) { + // '-' is regarded as null/undefined. + if (val != null && val !== '-') { + if (isString(val)) { + startIndex == null && (startIndex = 1); + } else { + startIndex = 0; + } + } // 10 is an experience number, avoid long loop. + + }, seriesLayoutBy, dataArrayRows, 10); + } else { + startIndex = isNumber(sourceHeader) ? sourceHeader : sourceHeader ? 1 : 0; + } + + if (!dimensionsDefine && startIndex === 1) { + dimensionsDefine = []; + arrayRowsTravelFirst(function (val, index) { + dimensionsDefine[index] = val != null ? val + '' : ''; + }, seriesLayoutBy, dataArrayRows, Infinity); + } + + dimensionsDetectedCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? dataArrayRows.length : dataArrayRows[0] ? dataArrayRows[0].length : null; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + if (!dimensionsDefine) { + dimensionsDefine = objectRowsCollectDimensions(data); + } + } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + if (!dimensionsDefine) { + dimensionsDefine = []; + each(data, function (colArr, key) { + dimensionsDefine.push(key); + }); + } + } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var value0 = getDataItemValue(data[0]); + dimensionsDetectedCount = isArray(value0) && value0.length || 1; + } else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if ("development" !== 'production') { + assert(!!dimensionsDefine, 'dimensions must be given if data is TypedArray.'); + } + } + + return { + startIndex: startIndex, + dimensionsDefine: normalizeDimensionsOption(dimensionsDefine), + dimensionsDetectedCount: dimensionsDetectedCount + }; + } + + function objectRowsCollectDimensions(data) { + var firstIndex = 0; + var obj; + + while (firstIndex < data.length && !(obj = data[firstIndex++])) { + } // jshint ignore: line + + + if (obj) { + var dimensions_1 = []; + each(obj, function (value, key) { + dimensions_1.push(key); + }); + return dimensions_1; + } + } // Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'], + // which is reasonable. But dimension name is duplicated. + // Returns undefined or an array contains only object without null/undefiend or string. + + + function normalizeDimensionsOption(dimensionsDefine) { + if (!dimensionsDefine) { + // The meaning of null/undefined is different from empty array. + return; + } + + var nameMap = createHashMap(); + return map(dimensionsDefine, function (rawItem, index) { + rawItem = isObject(rawItem) ? rawItem : { + name: rawItem + }; // Other fields will be discarded. + + var item = { + name: rawItem.name, + displayName: rawItem.displayName, + type: rawItem.type + }; // User can set null in dimensions. + // We dont auto specify name, othewise a given name may + // cause it be refered unexpectedly. + + if (item.name == null) { + return item; + } // Also consider number form like 2012. + + + item.name += ''; // User may also specify displayName. + // displayName will always exists except user not + // specified or dim name is not specified or detected. + // (A auto generated dim name will not be used as + // displayName). + + if (item.displayName == null) { + item.displayName = item.name; + } + + var exist = nameMap.get(item.name); + + if (!exist) { + nameMap.set(item.name, { + count: 1 + }); + } else { + item.name += '-' + exist.count++; + } + + return item; + }); + } + + function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) { + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + for (var i = 0; i < data.length && i < maxLoop; i++) { + cb(data[i] ? data[i][0] : null, i); + } + } else { + var value0 = data[0] || []; + + for (var i = 0; i < value0.length && i < maxLoop; i++) { + cb(value0[i], i); + } + } + } + + function shouldRetrieveDataByName(source) { + var sourceFormat = source.sourceFormat; + return sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var _a, _b, _c; // TODO + var providerMethods; + var mountMethods; + /** + * If normal array used, mutable chunk size is supported. + * If typed array used, chunk size must be fixed. + */ + + var DefaultDataProvider = + /** @class */ + function () { + function DefaultDataProvider(sourceParam, dimSize) { + // let source: Source; + var source = !isSourceInstance(sourceParam) ? createSourceFromSeriesDataOption(sourceParam) : sourceParam; // declare source is Source; + + this._source = source; + var data = this._data = source.data; // Typed array. TODO IE10+? + + if (source.sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if ("development" !== 'production') { + if (dimSize == null) { + throw new Error('Typed array data must specify dimension size'); + } + } + + this._offset = 0; + this._dimSize = dimSize; + this._data = data; + } + + mountMethods(this, data, source); + } + + DefaultDataProvider.prototype.getSource = function () { + return this._source; + }; + + DefaultDataProvider.prototype.count = function () { + return 0; + }; + + DefaultDataProvider.prototype.getItem = function (idx, out) { + return; + }; + + DefaultDataProvider.prototype.appendData = function (newData) { + }; + + DefaultDataProvider.prototype.clean = function () { + }; + + DefaultDataProvider.protoInitialize = function () { + // PENDING: To avoid potential incompat (e.g., prototype + // is visited somewhere), still init them on prototype. + var proto = DefaultDataProvider.prototype; + proto.pure = false; + proto.persistent = true; + }(); + + DefaultDataProvider.internalField = function () { + var _a; + + mountMethods = function (provider, data, source) { + var sourceFormat = source.sourceFormat; + var seriesLayoutBy = source.seriesLayoutBy; + var startIndex = source.startIndex; + var dimsDef = source.dimensionsDefine; + var methods = providerMethods[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(methods, 'Invalide sourceFormat: ' + sourceFormat); + } + + extend(provider, methods); + + if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + provider.getItem = getItemForTypedArray; + provider.count = countForTypedArray; + provider.fillStorage = fillStorageForTypedArray; + } else { + var rawItemGetter = getRawSourceItemGetter(sourceFormat, seriesLayoutBy); + provider.getItem = bind(rawItemGetter, null, data, startIndex, dimsDef); + var rawCounter = getRawSourceDataCounter(sourceFormat, seriesLayoutBy); + provider.count = bind(rawCounter, null, data, startIndex, dimsDef); + } + }; + + var getItemForTypedArray = function (idx, out) { + idx = idx - this._offset; + out = out || []; + var data = this._data; + var dimSize = this._dimSize; + var offset = dimSize * idx; + + for (var i = 0; i < dimSize; i++) { + out[i] = data[offset + i]; + } + + return out; + }; + + var fillStorageForTypedArray = function (start, end, storage, extent) { + var data = this._data; + var dimSize = this._dimSize; + + for (var dim = 0; dim < dimSize; dim++) { + var dimExtent = extent[dim]; + var min = dimExtent[0] == null ? Infinity : dimExtent[0]; + var max = dimExtent[1] == null ? -Infinity : dimExtent[1]; + var count = end - start; + var arr = storage[dim]; + + for (var i = 0; i < count; i++) { + // appendData with TypedArray will always do replace in provider. + var val = data[i * dimSize + dim]; + arr[start + i] = val; + val < min && (min = val); + val > max && (max = val); + } + + dimExtent[0] = min; + dimExtent[1] = max; + } + }; + + var countForTypedArray = function () { + return this._data ? this._data.length / this._dimSize : 0; + }; + + providerMethods = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = { + pure: true, + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = { + pure: true, + appendData: function () { + throw new Error('Do not support appendData when set seriesLayoutBy: "row".'); + } + }, _a[SOURCE_FORMAT_OBJECT_ROWS] = { + pure: true, + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_KEYED_COLUMNS] = { + pure: true, + appendData: function (newData) { + var data = this._data; + each(newData, function (newCol, key) { + var oldCol = data[key] || (data[key] = []); + + for (var i = 0; i < (newCol || []).length; i++) { + oldCol.push(newCol[i]); + } + }); + } + }, _a[SOURCE_FORMAT_ORIGINAL] = { + appendData: appendDataSimply + }, _a[SOURCE_FORMAT_TYPED_ARRAY] = { + persistent: false, + pure: true, + appendData: function (newData) { + if ("development" !== 'production') { + assert(isTypedArray(newData), 'Added data must be TypedArray if data in initialization is TypedArray'); + } + + this._data = newData; + }, + // Clean self if data is already used. + clean: function () { + // PENDING + this._offset += this.count(); + this._data = null; + } + }, _a); + + function appendDataSimply(newData) { + for (var i = 0; i < newData.length; i++) { + this._data.push(newData[i]); + } + } + }(); + + return DefaultDataProvider; + }(); + + var getItemSimply = function (rawData, startIndex, dimsDef, idx) { + return rawData[idx]; + }; + + var rawSourceItemGetterMap = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef, idx) { + return rawData[idx + startIndex]; + }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef, idx, out) { + idx += startIndex; + var item = out || []; + var data = rawData; + + for (var i = 0; i < data.length; i++) { + var row = data[i]; + item[i] = row ? row[idx] : null; + } + + return item; + }, _a[SOURCE_FORMAT_OBJECT_ROWS] = getItemSimply, _a[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef, idx, out) { + var item = out || []; + + for (var i = 0; i < dimsDef.length; i++) { + var dimName = dimsDef[i].name; + + if ("development" !== 'production') { + if (dimName == null) { + throw new Error(); + } + } + + var col = rawData[dimName]; + item[i] = col ? col[idx] : null; + } + + return item; + }, _a[SOURCE_FORMAT_ORIGINAL] = getItemSimply, _a); + + function getRawSourceItemGetter(sourceFormat, seriesLayoutBy) { + var method = rawSourceItemGetterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(method, 'Do not support get item on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + } + + return method; + } + + var countSimply = function (rawData, startIndex, dimsDef) { + return rawData.length; + }; + + var rawSourceDataCounterMap = (_b = {}, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef) { + return Math.max(0, rawData.length - startIndex); + }, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef) { + var row = rawData[0]; + return row ? Math.max(0, row.length - startIndex) : 0; + }, _b[SOURCE_FORMAT_OBJECT_ROWS] = countSimply, _b[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef) { + var dimName = dimsDef[0].name; + + if ("development" !== 'production') { + if (dimName == null) { + throw new Error(); + } + } + + var col = rawData[dimName]; + return col ? col.length : 0; + }, _b[SOURCE_FORMAT_ORIGINAL] = countSimply, _b); + + function getRawSourceDataCounter(sourceFormat, seriesLayoutBy) { + var method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)]; + + if ("development" !== 'production') { + assert(method, 'Do not suppport count on "' + sourceFormat + '", "' + seriesLayoutBy + '".'); + } + + return method; + } + + var getRawValueSimply = function (dataItem, dimIndex, property) { + return dataItem[dimIndex]; + }; + + var rawSourceValueGetterMap = (_c = {}, _c[SOURCE_FORMAT_ARRAY_ROWS] = getRawValueSimply, _c[SOURCE_FORMAT_OBJECT_ROWS] = function (dataItem, dimIndex, property) { + return dataItem[property]; + }, _c[SOURCE_FORMAT_KEYED_COLUMNS] = getRawValueSimply, _c[SOURCE_FORMAT_ORIGINAL] = function (dataItem, dimIndex, property) { + // FIXME: In some case (markpoint in geo (geo-map.html)), + // dataItem is {coord: [...]} + var value = getDataItemValue(dataItem); + return !(value instanceof Array) ? value : value[dimIndex]; + }, _c[SOURCE_FORMAT_TYPED_ARRAY] = getRawValueSimply, _c); + + function getRawSourceValueGetter(sourceFormat) { + var method = rawSourceValueGetterMap[sourceFormat]; + + if ("development" !== 'production') { + assert(method, 'Do not suppport get value on "' + sourceFormat + '".'); + } + + return method; + } + + function getMethodMapKey(sourceFormat, seriesLayoutBy) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + '_' + seriesLayoutBy : sourceFormat; + } // ??? FIXME can these logic be more neat: getRawValue, getRawDataItem, + // Consider persistent. + // Caution: why use raw value to display on label or tooltip? + // A reason is to avoid format. For example time value we do not know + // how to format is expected. More over, if stack is used, calculated + // value may be 0.91000000001, which have brings trouble to display. + // TODO: consider how to treat null/undefined/NaN when display? + + + function retrieveRawValue(data, dataIndex, // If dimIndex is null/undefined, return OptionDataItem. + // Otherwise, return OptionDataValue. + dim) { + if (!data) { + return; + } // Consider data may be not persistent. + + + var dataItem = data.getRawDataItem(dataIndex); + + if (dataItem == null) { + return; + } + + var store = data.getStore(); + var sourceFormat = store.getSource().sourceFormat; + + if (dim != null) { + var dimIndex = data.getDimensionIndex(dim); + var property = store.getDimensionProperty(dimIndex); + return getRawSourceValueGetter(sourceFormat)(dataItem, dimIndex, property); + } else { + var result = dataItem; + + if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + result = getDataItemValue(dataItem); + } + + return result; + } + } + + var DIMENSION_LABEL_REG = /\{@(.+?)\}/g; + + var DataFormatMixin = + /** @class */ + function () { + function DataFormatMixin() { + } + + /** + * Get params for formatter + */ + + + DataFormatMixin.prototype.getDataParams = function (dataIndex, dataType) { + var data = this.getData(dataType); + var rawValue = this.getRawValue(dataIndex, dataType); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex); + var itemOpt = data.getRawDataItem(dataIndex); + var style = data.getItemVisual(dataIndex, 'style'); + var color = style && style[data.getItemVisual(dataIndex, 'drawType') || 'fill']; + var borderColor = style && style.stroke; + var mainType = this.mainType; + var isSeries = mainType === 'series'; + var userOutput = data.userOutput && data.userOutput.get(); + return { + componentType: mainType, + componentSubType: this.subType, + componentIndex: this.componentIndex, + seriesType: isSeries ? this.subType : null, + seriesIndex: this.seriesIndex, + seriesId: isSeries ? this.id : null, + seriesName: isSeries ? this.name : null, + name: name, + dataIndex: rawDataIndex, + data: itemOpt, + dataType: dataType, + value: rawValue, + color: color, + borderColor: borderColor, + dimensionNames: userOutput ? userOutput.fullDimensions : null, + encode: userOutput ? userOutput.encode : null, + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ['seriesName', 'name', 'value'] + }; + }; + /** + * Format label + * @param dataIndex + * @param status 'normal' by default + * @param dataType + * @param labelDimIndex Only used in some chart that + * use formatter in different dimensions, like radar. + * @param formatter Formatter given outside. + * @return return null/undefined if no formatter + */ + + + DataFormatMixin.prototype.getFormattedLabel = function (dataIndex, status, dataType, labelDimIndex, formatter, extendParams) { + status = status || 'normal'; + var data = this.getData(dataType); + var params = this.getDataParams(dataIndex, dataType); + + if (extendParams) { + params.value = extendParams.interpolatedValue; + } + + if (labelDimIndex != null && isArray(params.value)) { + params.value = params.value[labelDimIndex]; + } + + if (!formatter) { + var itemModel = data.getItemModel(dataIndex); // @ts-ignore + + formatter = itemModel.get(status === 'normal' ? ['label', 'formatter'] : [status, 'label', 'formatter']); + } + + if (isFunction(formatter)) { + params.status = status; + params.dimensionIndex = labelDimIndex; + return formatter(params); + } else if (isString(formatter)) { + var str = formatTpl(formatter, params); // Support 'aaa{@[3]}bbb{@product}ccc'. + // Do not support '}' in dim name util have to. + + return str.replace(DIMENSION_LABEL_REG, function (origin, dimStr) { + var len = dimStr.length; + var dimLoose = dimStr; + + if (dimLoose.charAt(0) === '[' && dimLoose.charAt(len - 1) === ']') { + dimLoose = +dimLoose.slice(1, len - 1); // Also support: '[]' => 0 + + if ("development" !== 'production') { + if (isNaN(dimLoose)) { + error("Invalide label formatter: @" + dimStr + ", only support @[0], @[1], @[2], ..."); + } + } + } + + var val = retrieveRawValue(data, dataIndex, dimLoose); + + if (extendParams && isArray(extendParams.interpolatedValue)) { + var dimIndex = data.getDimensionIndex(dimLoose); + + if (dimIndex >= 0) { + val = extendParams.interpolatedValue[dimIndex]; + } + } + + return val != null ? val + '' : ''; + }); + } + }; + /** + * Get raw value in option + */ + + + DataFormatMixin.prototype.getRawValue = function (idx, dataType) { + return retrieveRawValue(this.getData(dataType), idx); + }; + /** + * Should be implemented. + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + * @param {string} [dataType] + */ + + + DataFormatMixin.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + // Empty function + return; + }; + + return DataFormatMixin; + }(); + // but guess little chance has been used outside. Do we need to backward + // compat it? + // type TooltipFormatResultLegacyObject = { + // // `html` means the markup language text, either in 'html' or 'richText'. + // // The name `html` is not appropriate becuase in 'richText' it is not a HTML + // // string. But still support it for backward compat. + // html: string; + // markers: Dictionary; + // }; + + /** + * For backward compat, normalize the return from `formatTooltip`. + */ + + function normalizeTooltipFormatResult(result) { + var markupText; // let markers: Dictionary; + + var markupFragment; + + if (isObject(result)) { + if (result.type) { + markupFragment = result; + } else { + if ("development" !== 'production') { + console.warn('The return type of `formatTooltip` is not supported: ' + makePrintable(result)); + } + } // else { + // markupText = (result as TooltipFormatResultLegacyObject).html; + // markers = (result as TooltipFormatResultLegacyObject).markers; + // if (markersExisting) { + // markers = zrUtil.merge(markersExisting, markers); + // } + // } + + } else { + markupText = result; + } + + return { + text: markupText, + // markers: markers || markersExisting, + frag: markupFragment + }; + } + + /** + * @param {Object} define + * @return See the return of `createTask`. + */ + + function createTask(define) { + return new Task(define); + } + + var Task = + /** @class */ + function () { + function Task(define) { + define = define || {}; + this._reset = define.reset; + this._plan = define.plan; + this._count = define.count; + this._onDirty = define.onDirty; + this._dirty = true; + } + + /** + * @param step Specified step. + * @param skip Skip customer perform call. + * @param modBy Sampling window size. + * @param modDataCount Sampling count. + * @return whether unfinished. + */ + + + Task.prototype.perform = function (performArgs) { + var upTask = this._upstream; + var skip = performArgs && performArgs.skip; // TODO some refactor. + // Pull data. Must pull data each time, because context.data + // may be updated by Series.setData. + + if (this._dirty && upTask) { + var context = this.context; + context.data = context.outputData = upTask.context.outputData; + } + + if (this.__pipeline) { + this.__pipeline.currentTask = this; + } + + var planResult; + + if (this._plan && !skip) { + planResult = this._plan(this.context); + } // Support sharding by mod, which changes the render sequence and makes the rendered graphic + // elements uniformed distributed when progress, especially when moving or zooming. + + + var lastModBy = normalizeModBy(this._modBy); + var lastModDataCount = this._modDataCount || 0; + var modBy = normalizeModBy(performArgs && performArgs.modBy); + var modDataCount = performArgs && performArgs.modDataCount || 0; + + if (lastModBy !== modBy || lastModDataCount !== modDataCount) { + planResult = 'reset'; + } + + function normalizeModBy(val) { + !(val >= 1) && (val = 1); // jshint ignore:line + + return val; + } + + var forceFirstProgress; + + if (this._dirty || planResult === 'reset') { + this._dirty = false; + forceFirstProgress = this._doReset(skip); + } + + this._modBy = modBy; + this._modDataCount = modDataCount; + var step = performArgs && performArgs.step; + + if (upTask) { + if ("development" !== 'production') { + assert(upTask._outputDueEnd != null); + } + + this._dueEnd = upTask._outputDueEnd; + } // DataTask or overallTask + else { + if ("development" !== 'production') { + assert(!this._progress || this._count); + } + + this._dueEnd = this._count ? this._count(this.context) : Infinity; + } // Note: Stubs, that its host overall task let it has progress, has progress. + // If no progress, pass index from upstream to downstream each time plan called. + + + if (this._progress) { + var start = this._dueIndex; + var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd); + + if (!skip && (forceFirstProgress || start < end)) { + var progress = this._progress; + + if (isArray(progress)) { + for (var i = 0; i < progress.length; i++) { + this._doProgress(progress[i], start, end, modBy, modDataCount); + } + } else { + this._doProgress(progress, start, end, modBy, modDataCount); + } + } + + this._dueIndex = end; // If no `outputDueEnd`, assume that output data and + // input data is the same, so use `dueIndex` as `outputDueEnd`. + + var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end; + + if ("development" !== 'production') { + // ??? Can not rollback. + assert(outputDueEnd >= this._outputDueEnd); + } + + this._outputDueEnd = outputDueEnd; + } else { + // (1) Some overall task has no progress. + // (2) Stubs, that its host overall task do not let it has progress, has no progress. + // This should always be performed so it can be passed to downstream. + this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd; + } + + return this.unfinished(); + }; + + Task.prototype.dirty = function () { + this._dirty = true; + this._onDirty && this._onDirty(this.context); + }; + + Task.prototype._doProgress = function (progress, start, end, modBy, modDataCount) { + iterator.reset(start, end, modBy, modDataCount); + this._callingProgress = progress; + + this._callingProgress({ + start: start, + end: end, + count: end - start, + next: iterator.next + }, this.context); + }; + + Task.prototype._doReset = function (skip) { + this._dueIndex = this._outputDueEnd = this._dueEnd = 0; + this._settedOutputEnd = null; + var progress; + var forceFirstProgress; + + if (!skip && this._reset) { + progress = this._reset(this.context); + + if (progress && progress.progress) { + forceFirstProgress = progress.forceFirstProgress; + progress = progress.progress; + } // To simplify no progress checking, array must has item. + + + if (isArray(progress) && !progress.length) { + progress = null; + } + } + + this._progress = progress; + this._modBy = this._modDataCount = null; + var downstream = this._downstream; + downstream && downstream.dirty(); + return forceFirstProgress; + }; + + Task.prototype.unfinished = function () { + return this._progress && this._dueIndex < this._dueEnd; + }; + /** + * @param downTask The downstream task. + * @return The downstream task. + */ + + + Task.prototype.pipe = function (downTask) { + if ("development" !== 'production') { + assert(downTask && !downTask._disposed && downTask !== this); + } // If already downstream, do not dirty downTask. + + + if (this._downstream !== downTask || this._dirty) { + this._downstream = downTask; + downTask._upstream = this; + downTask.dirty(); + } + }; + + Task.prototype.dispose = function () { + if (this._disposed) { + return; + } + + this._upstream && (this._upstream._downstream = null); + this._downstream && (this._downstream._upstream = null); + this._dirty = false; + this._disposed = true; + }; + + Task.prototype.getUpstream = function () { + return this._upstream; + }; + + Task.prototype.getDownstream = function () { + return this._downstream; + }; + + Task.prototype.setOutputEnd = function (end) { + // This only happend in dataTask, dataZoom, map, currently. + // where dataZoom do not set end each time, but only set + // when reset. So we should record the setted end, in case + // that the stub of dataZoom perform again and earse the + // setted end by upstream. + this._outputDueEnd = this._settedOutputEnd = end; + }; + + return Task; + }(); + + var iterator = function () { + var end; + var current; + var modBy; + var modDataCount; + var winCount; + var it = { + reset: function (s, e, sStep, sCount) { + current = s; + end = e; + modBy = sStep; + modDataCount = sCount; + winCount = Math.ceil(modDataCount / modBy); + it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext; + } + }; + return it; + + function sequentialNext() { + return current < end ? current++ : null; + } + + function modNext() { + var dataIndex = current % winCount * modBy + Math.ceil(current / winCount); + var result = current >= end ? null : dataIndex < modDataCount ? dataIndex // If modDataCount is smaller than data.count() (consider `appendData` case), + // Use normal linear rendering mode. + : current; + current++; + return result; + } + }(); /////////////////////////////////////////////////////////// + // For stream debug (Should be commented out after used!) + // @usage: printTask(this, 'begin'); + // @usage: printTask(this, null, {someExtraProp}); + // @usage: Use `__idxInPipeline` as conditional breakpiont. + // + // window.printTask = function (task: any, prefix: string, extra: { [key: string]: unknown }): void { + // window.ecTaskUID == null && (window.ecTaskUID = 0); + // task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`); + // task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`); + // let props = []; + // if (task.__pipeline) { + // let val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`; + // props.push({text: '__idxInPipeline/total', value: val}); + // } else { + // let stubCount = 0; + // task.agentStubMap.each(() => stubCount++); + // props.push({text: 'idx', value: `overall (stubs: ${stubCount})`}); + // } + // props.push({text: 'uid', value: task.uidDebug}); + // if (task.__pipeline) { + // props.push({text: 'pipelineId', value: task.__pipeline.id}); + // task.agent && props.push( + // {text: 'stubFor', value: task.agent.uidDebug} + // ); + // } + // props.push( + // {text: 'dirty', value: task._dirty}, + // {text: 'dueIndex', value: task._dueIndex}, + // {text: 'dueEnd', value: task._dueEnd}, + // {text: 'outputDueEnd', value: task._outputDueEnd} + // ); + // if (extra) { + // Object.keys(extra).forEach(key => { + // props.push({text: key, value: extra[key]}); + // }); + // } + // let args = ['color: blue']; + // let msg = `%c[${prefix || 'T'}] %c` + props.map(item => ( + // args.push('color: green', 'color: red'), + // `${item.text}: %c${item.value}` + // )).join('%c, '); + // console.log.apply(console, [msg].concat(args)); + // // console.log(this); + // }; + // window.printPipeline = function (task: any, prefix: string) { + // const pipeline = task.__pipeline; + // let currTask = pipeline.head; + // while (currTask) { + // window.printTask(currTask, prefix); + // currTask = currTask._downstream; + // } + // }; + // window.showChain = function (chainHeadTask) { + // var chain = []; + // var task = chainHeadTask; + // while (task) { + // chain.push({ + // task: task, + // up: task._upstream, + // down: task._downstream, + // idxInPipeline: task.__idxInPipeline + // }); + // task = task._downstream; + // } + // return chain; + // }; + // window.findTaskInChain = function (task, chainHeadTask) { + // let chain = window.showChain(chainHeadTask); + // let result = []; + // for (let i = 0; i < chain.length; i++) { + // let chainItem = chain[i]; + // if (chainItem.task === task) { + // result.push(i); + // } + // } + // return result; + // }; + // window.printChainAEachInChainB = function (chainHeadTaskA, chainHeadTaskB) { + // let chainA = window.showChain(chainHeadTaskA); + // for (let i = 0; i < chainA.length; i++) { + // console.log('chainAIdx:', i, 'inChainB:', window.findTaskInChain(chainA[i].task, chainHeadTaskB)); + // } + // }; + + /** + * Convert raw the value in to inner value in List. + * + * [Performance sensitive] + * + * [Caution]: this is the key logic of user value parser. + * For backward compatibiliy, do not modify it until have to! + */ + + function parseDataValue(value, // For high performance, do not omit the second param. + opt) { + // Performance sensitive. + var dimType = opt && opt.type; + + if (dimType === 'ordinal') { + // If given value is a category string + return value; + } + + if (dimType === 'time' // spead up when using timestamp + && !isNumber(value) && value != null && value !== '-') { + value = +parseDate(value); + } // dimType defaults 'number'. + // If dimType is not ordinal and value is null or undefined or NaN or '-', + // parse to NaN. + // number-like string (like ' 123 ') can be converted to a number. + // where null/undefined or other string will be converted to NaN. + + + return value == null || value === '' ? NaN // If string (like '-'), using '+' parse to NaN + // If object, also parse to NaN + : +value; + } + + var valueParserMap = createHashMap({ + 'number': function (val) { + // Do not use `numericToNumber` here. We have by defualt `numericToNumber`. + // Here the number parser can have loose rule: + // enable to cut suffix: "120px" => 120, "14%" => 14. + return parseFloat(val); + }, + 'time': function (val) { + // return timestamp. + return +parseDate(val); + }, + 'trim': function (val) { + return isString(val) ? trim(val) : val; + } + }); + + function getRawValueParser(type) { + return valueParserMap.get(type); + } + + var ORDER_COMPARISON_OP_MAP = { + lt: function (lval, rval) { + return lval < rval; + }, + lte: function (lval, rval) { + return lval <= rval; + }, + gt: function (lval, rval) { + return lval > rval; + }, + gte: function (lval, rval) { + return lval >= rval; + } + }; + + var FilterOrderComparator = + /** @class */ + function () { + function FilterOrderComparator(op, rval) { + if (!isNumber(rval)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = 'rvalue of "<", ">", "<=", ">=" can only be number in filter.'; + } + + throwError(errMsg); + } + + this._opFn = ORDER_COMPARISON_OP_MAP[op]; + this._rvalFloat = numericToNumber(rval); + } // Performance sensitive. + + + FilterOrderComparator.prototype.evaluate = function (lval) { + // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. + return isNumber(lval) ? this._opFn(lval, this._rvalFloat) : this._opFn(numericToNumber(lval), this._rvalFloat); + }; + + return FilterOrderComparator; + }(); + + var SortOrderComparator = + /** @class */ + function () { + /** + * @param order by defualt: 'asc' + * @param incomparable by defualt: Always on the tail. + * That is, if 'asc' => 'max', if 'desc' => 'min' + * See the definition of "incomparable" in [SORT_COMPARISON_RULE] + */ + function SortOrderComparator(order, incomparable) { + var isDesc = order === 'desc'; + this._resultLT = isDesc ? 1 : -1; + + if (incomparable == null) { + incomparable = isDesc ? 'min' : 'max'; + } + + this._incomparable = incomparable === 'min' ? -Infinity : Infinity; + } // See [SORT_COMPARISON_RULE]. + // Performance sensitive. + + + SortOrderComparator.prototype.evaluate = function (lval, rval) { + // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. + var lvalFloat = isNumber(lval) ? lval : numericToNumber(lval); + var rvalFloat = isNumber(rval) ? rval : numericToNumber(rval); + var lvalNotNumeric = isNaN(lvalFloat); + var rvalNotNumeric = isNaN(rvalFloat); + + if (lvalNotNumeric) { + lvalFloat = this._incomparable; + } + + if (rvalNotNumeric) { + rvalFloat = this._incomparable; + } + + if (lvalNotNumeric && rvalNotNumeric) { + var lvalIsStr = isString(lval); + var rvalIsStr = isString(rval); + + if (lvalIsStr) { + lvalFloat = rvalIsStr ? lval : 0; + } + + if (rvalIsStr) { + rvalFloat = lvalIsStr ? rval : 0; + } + } + + return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0; + }; + + return SortOrderComparator; + }(); + + var FilterEqualityComparator = + /** @class */ + function () { + function FilterEqualityComparator(isEq, rval) { + this._rval = rval; + this._isEQ = isEq; + this._rvalTypeof = typeof rval; + this._rvalFloat = numericToNumber(rval); + } // Performance sensitive. + + + FilterEqualityComparator.prototype.evaluate = function (lval) { + var eqResult = lval === this._rval; + + if (!eqResult) { + var lvalTypeof = typeof lval; + + if (lvalTypeof !== this._rvalTypeof && (lvalTypeof === 'number' || this._rvalTypeof === 'number')) { + eqResult = numericToNumber(lval) === this._rvalFloat; + } + } + + return this._isEQ ? eqResult : !eqResult; + }; + + return FilterEqualityComparator; + }(); + + /** + * [FILTER_COMPARISON_RULE] + * `lt`|`lte`|`gt`|`gte`: + * + rval must be a number. And lval will be converted to number (`numericToNumber`) to compare. + * `eq`: + * + If same type, compare with `===`. + * + If there is one number, convert to number (`numericToNumber`) to compare. + * + Else return `false`. + * `ne`: + * + Not `eq`. + * + * + * [SORT_COMPARISON_RULE] + * All the values are grouped into three categories: + * + "numeric" (number and numeric string) + * + "non-numeric-string" (string that excluding numeric string) + * + "others" + * "numeric" vs "numeric": values are ordered by number order. + * "non-numeric-string" vs "non-numeric-string": values are ordered by ES spec (#sec-abstract-relational-comparison). + * "others" vs "others": do not change order (always return 0). + * "numeric" vs "non-numeric-string": "non-numeric-string" is treated as "incomparable". + * "number" vs "others": "others" is treated as "incomparable". + * "non-numeric-string" vs "others": "others" is treated as "incomparable". + * "incomparable" will be seen as -Infinity or Infinity (depends on the settings). + * MEMO: + * non-numeric string sort make sence when need to put the items with the same tag together. + * But if we support string sort, we still need to avoid the misleading like `'2' > '12'`, + * So we treat "numeric-string" sorted by number order rather than string comparison. + * + * + * [CHECK_LIST_OF_THE_RULE_DESIGN] + * + Do not support string comparison until required. And also need to + * void the misleading of "2" > "12". + * + Should avoid the misleading case: + * `" 22 " gte "22"` is `true` but `" 22 " eq "22"` is `false`. + * + JS bad case should be avoided: null <= 0, [] <= 0, ' ' <= 0, ... + * + Only "numeric" can be converted to comparable number, otherwise converted to NaN. + * See `util/number.ts#numericToNumber`. + * + * @return If `op` is not `RelationalOperator`, return null; + */ + + + function createFilterComparator(op, rval) { + return op === 'eq' || op === 'ne' ? new FilterEqualityComparator(op === 'eq', rval) : hasOwn(ORDER_COMPARISON_OP_MAP, op) ? new FilterOrderComparator(op, rval) : null; + } + + /** + * TODO: disable writable. + * This structure will be exposed to users. + */ + + var ExternalSource = + /** @class */ + function () { + function ExternalSource() { + } + + ExternalSource.prototype.getRawData = function () { + // Only built-in transform available. + throw new Error('not supported'); + }; + + ExternalSource.prototype.getRawDataItem = function (dataIndex) { + // Only built-in transform available. + throw new Error('not supported'); + }; + + ExternalSource.prototype.cloneRawData = function () { + return; + }; + /** + * @return If dimension not found, return null/undefined. + */ + + + ExternalSource.prototype.getDimensionInfo = function (dim) { + return; + }; + /** + * dimensions defined if and only if either: + * (a) dataset.dimensions are declared. + * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`). + * If dimensions are defined, `dimensionInfoAll` is corresponding to + * the defined dimensions. + * Otherwise, `dimensionInfoAll` is determined by data columns. + * @return Always return an array (even empty array). + */ + + + ExternalSource.prototype.cloneAllDimensionInfo = function () { + return; + }; + + ExternalSource.prototype.count = function () { + return; + }; + /** + * Only support by dimension index. + * No need to support by dimension name in transform function, + * becuase transform function is not case-specific, no need to use name literally. + */ + + + ExternalSource.prototype.retrieveValue = function (dataIndex, dimIndex) { + return; + }; + + ExternalSource.prototype.retrieveValueFromItem = function (dataItem, dimIndex) { + return; + }; + + ExternalSource.prototype.convertValue = function (rawVal, dimInfo) { + return parseDataValue(rawVal, dimInfo); + }; + + return ExternalSource; + }(); + + function createExternalSource(internalSource, externalTransform) { + var extSource = new ExternalSource(); + var data = internalSource.data; + var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat; + var sourceHeaderCount = internalSource.startIndex; + var errMsg = ''; + + if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) { + // For the logic simplicity in transformer, only 'culumn' is + // supported in data transform. Otherwise, the `dimensionsDefine` + // might be detected by 'row', which probably confuses users. + if ("development" !== 'production') { + errMsg = '`seriesLayoutBy` of upstream dataset can only be "column" in data transform.'; + } + + throwError(errMsg); + } // [MEMO] + // Create a new dimensions structure for exposing. + // Do not expose all dimension info to users directly. + // Becuase the dimension is probably auto detected from data and not might reliable. + // Should not lead the transformers to think that is relialbe and return it. + // See [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. + + + var dimensions = []; + var dimsByName = {}; + var dimsDef = internalSource.dimensionsDefine; + + if (dimsDef) { + each(dimsDef, function (dimDef, idx) { + var name = dimDef.name; + var dimDefExt = { + index: idx, + name: name, + displayName: dimDef.displayName + }; + dimensions.push(dimDefExt); // Users probably not sepcify dimension name. For simplicity, data transform + // do not generate dimension name. + + if (name != null) { + // Dimension name should not be duplicated. + // For simplicity, data transform forbid name duplication, do not generate + // new name like module `completeDimensions.ts` did, but just tell users. + var errMsg_1 = ''; + + if (hasOwn(dimsByName, name)) { + if ("development" !== 'production') { + errMsg_1 = 'dimension name "' + name + '" duplicated.'; + } + + throwError(errMsg_1); + } + + dimsByName[name] = dimDefExt; + } + }); + } // If dimension definitions are not defined and can not be detected. + // e.g., pure data `[[11, 22], ...]`. + else { + for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) { + // Do not generete name or anything others. The consequence process in + // `transform` or `series` probably have there own name generation strategry. + dimensions.push({ + index: i + }); + } + } // Implement public methods: + + + var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + + if (externalTransform.__isBuiltIn) { + extSource.getRawDataItem = function (dataIndex) { + return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + }; + + extSource.getRawData = bind(getRawData, null, internalSource); + } + + extSource.cloneRawData = bind(cloneRawData, null, internalSource); + var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); + extSource.count = bind(rawCounter, null, data, sourceHeaderCount, dimensions); + var rawValueGetter = getRawSourceValueGetter(sourceFormat); + + extSource.retrieveValue = function (dataIndex, dimIndex) { + var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); + return retrieveValueFromItem(rawItem, dimIndex); + }; + + var retrieveValueFromItem = extSource.retrieveValueFromItem = function (dataItem, dimIndex) { + if (dataItem == null) { + return; + } + + var dimDef = dimensions[dimIndex]; // When `dimIndex` is `null`, `rawValueGetter` return the whole item. + + if (dimDef) { + return rawValueGetter(dataItem, dimIndex, dimDef.name); + } + }; + + extSource.getDimensionInfo = bind(getDimensionInfo, null, dimensions, dimsByName); + extSource.cloneAllDimensionInfo = bind(cloneAllDimensionInfo, null, dimensions); + return extSource; + } + + function getRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`getRawData` is not supported in source format ' + sourceFormat; + } + + throwError(errMsg); + } + + return upstream.data; + } + + function cloneRawData(upstream) { + var sourceFormat = upstream.sourceFormat; + var data = upstream.data; + + if (!isSupportedSourceFormat(sourceFormat)) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '`cloneRawData` is not supported in source format ' + sourceFormat; + } + + throwError(errMsg); + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + var result = []; + + for (var i = 0, len = data.length; i < len; i++) { + // Not strictly clone for performance + result.push(data[i].slice()); + } + + return result; + } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + var result = []; + + for (var i = 0, len = data.length; i < len; i++) { + // Not strictly clone for performance + result.push(extend({}, data[i])); + } + + return result; + } + } + + function getDimensionInfo(dimensions, dimsByName, dim) { + if (dim == null) { + return; + } // Keep the same logic as `List::getDimension` did. + + + if (isNumber(dim) // If being a number-like string but not being defined a dimension name. + || !isNaN(dim) && !hasOwn(dimsByName, dim)) { + return dimensions[dim]; + } else if (hasOwn(dimsByName, dim)) { + return dimsByName[dim]; + } + } + + function cloneAllDimensionInfo(dimensions) { + return clone(dimensions); + } + + var externalTransformMap = createHashMap(); + + function registerExternalTransform(externalTransform) { + externalTransform = clone(externalTransform); + var type = externalTransform.type; + var errMsg = ''; + + if (!type) { + if ("development" !== 'production') { + errMsg = 'Must have a `type` when `registerTransform`.'; + } + + throwError(errMsg); + } + + var typeParsed = type.split(':'); + + if (typeParsed.length !== 2) { + if ("development" !== 'production') { + errMsg = 'Name must include namespace like "ns:regression".'; + } + + throwError(errMsg); + } // Namespace 'echarts:xxx' is official namespace, where the transforms should + // be called directly via 'xxx' rather than 'echarts:xxx'. + + + var isBuiltIn = false; + + if (typeParsed[0] === 'echarts') { + type = typeParsed[1]; + isBuiltIn = true; + } + + externalTransform.__isBuiltIn = isBuiltIn; + externalTransformMap.set(type, externalTransform); + } + + function applyDataTransform(rawTransOption, sourceList, infoForPrint) { + var pipedTransOption = normalizeToArray(rawTransOption); + var pipeLen = pipedTransOption.length; + var errMsg = ''; + + if (!pipeLen) { + if ("development" !== 'production') { + errMsg = 'If `transform` declared, it should at least contain one transform.'; + } + + throwError(errMsg); + } + + for (var i = 0, len = pipeLen; i < len; i++) { + var transOption = pipedTransOption[i]; + sourceList = applySingleDataTransform(transOption, sourceList, infoForPrint, pipeLen === 1 ? null : i); // piped transform only support single input, except the fist one. + // piped transform only support single output, except the last one. + + if (i !== len - 1) { + sourceList.length = Math.max(sourceList.length, 1); + } + } + + return sourceList; + } + + function applySingleDataTransform(transOption, upSourceList, infoForPrint, // If `pipeIndex` is null/undefined, no piped transform. + pipeIndex) { + var errMsg = ''; + + if (!upSourceList.length) { + if ("development" !== 'production') { + errMsg = 'Must have at least one upstream dataset.'; + } + + throwError(errMsg); + } + + if (!isObject(transOption)) { + if ("development" !== 'production') { + errMsg = 'transform declaration must be an object rather than ' + typeof transOption + '.'; + } + + throwError(errMsg); + } + + var transType = transOption.type; + var externalTransform = externalTransformMap.get(transType); + + if (!externalTransform) { + if ("development" !== 'production') { + errMsg = 'Can not find transform on type "' + transType + '".'; + } + + throwError(errMsg); + } // Prepare source + + + var extUpSourceList = map(upSourceList, function (upSource) { + return createExternalSource(upSource, externalTransform); + }); + var resultList = normalizeToArray(externalTransform.transform({ + upstream: extUpSourceList[0], + upstreamList: extUpSourceList, + config: clone(transOption.config) + })); + + if ("development" !== 'production') { + if (transOption.print) { + var printStrArr = map(resultList, function (extSource) { + var pipeIndexStr = pipeIndex != null ? ' === pipe index: ' + pipeIndex : ''; + return ['=== dataset index: ' + infoForPrint.datasetIndex + pipeIndexStr + ' ===', '- transform result data:', makePrintable(extSource.data), '- transform result dimensions:', makePrintable(extSource.dimensions)].join('\n'); + }).join('\n'); + log(printStrArr); + } + } + + return map(resultList, function (result, resultIndex) { + var errMsg = ''; + + if (!isObject(result)) { + if ("development" !== 'production') { + errMsg = 'A transform should not return some empty results.'; + } + + throwError(errMsg); + } + + if (!result.data) { + if ("development" !== 'production') { + errMsg = 'Transform result data should be not be null or undefined'; + } + + throwError(errMsg); + } + + var sourceFormat = detectSourceFormat(result.data); + + if (!isSupportedSourceFormat(sourceFormat)) { + if ("development" !== 'production') { + errMsg = 'Transform result data should be array rows or object rows.'; + } + + throwError(errMsg); + } + + var resultMetaRawOption; + var firstUpSource = upSourceList[0]; + /** + * Intuitively, the end users known the content of the original `dataset.source`, + * calucating the transform result in mind. + * Suppose the original `dataset.source` is: + * ```js + * [ + * ['product', '2012', '2013', '2014', '2015'], + * ['AAA', 41.1, 30.4, 65.1, 53.3], + * ['BBB', 86.5, 92.1, 85.7, 83.1], + * ['CCC', 24.1, 67.2, 79.5, 86.4] + * ] + * ``` + * The dimension info have to be detected from the source data. + * Some of the transformers (like filter, sort) will follow the dimension info + * of upstream, while others use new dimensions (like aggregate). + * Transformer can output a field `dimensions` to define the its own output dimensions. + * We also allow transformers to ignore the output `dimensions` field, and + * inherit the upstream dimensions definition. It can reduce the burden of handling + * dimensions in transformers. + * + * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. + */ + + if (firstUpSource && resultIndex === 0 // If transformer returns `dimensions`, it means that the transformer has different + // dimensions definitions. We do not inherit anything from upstream. + && !result.dimensions) { + var startIndex = firstUpSource.startIndex; // We copy the header of upstream to the result becuase: + // (1) The returned data always does not contain header line and can not be used + // as dimension-detection. In this case we can not use "detected dimensions" of + // upstream directly, because it might be detected based on different `seriesLayoutBy`. + // (2) We should support that the series read the upstream source in `seriesLayoutBy: 'row'`. + // So the original detected header should be add to the result, otherwise they can not be read. + + if (startIndex) { + result.data = firstUpSource.data.slice(0, startIndex).concat(result.data); + } + + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: startIndex, + dimensions: firstUpSource.metaRawOption.dimensions + }; + } else { + resultMetaRawOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + sourceHeader: 0, + dimensions: result.dimensions + }; + } + + return createSource(result.data, resultMetaRawOption, null); + }); + } + + function isSupportedSourceFormat(sourceFormat) { + return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS; + } + + var UNDEFINED = 'undefined'; + /* global Float64Array, Int32Array, Uint32Array, Uint16Array */ + // Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is + // different from the Ctor of typed array. + + var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array; + var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array; + var CtorInt32Array = typeof Int32Array === UNDEFINED ? Array : Int32Array; + var CtorFloat64Array = typeof Float64Array === UNDEFINED ? Array : Float64Array; + /** + * Multi dimensional data store + */ + + var dataCtors = { + 'float': CtorFloat64Array, + 'int': CtorInt32Array, + // Ordinal data type can be string or int + 'ordinal': Array, + 'number': Array, + 'time': CtorFloat64Array + }; + var defaultDimValueGetters; + + function getIndicesCtor(rawCount) { + // The possible max value in this._indicies is always this._rawCount despite of filtering. + return rawCount > 65535 ? CtorUint32Array : CtorUint16Array; + } + + function getInitialExtent() { + return [Infinity, -Infinity]; + } + + function cloneChunk(originalChunk) { + var Ctor = originalChunk.constructor; // Only shallow clone is enough when Array. + + return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk); + } + + function prepareStore(store, dimIdx, dimType, end, append) { + var DataCtor = dataCtors[dimType || 'float']; + + if (append) { + var oldStore = store[dimIdx]; + var oldLen = oldStore && oldStore.length; + + if (!(oldLen === end)) { + var newStore = new DataCtor(end); // The cost of the copy is probably inconsiderable + // within the initial chunkSize. + + for (var j = 0; j < oldLen; j++) { + newStore[j] = oldStore[j]; + } + + store[dimIdx] = newStore; + } + } else { + store[dimIdx] = new DataCtor(end); + } + } + + /** + * Basically, DataStore API keep immutable. + */ + + var DataStore = + /** @class */ + function () { + function DataStore() { + this._chunks = []; // It will not be calculated util needed. + + this._rawExtent = []; + this._extent = []; + this._count = 0; + this._rawCount = 0; + this._calcDimNameToIdx = createHashMap(); + } + + /** + * Initialize from data + */ + + + DataStore.prototype.initData = function (provider, inputDimensions, dimValueGetter) { + if ("development" !== 'production') { + assert(isFunction(provider.getItem) && isFunction(provider.count), 'Inavlid data provider.'); + } + + this._provider = provider; // Clear + + this._chunks = []; + this._indices = null; + this.getRawIndex = this._getRawIdxIdentity; + var source = provider.getSource(); + var defaultGetter = this.defaultDimValueGetter = defaultDimValueGetters[source.sourceFormat]; // Default dim value getter + + this._dimValueGetter = dimValueGetter || defaultGetter; // Reset raw extent. + + this._rawExtent = []; + var willRetrieveDataByName = shouldRetrieveDataByName(source); + this._dimensions = map(inputDimensions, function (dim) { + if ("development" !== 'production') { + if (willRetrieveDataByName) { + assert(dim.property != null); + } + } + + return { + // Only pick these two props. Not leak other properties like orderMeta. + type: dim.type, + property: dim.property + }; + }); + + this._initDataFromProvider(0, provider.count()); + }; + + DataStore.prototype.getProvider = function () { + return this._provider; + }; + /** + * Caution: even when a `source` instance owned by a series, the created data store + * may still be shared by different sereis (the source hash does not use all `source` + * props, see `sourceManager`). In this case, the `source` props that are not used in + * hash (like `source.dimensionDefine`) probably only belongs to a certain series and + * thus should not be fetch here. + */ + + + DataStore.prototype.getSource = function () { + return this._provider.getSource(); + }; + /** + * @caution Only used in dataStack. + */ + + + DataStore.prototype.ensureCalculationDimension = function (dimName, type) { + var calcDimNameToIdx = this._calcDimNameToIdx; + var dimensions = this._dimensions; + var calcDimIdx = calcDimNameToIdx.get(dimName); + + if (calcDimIdx != null) { + if (dimensions[calcDimIdx].type === type) { + return calcDimIdx; + } + } else { + calcDimIdx = dimensions.length; + } + + dimensions[calcDimIdx] = { + type: type + }; + calcDimNameToIdx.set(dimName, calcDimIdx); + this._chunks[calcDimIdx] = new dataCtors[type || 'float'](this._rawCount); + this._rawExtent[calcDimIdx] = getInitialExtent(); + return calcDimIdx; + }; + + DataStore.prototype.collectOrdinalMeta = function (dimIdx, ordinalMeta) { + var chunk = this._chunks[dimIdx]; + var dim = this._dimensions[dimIdx]; + var rawExtents = this._rawExtent; + var offset = dim.ordinalOffset || 0; + var len = chunk.length; + + if (offset === 0) { + // We need to reset the rawExtent if collect is from start. + // Because this dimension may be guessed as number and calcuating a wrong extent. + rawExtents[dimIdx] = getInitialExtent(); + } + + var dimRawExtent = rawExtents[dimIdx]; // Parse from previous data offset. len may be changed after appendData + + for (var i = offset; i < len; i++) { + var val = chunk[i] = ordinalMeta.parseAndCollect(chunk[i]); + + if (!isNaN(val)) { + dimRawExtent[0] = Math.min(val, dimRawExtent[0]); + dimRawExtent[1] = Math.max(val, dimRawExtent[1]); + } + } + + dim.ordinalMeta = ordinalMeta; + dim.ordinalOffset = len; + dim.type = 'ordinal'; // Force to be ordinal + }; + + DataStore.prototype.getOrdinalMeta = function (dimIdx) { + var dimInfo = this._dimensions[dimIdx]; + var ordinalMeta = dimInfo.ordinalMeta; + return ordinalMeta; + }; + + DataStore.prototype.getDimensionProperty = function (dimIndex) { + var item = this._dimensions[dimIndex]; + return item && item.property; + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + */ + + + DataStore.prototype.appendData = function (data) { + if ("development" !== 'production') { + assert(!this._indices, 'appendData can only be called on raw data.'); + } + + var provider = this._provider; + var start = this.count(); + provider.appendData(data); + var end = provider.count(); + + if (!provider.persistent) { + end += start; + } + + if (start < end) { + this._initDataFromProvider(start, end, true); + } + + return [start, end]; + }; + + DataStore.prototype.appendValues = function (values, minFillLen) { + var chunks = this._chunks; + var dimensions = this._dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var start = this.count(); + var end = start + Math.max(values.length, minFillLen || 0); + + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + prepareStore(chunks, i, dim.type, end, true); + } + + var emptyDataItem = []; + + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; // Store the data by dimensions + + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dim = dimensions[dimIdx]; + var val = defaultDimValueGetters.arrayRows.call(this, values[sourceIdx] || emptyDataItem, dim.property, sourceIdx, dimIdx); + chunks[dimIdx][idx] = val; + var dimRawExtent = rawExtent[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + } + + this._rawCount = this._count = end; + return { + start: start, + end: end + }; + }; + + DataStore.prototype._initDataFromProvider = function (start, end, append) { + var provider = this._provider; + var chunks = this._chunks; + var dimensions = this._dimensions; + var dimLen = dimensions.length; + var rawExtent = this._rawExtent; + var dimNames = map(dimensions, function (dim) { + return dim.property; + }); + + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + + if (!rawExtent[i]) { + rawExtent[i] = getInitialExtent(); + } + + prepareStore(chunks, i, dim.type, end, append); + } + + if (provider.fillStorage) { + provider.fillStorage(start, end, chunks, rawExtent); + } else { + var dataItem = []; + + for (var idx = start; idx < end; idx++) { + // NOTICE: Try not to write things into dataItem + dataItem = provider.getItem(idx, dataItem); // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of category + // Use a tempValue to normalize the value to be a (x, y) value + // Store the data by dimensions + + for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) { + var dimStorage = chunks[dimIdx]; // PENDING NULL is empty or zero + + var val = this._dimValueGetter(dataItem, dimNames[dimIdx], idx, dimIdx); + + dimStorage[idx] = val; + var dimRawExtent = rawExtent[dimIdx]; + val < dimRawExtent[0] && (dimRawExtent[0] = val); + val > dimRawExtent[1] && (dimRawExtent[1] = val); + } + } + } + + if (!provider.persistent && provider.clean) { + // Clean unused data if data source is typed array. + provider.clean(); + } + + this._rawCount = this._count = end; // Reset data extent + + this._extent = []; + }; + + DataStore.prototype.count = function () { + return this._count; + }; + /** + * Get value. Return NaN if idx is out of range. + */ + + + DataStore.prototype.get = function (dim, idx) { + if (!(idx >= 0 && idx < this._count)) { + return NaN; + } + + var dimStore = this._chunks[dim]; + return dimStore ? dimStore[this.getRawIndex(idx)] : NaN; + }; + + DataStore.prototype.getValues = function (dimensions, idx) { + var values = []; + var dimArr = []; + + if (idx == null) { + idx = dimensions; // TODO get all from store? + + dimensions = []; // All dimensions + + for (var i = 0; i < this._dimensions.length; i++) { + dimArr.push(i); + } + } else { + dimArr = dimensions; + } + + for (var i = 0, len = dimArr.length; i < len; i++) { + values.push(this.get(dimArr[i], idx)); + } + + return values; + }; + /** + * @param dim concrete dim + */ + + + DataStore.prototype.getByRawIndex = function (dim, rawIdx) { + if (!(rawIdx >= 0 && rawIdx < this._rawCount)) { + return NaN; + } + + var dimStore = this._chunks[dim]; + return dimStore ? dimStore[rawIdx] : NaN; + }; + /** + * Get sum of data in one dimension + */ + + + DataStore.prototype.getSum = function (dim) { + var dimData = this._chunks[dim]; + var sum = 0; + + if (dimData) { + for (var i = 0, len = this.count(); i < len; i++) { + var value = this.get(dim, i); + + if (!isNaN(value)) { + sum += value; + } + } + } + + return sum; + }; + /** + * Get median of data in one dimension + */ + + + DataStore.prototype.getMedian = function (dim) { + var dimDataArray = []; // map all data of one dimension + + this.each([dim], function (val) { + if (!isNaN(val)) { + dimDataArray.push(val); + } + }); // TODO + // Use quick select? + + var sortedDimDataArray = dimDataArray.sort(function (a, b) { + return a - b; + }); + var len = this.count(); // calculate median + + return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2; + }; + /** + * Retreive the index with given raw data index + */ + + + DataStore.prototype.indexOfRawIndex = function (rawIndex) { + if (rawIndex >= this._rawCount || rawIndex < 0) { + return -1; + } + + if (!this._indices) { + return rawIndex; + } // Indices are ascending + + + var indices = this._indices; // If rawIndex === dataIndex + + var rawDataIndex = indices[rawIndex]; + + if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) { + return rawIndex; + } + + var left = 0; + var right = this._count - 1; + + while (left <= right) { + var mid = (left + right) / 2 | 0; + + if (indices[mid] < rawIndex) { + left = mid + 1; + } else if (indices[mid] > rawIndex) { + right = mid - 1; + } else { + return mid; + } + } + + return -1; + }; + /** + * Retreive the index of nearest value + * @param dim + * @param value + * @param [maxDistance=Infinity] + * @return If and only if multiple indices has + * the same value, they are put to the result. + */ + + + DataStore.prototype.indicesOfNearest = function (dim, value, maxDistance) { + var chunks = this._chunks; + var dimData = chunks[dim]; + var nearestIndices = []; + + if (!dimData) { + return nearestIndices; + } + + if (maxDistance == null) { + maxDistance = Infinity; + } + + var minDist = Infinity; + var minDiff = -1; + var nearestIndicesLen = 0; // Check the test case of `test/ut/spec/data/SeriesData.js`. + + for (var i = 0, len = this.count(); i < len; i++) { + var dataIndex = this.getRawIndex(i); + var diff = value - dimData[dataIndex]; + var dist = Math.abs(diff); + + if (dist <= maxDistance) { + // When the `value` is at the middle of `this.get(dim, i)` and `this.get(dim, i+1)`, + // we'd better not push both of them to `nearestIndices`, otherwise it is easy to + // get more than one item in `nearestIndices` (more specifically, in `tooltip`). + // So we chose the one that `diff >= 0` in this csae. + // But if `this.get(dim, i)` and `this.get(dim, j)` get the same value, both of them + // should be push to `nearestIndices`. + if (dist < minDist || dist === minDist && diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + nearestIndicesLen = 0; + } + + if (diff === minDiff) { + nearestIndices[nearestIndicesLen++] = i; + } + } + } + + nearestIndices.length = nearestIndicesLen; + return nearestIndices; + }; + + DataStore.prototype.getIndices = function () { + var newIndices; + var indices = this._indices; + + if (indices) { + var Ctor = indices.constructor; + var thisCount = this._count; // `new Array(a, b, c)` is different from `new Uint32Array(a, b, c)`. + + if (Ctor === Array) { + newIndices = new Ctor(thisCount); + + for (var i = 0; i < thisCount; i++) { + newIndices[i] = indices[i]; + } + } else { + newIndices = new Ctor(indices.buffer, 0, thisCount); + } + } else { + var Ctor = getIndicesCtor(this._rawCount); + newIndices = new Ctor(this.count()); + + for (var i = 0; i < newIndices.length; i++) { + newIndices[i] = i; + } + } + + return newIndices; + }; + /** + * Data filter. + */ + + + DataStore.prototype.filter = function (dims, cb) { + if (!this._count) { + return this; + } + + var newStore = this.clone(); + var count = newStore.count(); + var Ctor = getIndicesCtor(newStore._rawCount); + var newIndices = new Ctor(count); + var value = []; + var dimSize = dims.length; + var offset = 0; + var dim0 = dims[0]; + var chunks = newStore._chunks; + + for (var i = 0; i < count; i++) { + var keep = void 0; + var rawIdx = newStore.getRawIndex(i); // Simple optimization + + if (dimSize === 0) { + keep = cb(i); + } else if (dimSize === 1) { + var val = chunks[dim0][rawIdx]; + keep = cb(val, i); + } else { + var k = 0; + + for (; k < dimSize; k++) { + value[k] = chunks[dims[k]][rawIdx]; + } + + value[k] = i; + keep = cb.apply(null, value); + } + + if (keep) { + newIndices[offset++] = rawIdx; + } + } // Set indices after filtered. + + + if (offset < count) { + newStore._indices = newIndices; + } + + newStore._count = offset; // Reset data extent + + newStore._extent = []; + + newStore._updateGetRawIdx(); + + return newStore; + }; + /** + * Select data in range. (For optimization of filter) + * (Manually inline code, support 5 million data filtering in data zoom.) + */ + + + DataStore.prototype.selectRange = function (range) { + var newStore = this.clone(); + var len = newStore._count; + + if (!len) { + return this; + } + + var dims = keys(range); + var dimSize = dims.length; + + if (!dimSize) { + return this; + } + + var originalCount = newStore.count(); + var Ctor = getIndicesCtor(newStore._rawCount); + var newIndices = new Ctor(originalCount); + var offset = 0; + var dim0 = dims[0]; + var min = range[dim0][0]; + var max = range[dim0][1]; + var storeArr = newStore._chunks; + var quickFinished = false; + + if (!newStore._indices) { + // Extreme optimization for common case. About 2x faster in chrome. + var idx = 0; + + if (dimSize === 1) { + var dimStorage = storeArr[dims[0]]; + + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; // NaN will not be filtered. Consider the case, in line chart, empty + // value indicates the line should be broken. But for the case like + // scatter plot, a data item with empty value will not be rendered, + // but the axis extent may be effected if some other dim of the data + // item has value. Fortunately it is not a significant negative effect. + + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = idx; + } + + idx++; + } + + quickFinished = true; + } else if (dimSize === 2) { + var dimStorage = storeArr[dims[0]]; + var dimStorage2 = storeArr[dims[1]]; + var min2 = range[dims[1]][0]; + var max2 = range[dims[1]][1]; + + for (var i = 0; i < len; i++) { + var val = dimStorage[i]; + var val2 = dimStorage2[i]; // Do not filter NaN, see comment above. + + if ((val >= min && val <= max || isNaN(val)) && (val2 >= min2 && val2 <= max2 || isNaN(val2))) { + newIndices[offset++] = idx; + } + + idx++; + } + + quickFinished = true; + } + } + + if (!quickFinished) { + if (dimSize === 1) { + for (var i = 0; i < originalCount; i++) { + var rawIndex = newStore.getRawIndex(i); + var val = storeArr[dims[0]][rawIndex]; // Do not filter NaN, see comment above. + + if (val >= min && val <= max || isNaN(val)) { + newIndices[offset++] = rawIndex; + } + } + } else { + for (var i = 0; i < originalCount; i++) { + var keep = true; + var rawIndex = newStore.getRawIndex(i); + + for (var k = 0; k < dimSize; k++) { + var dimk = dims[k]; + var val = storeArr[dimk][rawIndex]; // Do not filter NaN, see comment above. + + if (val < range[dimk][0] || val > range[dimk][1]) { + keep = false; + } + } + + if (keep) { + newIndices[offset++] = newStore.getRawIndex(i); + } + } + } + } // Set indices after filtered. + + + if (offset < originalCount) { + newStore._indices = newIndices; + } + + newStore._count = offset; // Reset data extent + + newStore._extent = []; + + newStore._updateGetRawIdx(); + + return newStore; + }; // /** + // * Data mapping to a plain array + // */ + // mapArray(dims: DimensionIndex[], cb: MapArrayCb): any[] { + // const result: any[] = []; + // this.each(dims, function () { + // result.push(cb && (cb as MapArrayCb).apply(null, arguments)); + // }); + // return result; + // } + + /** + * Data mapping to a new List with given dimensions + */ + + + DataStore.prototype.map = function (dims, cb) { + // TODO only clone picked chunks. + var target = this.clone(dims); + + this._updateDims(target, dims, cb); + + return target; + }; + /** + * @caution Danger!! Only used in dataStack. + */ + + + DataStore.prototype.modify = function (dims, cb) { + this._updateDims(this, dims, cb); + }; + + DataStore.prototype._updateDims = function (target, dims, cb) { + var targetChunks = target._chunks; + var tmpRetValue = []; + var dimSize = dims.length; + var dataCount = target.count(); + var values = []; + var rawExtent = target._rawExtent; + + for (var i = 0; i < dims.length; i++) { + rawExtent[dims[i]] = getInitialExtent(); + } + + for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) { + var rawIndex = target.getRawIndex(dataIndex); + + for (var k = 0; k < dimSize; k++) { + values[k] = targetChunks[dims[k]][rawIndex]; + } + + values[dimSize] = dataIndex; + var retValue = cb && cb.apply(null, values); + + if (retValue != null) { + // a number or string (in oridinal dimension)? + if (typeof retValue !== 'object') { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + + for (var i = 0; i < retValue.length; i++) { + var dim = dims[i]; + var val = retValue[i]; + var rawExtentOnDim = rawExtent[dim]; + var dimStore = targetChunks[dim]; + + if (dimStore) { + dimStore[rawIndex] = val; + } + + if (val < rawExtentOnDim[0]) { + rawExtentOnDim[0] = val; + } + + if (val > rawExtentOnDim[1]) { + rawExtentOnDim[1] = val; + } + } + } + } + }; + /** + * Large data down sampling using largest-triangle-three-buckets + * @param {string} valueDimension + * @param {number} targetCount + */ + + + DataStore.prototype.lttbDownSample = function (valueDimension, rate) { + var target = this.clone([valueDimension], true); + var targetStorage = target._chunks; + var dimStore = targetStorage[valueDimension]; + var len = this.count(); + var sampledIndex = 0; + var frameSize = Math.floor(1 / rate); + var currentRawIndex = this.getRawIndex(0); + var maxArea; + var area; + var nextRawIndex; + var newIndices = new (getIndicesCtor(this._rawCount))(Math.min((Math.ceil(len / frameSize) + 2) * 2, len)); // First frame use the first data. + + newIndices[sampledIndex++] = currentRawIndex; + + for (var i = 1; i < len - 1; i += frameSize) { + var nextFrameStart = Math.min(i + frameSize, len - 1); + var nextFrameEnd = Math.min(i + frameSize * 2, len); + var avgX = (nextFrameEnd + nextFrameStart) / 2; + var avgY = 0; + + for (var idx = nextFrameStart; idx < nextFrameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + + if (isNaN(y)) { + continue; + } + + avgY += y; + } + + avgY /= nextFrameEnd - nextFrameStart; + var frameStart = i; + var frameEnd = Math.min(i + frameSize, len); + var pointAX = i - 1; + var pointAY = dimStore[currentRawIndex]; + maxArea = -1; + nextRawIndex = frameStart; + var firstNaNIndex = -1; + var countNaN = 0; // Find a point from current frame that construct a triangel with largest area with previous selected point + // And the average of next frame. + + for (var idx = frameStart; idx < frameEnd; idx++) { + var rawIndex = this.getRawIndex(idx); + var y = dimStore[rawIndex]; + + if (isNaN(y)) { + countNaN++; + + if (firstNaNIndex < 0) { + firstNaNIndex = rawIndex; + } + + continue; + } // Calculate triangle area over three buckets + + + area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY)); + + if (area > maxArea) { + maxArea = area; + nextRawIndex = rawIndex; // Next a is this b + } + } + + if (countNaN > 0 && countNaN < frameEnd - frameStart) { + // Append first NaN point in every bucket. + // It is necessary to ensure the correct order of indices. + newIndices[sampledIndex++] = Math.min(firstNaNIndex, nextRawIndex); + nextRawIndex = Math.max(firstNaNIndex, nextRawIndex); + } + + newIndices[sampledIndex++] = nextRawIndex; + currentRawIndex = nextRawIndex; // This a is the next a (chosen b) + } // First frame use the last data. + + + newIndices[sampledIndex++] = this.getRawIndex(len - 1); + target._count = sampledIndex; + target._indices = newIndices; + target.getRawIndex = this._getRawIdx; + return target; + }; + /** + * Large data down sampling on given dimension + * @param sampleIndex Sample index for name and id + */ + + + DataStore.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var target = this.clone([dimension], true); + var targetStorage = target._chunks; + var frameValues = []; + var frameSize = Math.floor(1 / rate); + var dimStore = targetStorage[dimension]; + var len = this.count(); + var rawExtentOnDim = target._rawExtent[dimension] = getInitialExtent(); + var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize)); + var offset = 0; + + for (var i = 0; i < len; i += frameSize) { + // Last frame + if (frameSize > len - i) { + frameSize = len - i; + frameValues.length = frameSize; + } + + for (var k = 0; k < frameSize; k++) { + var dataIdx = this.getRawIndex(i + k); + frameValues[k] = dimStore[dataIdx]; + } + + var value = sampleValue(frameValues); + var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len - 1)); // Only write value on the filtered data + + dimStore[sampleFrameIdx] = value; + + if (value < rawExtentOnDim[0]) { + rawExtentOnDim[0] = value; + } + + if (value > rawExtentOnDim[1]) { + rawExtentOnDim[1] = value; + } + + newIndices[offset++] = sampleFrameIdx; + } + + target._count = offset; + target._indices = newIndices; + + target._updateGetRawIdx(); + + return target; + }; + /** + * Data iteration + * @param ctx default this + * @example + * list.each('x', function (x, idx) {}); + * list.each(['x', 'y'], function (x, y, idx) {}); + * list.each(function (idx) {}) + */ + + + DataStore.prototype.each = function (dims, cb) { + if (!this._count) { + return; + } + + var dimSize = dims.length; + var chunks = this._chunks; + + for (var i = 0, len = this.count(); i < len; i++) { + var rawIdx = this.getRawIndex(i); // Simple optimization + + switch (dimSize) { + case 0: + cb(i); + break; + + case 1: + cb(chunks[dims[0]][rawIdx], i); + break; + + case 2: + cb(chunks[dims[0]][rawIdx], chunks[dims[1]][rawIdx], i); + break; + + default: + var k = 0; + var value = []; + + for (; k < dimSize; k++) { + value[k] = chunks[dims[k]][rawIdx]; + } // Index + + + value[k] = i; + cb.apply(null, value); + } + } + }; + /** + * Get extent of data in one dimension + */ + + + DataStore.prototype.getDataExtent = function (dim) { + // Make sure use concrete dim as cache name. + var dimData = this._chunks[dim]; + var initialExtent = getInitialExtent(); + + if (!dimData) { + return initialExtent; + } // Make more strict checkings to ensure hitting cache. + + + var currEnd = this.count(); // Consider the most cases when using data zoom, `getDataExtent` + // happened before filtering. We cache raw extent, which is not + // necessary to be cleared and recalculated when restore data. + + var useRaw = !this._indices; + var dimExtent; + + if (useRaw) { + return this._rawExtent[dim].slice(); + } + + dimExtent = this._extent[dim]; + + if (dimExtent) { + return dimExtent.slice(); + } + + dimExtent = initialExtent; + var min = dimExtent[0]; + var max = dimExtent[1]; + + for (var i = 0; i < currEnd; i++) { + var rawIdx = this.getRawIndex(i); + var value = dimData[rawIdx]; + value < min && (min = value); + value > max && (max = value); + } + + dimExtent = [min, max]; + this._extent[dim] = dimExtent; + return dimExtent; + }; + /** + * Get raw data item + */ + + + DataStore.prototype.getRawDataItem = function (idx) { + var rawIdx = this.getRawIndex(idx); + + if (!this._provider.persistent) { + var val = []; + var chunks = this._chunks; + + for (var i = 0; i < chunks.length; i++) { + val.push(chunks[i][rawIdx]); + } + + return val; + } else { + return this._provider.getItem(rawIdx); + } + }; + /** + * Clone shallow. + * + * @param clonedDims Determine which dims to clone. Will share the data if not specified. + */ + + + DataStore.prototype.clone = function (clonedDims, ignoreIndices) { + var target = new DataStore(); + var chunks = this._chunks; + var clonedDimsMap = clonedDims && reduce(clonedDims, function (obj, dimIdx) { + obj[dimIdx] = true; + return obj; + }, {}); + + if (clonedDimsMap) { + for (var i = 0; i < chunks.length; i++) { + // Not clone if dim is not picked. + target._chunks[i] = !clonedDimsMap[i] ? chunks[i] : cloneChunk(chunks[i]); + } + } else { + target._chunks = chunks; + } + + this._copyCommonProps(target); + + if (!ignoreIndices) { + target._indices = this._cloneIndices(); + } + + target._updateGetRawIdx(); + + return target; + }; + + DataStore.prototype._copyCommonProps = function (target) { + target._count = this._count; + target._rawCount = this._rawCount; + target._provider = this._provider; + target._dimensions = this._dimensions; + target._extent = clone(this._extent); + target._rawExtent = clone(this._rawExtent); + }; + + DataStore.prototype._cloneIndices = function () { + if (this._indices) { + var Ctor = this._indices.constructor; + var indices = void 0; + + if (Ctor === Array) { + var thisCount = this._indices.length; + indices = new Ctor(thisCount); + + for (var i = 0; i < thisCount; i++) { + indices[i] = this._indices[i]; + } + } else { + indices = new Ctor(this._indices); + } + + return indices; + } + + return null; + }; + + DataStore.prototype._getRawIdxIdentity = function (idx) { + return idx; + }; + + DataStore.prototype._getRawIdx = function (idx) { + if (idx < this._count && idx >= 0) { + return this._indices[idx]; + } + + return -1; + }; + + DataStore.prototype._updateGetRawIdx = function () { + this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity; + }; + + DataStore.internalField = function () { + function getDimValueSimply(dataItem, property, dataIndex, dimIndex) { + return parseDataValue(dataItem[dimIndex], this._dimensions[dimIndex]); + } + + defaultDimValueGetters = { + arrayRows: getDimValueSimply, + objectRows: function (dataItem, property, dataIndex, dimIndex) { + return parseDataValue(dataItem[property], this._dimensions[dimIndex]); + }, + keyedColumns: getDimValueSimply, + original: function (dataItem, property, dataIndex, dimIndex) { + // Performance sensitive, do not use modelUtil.getDataItemValue. + // If dataItem is an plain object with no value field, the let `value` + // will be assigned with the object, but it will be tread correctly + // in the `convertValue`. + var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value); + return parseDataValue(value instanceof Array ? value[dimIndex] // If value is a single number or something else not array. + : value, this._dimensions[dimIndex]); + }, + typedArray: function (dataItem, property, dataIndex, dimIndex) { + return dataItem[dimIndex]; + } + }; + }(); + + return DataStore; + }(); + + /** + * [REQUIREMENT_MEMO]: + * (0) `metaRawOption` means `dimensions`/`sourceHeader`/`seriesLayoutBy` in raw option. + * (1) Keep support the feature: `metaRawOption` can be specified both on `series` and + * `root-dataset`. Them on `series` has higher priority. + * (2) Do not support to set `metaRawOption` on a `non-root-dataset`, because it might + * confuse users: whether those props indicate how to visit the upstream source or visit + * the transform result source, and some transforms has nothing to do with these props, + * and some transforms might have multiple upstream. + * (3) Transforms should specify `metaRawOption` in each output, just like they can be + * declared in `root-dataset`. + * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms. + * That is for reducing complexity in transfroms. + * PENDING: Whether to provide transposition transform? + * + * [IMPLEMENTAION_MEMO]: + * "sourceVisitConfig" are calculated from `metaRawOption` and `data`. + * They will not be calculated until `source` is about to be visited (to prevent from + * duplicate calcuation). `source` is visited only in series and input to transforms. + * + * [DIMENSION_INHERIT_RULE]: + * By default the dimensions are inherited from ancestors, unless a transform return + * a new dimensions definition. + * Consider the case: + * ```js + * dataset: [{ + * source: [ ['Product', 'Sales', 'Prise'], ['Cookies', 321, 44.21], ...] + * }, { + * transform: { type: 'filter', ... } + * }] + * dataset: [{ + * dimension: ['Product', 'Sales', 'Prise'], + * source: [ ['Cookies', 321, 44.21], ...] + * }, { + * transform: { type: 'filter', ... } + * }] + * ``` + * The two types of option should have the same behavior after transform. + * + * + * [SCENARIO]: + * (1) Provide source data directly: + * ```js + * series: { + * encode: {...}, + * dimensions: [...] + * seriesLayoutBy: 'row', + * data: [[...]] + * } + * ``` + * (2) Series refer to dataset. + * ```js + * series: [{ + * encode: {...} + * // Ignore datasetIndex means `datasetIndex: 0` + * // and the dimensions defination in dataset is used + * }, { + * encode: {...}, + * seriesLayoutBy: 'column', + * datasetIndex: 1 + * }] + * ``` + * (3) dataset transform + * ```js + * dataset: [{ + * source: [...] + * }, { + * source: [...] + * }, { + * // By default from 0. + * transform: { type: 'filter', config: {...} } + * }, { + * // Piped. + * transform: [ + * { type: 'filter', config: {...} }, + * { type: 'sort', config: {...} } + * ] + * }, { + * id: 'regressionData', + * fromDatasetIndex: 1, + * // Third-party transform + * transform: { type: 'ecStat:regression', config: {...} } + * }, { + * // retrieve the extra result. + * id: 'regressionFormula', + * fromDatasetId: 'regressionData', + * fromTransformResult: 1 + * }] + * ``` + */ + + var SourceManager = + /** @class */ + function () { + function SourceManager(sourceHost) { + // Cached source. Do not repeat calculating if not dirty. + this._sourceList = []; + this._storeList = []; // version sign of each upstream source manager. + + this._upstreamSignList = []; + this._versionSignBase = 0; + this._dirty = true; + this._sourceHost = sourceHost; + } + + /** + * Mark dirty. + */ + + + SourceManager.prototype.dirty = function () { + this._setLocalSource([], []); + + this._storeList = []; + this._dirty = true; + }; + + SourceManager.prototype._setLocalSource = function (sourceList, upstreamSignList) { + this._sourceList = sourceList; + this._upstreamSignList = upstreamSignList; + this._versionSignBase++; + + if (this._versionSignBase > 9e10) { + this._versionSignBase = 0; + } + }; + /** + * For detecting whether the upstream source is dirty, so that + * the local cached source (in `_sourceList`) should be discarded. + */ + + + SourceManager.prototype._getVersionSign = function () { + return this._sourceHost.uid + '_' + this._versionSignBase; + }; + /** + * Always return a source instance. Otherwise throw error. + */ + + + SourceManager.prototype.prepareSource = function () { + // For the case that call `setOption` multiple time but no data changed, + // cache the result source to prevent from repeating transform. + if (this._isDirty()) { + this._createSource(); + + this._dirty = false; + } + }; + + SourceManager.prototype._createSource = function () { + this._setLocalSource([], []); + + var sourceHost = this._sourceHost; + + var upSourceMgrList = this._getUpstreamSourceManagers(); + + var hasUpstream = !!upSourceMgrList.length; + var resultSourceList; + var upstreamSignList; + + if (isSeries(sourceHost)) { + var seriesModel = sourceHost; + var data = void 0; + var sourceFormat = void 0; + var upSource = void 0; // Has upstream dataset + + if (hasUpstream) { + var upSourceMgr = upSourceMgrList[0]; + upSourceMgr.prepareSource(); + upSource = upSourceMgr.getSource(); + data = upSource.data; + sourceFormat = upSource.sourceFormat; + upstreamSignList = [upSourceMgr._getVersionSign()]; + } // Series data is from own. + else { + data = seriesModel.get('data', true); + sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL; + upstreamSignList = []; + } // See [REQUIREMENT_MEMO], merge settings on series and parent dataset if it is root. + + + var newMetaRawOption = this._getSourceMetaRawOption() || {}; + var upMetaRawOption = upSource && upSource.metaRawOption || {}; + var seriesLayoutBy = retrieve2(newMetaRawOption.seriesLayoutBy, upMetaRawOption.seriesLayoutBy) || null; + var sourceHeader = retrieve2(newMetaRawOption.sourceHeader, upMetaRawOption.sourceHeader); // Note here we should not use `upSource.dimensionsDefine`. Consider the case: + // `upSource.dimensionsDefine` is detected by `seriesLayoutBy: 'column'`, + // but series need `seriesLayoutBy: 'row'`. + + var dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption.dimensions); // We share source with dataset as much as possible + // to avoid extra memroy cost of high dimensional data. + + var needsCreateSource = seriesLayoutBy !== upMetaRawOption.seriesLayoutBy || !!sourceHeader !== !!upMetaRawOption.sourceHeader || dimensions; + resultSourceList = needsCreateSource ? [createSource(data, { + seriesLayoutBy: seriesLayoutBy, + sourceHeader: sourceHeader, + dimensions: dimensions + }, sourceFormat)] : []; + } else { + var datasetModel = sourceHost; // Has upstream dataset. + + if (hasUpstream) { + var result = this._applyTransform(upSourceMgrList); + + resultSourceList = result.sourceList; + upstreamSignList = result.upstreamSignList; + } // Is root dataset. + else { + var sourceData = datasetModel.get('source', true); + resultSourceList = [createSource(sourceData, this._getSourceMetaRawOption(), null)]; + upstreamSignList = []; + } + } + + if ("development" !== 'production') { + assert(resultSourceList && upstreamSignList); + } + + this._setLocalSource(resultSourceList, upstreamSignList); + }; + + SourceManager.prototype._applyTransform = function (upMgrList) { + var datasetModel = this._sourceHost; + var transformOption = datasetModel.get('transform', true); + var fromTransformResult = datasetModel.get('fromTransformResult', true); + + if ("development" !== 'production') { + assert(fromTransformResult != null || transformOption != null); + } + + if (fromTransformResult != null) { + var errMsg = ''; + + if (upMgrList.length !== 1) { + if ("development" !== 'production') { + errMsg = 'When using `fromTransformResult`, there should be only one upstream dataset'; + } + + doThrow(errMsg); + } + } + + var sourceList; + var upSourceList = []; + var upstreamSignList = []; + each(upMgrList, function (upMgr) { + upMgr.prepareSource(); + var upSource = upMgr.getSource(fromTransformResult || 0); + var errMsg = ''; + + if (fromTransformResult != null && !upSource) { + if ("development" !== 'production') { + errMsg = 'Can not retrieve result by `fromTransformResult`: ' + fromTransformResult; + } + + doThrow(errMsg); + } + + upSourceList.push(upSource); + upstreamSignList.push(upMgr._getVersionSign()); + }); + + if (transformOption) { + sourceList = applyDataTransform(transformOption, upSourceList, { + datasetIndex: datasetModel.componentIndex + }); + } else if (fromTransformResult != null) { + sourceList = [cloneSourceShallow(upSourceList[0])]; + } + + return { + sourceList: sourceList, + upstreamSignList: upstreamSignList + }; + }; + + SourceManager.prototype._isDirty = function () { + if (this._dirty) { + return true; + } // All sourceList is from the some upsteam. + + + var upSourceMgrList = this._getUpstreamSourceManagers(); + + for (var i = 0; i < upSourceMgrList.length; i++) { + var upSrcMgr = upSourceMgrList[i]; + + if ( // Consider the case that there is ancestor diry, call it recursively. + // The performance is probably not an issue because usually the chain is not long. + upSrcMgr._isDirty() || this._upstreamSignList[i] !== upSrcMgr._getVersionSign()) { + return true; + } + } + }; + /** + * @param sourceIndex By defualt 0, means "main source". + * Most cases there is only one source. + */ + + + SourceManager.prototype.getSource = function (sourceIndex) { + sourceIndex = sourceIndex || 0; + var source = this._sourceList[sourceIndex]; + + if (!source) { + // Series may share source instance with dataset. + var upSourceMgrList = this._getUpstreamSourceManagers(); + + return upSourceMgrList[0] && upSourceMgrList[0].getSource(sourceIndex); + } + + return source; + }; + /** + * + * Get a data store which can be shared across series. + * Only available for series. + * + * @param seriesDimRequest Dimensions that are generated in series. + * Should have been sorted by `storeDimIndex` asc. + */ + + + SourceManager.prototype.getSharedDataStore = function (seriesDimRequest) { + if ("development" !== 'production') { + assert(isSeries(this._sourceHost), 'Can only call getDataStore on series source manager.'); + } + + var schema = seriesDimRequest.makeStoreSchema(); + return this._innerGetDataStore(schema.dimensions, seriesDimRequest.source, schema.hash); + }; + + SourceManager.prototype._innerGetDataStore = function (storeDims, seriesSource, sourceReadKey) { + // TODO Can use other sourceIndex? + var sourceIndex = 0; + var storeList = this._storeList; + var cachedStoreMap = storeList[sourceIndex]; + + if (!cachedStoreMap) { + cachedStoreMap = storeList[sourceIndex] = {}; + } + + var cachedStore = cachedStoreMap[sourceReadKey]; + + if (!cachedStore) { + var upSourceMgr = this._getUpstreamSourceManagers()[0]; + + if (isSeries(this._sourceHost) && upSourceMgr) { + cachedStore = upSourceMgr._innerGetDataStore(storeDims, seriesSource, sourceReadKey); + } else { + cachedStore = new DataStore(); // Always create store from source of series. + + cachedStore.initData(new DefaultDataProvider(seriesSource, storeDims.length), storeDims); + } + + cachedStoreMap[sourceReadKey] = cachedStore; + } + + return cachedStore; + }; + /** + * PEDING: Is it fast enough? + * If no upstream, return empty array. + */ + + + SourceManager.prototype._getUpstreamSourceManagers = function () { + // Always get the relationship from the raw option. + // Do not cache the link of the dependency graph, so that + // no need to update them when change happen. + var sourceHost = this._sourceHost; + + if (isSeries(sourceHost)) { + var datasetModel = querySeriesUpstreamDatasetModel(sourceHost); + return !datasetModel ? [] : [datasetModel.getSourceManager()]; + } else { + return map(queryDatasetUpstreamDatasetModels(sourceHost), function (datasetModel) { + return datasetModel.getSourceManager(); + }); + } + }; + + SourceManager.prototype._getSourceMetaRawOption = function () { + var sourceHost = this._sourceHost; + var seriesLayoutBy; + var sourceHeader; + var dimensions; + + if (isSeries(sourceHost)) { + seriesLayoutBy = sourceHost.get('seriesLayoutBy', true); + sourceHeader = sourceHost.get('sourceHeader', true); + dimensions = sourceHost.get('dimensions', true); + } // See [REQUIREMENT_MEMO], `non-root-dataset` do not support them. + else if (!this._getUpstreamSourceManagers().length) { + var model = sourceHost; + seriesLayoutBy = model.get('seriesLayoutBy', true); + sourceHeader = model.get('sourceHeader', true); + dimensions = model.get('dimensions', true); + } + + return { + seriesLayoutBy: seriesLayoutBy, + sourceHeader: sourceHeader, + dimensions: dimensions + }; + }; + + return SourceManager; + }(); + + // disable the transform merge, but do not disable transfrom clone from rawOption. + + function disableTransformOptionMerge(datasetModel) { + var transformOption = datasetModel.option.transform; + transformOption && setAsPrimitive(datasetModel.option.transform); + } + + function isSeries(sourceHost) { + // Avoid circular dependency with Series.ts + return sourceHost.mainType === 'series'; + } + + function doThrow(errMsg) { + throw new Error(errMsg); + } + + var TOOLTIP_LINE_HEIGHT_CSS = 'line-height:1'; // TODO: more textStyle option + + function getTooltipTextStyle(textStyle, renderMode) { + var nameFontColor = textStyle.color || '#6e7079'; + var nameFontSize = textStyle.fontSize || 12; + var nameFontWeight = textStyle.fontWeight || '400'; + var valueFontColor = textStyle.color || '#464646'; + var valueFontSize = textStyle.fontSize || 14; + var valueFontWeight = textStyle.fontWeight || '900'; + + if (renderMode === 'html') { + // `textStyle` is probably from user input, should be encoded to reduce security risk. + return { + // eslint-disable-next-line max-len + nameStyle: "font-size:" + encodeHTML(nameFontSize + '') + "px;color:" + encodeHTML(nameFontColor) + ";font-weight:" + encodeHTML(nameFontWeight + ''), + // eslint-disable-next-line max-len + valueStyle: "font-size:" + encodeHTML(valueFontSize + '') + "px;color:" + encodeHTML(valueFontColor) + ";font-weight:" + encodeHTML(valueFontWeight + '') + }; + } else { + return { + nameStyle: { + fontSize: nameFontSize, + fill: nameFontColor, + fontWeight: nameFontWeight + }, + valueStyle: { + fontSize: valueFontSize, + fill: valueFontColor, + fontWeight: valueFontWeight + } + }; + } + } // See `TooltipMarkupLayoutIntent['innerGapLevel']`. + // (value from UI design) + + + var HTML_GAPS = [0, 10, 20, 30]; + var RICH_TEXT_GAPS = ['', '\n', '\n\n', '\n\n\n']; // eslint-disable-next-line max-len + + function createTooltipMarkup(type, option) { + option.type = type; + return option; + } + + function isSectionFragment(frag) { + return frag.type === 'section'; + } + + function getBuilder(frag) { + return isSectionFragment(frag) ? buildSection : buildNameValue; + } + + function getBlockGapLevel(frag) { + if (isSectionFragment(frag)) { + var gapLevel_1 = 0; + var subBlockLen = frag.blocks.length; + var hasInnerGap_1 = subBlockLen > 1 || subBlockLen > 0 && !frag.noHeader; + each(frag.blocks, function (subBlock) { + var subGapLevel = getBlockGapLevel(subBlock); // If the some of the sub-blocks have some gaps (like 10px) inside, this block + // should use a larger gap (like 20px) to distinguish those sub-blocks. + + if (subGapLevel >= gapLevel_1) { + gapLevel_1 = subGapLevel + +(hasInnerGap_1 && ( // 0 always can not be readable gap level. + !subGapLevel // If no header, always keep the sub gap level. Otherwise + // look weird in case `multipleSeries`. + || isSectionFragment(subBlock) && !subBlock.noHeader)); + } + }); + return gapLevel_1; + } + + return 0; + } + + function buildSection(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var noHeader = fragment.noHeader; + var gaps = getGap(getBlockGapLevel(fragment)); + var subMarkupTextList = []; + var subBlocks = fragment.blocks || []; + assert(!subBlocks || isArray(subBlocks)); + subBlocks = subBlocks || []; + var orderMode = ctx.orderMode; + + if (fragment.sortBlocks && orderMode) { + subBlocks = subBlocks.slice(); + var orderMap = { + valueAsc: 'asc', + valueDesc: 'desc' + }; + + if (hasOwn(orderMap, orderMode)) { + var comparator_1 = new SortOrderComparator(orderMap[orderMode], null); + subBlocks.sort(function (a, b) { + return comparator_1.evaluate(a.sortParam, b.sortParam); + }); + } // FIXME 'seriesDesc' necessary? + else if (orderMode === 'seriesDesc') { + subBlocks.reverse(); + } + } + + each(subBlocks, function (subBlock, idx) { + var valueFormatter = fragment.valueFormatter; + var subMarkupText = getBuilder(subBlock)( // Inherit valueFormatter + valueFormatter ? extend(extend({}, ctx), { + valueFormatter: valueFormatter + }) : ctx, subBlock, idx > 0 ? gaps.html : 0, toolTipTextStyle); + subMarkupText != null && subMarkupTextList.push(subMarkupText); + }); + var subMarkupText = ctx.renderMode === 'richText' ? subMarkupTextList.join(gaps.richText) : wrapBlockHTML(subMarkupTextList.join(''), noHeader ? topMarginForOuterGap : gaps.html); + + if (noHeader) { + return subMarkupText; + } + + var displayableHeader = makeValueReadable(fragment.header, 'ordinal', ctx.useUTC); + var nameStyle = getTooltipTextStyle(toolTipTextStyle, ctx.renderMode).nameStyle; + + if (ctx.renderMode === 'richText') { + return wrapInlineNameRichText(ctx, displayableHeader, nameStyle) + gaps.richText + subMarkupText; + } else { + return wrapBlockHTML("
            " + encodeHTML(displayableHeader) + '
            ' + subMarkupText, topMarginForOuterGap); + } + } + + function buildNameValue(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) { + var renderMode = ctx.renderMode; + var noName = fragment.noName; + var noValue = fragment.noValue; + var noMarker = !fragment.markerType; + var name = fragment.name; + var useUTC = ctx.useUTC; + + var valueFormatter = fragment.valueFormatter || ctx.valueFormatter || function (value) { + value = isArray(value) ? value : [value]; + return map(value, function (val, idx) { + return makeValueReadable(val, isArray(valueTypeOption) ? valueTypeOption[idx] : valueTypeOption, useUTC); + }); + }; + + if (noName && noValue) { + return; + } + + var markerStr = noMarker ? '' : ctx.markupStyleCreator.makeTooltipMarker(fragment.markerType, fragment.markerColor || '#333', renderMode); + var readableName = noName ? '' : makeValueReadable(name, 'ordinal', useUTC); + var valueTypeOption = fragment.valueType; + var readableValueList = noValue ? [] : valueFormatter(fragment.value); + var valueAlignRight = !noMarker || !noName; // It little weird if only value next to marker but far from marker. + + var valueCloseToMarker = !noMarker && noName; + + var _a = getTooltipTextStyle(toolTipTextStyle, renderMode), + nameStyle = _a.nameStyle, + valueStyle = _a.valueStyle; + + return renderMode === 'richText' ? (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameRichText(ctx, readableName, nameStyle)) // Value has commas inside, so use ' ' as delimiter for multiple values. + + (noValue ? '' : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML((noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? '' : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap); + } + + /** + * @return markupText. null/undefined means no content. + */ + + + function buildTooltipMarkup(fragment, markupStyleCreator, renderMode, orderMode, useUTC, toolTipTextStyle) { + if (!fragment) { + return; + } + + var builder = getBuilder(fragment); + var ctx = { + useUTC: useUTC, + renderMode: renderMode, + orderMode: orderMode, + markupStyleCreator: markupStyleCreator, + valueFormatter: fragment.valueFormatter + }; + return builder(ctx, fragment, 0, toolTipTextStyle); + } + + function getGap(gapLevel) { + return { + html: HTML_GAPS[gapLevel], + richText: RICH_TEXT_GAPS[gapLevel] + }; + } + + function wrapBlockHTML(encodedContent, topGap) { + var clearfix = '
            '; + var marginCSS = "margin: " + topGap + "px 0 0"; + return "
            " + encodedContent + clearfix + '
            '; + } + + function wrapInlineNameHTML(name, leftHasMarker, style) { + var marginCss = leftHasMarker ? 'margin-left:2px' : ''; + return "" + encodeHTML(name) + ''; + } + + function wrapInlineValueHTML(valueList, alignRight, valueCloseToMarker, style) { + // Do not too close to marker, considering there are multiple values separated by spaces. + var paddingStr = valueCloseToMarker ? '10px' : '20px'; + var alignCSS = alignRight ? "float:right;margin-left:" + paddingStr : ''; + valueList = isArray(valueList) ? valueList : [valueList]; + return "" // Value has commas inside, so use ' ' as delimiter for multiple values. + + map(valueList, function (value) { + return encodeHTML(value); + }).join('  ') + ''; + } + + function wrapInlineNameRichText(ctx, name, style) { + return ctx.markupStyleCreator.wrapRichTextStyle(name, style); + } + + function wrapInlineValueRichText(ctx, values, alignRight, valueCloseToMarker, style) { + var styles = [style]; + var paddingLeft = valueCloseToMarker ? 10 : 20; + alignRight && styles.push({ + padding: [0, 0, 0, paddingLeft], + align: 'right' + }); // Value has commas inside, so use ' ' as delimiter for multiple values. + + return ctx.markupStyleCreator.wrapRichTextStyle(isArray(values) ? values.join(' ') : values, styles); + } + + function retrieveVisualColorForTooltipMarker(series, dataIndex) { + var style = series.getData().getItemVisual(dataIndex, 'style'); + var color = style[series.visualDrawType]; + return convertToColorString(color); + } + + function getPaddingFromTooltipModel(model, renderMode) { + var padding = model.get('padding'); + return padding != null ? padding // We give slightly different to look pretty. + : renderMode === 'richText' ? [8, 10] : 10; + } + + /** + * The major feature is generate styles for `renderMode: 'richText'`. + * But it also serves `renderMode: 'html'` to provide + * "renderMode-independent" API. + */ + + var TooltipMarkupStyleCreator = + /** @class */ + function () { + function TooltipMarkupStyleCreator() { + this.richTextStyles = {}; // Notice that "generate a style name" usuall happens repeatly when mouse moving and + // displaying a tooltip. So we put the `_nextStyleNameId` as a member of each creator + // rather than static shared by all creators (which will cause it increase to fast). + + this._nextStyleNameId = getRandomIdBase(); + } + + TooltipMarkupStyleCreator.prototype._generateStyleName = function () { + return '__EC_aUTo_' + this._nextStyleNameId++; + }; + + TooltipMarkupStyleCreator.prototype.makeTooltipMarker = function (markerType, colorStr, renderMode) { + var markerId = renderMode === 'richText' ? this._generateStyleName() : null; + var marker = getTooltipMarker({ + color: colorStr, + type: markerType, + renderMode: renderMode, + markerId: markerId + }); + + if (isString(marker)) { + return marker; + } else { + if ("development" !== 'production') { + assert(markerId); + } + + this.richTextStyles[markerId] = marker.style; + return marker.content; + } + }; + /** + * @usage + * ```ts + * const styledText = markupStyleCreator.wrapRichTextStyle([ + * // The styles will be auto merged. + * { + * fontSize: 12, + * color: 'blue' + * }, + * { + * padding: 20 + * } + * ]); + * ``` + */ + + + TooltipMarkupStyleCreator.prototype.wrapRichTextStyle = function (text, styles) { + var finalStl = {}; + + if (isArray(styles)) { + each(styles, function (stl) { + return extend(finalStl, stl); + }); + } else { + extend(finalStl, styles); + } + + var styleName = this._generateStyleName(); + + this.richTextStyles[styleName] = finalStl; + return "{" + styleName + "|" + text + "}"; + }; + + return TooltipMarkupStyleCreator; + }(); + + function defaultSeriesFormatTooltip(opt) { + var series = opt.series; + var dataIndex = opt.dataIndex; + var multipleSeries = opt.multipleSeries; + var data = series.getData(); + var tooltipDims = data.mapDimensionsAll('defaultedTooltip'); + var tooltipDimLen = tooltipDims.length; + var value = series.getRawValue(dataIndex); + var isValueArr = isArray(value); + var markerColor = retrieveVisualColorForTooltipMarker(series, dataIndex); // Complicated rule for pretty tooltip. + + var inlineValue; + var inlineValueType; + var subBlocks; + var sortParam; + + if (tooltipDimLen > 1 || isValueArr && !tooltipDimLen) { + var formatArrResult = formatTooltipArrayValue(value, series, dataIndex, tooltipDims, markerColor); + inlineValue = formatArrResult.inlineValues; + inlineValueType = formatArrResult.inlineValueTypes; + subBlocks = formatArrResult.blocks; // Only support tooltip sort by the first inline value. It's enough in most cases. + + sortParam = formatArrResult.inlineValues[0]; + } else if (tooltipDimLen) { + var dimInfo = data.getDimensionInfo(tooltipDims[0]); + sortParam = inlineValue = retrieveRawValue(data, dataIndex, tooltipDims[0]); + inlineValueType = dimInfo.type; + } else { + sortParam = inlineValue = isValueArr ? value[0] : value; + } // Do not show generated series name. It might not be readable. + + + var seriesNameSpecified = isNameSpecified(series); + var seriesName = seriesNameSpecified && series.name || ''; + var itemName = data.getName(dataIndex); + var inlineName = multipleSeries ? seriesName : itemName; + return createTooltipMarkup('section', { + header: seriesName, + // When series name not specified, do not show a header line with only '-'. + // This case alway happen in tooltip.trigger: 'item'. + noHeader: multipleSeries || !seriesNameSpecified, + sortParam: sortParam, + blocks: [createTooltipMarkup('nameValue', { + markerType: 'item', + markerColor: markerColor, + // Do not mix display seriesName and itemName in one tooltip, + // which might confuses users. + name: inlineName, + // name dimension might be auto assigned, where the name might + // be not readable. So we check trim here. + noName: !trim(inlineName), + value: inlineValue, + valueType: inlineValueType + })].concat(subBlocks || []) + }); + } + + function formatTooltipArrayValue(value, series, dataIndex, tooltipDims, colorStr) { + // check: category-no-encode-has-axis-data in dataset.html + var data = series.getData(); + var isValueMultipleLine = reduce(value, function (isValueMultipleLine, val, idx) { + var dimItem = data.getDimensionInfo(idx); + return isValueMultipleLine = isValueMultipleLine || dimItem && dimItem.tooltip !== false && dimItem.displayName != null; + }, false); + var inlineValues = []; + var inlineValueTypes = []; + var blocks = []; + tooltipDims.length ? each(tooltipDims, function (dim) { + setEachItem(retrieveRawValue(data, dataIndex, dim), dim); + }) // By default, all dims is used on tooltip. + : each(value, setEachItem); + + function setEachItem(val, dim) { + var dimInfo = data.getDimensionInfo(dim); // If `dimInfo.tooltip` is not set, show tooltip. + + if (!dimInfo || dimInfo.otherDims.tooltip === false) { + return; + } + + if (isValueMultipleLine) { + blocks.push(createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: colorStr, + name: dimInfo.displayName, + value: val, + valueType: dimInfo.type + })); + } else { + inlineValues.push(val); + inlineValueTypes.push(dimInfo.type); + } + } + + return { + inlineValues: inlineValues, + inlineValueTypes: inlineValueTypes, + blocks: blocks + }; + } + + var inner$1 = makeInner(); + + function getSelectionKey(data, dataIndex) { + return data.getName(dataIndex) || data.getId(dataIndex); + } + + var SERIES_UNIVERSAL_TRANSITION_PROP = '__universalTransitionEnabled'; + + var SeriesModel = + /** @class */ + function (_super) { + __extends(SeriesModel, _super); + + function SeriesModel() { + // [Caution]: Becuase this class or desecendants can be used as `XXX.extend(subProto)`, + // the class members must not be initialized in constructor or declaration place. + // Otherwise there is bad case: + // class A {xxx = 1;} + // enableClassExtend(A); + // class B extends A {} + // var C = B.extend({xxx: 5}); + // var c = new C(); + // console.log(c.xxx); // expect 5 but always 1. + var _this = _super !== null && _super.apply(this, arguments) || this; // --------------------------------------- + // Props about data selection + // --------------------------------------- + + + _this._selectedDataIndicesMap = {}; + return _this; + } + + SeriesModel.prototype.init = function (option, parentModel, ecModel) { + this.seriesIndex = this.componentIndex; + this.dataTask = createTask({ + count: dataTaskCount, + reset: dataTaskReset + }); + this.dataTask.context = { + model: this + }; + this.mergeDefaultAndTheme(option, ecModel); + var sourceManager = inner$1(this).sourceManager = new SourceManager(this); + sourceManager.prepareSource(); + var data = this.getInitialData(option, ecModel); + wrapData(data, this); + this.dataTask.context.data = data; + + if ("development" !== 'production') { + assert(data, 'getInitialData returned invalid data.'); + } + + inner$1(this).dataBeforeProcessed = data; // If we reverse the order (make data firstly, and then make + // dataBeforeProcessed by cloneShallow), cloneShallow will + // cause data.graph.data !== data when using + // module:echarts/data/Graph or module:echarts/data/Tree. + // See module:echarts/data/helper/linkSeriesData + // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model + // init or merge stage, because the data can be restored. So we do not `restoreData` + // and `setData` here, which forbids calling `seriesModel.getData()` in this stage. + // Call `seriesModel.getRawData()` instead. + // this.restoreData(); + + autoSeriesName(this); + + this._initSelectedMapFromData(data); + }; + /** + * Util for merge default and theme to option + */ + + + SeriesModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; // Backward compat: using subType on theme. + // But if name duplicate between series subType + // (for example: parallel) add component mainType, + // add suffix 'Series'. + + var themeSubType = this.subType; + + if (ComponentModel.hasClass(themeSubType)) { + themeSubType += 'Series'; + } + + merge(option, ecModel.getTheme().get(this.subType)); + merge(option, this.getDefaultOption()); // Default label emphasis `show` + + defaultEmphasis(option, 'label', ['show']); + this.fillDataTextStyle(option.data); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + SeriesModel.prototype.mergeOption = function (newSeriesOption, ecModel) { + // this.settingTask.dirty(); + newSeriesOption = merge(this.option, newSeriesOption, true); + this.fillDataTextStyle(newSeriesOption.data); + var layoutMode = fetchLayoutMode(this); + + if (layoutMode) { + mergeLayoutParam(this.option, newSeriesOption, layoutMode); + } + + var sourceManager = inner$1(this).sourceManager; + sourceManager.dirty(); + sourceManager.prepareSource(); + var data = this.getInitialData(newSeriesOption, ecModel); + wrapData(data, this); + this.dataTask.dirty(); + this.dataTask.context.data = data; + inner$1(this).dataBeforeProcessed = data; + autoSeriesName(this); + + this._initSelectedMapFromData(data); + }; + + SeriesModel.prototype.fillDataTextStyle = function (data) { + // Default data label emphasis `show` + // FIXME Tree structure data ? + // FIXME Performance ? + if (data && !isTypedArray(data)) { + var props = ['show']; + + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + defaultEmphasis(data[i], 'label', props); + } + } + } + }; + /** + * Init a data structure from data related option in series + * Must be overriden. + */ + + + SeriesModel.prototype.getInitialData = function (option, ecModel) { + return; + }; + /** + * Append data to list + */ + + + SeriesModel.prototype.appendData = function (params) { + // FIXME ??? + // (1) If data from dataset, forbidden append. + // (2) support append data of dataset. + var data = this.getRawData(); + data.appendData(params.data); + }; + /** + * Consider some method like `filter`, `map` need make new data, + * We should make sure that `seriesModel.getData()` get correct + * data in the stream procedure. So we fetch data from upstream + * each time `task.perform` called. + */ + + + SeriesModel.prototype.getData = function (dataType) { + var task = getCurrentTask(this); + + if (task) { + var data = task.context.data; + return dataType == null ? data : data.getLinkedData(dataType); + } else { + // When series is not alive (that may happen when click toolbox + // restore or setOption with not merge mode), series data may + // be still need to judge animation or something when graphic + // elements want to know whether fade out. + return inner$1(this).data; + } + }; + + SeriesModel.prototype.getAllData = function () { + var mainData = this.getData(); + return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{ + data: mainData + }]; + }; + + SeriesModel.prototype.setData = function (data) { + var task = getCurrentTask(this); + + if (task) { + var context = task.context; // Consider case: filter, data sample. + // FIXME:TS never used, so comment it + // if (context.data !== data && task.modifyOutputEnd) { + // task.setOutputEnd(data.count()); + // } + + context.outputData = data; // Caution: setData should update context.data, + // Because getData may be called multiply in a + // single stage and expect to get the data just + // set. (For example, AxisProxy, x y both call + // getData and setDate sequentially). + // So the context.data should be fetched from + // upstream each time when a stage starts to be + // performed. + + if (task !== this.dataTask) { + context.data = data; + } + } + + inner$1(this).data = data; + }; + + SeriesModel.prototype.getEncode = function () { + var encode = this.get('encode', true); + + if (encode) { + return createHashMap(encode); + } + }; + + SeriesModel.prototype.getSourceManager = function () { + return inner$1(this).sourceManager; + }; + + SeriesModel.prototype.getSource = function () { + return this.getSourceManager().getSource(); + }; + /** + * Get data before processed + */ + + + SeriesModel.prototype.getRawData = function () { + return inner$1(this).dataBeforeProcessed; + }; + + SeriesModel.prototype.getColorBy = function () { + var colorBy = this.get('colorBy'); + return colorBy || 'series'; + }; + + SeriesModel.prototype.isColorBySeries = function () { + return this.getColorBy() === 'series'; + }; + /** + * Get base axis if has coordinate system and has axis. + * By default use coordSys.getBaseAxis(); + * Can be overrided for some chart. + * @return {type} description + */ + + + SeriesModel.prototype.getBaseAxis = function () { + var coordSys = this.coordinateSystem; // @ts-ignore + + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }; + /** + * Default tooltip formatter + * + * @param dataIndex + * @param multipleSeries + * @param dataType + * @param renderMode valid values: 'html'(by default) and 'richText'. + * 'html' is used for rendering tooltip in extra DOM form, and the result + * string is used as DOM HTML content. + * 'richText' is used for rendering tooltip in rich text form, for those where + * DOM operation is not supported. + * @return formatted tooltip with `html` and `markers` + * Notice: The override method can also return string + */ + + + SeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + return defaultSeriesFormatTooltip({ + series: this, + dataIndex: dataIndex, + multipleSeries: multipleSeries + }); + }; + + SeriesModel.prototype.isAnimationEnabled = function () { + var ecModel = this.ecModel; // Disable animation if using echarts in node but not give ssr flag. + // In ssr mode, renderToString will generate svg with css animation. + + if (env.node && !(ecModel && ecModel.ssr)) { + return false; + } + + var animationEnabled = this.getShallow('animation'); + + if (animationEnabled) { + if (this.getData().count() > this.getShallow('animationThreshold')) { + animationEnabled = false; + } + } + + return !!animationEnabled; + }; + + SeriesModel.prototype.restoreData = function () { + this.dataTask.dirty(); + }; + + SeriesModel.prototype.getColorFromPalette = function (name, scope, requestColorNum) { + var ecModel = this.ecModel; // PENDING + + var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum); + + if (!color) { + color = ecModel.getColorFromPalette(name, scope, requestColorNum); + } + + return color; + }; + /** + * Use `data.mapDimensionsAll(coordDim)` instead. + * @deprecated + */ + + + SeriesModel.prototype.coordDimToDataDim = function (coordDim) { + return this.getRawData().mapDimensionsAll(coordDim); + }; + /** + * Get progressive rendering count each step + */ + + + SeriesModel.prototype.getProgressive = function () { + return this.get('progressive'); + }; + /** + * Get progressive rendering count each step + */ + + + SeriesModel.prototype.getProgressiveThreshold = function () { + return this.get('progressiveThreshold'); + }; // PENGING If selectedMode is null ? + + + SeriesModel.prototype.select = function (innerDataIndices, dataType) { + this._innerSelect(this.getData(dataType), innerDataIndices); + }; + + SeriesModel.prototype.unselect = function (innerDataIndices, dataType) { + var selectedMap = this.option.selectedMap; + + if (!selectedMap) { + return; + } + + var selectedMode = this.option.selectedMode; + var data = this.getData(dataType); + + if (selectedMode === 'series' || selectedMap === 'all') { + this.option.selectedMap = {}; + this._selectedDataIndicesMap = {}; + return; + } + + for (var i = 0; i < innerDataIndices.length; i++) { + var dataIndex = innerDataIndices[i]; + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = false; + this._selectedDataIndicesMap[nameOrId] = -1; + } + }; + + SeriesModel.prototype.toggleSelect = function (innerDataIndices, dataType) { + var tmpArr = []; + + for (var i = 0; i < innerDataIndices.length; i++) { + tmpArr[0] = innerDataIndices[i]; + this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr, dataType) : this.select(tmpArr, dataType); + } + }; + + SeriesModel.prototype.getSelectedDataIndices = function () { + if (this.option.selectedMap === 'all') { + return [].slice.call(this.getData().getIndices()); + } + + var selectedDataIndicesMap = this._selectedDataIndicesMap; + var nameOrIds = keys(selectedDataIndicesMap); + var dataIndices = []; + + for (var i = 0; i < nameOrIds.length; i++) { + var dataIndex = selectedDataIndicesMap[nameOrIds[i]]; + + if (dataIndex >= 0) { + dataIndices.push(dataIndex); + } + } + + return dataIndices; + }; + + SeriesModel.prototype.isSelected = function (dataIndex, dataType) { + var selectedMap = this.option.selectedMap; + + if (!selectedMap) { + return false; + } + + var data = this.getData(dataType); + return (selectedMap === 'all' || selectedMap[getSelectionKey(data, dataIndex)]) && !data.getItemModel(dataIndex).get(['select', 'disabled']); + }; + + SeriesModel.prototype.isUniversalTransitionEnabled = function () { + if (this[SERIES_UNIVERSAL_TRANSITION_PROP]) { + return true; + } + + var universalTransitionOpt = this.option.universalTransition; // Quick reject + + if (!universalTransitionOpt) { + return false; + } + + if (universalTransitionOpt === true) { + return true; + } // Can be simply 'universalTransition: true' + + + return universalTransitionOpt && universalTransitionOpt.enabled; + }; + + SeriesModel.prototype._innerSelect = function (data, innerDataIndices) { + var _a, _b; + + var option = this.option; + var selectedMode = option.selectedMode; + var len = innerDataIndices.length; + + if (!selectedMode || !len) { + return; + } + + if (selectedMode === 'series') { + option.selectedMap = 'all'; + } else if (selectedMode === 'multiple') { + if (!isObject(option.selectedMap)) { + option.selectedMap = {}; + } + + var selectedMap = option.selectedMap; + + for (var i = 0; i < len; i++) { + var dataIndex = innerDataIndices[i]; // TODO diffrent types of data share same object. + + var nameOrId = getSelectionKey(data, dataIndex); + selectedMap[nameOrId] = true; + this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex); + } + } else if (selectedMode === 'single' || selectedMode === true) { + var lastDataIndex = innerDataIndices[len - 1]; + var nameOrId = getSelectionKey(data, lastDataIndex); + option.selectedMap = (_a = {}, _a[nameOrId] = true, _a); + this._selectedDataIndicesMap = (_b = {}, _b[nameOrId] = data.getRawIndex(lastDataIndex), _b); + } + }; + + SeriesModel.prototype._initSelectedMapFromData = function (data) { + // Ignore select info in data if selectedMap exists. + // NOTE It's only for legacy usage. edge data is not supported. + if (this.option.selectedMap) { + return; + } + + var dataIndices = []; + + if (data.hasItemOption) { + data.each(function (idx) { + var rawItem = data.getRawDataItem(idx); + + if (rawItem && rawItem.selected) { + dataIndices.push(idx); + } + }); + } + + if (dataIndices.length > 0) { + this._innerSelect(data, dataIndices); + } + }; // /** + // * @see {module:echarts/stream/Scheduler} + // */ + // abstract pipeTask: null + + + SeriesModel.registerClass = function (clz) { + return ComponentModel.registerClass(clz); + }; + + SeriesModel.protoInitialize = function () { + var proto = SeriesModel.prototype; + proto.type = 'series.__base__'; + proto.seriesIndex = 0; + proto.ignoreStyleOnData = false; + proto.hasSymbolVisual = false; + proto.defaultSymbol = 'circle'; // Make sure the values can be accessed! + + proto.visualStyleAccessPath = 'itemStyle'; + proto.visualDrawType = 'fill'; + }(); + + return SeriesModel; + }(ComponentModel); + + mixin(SeriesModel, DataFormatMixin); + mixin(SeriesModel, PaletteMixin); + mountExtend(SeriesModel, ComponentModel); + + /** + * MUST be called after `prepareSource` called + * Here we need to make auto series, especially for auto legend. But we + * do not modify series.name in option to avoid side effects. + */ + + function autoSeriesName(seriesModel) { + // User specified name has higher priority, otherwise it may cause + // series can not be queried unexpectedly. + var name = seriesModel.name; + + if (!isNameSpecified(seriesModel)) { + seriesModel.name = getSeriesAutoName(seriesModel) || name; + } + } + + function getSeriesAutoName(seriesModel) { + var data = seriesModel.getRawData(); + var dataDims = data.mapDimensionsAll('seriesName'); + var nameArr = []; + each(dataDims, function (dataDim) { + var dimInfo = data.getDimensionInfo(dataDim); + dimInfo.displayName && nameArr.push(dimInfo.displayName); + }); + return nameArr.join(' '); + } + + function dataTaskCount(context) { + return context.model.getRawData().count(); + } + + function dataTaskReset(context) { + var seriesModel = context.model; + seriesModel.setData(seriesModel.getRawData().cloneShallow()); + return dataTaskProgress; + } + + function dataTaskProgress(param, context) { + // Avoid repead cloneShallow when data just created in reset. + if (context.outputData && param.end > context.outputData.count()) { + context.model.getRawData().cloneShallow(context.outputData); + } + } // TODO refactor + + + function wrapData(data, seriesModel) { + each(concatArray(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function (methodName) { + data.wrapMethod(methodName, curry(onDataChange, seriesModel)); + }); + } + + function onDataChange(seriesModel, newList) { + var task = getCurrentTask(seriesModel); + + if (task) { + // Consider case: filter, selectRange + task.setOutputEnd((newList || this).count()); + } + + return newList; + } + + function getCurrentTask(seriesModel) { + var scheduler = (seriesModel.ecModel || {}).scheduler; + var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid); + + if (pipeline) { + // When pipline finished, the currrentTask keep the last + // task (renderTask). + var task = pipeline.currentTask; + + if (task) { + var agentStubMap = task.agentStubMap; + + if (agentStubMap) { + task = agentStubMap.get(seriesModel.uid); + } + } + + return task; + } + } + + var ComponentView = + /** @class */ + function () { + function ComponentView() { + this.group = new Group(); + this.uid = getUID('viewComponent'); + } + + ComponentView.prototype.init = function (ecModel, api) { + }; + + ComponentView.prototype.render = function (model, ecModel, api, payload) { + }; + + ComponentView.prototype.dispose = function (ecModel, api) { + }; + + ComponentView.prototype.updateView = function (model, ecModel, api, payload) {// Do nothing; + }; + + ComponentView.prototype.updateLayout = function (model, ecModel, api, payload) {// Do nothing; + }; + + ComponentView.prototype.updateVisual = function (model, ecModel, api, payload) {// Do nothing; + }; + /** + * Hook for toggle blur target series. + * Can be used in marker for blur or leave blur the markers + */ + + + ComponentView.prototype.toggleBlurSeries = function (seriesModels, isBlur, ecModel) {// Do nothing; + }; + /** + * Traverse the new rendered elements. + * + * It will traverse the new added element in progressive rendering. + * And traverse all in normal rendering. + */ + + + ComponentView.prototype.eachRendered = function (cb) { + var group = this.group; + + if (group) { + group.traverse(cb); + } + }; + + return ComponentView; + }(); + enableClassExtend(ComponentView); + enableClassManagement(ComponentView); + + /** + * @return {string} If large mode changed, return string 'reset'; + */ + + function createRenderPlanner() { + var inner = makeInner(); + return function (seriesModel) { + var fields = inner(seriesModel); + var pipelineContext = seriesModel.pipelineContext; + var originalLarge = !!fields.large; + var originalProgressive = !!fields.progressiveRender; // FIXME: if the planner works on a filtered series, `pipelineContext` does not + // exists. See #11611 . Probably we need to modify this structure, see the comment + // on `performRawSeries` in `Schedular.js`. + + var large = fields.large = !!(pipelineContext && pipelineContext.large); + var progressive = fields.progressiveRender = !!(pipelineContext && pipelineContext.progressiveRender); + return !!(originalLarge !== large || originalProgressive !== progressive) && 'reset'; + }; + } + + var inner$2 = makeInner(); + var renderPlanner = createRenderPlanner(); + + var ChartView = + /** @class */ + function () { + function ChartView() { + this.group = new Group(); + this.uid = getUID('viewChart'); + this.renderTask = createTask({ + plan: renderTaskPlan, + reset: renderTaskReset + }); + this.renderTask.context = { + view: this + }; + } + + ChartView.prototype.init = function (ecModel, api) { + }; + + ChartView.prototype.render = function (seriesModel, ecModel, api, payload) { + if ("development" !== 'production') { + throw new Error('render method must been implemented'); + } + }; + /** + * Highlight series or specified data item. + */ + + + ChartView.prototype.highlight = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(payload && payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + toggleHighlight(data, payload, 'emphasis'); + }; + /** + * Downplay series or specified data item. + */ + + + ChartView.prototype.downplay = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(payload && payload.dataType); + + if (!data) { + if ("development" !== 'production') { + error("Unknown dataType " + payload.dataType); + } + + return; + } + + toggleHighlight(data, payload, 'normal'); + }; + /** + * Remove self. + */ + + + ChartView.prototype.remove = function (ecModel, api) { + this.group.removeAll(); + }; + /** + * Dispose self. + */ + + + ChartView.prototype.dispose = function (ecModel, api) { + }; + + ChartView.prototype.updateView = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; // FIXME never used? + + + ChartView.prototype.updateLayout = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; // FIXME never used? + + + ChartView.prototype.updateVisual = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + /** + * Traverse the new rendered elements. + * + * It will traverse the new added element in progressive rendering. + * And traverse all in normal rendering. + */ + + + ChartView.prototype.eachRendered = function (cb) { + traverseElements(this.group, cb); + }; + + ChartView.markUpdateMethod = function (payload, methodName) { + inner$2(payload).updateMethod = methodName; + }; + + ChartView.protoInitialize = function () { + var proto = ChartView.prototype; + proto.type = 'chart'; + }(); + + return ChartView; + }(); + + /** + * Set state of single element + */ + + function elSetState(el, state, highlightDigit) { + if (el && isHighDownDispatcher(el)) { + (state === 'emphasis' ? enterEmphasis : leaveEmphasis)(el, highlightDigit); + } + } + + function toggleHighlight(data, payload, state) { + var dataIndex = queryDataIndex(data, payload); + var highlightDigit = payload && payload.highlightKey != null ? getHighlightDigit(payload.highlightKey) : null; + + if (dataIndex != null) { + each(normalizeToArray(dataIndex), function (dataIdx) { + elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit); + }); + } else { + data.eachItemGraphicEl(function (el) { + elSetState(el, state, highlightDigit); + }); + } + } + + enableClassExtend(ChartView, ['dispose']); + enableClassManagement(ChartView); + + function renderTaskPlan(context) { + return renderPlanner(context.model); + } + + function renderTaskReset(context) { + var seriesModel = context.model; + var ecModel = context.ecModel; + var api = context.api; + var payload = context.payload; // FIXME: remove updateView updateVisual + + var progressiveRender = seriesModel.pipelineContext.progressiveRender; + var view = context.view; + var updateMethod = payload && inner$2(payload).updateMethod; + var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod // `appendData` is also supported when data amount + // is less than progressive threshold. + : 'render'; + + if (methodName !== 'render') { + view[methodName](seriesModel, ecModel, api, payload); + } + + return progressMethodMap[methodName]; + } + + var progressMethodMap = { + incrementalPrepareRender: { + progress: function (params, context) { + context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload); + } + }, + render: { + // Put view.render in `progress` to support appendData. But in this case + // view.render should not be called in reset, otherwise it will be called + // twise. Use `forceFirstProgress` to make sure that view.render is called + // in any cases. + forceFirstProgress: true, + progress: function (params, context) { + context.view.render(context.model, context.ecModel, context.api, context.payload); + } + } + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var ORIGIN_METHOD = '\0__throttleOriginMethod'; + var RATE = '\0__throttleRate'; + var THROTTLE_TYPE = '\0__throttleType'; + + /** + * @public + * @param {(Function)} fn + * @param {number} [delay=0] Unit: ms. + * @param {boolean} [debounce=false] + * true: If call interval less than `delay`, only the last call works. + * false: If call interval less than `delay, call works on fixed rate. + * @return {(Function)} throttled fn. + */ + + function throttle(fn, delay, debounce) { + var currCall; + var lastCall = 0; + var lastExec = 0; + var timer = null; + var diff; + var scope; + var args; + var debounceNextCall; + delay = delay || 0; + + function exec() { + lastExec = new Date().getTime(); + timer = null; + fn.apply(scope, args || []); + } + + var cb = function () { + var cbArgs = []; + + for (var _i = 0; _i < arguments.length; _i++) { + cbArgs[_i] = arguments[_i]; + } + + currCall = new Date().getTime(); + scope = this; + args = cbArgs; + var thisDelay = debounceNextCall || delay; + var thisDebounce = debounceNextCall || debounce; + debounceNextCall = null; + diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay; + clearTimeout(timer); // Here we should make sure that: the `exec` SHOULD NOT be called later + // than a new call of `cb`, that is, preserving the command order. Consider + // calculating "scale rate" when roaming as an example. When a call of `cb` + // happens, either the `exec` is called dierectly, or the call is delayed. + // But the delayed call should never be later than next call of `cb`. Under + // this assurance, we can simply update view state each time `dispatchAction` + // triggered by user roaming, but not need to add extra code to avoid the + // state being "rolled-back". + + if (thisDebounce) { + timer = setTimeout(exec, thisDelay); + } else { + if (diff >= 0) { + exec(); + } else { + timer = setTimeout(exec, -diff); + } + } + + lastCall = currCall; + }; + /** + * Clear throttle. + * @public + */ + + + cb.clear = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + }; + /** + * Enable debounce once. + */ + + + cb.debounceNextCall = function (debounceDelay) { + debounceNextCall = debounceDelay; + }; + + return cb; + } + + /** + * Create throttle method or update throttle rate. + * + * @example + * ComponentView.prototype.render = function () { + * ... + * throttle.createOrUpdate( + * this, + * '_dispatchAction', + * this.model.get('throttle'), + * 'fixRate' + * ); + * }; + * ComponentView.prototype.remove = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * ComponentView.prototype.dispose = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * + */ + + function createOrUpdate(obj, fnAttr, rate, throttleType) { + var fn = obj[fnAttr]; + + if (!fn) { + return; + } + + var originFn = fn[ORIGIN_METHOD] || fn; + var lastThrottleType = fn[THROTTLE_TYPE]; + var lastRate = fn[RATE]; + + if (lastRate !== rate || lastThrottleType !== throttleType) { + if (rate == null || !throttleType) { + return obj[fnAttr] = originFn; + } + + fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce'); + fn[ORIGIN_METHOD] = originFn; + fn[THROTTLE_TYPE] = throttleType; + fn[RATE] = rate; + } + + return fn; + } + + /** + * Clear throttle. Example see throttle.createOrUpdate. + */ + + function clear(obj, fnAttr) { + var fn = obj[fnAttr]; + + if (fn && fn[ORIGIN_METHOD]) { + // Clear throttle + fn.clear && fn.clear(); + obj[fnAttr] = fn[ORIGIN_METHOD]; + } + } + + var inner$3 = makeInner(); + var defaultStyleMappers = { + itemStyle: makeStyleMapper(ITEM_STYLE_KEY_MAP, true), + lineStyle: makeStyleMapper(LINE_STYLE_KEY_MAP, true) + }; + var defaultColorKey = { + lineStyle: 'stroke', + itemStyle: 'fill' + }; + + function getStyleMapper(seriesModel, stylePath) { + var styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath]; + + if (!styleMapper) { + console.warn("Unkown style type '" + stylePath + "'."); + return defaultStyleMappers.itemStyle; + } + + return styleMapper; + } + + function getDefaultColorKey(seriesModel, stylePath) { + // return defaultColorKey[stylePath] || + var colorKey = seriesModel.visualDrawType || defaultColorKey[stylePath]; + + if (!colorKey) { + console.warn("Unkown style type '" + stylePath + "'."); + return 'fill'; + } + + return colorKey; + } + + var seriesStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; // Set in itemStyle + + var styleModel = seriesModel.getModel(stylePath); + var getStyle = getStyleMapper(seriesModel, stylePath); + var globalStyle = getStyle(styleModel); + var decalOption = styleModel.getShallow('decal'); + + if (decalOption) { + data.setVisual('decal', decalOption); + decalOption.dirty = true; + } // TODO + + + var colorKey = getDefaultColorKey(seriesModel, stylePath); + var color = globalStyle[colorKey]; // TODO style callback + + var colorCallback = isFunction(color) ? color : null; + var hasAutoColor = globalStyle.fill === 'auto' || globalStyle.stroke === 'auto'; // Get from color palette by default. + + if (!globalStyle[colorKey] || colorCallback || hasAutoColor) { + // Note: if some series has color specified (e.g., by itemStyle.color), we DO NOT + // make it effect palette. Bacause some scenarios users need to make some series + // transparent or as background, which should better not effect the palette. + var colorPalette = seriesModel.getColorFromPalette( // TODO series count changed. + seriesModel.name, null, ecModel.getSeriesCount()); + + if (!globalStyle[colorKey]) { + globalStyle[colorKey] = colorPalette; + data.setVisual('colorFromPalette', true); + } + + globalStyle.fill = globalStyle.fill === 'auto' || isFunction(globalStyle.fill) ? colorPalette : globalStyle.fill; + globalStyle.stroke = globalStyle.stroke === 'auto' || isFunction(globalStyle.stroke) ? colorPalette : globalStyle.stroke; + } + + data.setVisual('style', globalStyle); + data.setVisual('drawType', colorKey); // Only visible series has each data be visual encoded + + if (!ecModel.isSeriesFiltered(seriesModel) && colorCallback) { + data.setVisual('colorFromPalette', false); + return { + dataEach: function (data, idx) { + var dataParams = seriesModel.getDataParams(idx); + var itemStyle = extend({}, globalStyle); + itemStyle[colorKey] = colorCallback(dataParams); + data.setItemVisual(idx, 'style', itemStyle); + } + }; + } + } + }; + var sharedModel = new Model(); + var dataStyleTask = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (seriesModel.ignoreStyleOnData || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; // Set in itemStyle + + var getStyle = getStyleMapper(seriesModel, stylePath); + var colorKey = data.getVisual('drawType'); + return { + dataEach: data.hasItemOption ? function (data, idx) { + // Not use getItemModel for performance considuration + var rawItem = data.getRawDataItem(idx); + + if (rawItem && rawItem[stylePath]) { + sharedModel.option = rawItem[stylePath]; + var style = getStyle(sharedModel); + var existsStyle = data.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + + if (sharedModel.option.decal) { + data.setItemVisual(idx, 'decal', sharedModel.option.decal); + sharedModel.option.decal.dirty = true; + } + + if (colorKey in style) { + data.setItemVisual(idx, 'colorFromPalette', false); + } + } + } : null + }; + } + }; // Pick color from palette for the data which has not been set with color yet. + // Note: do not support stream rendering. No such cases yet. + + var dataColorPaletteTask = { + performRawSeries: true, + overallReset: function (ecModel) { + // Each type of series use one scope. + // Pie and funnel are using diferrent scopes + var paletteScopeGroupByType = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var colorBy = seriesModel.getColorBy(); + + if (seriesModel.isColorBySeries()) { + return; + } + + var key = seriesModel.type + '-' + colorBy; + var colorScope = paletteScopeGroupByType.get(key); + + if (!colorScope) { + colorScope = {}; + paletteScopeGroupByType.set(key, colorScope); + } + + inner$3(seriesModel).scope = colorScope; + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.isColorBySeries() || ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var dataAll = seriesModel.getRawData(); + var idxMap = {}; + var data = seriesModel.getData(); + var colorScope = inner$3(seriesModel).scope; + var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle'; + var colorKey = getDefaultColorKey(seriesModel, stylePath); + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap[rawIdx] = idx; + }); // Iterate on data before filtered. To make sure color from palette can be + // Consistent when toggling legend. + + dataAll.each(function (rawIdx) { + var idx = idxMap[rawIdx]; + var fromPalette = data.getItemVisual(idx, 'colorFromPalette'); // Get color from palette for each data only when the color is inherited from series color, which is + // also picked from color palette. So following situation is not in the case: + // 1. series.itemStyle.color is set + // 2. color is encoded by visualMap + + if (fromPalette) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + var name_1 = dataAll.getName(rawIdx) || rawIdx + ''; + var dataCount = dataAll.count(); + itemStyle[colorKey] = seriesModel.getColorFromPalette(name_1, colorScope, dataCount); + } + }); + }); + } + }; + + var PI$3 = Math.PI; + + /** + * @param {module:echarts/ExtensionAPI} api + * @param {Object} [opts] + * @param {string} [opts.text] + * @param {string} [opts.color] + * @param {string} [opts.textColor] + * @return {module:zrender/Element} + */ + + function defaultLoading(api, opts) { + opts = opts || {}; + defaults(opts, { + text: 'loading', + textColor: '#000', + fontSize: 12, + fontWeight: 'normal', + fontStyle: 'normal', + fontFamily: 'sans-serif', + maskColor: 'rgba(255, 255, 255, 0.8)', + showSpinner: true, + color: '#5470c6', + spinnerRadius: 10, + lineWidth: 5, + zlevel: 0 + }); + var group = new Group(); + var mask = new Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + group.add(mask); + var textContent = new ZRText({ + style: { + text: opts.text, + fill: opts.textColor, + fontSize: opts.fontSize, + fontWeight: opts.fontWeight, + fontStyle: opts.fontStyle, + fontFamily: opts.fontFamily + }, + zlevel: opts.zlevel, + z: 10001 + }); + var labelRect = new Rect({ + style: { + fill: 'none' + }, + textContent: textContent, + textConfig: { + position: 'right', + distance: 10 + }, + zlevel: opts.zlevel, + z: 10001 + }); + group.add(labelRect); + var arc; + + if (opts.showSpinner) { + arc = new Arc({ + shape: { + startAngle: -PI$3 / 2, + endAngle: -PI$3 / 2 + 0.1, + r: opts.spinnerRadius + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: opts.lineWidth + }, + zlevel: opts.zlevel, + z: 10001 + }); + arc.animateShape(true).when(1000, { + endAngle: PI$3 * 3 / 2 + }).start('circularInOut'); + arc.animateShape(true).when(1000, { + startAngle: PI$3 * 3 / 2 + }).delay(300).start('circularInOut'); + group.add(arc); + } // Inject resize + + + group.resize = function () { + var textWidth = textContent.getBoundingRect().width; + var r = opts.showSpinner ? opts.spinnerRadius : 0; // cx = (containerWidth - arcDiameter - textDistance - textWidth) / 2 + // textDistance needs to be calculated when both animation and text exist + + var cx = (api.getWidth() - r * 2 - (opts.showSpinner && textWidth ? 10 : 0) - textWidth) / 2 - (opts.showSpinner && textWidth ? 0 : 5 + textWidth / 2) // only show the text + + (opts.showSpinner ? 0 : textWidth / 2) // only show the spinner + + (textWidth ? 0 : r); + var cy = api.getHeight() / 2; + opts.showSpinner && arc.setShape({ + cx: cx, + cy: cy + }); + labelRect.setShape({ + x: cx - r, + y: cy - r, + width: r * 2, + height: r * 2 + }); + mask.setShape({ + x: 0, + y: 0, + width: api.getWidth(), + height: api.getHeight() + }); + }; + + group.resize(); + return group; + } + + var Scheduler = + /** @class */ + function () { + function Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) { + // key: handlerUID + this._stageTaskMap = createHashMap(); + this.ecInstance = ecInstance; + this.api = api; // Fix current processors in case that in some rear cases that + // processors might be registered after echarts instance created. + // Register processors incrementally for a echarts instance is + // not supported by this stream architecture. + + dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice(); + visualHandlers = this._visualHandlers = visualHandlers.slice(); + this._allHandlers = dataProcessorHandlers.concat(visualHandlers); + } + + Scheduler.prototype.restoreData = function (ecModel, payload) { + // TODO: Only restore needed series and components, but not all components. + // Currently `restoreData` of all of the series and component will be called. + // But some independent components like `title`, `legend`, `graphic`, `toolbox`, + // `tooltip`, `axisPointer`, etc, do not need series refresh when `setOption`, + // and some components like coordinate system, axes, dataZoom, visualMap only + // need their target series refresh. + // (1) If we are implementing this feature some day, we should consider these cases: + // if a data processor depends on a component (e.g., dataZoomProcessor depends + // on the settings of `dataZoom`), it should be re-performed if the component + // is modified by `setOption`. + // (2) If a processor depends on sevral series, speicified by its `getTargetSeries`, + // it should be re-performed when the result array of `getTargetSeries` changed. + // We use `dependencies` to cover these issues. + // (3) How to update target series when coordinate system related components modified. + // TODO: simply the dirty mechanism? Check whether only the case here can set tasks dirty, + // and this case all of the tasks will be set as dirty. + ecModel.restoreData(payload); // Theoretically an overall task not only depends on each of its target series, but also + // depends on all of the series. + // The overall task is not in pipeline, and `ecModel.restoreData` only set pipeline tasks + // dirty. If `getTargetSeries` of an overall task returns nothing, we should also ensure + // that the overall task is set as dirty and to be performed, otherwise it probably cause + // state chaos. So we have to set dirty of all of the overall tasks manually, otherwise it + // probably cause state chaos (consider `dataZoomProcessor`). + + this._stageTaskMap.each(function (taskRecord) { + var overallTask = taskRecord.overallTask; + overallTask && overallTask.dirty(); + }); + }; // If seriesModel provided, incremental threshold is check by series data. + + + Scheduler.prototype.getPerformArgs = function (task, isBlock) { + // For overall task + if (!task.__pipeline) { + return; + } + + var pipeline = this._pipelineMap.get(task.__pipeline.id); + + var pCtx = pipeline.context; + var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex; + var step = incremental ? pipeline.step : null; + var modDataCount = pCtx && pCtx.modDataCount; + var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null; + return { + step: step, + modBy: modBy, + modDataCount: modDataCount + }; + }; + + Scheduler.prototype.getPipeline = function (pipelineId) { + return this._pipelineMap.get(pipelineId); + }; + /** + * Current, progressive rendering starts from visual and layout. + * Always detect render mode in the same stage, avoiding that incorrect + * detection caused by data filtering. + * Caution: + * `updateStreamModes` use `seriesModel.getData()`. + */ + + + Scheduler.prototype.updateStreamModes = function (seriesModel, view) { + var pipeline = this._pipelineMap.get(seriesModel.uid); + + var data = seriesModel.getData(); + var dataLen = data.count(); // `progressiveRender` means that can render progressively in each + // animation frame. Note that some types of series do not provide + // `view.incrementalPrepareRender` but support `chart.appendData`. We + // use the term `incremental` but not `progressive` to describe the + // case that `chart.appendData`. + + var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold; + var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold'); // TODO: modDataCount should not updated if `appendData`, otherwise cause whole repaint. + // see `test/candlestick-large3.html` + + var modDataCount = seriesModel.get('progressiveChunkMode') === 'mod' ? dataLen : null; + seriesModel.pipelineContext = pipeline.context = { + progressiveRender: progressiveRender, + modDataCount: modDataCount, + large: large + }; + }; + + Scheduler.prototype.restorePipelines = function (ecModel) { + var scheduler = this; + var pipelineMap = scheduler._pipelineMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var progressive = seriesModel.getProgressive(); + var pipelineId = seriesModel.uid; + pipelineMap.set(pipelineId, { + id: pipelineId, + head: null, + tail: null, + threshold: seriesModel.getProgressiveThreshold(), + progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()), + blockIndex: -1, + step: Math.round(progressive || 700), + count: 0 + }); + + scheduler._pipe(seriesModel, seriesModel.dataTask); + }); + }; + + Scheduler.prototype.prepareStageTasks = function () { + var stageTaskMap = this._stageTaskMap; + var ecModel = this.api.getModel(); + var api = this.api; + each(this._allHandlers, function (handler) { + var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, {}); + var errMsg = ''; + + if ("development" !== 'production') { + // Currently do not need to support to sepecify them both. + errMsg = '"reset" and "overallReset" must not be both specified.'; + } + + assert(!(handler.reset && handler.overallReset), errMsg); + handler.reset && this._createSeriesStageTask(handler, record, ecModel, api); + handler.overallReset && this._createOverallStageTask(handler, record, ecModel, api); + }, this); + }; + + Scheduler.prototype.prepareView = function (view, model, ecModel, api) { + var renderTask = view.renderTask; + var context = renderTask.context; + context.model = model; + context.ecModel = ecModel; + context.api = api; + renderTask.__block = !view.incrementalPrepareRender; + + this._pipe(model, renderTask); + }; + + Scheduler.prototype.performDataProcessorTasks = function (ecModel, payload) { + // If we do not use `block` here, it should be considered when to update modes. + this._performStageTasks(this._dataProcessorHandlers, ecModel, payload, { + block: true + }); + }; + + Scheduler.prototype.performVisualTasks = function (ecModel, payload, opt) { + this._performStageTasks(this._visualHandlers, ecModel, payload, opt); + }; + + Scheduler.prototype._performStageTasks = function (stageHandlers, ecModel, payload, opt) { + opt = opt || {}; + var unfinished = false; + var scheduler = this; + each(stageHandlers, function (stageHandler, idx) { + if (opt.visualType && opt.visualType !== stageHandler.visualType) { + return; + } + + var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid); + + var seriesTaskMap = stageHandlerRecord.seriesTaskMap; + var overallTask = stageHandlerRecord.overallTask; + + if (overallTask) { + var overallNeedDirty_1; + var agentStubMap = overallTask.agentStubMap; + agentStubMap.each(function (stub) { + if (needSetDirty(opt, stub)) { + stub.dirty(); + overallNeedDirty_1 = true; + } + }); + overallNeedDirty_1 && overallTask.dirty(); + scheduler.updatePayload(overallTask, payload); + var performArgs_1 = scheduler.getPerformArgs(overallTask, opt.block); // Execute stubs firstly, which may set the overall task dirty, + // then execute the overall task. And stub will call seriesModel.setData, + // which ensures that in the overallTask seriesModel.getData() will not + // return incorrect data. + + agentStubMap.each(function (stub) { + stub.perform(performArgs_1); + }); + + if (overallTask.perform(performArgs_1)) { + unfinished = true; + } + } else if (seriesTaskMap) { + seriesTaskMap.each(function (task, pipelineId) { + if (needSetDirty(opt, task)) { + task.dirty(); + } + + var performArgs = scheduler.getPerformArgs(task, opt.block); // FIXME + // if intending to decalare `performRawSeries` in handlers, only + // stream-independent (specifically, data item independent) operations can be + // performed. Because is a series is filtered, most of the tasks will not + // be performed. A stream-dependent operation probably cause wrong biz logic. + // Perhaps we should not provide a separate callback for this case instead + // of providing the config `performRawSeries`. The stream-dependent operaions + // and stream-independent operations should better not be mixed. + + performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model); + scheduler.updatePayload(task, payload); + + if (task.perform(performArgs)) { + unfinished = true; + } + }); + } + }); + + function needSetDirty(opt, task) { + return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id)); + } + + this.unfinished = unfinished || this.unfinished; + }; + + Scheduler.prototype.performSeriesTasks = function (ecModel) { + var unfinished; + ecModel.eachSeries(function (seriesModel) { + // Progress to the end for dataInit and dataRestore. + unfinished = seriesModel.dataTask.perform() || unfinished; + }); + this.unfinished = unfinished || this.unfinished; + }; + + Scheduler.prototype.plan = function () { + // Travel pipelines, check block. + this._pipelineMap.each(function (pipeline) { + var task = pipeline.tail; + + do { + if (task.__block) { + pipeline.blockIndex = task.__idxInPipeline; + break; + } + + task = task.getUpstream(); + } while (task); + }); + }; + + Scheduler.prototype.updatePayload = function (task, payload) { + payload !== 'remain' && (task.context.payload = payload); + }; + + Scheduler.prototype._createSeriesStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var oldSeriesTaskMap = stageHandlerRecord.seriesTaskMap; // The count of stages are totally about only several dozen, so + // do not need to reuse the map. + + var newSeriesTaskMap = stageHandlerRecord.seriesTaskMap = createHashMap(); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; // If a stageHandler should cover all series, `createOnAllSeries` should be declared mandatorily, + // to avoid some typo or abuse. Otherwise if an extension do not specify a `seriesType`, + // it works but it may cause other irrelevant charts blocked. + + if (stageHandler.createOnAllSeries) { + ecModel.eachRawSeries(create); + } else if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, create); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(create); + } + + function create(seriesModel) { + var pipelineId = seriesModel.uid; // Init tasks for each seriesModel only once. + // Reuse original task instance. + + var task = newSeriesTaskMap.set(pipelineId, oldSeriesTaskMap && oldSeriesTaskMap.get(pipelineId) || createTask({ + plan: seriesTaskPlan, + reset: seriesTaskReset, + count: seriesTaskCount + })); + task.context = { + model: seriesModel, + ecModel: ecModel, + api: api, + // PENDING: `useClearVisual` not used? + useClearVisual: stageHandler.isVisual && !stageHandler.isLayout, + plan: stageHandler.plan, + reset: stageHandler.reset, + scheduler: scheduler + }; + + scheduler._pipe(seriesModel, task); + } + }; + + Scheduler.prototype._createOverallStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) { + var scheduler = this; + var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask // For overall task, the function only be called on reset stage. + || createTask({ + reset: overallTaskReset + }); + overallTask.context = { + ecModel: ecModel, + api: api, + overallReset: stageHandler.overallReset, + scheduler: scheduler + }; + var oldAgentStubMap = overallTask.agentStubMap; // The count of stages are totally about only several dozen, so + // do not need to reuse the map. + + var newAgentStubMap = overallTask.agentStubMap = createHashMap(); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; + var overallProgress = true; + var shouldOverallTaskDirty = false; // FIXME:TS never used, so comment it + // let modifyOutputEnd = stageHandler.modifyOutputEnd; + // An overall task with seriesType detected or has `getTargetSeries`, we add + // stub in each pipelines, it will set the overall task dirty when the pipeline + // progress. Moreover, to avoid call the overall task each frame (too frequent), + // we set the pipeline block. + + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = '"createOnAllSeries" do not supported for "overallReset", ' + 'becuase it will block all streams.'; + } + + assert(!stageHandler.createOnAllSeries, errMsg); + + if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, createStub); + } else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(createStub); + } // Otherwise, (usually it is legancy case), the overall task will only be + // executed when upstream dirty. Otherwise the progressive rendering of all + // pipelines will be disabled unexpectedly. But it still needs stubs to receive + // dirty info from upsteam. + else { + overallProgress = false; + each(ecModel.getSeries(), createStub); + } + + function createStub(seriesModel) { + var pipelineId = seriesModel.uid; + var stub = newAgentStubMap.set(pipelineId, oldAgentStubMap && oldAgentStubMap.get(pipelineId) || ( // When the result of `getTargetSeries` changed, the overallTask + // should be set as dirty and re-performed. + shouldOverallTaskDirty = true, createTask({ + reset: stubReset, + onDirty: stubOnDirty + }))); + stub.context = { + model: seriesModel, + overallProgress: overallProgress // FIXME:TS never used, so comment it + // modifyOutputEnd: modifyOutputEnd + + }; + stub.agent = overallTask; + stub.__block = overallProgress; + + scheduler._pipe(seriesModel, stub); + } + + if (shouldOverallTaskDirty) { + overallTask.dirty(); + } + }; + + Scheduler.prototype._pipe = function (seriesModel, task) { + var pipelineId = seriesModel.uid; + + var pipeline = this._pipelineMap.get(pipelineId); + + !pipeline.head && (pipeline.head = task); + pipeline.tail && pipeline.tail.pipe(task); + pipeline.tail = task; + task.__idxInPipeline = pipeline.count++; + task.__pipeline = pipeline; + }; + + Scheduler.wrapStageHandler = function (stageHandler, visualType) { + if (isFunction(stageHandler)) { + stageHandler = { + overallReset: stageHandler, + seriesType: detectSeriseType(stageHandler) + }; + } + + stageHandler.uid = getUID('stageHandler'); + visualType && (stageHandler.visualType = visualType); + return stageHandler; + }; + return Scheduler; + }(); + + function overallTaskReset(context) { + context.overallReset(context.ecModel, context.api, context.payload); + } + + function stubReset(context) { + return context.overallProgress && stubProgress; + } + + function stubProgress() { + this.agent.dirty(); + this.getDownstream().dirty(); + } + + function stubOnDirty() { + this.agent && this.agent.dirty(); + } + + function seriesTaskPlan(context) { + return context.plan ? context.plan(context.model, context.ecModel, context.api, context.payload) : null; + } + + function seriesTaskReset(context) { + if (context.useClearVisual) { + context.data.clearAllVisual(); + } + + var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload)); + return resetDefines.length > 1 ? map(resetDefines, function (v, idx) { + return makeSeriesTaskProgress(idx); + }) : singleSeriesTaskProgress; + } + + var singleSeriesTaskProgress = makeSeriesTaskProgress(0); + + function makeSeriesTaskProgress(resetDefineIdx) { + return function (params, context) { + var data = context.data; + var resetDefine = context.resetDefines[resetDefineIdx]; + + if (resetDefine && resetDefine.dataEach) { + for (var i = params.start; i < params.end; i++) { + resetDefine.dataEach(data, i); + } + } else if (resetDefine && resetDefine.progress) { + resetDefine.progress(params, data); + } + }; + } + + function seriesTaskCount(context) { + return context.data.count(); + } + + /** + * Only some legacy stage handlers (usually in echarts extensions) are pure function. + * To ensure that they can work normally, they should work in block mode, that is, + * they should not be started util the previous tasks finished. So they cause the + * progressive rendering disabled. We try to detect the series type, to narrow down + * the block range to only the series type they concern, but not all series. + */ + + + function detectSeriseType(legacyFunc) { + seriesType = null; + + try { + // Assume there is no async when calling `eachSeriesByType`. + legacyFunc(ecModelMock, apiMock); + } catch (e) { + } + + return seriesType; + } + + var ecModelMock = {}; + var apiMock = {}; + var seriesType; + mockMethods(ecModelMock, GlobalModel); + mockMethods(apiMock, ExtensionAPI); + + ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function (type) { + seriesType = type; + }; + + ecModelMock.eachComponent = function (cond) { + if (cond.mainType === 'series' && cond.subType) { + seriesType = cond.subType; + } + }; + + function mockMethods(target, Clz) { + /* eslint-disable */ + for (var name_1 in Clz.prototype) { + // Do not use hasOwnProperty + target[name_1] = noop; + } + /* eslint-enable */ + + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF']; + var lightTheme = { + color: colorAll, + colorLayer: [['#37A2DA', '#ffd85c', '#fd7b5f'], ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'], ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'], colorAll] + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var contrastColor = '#B9B8CE'; + var backgroundColor = '#100C2A'; + + var axisCommon = function () { + return { + axisLine: { + lineStyle: { + color: contrastColor + } + }, + splitLine: { + lineStyle: { + color: '#484753' + } + }, + splitArea: { + areaStyle: { + color: ['rgba(255,255,255,0.02)', 'rgba(255,255,255,0.05)'] + } + }, + minorSplitLine: { + lineStyle: { + color: '#20203B' + } + } + }; + }; + + var colorPalette = ['#4992ff', '#7cffb2', '#fddd60', '#ff6e76', '#58d9f9', '#05c091', '#ff8a45', '#8d48e3', '#dd79ff']; + var theme = { + darkMode: true, + color: colorPalette, + backgroundColor: backgroundColor, + axisPointer: { + lineStyle: { + color: '#817f91' + }, + crossStyle: { + color: '#817f91' + }, + label: { + // TODO Contrast of label backgorundColor + color: '#fff' + } + }, + legend: { + textStyle: { + color: contrastColor + } + }, + textStyle: { + color: contrastColor + }, + title: { + textStyle: { + color: '#EEF1FA' + }, + subtextStyle: { + color: '#B9B8CE' + } + }, + toolbox: { + iconStyle: { + borderColor: contrastColor + } + }, + dataZoom: { + borderColor: '#71708A', + textStyle: { + color: contrastColor + }, + brushStyle: { + color: 'rgba(135,163,206,0.3)' + }, + handleStyle: { + color: '#353450', + borderColor: '#C5CBE3' + }, + moveHandleStyle: { + color: '#B0B6C3', + opacity: 0.3 + }, + fillerColor: 'rgba(135,163,206,0.2)', + emphasis: { + handleStyle: { + borderColor: '#91B7F2', + color: '#4D587D' + }, + moveHandleStyle: { + color: '#636D9A', + opacity: 0.7 + } + }, + dataBackground: { + lineStyle: { + color: '#71708A', + width: 1 + }, + areaStyle: { + color: '#71708A' + } + }, + selectedDataBackground: { + lineStyle: { + color: '#87A3CE' + }, + areaStyle: { + color: '#87A3CE' + } + } + }, + visualMap: { + textStyle: { + color: contrastColor + } + }, + timeline: { + lineStyle: { + color: contrastColor + }, + label: { + color: contrastColor + }, + controlStyle: { + color: contrastColor, + borderColor: contrastColor + } + }, + calendar: { + itemStyle: { + color: backgroundColor + }, + dayLabel: { + color: contrastColor + }, + monthLabel: { + color: contrastColor + }, + yearLabel: { + color: contrastColor + } + }, + timeAxis: axisCommon(), + logAxis: axisCommon(), + valueAxis: axisCommon(), + categoryAxis: axisCommon(), + line: { + symbol: 'circle' + }, + graph: { + color: colorPalette + }, + gauge: { + title: { + color: contrastColor + }, + axisLine: { + lineStyle: { + color: [[1, 'rgba(207,212,219,0.2)']] + } + }, + axisLabel: { + color: contrastColor + }, + detail: { + color: '#EEF1FA' + } + }, + candlestick: { + itemStyle: { + color: '#f64e56', + color0: '#54ea92', + borderColor: '#f64e56', + borderColor0: '#54ea92' // borderColor: '#ca2824', + // borderColor0: '#09a443' + + } + } + }; + theme.categoryAxis.splitLine.show = false; + + /** + * Usage of query: + * `chart.on('click', query, handler);` + * The `query` can be: + * + The component type query string, only `mainType` or `mainType.subType`, + * like: 'xAxis', 'series', 'xAxis.category' or 'series.line'. + * + The component query object, like: + * `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`, + * `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`. + * + The data query object, like: + * `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`. + * + The other query object (cmponent customized query), like: + * `{element: 'some'}` (only available in custom series). + * + * Caveat: If a prop in the `query` object is `null/undefined`, it is the + * same as there is no such prop in the `query` object. + */ + + var ECEventProcessor = + /** @class */ + function () { + function ECEventProcessor() { + } + + ECEventProcessor.prototype.normalizeQuery = function (query) { + var cptQuery = {}; + var dataQuery = {}; + var otherQuery = {}; // `query` is `mainType` or `mainType.subType` of component. + + if (isString(query)) { + var condCptType = parseClassType(query); // `.main` and `.sub` may be ''. + + cptQuery.mainType = condCptType.main || null; + cptQuery.subType = condCptType.sub || null; + } // `query` is an object, convert to {mainType, index, name, id}. + else { + // `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved, + // can not be used in `compomentModel.filterForExposedEvent`. + var suffixes_1 = ['Index', 'Name', 'Id']; + var dataKeys_1 = { + name: 1, + dataIndex: 1, + dataType: 1 + }; + each(query, function (val, key) { + var reserved = false; + + for (var i = 0; i < suffixes_1.length; i++) { + var propSuffix = suffixes_1[i]; + var suffixPos = key.lastIndexOf(propSuffix); + + if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) { + var mainType = key.slice(0, suffixPos); // Consider `dataIndex`. + + if (mainType !== 'data') { + cptQuery.mainType = mainType; + cptQuery[propSuffix.toLowerCase()] = val; + reserved = true; + } + } + } + + if (dataKeys_1.hasOwnProperty(key)) { + dataQuery[key] = val; + reserved = true; + } + + if (!reserved) { + otherQuery[key] = val; + } + }); + } + + return { + cptQuery: cptQuery, + dataQuery: dataQuery, + otherQuery: otherQuery + }; + }; + + ECEventProcessor.prototype.filter = function (eventType, query) { + // They should be assigned before each trigger call. + var eventInfo = this.eventInfo; + + if (!eventInfo) { + return true; + } + + var targetEl = eventInfo.targetEl; + var packedEvent = eventInfo.packedEvent; + var model = eventInfo.model; + var view = eventInfo.view; // For event like 'globalout'. + + if (!model || !view) { + return true; + } + + var cptQuery = query.cptQuery; + var dataQuery = query.dataQuery; + return check(cptQuery, model, 'mainType') && check(cptQuery, model, 'subType') && check(cptQuery, model, 'index', 'componentIndex') && check(cptQuery, model, 'name') && check(cptQuery, model, 'id') && check(dataQuery, packedEvent, 'name') && check(dataQuery, packedEvent, 'dataIndex') && check(dataQuery, packedEvent, 'dataType') && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent)); + + function check(query, host, prop, propOnHost) { + return query[prop] == null || host[propOnHost || prop] === query[prop]; + } + }; + + ECEventProcessor.prototype.afterTrigger = function () { + // Make sure the eventInfo wont be used in next trigger. + this.eventInfo = null; + }; + + return ECEventProcessor; + }(); + + var SYMBOL_PROPS_WITH_CB = ['symbol', 'symbolSize', 'symbolRotate', 'symbolOffset']; + var SYMBOL_PROPS = SYMBOL_PROPS_WITH_CB.concat(['symbolKeepAspect']); // Encoding visual for all series include which is filtered for legend drawing + + var seriesSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + + if (seriesModel.legendIcon) { + data.setVisual('legendIcon', seriesModel.legendIcon); + } + + if (!seriesModel.hasSymbolVisual) { + return; + } + + var symbolOptions = {}; + var symbolOptionsCb = {}; + var hasCallback = false; + + for (var i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) { + var symbolPropName = SYMBOL_PROPS_WITH_CB[i]; + var val = seriesModel.get(symbolPropName); + + if (isFunction(val)) { + hasCallback = true; + symbolOptionsCb[symbolPropName] = val; + } else { + symbolOptions[symbolPropName] = val; + } + } + + symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol; + data.setVisual(extend({ + legendIcon: seriesModel.legendIcon || symbolOptions.symbol, + symbolKeepAspect: seriesModel.get('symbolKeepAspect') + }, symbolOptions)); // Only visible series has each data be visual encoded + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var symbolPropsCb = keys(symbolOptionsCb); + + function dataEach(data, idx) { + var rawValue = seriesModel.getRawValue(idx); + var params = seriesModel.getDataParams(idx); + + for (var i = 0; i < symbolPropsCb.length; i++) { + var symbolPropName = symbolPropsCb[i]; + data.setItemVisual(idx, symbolPropName, symbolOptionsCb[symbolPropName](rawValue, params)); + } + } + + return { + dataEach: hasCallback ? dataEach : null + }; + } + }; + var dataSymbolTask = { + createOnAllSeries: true, + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + if (!seriesModel.hasSymbolVisual) { + return; + } // Only visible series has each data be visual encoded + + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + + for (var i = 0; i < SYMBOL_PROPS.length; i++) { + var symbolPropName = SYMBOL_PROPS[i]; + var val = itemModel.getShallow(symbolPropName, true); + + if (val != null) { + data.setItemVisual(idx, symbolPropName, val); + } + } + } + + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function getItemVisualFromData(data, dataIndex, key) { + switch (key) { + case 'color': + var style = data.getItemVisual(dataIndex, 'style'); + return style[data.getVisual('drawType')]; + + case 'opacity': + return data.getItemVisual(dataIndex, 'style').opacity; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + return data.getItemVisual(dataIndex, key); + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + + function getVisualFromData(data, key) { + switch (key) { + case 'color': + var style = data.getVisual('style'); + return style[data.getVisual('drawType')]; + + case 'opacity': + return data.getVisual('style').opacity; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + return data.getVisual(key); + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + + function setItemVisualFromData(data, dataIndex, key, value) { + switch (key) { + case 'color': + // Make sure not sharing style object. + var style = data.ensureUniqueItemVisual(dataIndex, 'style'); + style[data.getVisual('drawType')] = value; // Mark the color has been changed, not from palette anymore + + data.setItemVisual(dataIndex, 'colorFromPalette', false); + break; + + case 'opacity': + data.ensureUniqueItemVisual(dataIndex, 'style').opacity = value; + break; + + case 'symbol': + case 'symbolSize': + case 'liftZ': + data.setItemVisual(dataIndex, key, value); + break; + + default: + if ("development" !== 'production') { + console.warn("Unknown visual type " + key); + } + + } + } + + // Inlucdes: pieSelect, pieUnSelect, pieToggleSelect, mapSelect, mapUnSelect, mapToggleSelect + + function createLegacyDataSelectAction(seriesType, ecRegisterAction) { + function getSeriesIndices(ecModel, payload) { + var seriesIndices = []; + ecModel.eachComponent({ + mainType: 'series', + subType: seriesType, + query: payload + }, function (seriesModel) { + seriesIndices.push(seriesModel.seriesIndex); + }); + return seriesIndices; + } + + each([[seriesType + 'ToggleSelect', 'toggleSelect'], [seriesType + 'Select', 'select'], [seriesType + 'UnSelect', 'unselect']], function (eventsMap) { + ecRegisterAction(eventsMap[0], function (payload, ecModel, api) { + payload = extend({}, payload); + + if ("development" !== 'production') { + deprecateReplaceLog(payload.type, eventsMap[1]); + } + + api.dispatchAction(extend(payload, { + type: eventsMap[1], + seriesIndex: getSeriesIndices(ecModel, payload) + })); + }); + }); + } + + function handleSeriesLegacySelectEvents(type, eventPostfix, ecIns, ecModel, payload) { + var legacyEventName = type + eventPostfix; + + if (!ecIns.isSilent(legacyEventName)) { + if ("development" !== 'production') { + deprecateLog("event " + legacyEventName + " is deprecated."); + } + + ecModel.eachComponent({ + mainType: 'series', + subType: 'pie' + }, function (seriesModel) { + var seriesIndex = seriesModel.seriesIndex; + var selectedMap = seriesModel.option.selectedMap; + var selected = payload.selected; + + for (var i = 0; i < selected.length; i++) { + if (selected[i].seriesIndex === seriesIndex) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload.fromActionPayload); + ecIns.trigger(legacyEventName, { + type: legacyEventName, + seriesId: seriesModel.id, + name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex), + selected: isString(selectedMap) ? selectedMap : extend({}, selectedMap) + }); + } + } + }); + } + } + + function handleLegacySelectEvents(messageCenter, ecIns, api) { + messageCenter.on('selectchanged', function (params) { + var ecModel = api.getModel(); + + if (params.isFromClick) { + handleSeriesLegacySelectEvents('map', 'selectchanged', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'selectchanged', ecIns, ecModel, params); + } else if (params.fromAction === 'select') { + handleSeriesLegacySelectEvents('map', 'selected', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'selected', ecIns, ecModel, params); + } else if (params.fromAction === 'unselect') { + handleSeriesLegacySelectEvents('map', 'unselected', ecIns, ecModel, params); + handleSeriesLegacySelectEvents('pie', 'unselected', ecIns, ecModel, params); + } + }); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function findEventDispatcher(target, det, returnFirstMatch) { + var found; + + while (target) { + if (det(target)) { + found = target; + + if (returnFirstMatch) { + break; + } + } + + target = target.__hostTarget || target.parent; + } + + return found; + } + + var wmUniqueIndex = Math.round(Math.random() * 9); + var supportDefineProperty = typeof Object.defineProperty === 'function'; + var WeakMap = (function () { + function WeakMap() { + this._id = '__ec_inner_' + wmUniqueIndex++; + } + + WeakMap.prototype.get = function (key) { + return this._guard(key)[this._id]; + }; + WeakMap.prototype.set = function (key, value) { + var target = this._guard(key); + if (supportDefineProperty) { + Object.defineProperty(target, this._id, { + value: value, + enumerable: false, + configurable: true + }); + } else { + target[this._id] = value; + } + return this; + }; + WeakMap.prototype["delete"] = function (key) { + if (this.has(key)) { + delete this._guard(key)[this._id]; + return true; + } + return false; + }; + WeakMap.prototype.has = function (key) { + return !!this._guard(key)[this._id]; + }; + WeakMap.prototype._guard = function (key) { + if (key !== Object(key)) { + throw TypeError('Value of WeakMap is not a non-null object.'); + } + return key; + }; + return WeakMap; + }()); + + /** + * Triangle shape + * @inner + */ + + var Triangle = Path.extend({ + type: 'triangle', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy + height); + path.lineTo(cx - width, cy + height); + path.closePath(); + } + }); + /** + * Diamond shape + * @inner + */ + + var Diamond = Path.extend({ + type: 'diamond', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy); + path.lineTo(cx, cy + height); + path.lineTo(cx - width, cy); + path.closePath(); + } + }); + /** + * Pin shape + * @inner + */ + + var Pin = Path.extend({ + type: 'pin', + shape: { + // x, y on the cusp + x: 0, + y: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var x = shape.x; + var y = shape.y; + var w = shape.width / 5 * 3; // Height must be larger than width + + var h = Math.max(w, shape.height); + var r = w / 2; // Dist on y with tangent point and circle center + + var dy = r * r / (h - r); + var cy = y - h + r + dy; + var angle = Math.asin(dy / r); // Dist on x with tangent point and circle center + + var dx = Math.cos(angle) * r; + var tanX = Math.sin(angle); + var tanY = Math.cos(angle); + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + path.moveTo(x - dx, cy + dy); + path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle); + path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y); + path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy); + path.closePath(); + } + }); + /** + * Arrow shape + * @inner + */ + + var Arrow = Path.extend({ + type: 'arrow', + shape: { + x: 0, + y: 0, + width: 0, + height: 0 + }, + buildPath: function (ctx, shape) { + var height = shape.height; + var width = shape.width; + var x = shape.x; + var y = shape.y; + var dx = width / 3 * 2; + ctx.moveTo(x, y); + ctx.lineTo(x + dx, y + height); + ctx.lineTo(x, y + height / 4 * 3); + ctx.lineTo(x - dx, y + height); + ctx.lineTo(x, y); + ctx.closePath(); + } + }); + /** + * Map of path contructors + */ + // TODO Use function to build symbol path. + + var symbolCtors = { + line: Line, + rect: Rect, + roundRect: Rect, + square: Rect, + circle: Circle, + diamond: Diamond, + pin: Pin, + arrow: Arrow, + triangle: Triangle + }; + var symbolShapeMakers = { + line: function (x, y, w, h, shape) { + shape.x1 = x; + shape.y1 = y + h / 2; + shape.x2 = x + w; + shape.y2 = y + h / 2; + }, + rect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + }, + roundRect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + shape.r = Math.min(w, h) / 4; + }, + square: function (x, y, w, h, shape) { + var size = Math.min(w, h); + shape.x = x; + shape.y = y; + shape.width = size; + shape.height = size; + }, + circle: function (x, y, w, h, shape) { + // Put circle in the center of square + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.r = Math.min(w, h) / 2; + }, + diamond: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + }, + pin: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + arrow: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + triangle: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + } + }; + var symbolBuildProxies = {}; + each(symbolCtors, function (Ctor, name) { + symbolBuildProxies[name] = new Ctor(); + }); + var SymbolClz = Path.extend({ + type: 'symbol', + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + calculateTextPosition: function (out, config, rect) { + var res = calculateTextPosition(out, config, rect); + var shape = this.shape; + + if (shape && shape.symbolType === 'pin' && config.position === 'inside') { + res.y = rect.y + rect.height * 0.4; + } + + return res; + }, + buildPath: function (ctx, shape, inBundle) { + var symbolType = shape.symbolType; + + if (symbolType !== 'none') { + var proxySymbol = symbolBuildProxies[symbolType]; + + if (!proxySymbol) { + // Default rect + symbolType = 'rect'; + proxySymbol = symbolBuildProxies[symbolType]; + } + + symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape); + proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle); + } + } + }); // Provide setColor helper method to avoid determine if set the fill or stroke outside + + function symbolPathSetColor(color, innerColor) { + if (this.type !== 'image') { + var symbolStyle = this.style; + + if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = innerColor || '#fff'; // TODO Same width with lineStyle in LineView + + symbolStyle.lineWidth = 2; + } else if (this.shape.symbolType === 'line') { + symbolStyle.stroke = color; + } else { + symbolStyle.fill = color; + } + + this.markRedraw(); + } + } + + /** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + */ + + + function createSymbol(symbolType, x, y, w, h, color, // whether to keep the ratio of w/h, + keepAspect) { + // TODO Support image object, DynamicImage. + var isEmpty = symbolType.indexOf('empty') === 0; + + if (isEmpty) { + symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); + } + + var symbolPath; + + if (symbolType.indexOf('image://') === 0) { + symbolPath = makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else if (symbolType.indexOf('path://') === 0) { + symbolPath = makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); + } else { + symbolPath = new SymbolClz({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + + symbolPath.__isEmptyBrush = isEmpty; // TODO Should deprecate setColor + + symbolPath.setColor = symbolPathSetColor; + + if (color) { + symbolPath.setColor(color); + } + + return symbolPath; + } + + function normalizeSymbolSize(symbolSize) { + if (!isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + + return [symbolSize[0] || 0, symbolSize[1] || 0]; + } + + function normalizeSymbolOffset(symbolOffset, symbolSize) { + if (symbolOffset == null) { + return; + } + + if (!isArray(symbolOffset)) { + symbolOffset = [symbolOffset, symbolOffset]; + } + + return [parsePercent$1(symbolOffset[0], symbolSize[0]) || 0, parsePercent$1(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0]; + } + + function createLinearGradient(ctx, obj, rect) { + var x = obj.x == null ? 0 : obj.x; + var x2 = obj.x2 == null ? 1 : obj.x2; + var y = obj.y == null ? 0 : obj.y; + var y2 = obj.y2 == null ? 0 : obj.y2; + if (!obj.global) { + x = x * rect.width + rect.x; + x2 = x2 * rect.width + rect.x; + y = y * rect.height + rect.y; + y2 = y2 * rect.height + rect.y; + } + x = isNaN(x) ? 0 : x; + x2 = isNaN(x2) ? 1 : x2; + y = isNaN(y) ? 0 : y; + y2 = isNaN(y2) ? 0 : y2; + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + return canvasGradient; + } + + function createRadialGradient(ctx, obj, rect) { + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + var x = obj.x == null ? 0.5 : obj.x; + var y = obj.y == null ? 0.5 : obj.y; + var r = obj.r == null ? 0.5 : obj.r; + if (!obj.global) { + x = x * width + rect.x; + y = y * height + rect.y; + r = r * min; + } + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + return canvasGradient; + } + + function getCanvasGradient(ctx, obj, rect) { + var canvasGradient = obj.type === 'radial' + ? createRadialGradient(ctx, obj, rect) + : createLinearGradient(ctx, obj, rect); + var colorStops = obj.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color); + } + return canvasGradient; + } + + function isClipPathChanged(clipPaths, prevClipPaths) { + if (clipPaths === prevClipPaths || (!clipPaths && !prevClipPaths)) { + return false; + } + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } + return false; + } + + function parseInt10(val) { + return parseInt(val, 10); + } + + function getSize(root, whIdx, opts) { + var wh = ['width', 'height'][whIdx]; + var cwh = ['clientWidth', 'clientHeight'][whIdx]; + var plt = ['paddingLeft', 'paddingTop'][whIdx]; + var prb = ['paddingRight', 'paddingBottom'][whIdx]; + if (opts[wh] != null && opts[wh] !== 'auto') { + return parseFloat(opts[wh]); + } + var stl = document.defaultView.getComputedStyle(root); + return ((root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh])) + - (parseInt10(stl[plt]) || 0) + - (parseInt10(stl[prb]) || 0)) | 0; + } + + function normalizeLineDash(lineType, lineWidth) { + if (!lineType || lineType === 'solid' || !(lineWidth > 0)) { + return null; + } + return lineType === 'dashed' + ? [4 * lineWidth, 2 * lineWidth] + : lineType === 'dotted' + ? [lineWidth] + : isNumber(lineType) + ? [lineType] : isArray(lineType) ? lineType : null; + } + + function getLineDash(el) { + var style = el.style; + var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth); + var lineDashOffset = style.lineDashOffset; + if (lineDash) { + var lineScale_1 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1; + if (lineScale_1 && lineScale_1 !== 1) { + lineDash = map(lineDash, function (rawVal) { + return rawVal / lineScale_1; + }); + lineDashOffset /= lineScale_1; + } + } + return [lineDash, lineDashOffset]; + } + + var pathProxyForDraw = new PathProxy(true); + + function styleHasStroke(style) { + var stroke = style.stroke; + return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0)); + } + + function isValidStrokeFillStyle(strokeOrFill) { + return typeof strokeOrFill === 'string' && strokeOrFill !== 'none'; + } + + function styleHasFill(style) { + var fill = style.fill; + return fill != null && fill !== 'none'; + } + + function doFillPath(ctx, style) { + if (style.fillOpacity != null && style.fillOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.fillOpacity * style.opacity; + ctx.fill(); + ctx.globalAlpha = originalGlobalAlpha; + } else { + ctx.fill(); + } + } + + function doStrokePath(ctx, style) { + if (style.strokeOpacity != null && style.strokeOpacity !== 1) { + var originalGlobalAlpha = ctx.globalAlpha; + ctx.globalAlpha = style.strokeOpacity * style.opacity; + ctx.stroke(); + ctx.globalAlpha = originalGlobalAlpha; + } else { + ctx.stroke(); + } + } + + function createCanvasPattern(ctx, pattern, el) { + var image = createOrUpdateImage(pattern.image, pattern.__image, el); + if (isImageReady(image)) { + var canvasPattern = ctx.createPattern(image, pattern.repeat || 'repeat'); + if (typeof DOMMatrix === 'function' + && canvasPattern + && canvasPattern.setTransform) { + var matrix = new DOMMatrix(); + matrix.translateSelf((pattern.x || 0), (pattern.y || 0)); + matrix.rotateSelf(0, 0, (pattern.rotation || 0) * RADIAN_TO_DEGREE); + matrix.scaleSelf((pattern.scaleX || 1), (pattern.scaleY || 1)); + canvasPattern.setTransform(matrix); + } + return canvasPattern; + } + } + + function brushPath(ctx, el, style, inBatch) { + var _a; + var hasStroke = styleHasStroke(style); + var hasFill = styleHasFill(style); + var strokePercent = style.strokePercent; + var strokePart = strokePercent < 1; + var firstDraw = !el.path; + if ((!el.silent || strokePart) && firstDraw) { + el.createPathProxy(); + } + var path = el.path || pathProxyForDraw; + var dirtyFlag = el.__dirty; + if (!inBatch) { + var fill = style.fill; + var stroke = style.stroke; + var hasFillGradient = hasFill && !!fill.colorStops; + var hasStrokeGradient = hasStroke && !!stroke.colorStops; + var hasFillPattern = hasFill && !!fill.image; + var hasStrokePattern = hasStroke && !!stroke.image; + var fillGradient = void 0; + var strokeGradient = void 0; + var fillPattern = void 0; + var strokePattern = void 0; + var rect = void 0; + if (hasFillGradient || hasStrokeGradient) { + rect = el.getBoundingRect(); + } + if (hasFillGradient) { + fillGradient = dirtyFlag + ? getCanvasGradient(ctx, fill, rect) + : el.__canvasFillGradient; + el.__canvasFillGradient = fillGradient; + } + if (hasStrokeGradient) { + strokeGradient = dirtyFlag + ? getCanvasGradient(ctx, stroke, rect) + : el.__canvasStrokeGradient; + el.__canvasStrokeGradient = strokeGradient; + } + if (hasFillPattern) { + fillPattern = (dirtyFlag || !el.__canvasFillPattern) + ? createCanvasPattern(ctx, fill, el) + : el.__canvasFillPattern; + el.__canvasFillPattern = fillPattern; + } + if (hasStrokePattern) { + strokePattern = (dirtyFlag || !el.__canvasStrokePattern) + ? createCanvasPattern(ctx, stroke, el) + : el.__canvasStrokePattern; + el.__canvasStrokePattern = fillPattern; + } + if (hasFillGradient) { + ctx.fillStyle = fillGradient; + } else if (hasFillPattern) { + if (fillPattern) { + ctx.fillStyle = fillPattern; + } else { + hasFill = false; + } + } + if (hasStrokeGradient) { + ctx.strokeStyle = strokeGradient; + } else if (hasStrokePattern) { + if (strokePattern) { + ctx.strokeStyle = strokePattern; + } else { + hasStroke = false; + } + } + } + var scale = el.getGlobalScale(); + path.setScale(scale[0], scale[1], el.segmentIgnoreThreshold); + var lineDash; + var lineDashOffset; + if (ctx.setLineDash && style.lineDash) { + _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + } + var needsRebuild = true; + if (firstDraw || (dirtyFlag & SHAPE_CHANGED_BIT)) { + path.setDPR(ctx.dpr); + if (strokePart) { + path.setContext(null); + } else { + path.setContext(ctx); + needsRebuild = false; + } + path.reset(); + el.buildPath(path, el.shape, inBatch); + path.toStatic(); + el.pathUpdated(); + } + if (needsRebuild) { + path.rebuildPath(ctx, strokePart ? strokePercent : 1); + } + if (lineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (!inBatch) { + if (style.strokeFirst) { + if (hasStroke) { + doStrokePath(ctx, style); + } + if (hasFill) { + doFillPath(ctx, style); + } + } else { + if (hasFill) { + doFillPath(ctx, style); + } + if (hasStroke) { + doStrokePath(ctx, style); + } + } + } + if (lineDash) { + ctx.setLineDash([]); + } + } + + function brushImage(ctx, el, style) { + var image = el.__image = createOrUpdateImage(style.image, el.__image, el, el.onload); + if (!image || !isImageReady(image)) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var width = el.getWidth(); + var height = el.getHeight(); + var aspect = image.width / image.height; + if (width == null && height != null) { + width = height * aspect; + } else if (height == null && width != null) { + height = width / aspect; + } else if (width == null && height == null) { + width = image.width; + height = image.height; + } + if (style.sWidth && style.sHeight) { + var sx = style.sx || 0; + var sy = style.sy || 0; + ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height); + } else if (style.sx && style.sy) { + var sx = style.sx; + var sy = style.sy; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height); + } else { + ctx.drawImage(image, x, y, width, height); + } + } + + function brushText(ctx, el, style) { + var _a; + var text = style.text; + text != null && (text += ''); + if (text) { + ctx.font = style.font || DEFAULT_FONT; + ctx.textAlign = style.textAlign; + ctx.textBaseline = style.textBaseline; + var lineDash = void 0; + var lineDashOffset = void 0; + if (ctx.setLineDash && style.lineDash) { + _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + } + if (lineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + if (style.strokeFirst) { + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + } else { + if (styleHasFill(style)) { + ctx.fillText(text, style.x, style.y); + } + if (styleHasStroke(style)) { + ctx.strokeText(text, style.x, style.y); + } + } + if (lineDash) { + ctx.setLineDash([]); + } + } + } + + var SHADOW_NUMBER_PROPS = ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY']; + var STROKE_PROPS = [ + ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10] + ]; + + function bindCommonProps(ctx, style, prevStyle, forceSetAll, scope) { + var styleChanged = false; + if (!forceSetAll) { + prevStyle = prevStyle || {}; + if (style === prevStyle) { + return false; + } + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + flushPathDrawn(ctx, scope); + styleChanged = true; + var opacity = Math.max(Math.min(style.opacity, 1), 0); + ctx.globalAlpha = isNaN(opacity) ? DEFAULT_COMMON_STYLE.opacity : opacity; + } + if (forceSetAll || style.blend !== prevStyle.blend) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalCompositeOperation = style.blend || DEFAULT_COMMON_STYLE.blend; + } + for (var i = 0; i < SHADOW_NUMBER_PROPS.length; i++) { + var propName = SHADOW_NUMBER_PROPS[i]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = ctx.dpr * (style[propName] || 0); + } + } + if (forceSetAll || style.shadowColor !== prevStyle.shadowColor) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.shadowColor = style.shadowColor || DEFAULT_COMMON_STYLE.shadowColor; + } + return styleChanged; + } + + function bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetAll, scope) { + var style = getStyle(el, scope.inHover); + var prevStyle = forceSetAll + ? null + : (prevEl && getStyle(prevEl, scope.inHover) || {}); + if (style === prevStyle) { + return false; + } + var styleChanged = bindCommonProps(ctx, style, prevStyle, forceSetAll, scope); + if (forceSetAll || style.fill !== prevStyle.fill) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + isValidStrokeFillStyle(style.fill) && (ctx.fillStyle = style.fill); + } + if (forceSetAll || style.stroke !== prevStyle.stroke) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + isValidStrokeFillStyle(style.stroke) && (ctx.strokeStyle = style.stroke); + } + if (forceSetAll || style.opacity !== prevStyle.opacity) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.globalAlpha = style.opacity == null ? 1 : style.opacity; + } + if (el.hasStroke()) { + var lineWidth = style.lineWidth; + var newLineWidth = lineWidth / ((style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1); + if (ctx.lineWidth !== newLineWidth) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx.lineWidth = newLineWidth; + } + } + for (var i = 0; i < STROKE_PROPS.length; i++) { + var prop = STROKE_PROPS[i]; + var propName = prop[0]; + if (forceSetAll || style[propName] !== prevStyle[propName]) { + if (!styleChanged) { + flushPathDrawn(ctx, scope); + styleChanged = true; + } + ctx[propName] = style[propName] || prop[1]; + } + } + return styleChanged; + } + + function bindImageStyle(ctx, el, prevEl, forceSetAll, scope) { + return bindCommonProps(ctx, getStyle(el, scope.inHover), prevEl && getStyle(prevEl, scope.inHover), forceSetAll, scope); + } + + function setContextTransform(ctx, el) { + var m = el.transform; + var dpr = ctx.dpr || 1; + if (m) { + ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]); + } else { + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + } + } + + function updateClipStatus(clipPaths, ctx, scope) { + var allClipped = false; + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + allClipped = allClipped || clipPath.isZeroArea(); + setContextTransform(ctx, clipPath); + ctx.beginPath(); + clipPath.buildPath(ctx, clipPath.shape); + ctx.clip(); + } + scope.allClipped = allClipped; + } + + function isTransformChanged(m0, m1) { + if (m0 && m1) { + return m0[0] !== m1[0] + || m0[1] !== m1[1] + || m0[2] !== m1[2] + || m0[3] !== m1[3] + || m0[4] !== m1[4] + || m0[5] !== m1[5]; + } else if (!m0 && !m1) { + return false; + } + return true; + } + + var DRAW_TYPE_PATH = 1; + var DRAW_TYPE_IMAGE = 2; + var DRAW_TYPE_TEXT = 3; + var DRAW_TYPE_INCREMENTAL = 4; + + function canPathBatch(style) { + var hasFill = styleHasFill(style); + var hasStroke = styleHasStroke(style); + return !(style.lineDash + || !(+hasFill ^ +hasStroke) + || (hasFill && typeof style.fill !== 'string') + || (hasStroke && typeof style.stroke !== 'string') + || style.strokePercent < 1 + || style.strokeOpacity < 1 + || style.fillOpacity < 1); + } + + function flushPathDrawn(ctx, scope) { + scope.batchFill && ctx.fill(); + scope.batchStroke && ctx.stroke(); + scope.batchFill = ''; + scope.batchStroke = ''; + } + + function getStyle(el, inHover) { + return inHover ? (el.__hoverStyle || el.style) : el.style; + } + + function brushSingle(ctx, el) { + brush(ctx, el, {inHover: false, viewWidth: 0, viewHeight: 0}, true); + } + + function brush(ctx, el, scope, isLast) { + var m = el.transform; + if (!el.shouldBePainted(scope.viewWidth, scope.viewHeight, false, false)) { + el.__dirty &= ~REDRAW_BIT; + el.__isRendered = false; + return; + } + var clipPaths = el.__clipPaths; + var prevElClipPaths = scope.prevElClipPaths; + var forceSetTransform = false; + var forceSetStyle = false; + if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) { + if (prevElClipPaths && prevElClipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.restore(); + forceSetStyle = forceSetTransform = true; + scope.prevElClipPaths = null; + scope.allClipped = false; + scope.prevEl = null; + } + if (clipPaths && clipPaths.length) { + flushPathDrawn(ctx, scope); + ctx.save(); + updateClipStatus(clipPaths, ctx, scope); + forceSetTransform = true; + } + scope.prevElClipPaths = clipPaths; + } + if (scope.allClipped) { + el.__isRendered = false; + return; + } + el.beforeBrush && el.beforeBrush(); + el.innerBeforeBrush(); + var prevEl = scope.prevEl; + if (!prevEl) { + forceSetStyle = forceSetTransform = true; + } + var canBatchPath = el instanceof Path + && el.autoBatch + && canPathBatch(el.style); + if (forceSetTransform || isTransformChanged(m, prevEl.transform)) { + flushPathDrawn(ctx, scope); + setContextTransform(ctx, el); + } else if (!canBatchPath) { + flushPathDrawn(ctx, scope); + } + var style = getStyle(el, scope.inHover); + if (el instanceof Path) { + if (scope.lastDrawType !== DRAW_TYPE_PATH) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_PATH; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + if (!canBatchPath || (!scope.batchFill && !scope.batchStroke)) { + ctx.beginPath(); + } + brushPath(ctx, el, style, canBatchPath); + if (canBatchPath) { + scope.batchFill = style.fill || ''; + scope.batchStroke = style.stroke || ''; + } + } else { + if (el instanceof TSpan) { + if (scope.lastDrawType !== DRAW_TYPE_TEXT) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_TEXT; + } + bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope); + brushText(ctx, el, style); + } else if (el instanceof ZRImage) { + if (scope.lastDrawType !== DRAW_TYPE_IMAGE) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_IMAGE; + } + bindImageStyle(ctx, el, prevEl, forceSetStyle, scope); + brushImage(ctx, el, style); + } else if (el.getTemporalDisplayables) { + if (scope.lastDrawType !== DRAW_TYPE_INCREMENTAL) { + forceSetStyle = true; + scope.lastDrawType = DRAW_TYPE_INCREMENTAL; + } + brushIncremental(ctx, el, scope); + } + } + if (canBatchPath && isLast) { + flushPathDrawn(ctx, scope); + } + el.innerAfterBrush(); + el.afterBrush && el.afterBrush(); + scope.prevEl = el; + el.__dirty = 0; + el.__isRendered = true; + } + + function brushIncremental(ctx, el, scope) { + var displayables = el.getDisplayables(); + var temporalDisplayables = el.getTemporalDisplayables(); + ctx.save(); + var innerScope = { + prevElClipPaths: null, + prevEl: null, + allClipped: false, + viewWidth: scope.viewWidth, + viewHeight: scope.viewHeight, + inHover: scope.inHover + }; + var i; + var len; + for (i = el.getCursor(), len = displayables.length; i < len; i++) { + var displayable = displayables[i]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i === len - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + for (var i_1 = 0, len_1 = temporalDisplayables.length; i_1 < len_1; i_1++) { + var displayable = temporalDisplayables[i_1]; + displayable.beforeBrush && displayable.beforeBrush(); + displayable.innerBeforeBrush(); + brush(ctx, displayable, innerScope, i_1 === len_1 - 1); + displayable.innerAfterBrush(); + displayable.afterBrush && displayable.afterBrush(); + innerScope.prevEl = displayable; + } + el.clearTemporalDisplayables(); + el.notClear = true; + ctx.restore(); + } + + var decalMap = new WeakMap(); + var decalCache = new LRU(100); + var decalKeys = ['symbol', 'symbolSize', 'symbolKeepAspect', 'color', 'backgroundColor', 'dashArrayX', 'dashArrayY', 'maxTileWidth', 'maxTileHeight']; + + /** + * Create or update pattern image from decal options + * + * @param {InnerDecalObject | 'none'} decalObject decal options, 'none' if no decal + * @return {Pattern} pattern with generated image, null if no decal + */ + + function createOrUpdatePatternFromDecal(decalObject, api) { + if (decalObject === 'none') { + return null; + } + + var dpr = api.getDevicePixelRatio(); + var zr = api.getZr(); + var isSVG = zr.painter.type === 'svg'; + + if (decalObject.dirty) { + decalMap["delete"](decalObject); + } + + var oldPattern = decalMap.get(decalObject); + + if (oldPattern) { + return oldPattern; + } + + var decalOpt = defaults(decalObject, { + symbol: 'rect', + symbolSize: 1, + symbolKeepAspect: true, + color: 'rgba(0, 0, 0, 0.2)', + backgroundColor: null, + dashArrayX: 5, + dashArrayY: 5, + rotation: 0, + maxTileWidth: 512, + maxTileHeight: 512 + }); + + if (decalOpt.backgroundColor === 'none') { + decalOpt.backgroundColor = null; + } + + var pattern = { + repeat: 'repeat' + }; + setPatternnSource(pattern); + pattern.rotation = decalOpt.rotation; + pattern.scaleX = pattern.scaleY = isSVG ? 1 : 1 / dpr; + decalMap.set(decalObject, pattern); + decalObject.dirty = false; + return pattern; + + function setPatternnSource(pattern) { + var keys = [dpr]; + var isValidKey = true; + + for (var i = 0; i < decalKeys.length; ++i) { + var value = decalOpt[decalKeys[i]]; + + if (value != null && !isArray(value) && !isString(value) && !isNumber(value) && typeof value !== 'boolean') { + isValidKey = false; + break; + } + + keys.push(value); + } + + var cacheKey; + + if (isValidKey) { + cacheKey = keys.join(',') + (isSVG ? '-svg' : ''); + var cache = decalCache.get(cacheKey); + + if (cache) { + isSVG ? pattern.svgElement = cache : pattern.image = cache; + } + } + + var dashArrayX = normalizeDashArrayX(decalOpt.dashArrayX); + var dashArrayY = normalizeDashArrayY(decalOpt.dashArrayY); + var symbolArray = normalizeSymbolArray(decalOpt.symbol); + var lineBlockLengthsX = getLineBlockLengthX(dashArrayX); + var lineBlockLengthY = getLineBlockLengthY(dashArrayY); + var canvas = !isSVG && platformApi.createCanvas(); + var svgRoot = isSVG && { + tag: 'g', + attrs: {}, + key: 'dcl', + children: [] + }; + var pSize = getPatternSize(); + var ctx; + + if (canvas) { + canvas.width = pSize.width * dpr; + canvas.height = pSize.height * dpr; + ctx = canvas.getContext('2d'); + } + + brushDecal(); + + if (isValidKey) { + decalCache.put(cacheKey, canvas || svgRoot); + } + + pattern.image = canvas; + pattern.svgElement = svgRoot; + pattern.svgWidth = pSize.width; + pattern.svgHeight = pSize.height; + + /** + * Get minumum length that can make a repeatable pattern. + * + * @return {Object} pattern width and height + */ + + function getPatternSize() { + /** + * For example, if dash is [[3, 2], [2, 1]] for X, it looks like + * |--- --- --- --- --- ... + * |-- -- -- -- -- -- -- -- ... + * |--- --- --- --- --- ... + * |-- -- -- -- -- -- -- -- ... + * So the minumum length of X is 15, + * which is the least common multiple of `3 + 2` and `2 + 1` + * |--- --- --- |--- --- ... + * |-- -- -- -- -- |-- -- -- ... + */ + var width = 1; + + for (var i = 0, xlen = lineBlockLengthsX.length; i < xlen; ++i) { + width = getLeastCommonMultiple(width, lineBlockLengthsX[i]); + } + + var symbolRepeats = 1; + + for (var i = 0, xlen = symbolArray.length; i < xlen; ++i) { + symbolRepeats = getLeastCommonMultiple(symbolRepeats, symbolArray[i].length); + } + + width *= symbolRepeats; + var height = lineBlockLengthY * lineBlockLengthsX.length * symbolArray.length; + + if ("development" !== 'production') { + var warn = function (attrName) { + /* eslint-disable-next-line */ + console.warn("Calculated decal size is greater than " + attrName + " due to decal option settings so " + attrName + " is used for the decal size. Please consider changing the decal option to make a smaller decal or set " + attrName + " to be larger to avoid incontinuity."); + }; + + if (width > decalOpt.maxTileWidth) { + warn('maxTileWidth'); + } + + if (height > decalOpt.maxTileHeight) { + warn('maxTileHeight'); + } + } + + return { + width: Math.max(1, Math.min(width, decalOpt.maxTileWidth)), + height: Math.max(1, Math.min(height, decalOpt.maxTileHeight)) + }; + } + + function brushDecal() { + if (ctx) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + + if (decalOpt.backgroundColor) { + ctx.fillStyle = decalOpt.backgroundColor; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + } + + var ySum = 0; + + for (var i = 0; i < dashArrayY.length; ++i) { + ySum += dashArrayY[i]; + } + + if (ySum <= 0) { + // dashArrayY is 0, draw nothing + return; + } + + var y = -lineBlockLengthY; + var yId = 0; + var yIdTotal = 0; + var xId0 = 0; + + while (y < pSize.height) { + if (yId % 2 === 0) { + var symbolYId = yIdTotal / 2 % symbolArray.length; + var x = 0; + var xId1 = 0; + var xId1Total = 0; + + while (x < pSize.width * 2) { + var xSum = 0; + + for (var i = 0; i < dashArrayX[xId0].length; ++i) { + xSum += dashArrayX[xId0][i]; + } + + if (xSum <= 0) { + // Skip empty line + break; + } // E.g., [15, 5, 20, 5] draws only for 15 and 20 + + + if (xId1 % 2 === 0) { + var size = (1 - decalOpt.symbolSize) * 0.5; + var left = x + dashArrayX[xId0][xId1] * size; + var top_1 = y + dashArrayY[yId] * size; + var width = dashArrayX[xId0][xId1] * decalOpt.symbolSize; + var height = dashArrayY[yId] * decalOpt.symbolSize; + var symbolXId = xId1Total / 2 % symbolArray[symbolYId].length; + brushSymbol(left, top_1, width, height, symbolArray[symbolYId][symbolXId]); + } + + x += dashArrayX[xId0][xId1]; + ++xId1Total; + ++xId1; + + if (xId1 === dashArrayX[xId0].length) { + xId1 = 0; + } + } + + ++xId0; + + if (xId0 === dashArrayX.length) { + xId0 = 0; + } + } + + y += dashArrayY[yId]; + ++yIdTotal; + ++yId; + + if (yId === dashArrayY.length) { + yId = 0; + } + } + + function brushSymbol(x, y, width, height, symbolType) { + var scale = isSVG ? 1 : dpr; + var symbol = createSymbol(symbolType, x * scale, y * scale, width * scale, height * scale, decalOpt.color, decalOpt.symbolKeepAspect); + + if (isSVG) { + var symbolVNode = zr.painter.renderOneToVNode(symbol); + + if (symbolVNode) { + svgRoot.children.push(symbolVNode); + } + } else { + // Paint to canvas for all other renderers. + brushSingle(ctx, symbol); + } + } + } + } + } + + /** + * Convert symbol array into normalized array + * + * @param {string | (string | string[])[]} symbol symbol input + * @return {string[][]} normolized symbol array + */ + + function normalizeSymbolArray(symbol) { + if (!symbol || symbol.length === 0) { + return [['rect']]; + } + + if (isString(symbol)) { + return [[symbol]]; + } + + var isAllString = true; + + for (var i = 0; i < symbol.length; ++i) { + if (!isString(symbol[i])) { + isAllString = false; + break; + } + } + + if (isAllString) { + return normalizeSymbolArray([symbol]); + } + + var result = []; + + for (var i = 0; i < symbol.length; ++i) { + if (isString(symbol[i])) { + result.push([symbol[i]]); + } else { + result.push(symbol[i]); + } + } + + return result; + } + + /** + * Convert dash input into dashArray + * + * @param {DecalDashArrayX} dash dash input + * @return {number[][]} normolized dash array + */ + + + function normalizeDashArrayX(dash) { + if (!dash || dash.length === 0) { + return [[0, 0]]; + } + + if (isNumber(dash)) { + var dashValue = Math.ceil(dash); + return [[dashValue, dashValue]]; + } + /** + * [20, 5] should be normalized into [[20, 5]], + * while [20, [5, 10]] should be normalized into [[20, 20], [5, 10]] + */ + + + var isAllNumber = true; + + for (var i = 0; i < dash.length; ++i) { + if (!isNumber(dash[i])) { + isAllNumber = false; + break; + } + } + + if (isAllNumber) { + return normalizeDashArrayX([dash]); + } + + var result = []; + + for (var i = 0; i < dash.length; ++i) { + if (isNumber(dash[i])) { + var dashValue = Math.ceil(dash[i]); + result.push([dashValue, dashValue]); + } else { + var dashValue = map(dash[i], function (n) { + return Math.ceil(n); + }); + + if (dashValue.length % 2 === 1) { + // [4, 2, 1] means |---- - -- |---- - -- | + // so normalize it to be [4, 2, 1, 4, 2, 1] + result.push(dashValue.concat(dashValue)); + } else { + result.push(dashValue); + } + } + } + + return result; + } + + /** + * Convert dash input into dashArray + * + * @param {DecalDashArrayY} dash dash input + * @return {number[]} normolized dash array + */ + + + function normalizeDashArrayY(dash) { + if (!dash || typeof dash === 'object' && dash.length === 0) { + return [0, 0]; + } + + if (isNumber(dash)) { + var dashValue_1 = Math.ceil(dash); + return [dashValue_1, dashValue_1]; + } + + var dashValue = map(dash, function (n) { + return Math.ceil(n); + }); + return dash.length % 2 ? dashValue.concat(dashValue) : dashValue; + } + + /** + * Get block length of each line. A block is the length of dash line and space. + * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after + * that, so the block length of this line is 5. + * + * @param {number[][]} dash dash arrary of X or Y + * @return {number[]} block length of each line + */ + + + function getLineBlockLengthX(dash) { + return map(dash, function (line) { + return getLineBlockLengthY(line); + }); + } + + function getLineBlockLengthY(dash) { + var blockLength = 0; + + for (var i = 0; i < dash.length; ++i) { + blockLength += dash[i]; + } + + if (dash.length % 2 === 1) { + // [4, 2, 1] means |---- - -- |---- - -- | + // So total length is (4 + 2 + 1) * 2 + return blockLength * 2; + } + + return blockLength; + } + + function decalVisual(ecModel, api) { + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + + if (data.hasItemVisual()) { + data.each(function (idx) { + var decal = data.getItemVisual(idx, 'decal'); + + if (decal) { + var itemStyle = data.ensureUniqueItemVisual(idx, 'style'); + itemStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + + var decal = data.getVisual('decal'); + + if (decal) { + var style = data.getVisual('style'); + style.decal = createOrUpdatePatternFromDecal(decal, api); + } + }); + } + + var lifecycle = new Eventful(); + + // The implentations will be registered when installing the component. + // Avoid these code being bundled to the core module. + + var implsStore = {}; // TODO Type + + function registerImpl(name, impl) { + if ("development" !== 'production') { + if (implsStore[name]) { + error("Already has an implementation of " + name + "."); + } + } + + implsStore[name] = impl; + } + + function getImpl(name) { + if ("development" !== 'production') { + if (!implsStore[name]) { + error("Implementation of " + name + " doesn't exists."); + } + } + + return implsStore[name]; + } + + var hasWindow = typeof window !== 'undefined'; + var version$1 = '5.3.2'; + var dependencies = { + zrender: '5.3.1' + }; + var TEST_FRAME_REMAIN_TIME = 1; + var PRIORITY_PROCESSOR_SERIES_FILTER = 800; // Some data processors depends on the stack result dimension (to calculate data extent). + // So data stack stage should be in front of data processing stage. + + var PRIORITY_PROCESSOR_DATASTACK = 900; // "Data filter" will block the stream, so it should be + // put at the begining of data processing. + + var PRIORITY_PROCESSOR_FILTER = 1000; + var PRIORITY_PROCESSOR_DEFAULT = 2000; + var PRIORITY_PROCESSOR_STATISTIC = 5000; + var PRIORITY_VISUAL_LAYOUT = 1000; + var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100; + var PRIORITY_VISUAL_GLOBAL = 2000; + var PRIORITY_VISUAL_CHART = 3000; + var PRIORITY_VISUAL_COMPONENT = 4000; // Visual property in data. Greater than `PRIORITY_VISUAL_COMPONENT` to enable to + // overwrite the viusal result of component (like `visualMap`) + // using data item specific setting (like itemStyle.xxx on data item) + + var PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500; // Greater than `PRIORITY_VISUAL_CHART_DATA_CUSTOM` to enable to layout based on + // visual result like `symbolSize`. + + var PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600; + var PRIORITY_VISUAL_BRUSH = 5000; + var PRIORITY_VISUAL_ARIA = 6000; + var PRIORITY_VISUAL_DECAL = 7000; + var PRIORITY = { + PROCESSOR: { + FILTER: PRIORITY_PROCESSOR_FILTER, + SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER, + STATISTIC: PRIORITY_PROCESSOR_STATISTIC + }, + VISUAL: { + LAYOUT: PRIORITY_VISUAL_LAYOUT, + PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT, + GLOBAL: PRIORITY_VISUAL_GLOBAL, + CHART: PRIORITY_VISUAL_CHART, + POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT, + COMPONENT: PRIORITY_VISUAL_COMPONENT, + BRUSH: PRIORITY_VISUAL_BRUSH, + CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM, + ARIA: PRIORITY_VISUAL_ARIA, + DECAL: PRIORITY_VISUAL_DECAL + } + }; // Main process have three entries: `setOption`, `dispatchAction` and `resize`, + // where they must not be invoked nestedly, except the only case: invoke + // dispatchAction with updateMethod "none" in main process. + // This flag is used to carry out this rule. + // All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]). + + var IN_MAIN_PROCESS_KEY = '__flagInMainProcess'; + var PENDING_UPDATE = '__pendingUpdate'; + var STATUS_NEEDS_UPDATE_KEY = '__needsUpdateStatus'; + var ACTION_REG = /^[a-zA-Z0-9_]+$/; + var CONNECT_STATUS_KEY = '__connectUpdateStatus'; + var CONNECT_STATUS_PENDING = 0; + var CONNECT_STATUS_UPDATING = 1; + var CONNECT_STATUS_UPDATED = 2; + + function createRegisterEventWithLowercaseECharts(method) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + if (this.isDisposed()) { + disposedWarning(this.id); + return; + } + + return toLowercaseNameAndCallEventful(this, method, args); + }; + } + + function createRegisterEventWithLowercaseMessageCenter(method) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + return toLowercaseNameAndCallEventful(this, method, args); + }; + } + + function toLowercaseNameAndCallEventful(host, method, args) { + // `args[0]` is event name. Event name is all lowercase. + args[0] = args[0] && args[0].toLowerCase(); + return Eventful.prototype[method].apply(host, args); + } + + var MessageCenter = + /** @class */ + function (_super) { + __extends(MessageCenter, _super); + + function MessageCenter() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return MessageCenter; + }(Eventful); + + var messageCenterProto = MessageCenter.prototype; + messageCenterProto.on = createRegisterEventWithLowercaseMessageCenter('on'); + messageCenterProto.off = createRegisterEventWithLowercaseMessageCenter('off'); // --------------------------------------- + // Internal method names for class ECharts + // --------------------------------------- + + var prepare; + var prepareView; + var updateDirectly; + var updateMethods; + var doConvertPixel; + var updateStreamModes; + var doDispatchAction; + var flushPendingActions; + var triggerUpdatedEvent; + var bindRenderedEvent; + var bindMouseEvent; + var render; + var renderComponents; + var renderSeries; + var createExtensionAPI; + var enableConnect; + var markStatusToUpdate; + var applyChangedStates; + + var ECharts = + /** @class */ + function (_super) { + __extends(ECharts, _super); + + function ECharts(dom, // Theme name or themeOption. + theme, opts) { + var _this = _super.call(this, new ECEventProcessor()) || this; + + _this._chartsViews = []; + _this._chartsMap = {}; + _this._componentsViews = []; + _this._componentsMap = {}; // Can't dispatch action during rendering procedure + + _this._pendingActions = []; + opts = opts || {}; // Get theme by name + + if (isString(theme)) { + theme = themeStorage[theme]; + } + + _this._dom = dom; + var defaultRenderer = 'canvas'; + var defaultUseDirtyRect = false; + + if ("development" !== 'production') { + var root = + /* eslint-disable-next-line */ + hasWindow ? window : global; + defaultRenderer = root.__ECHARTS__DEFAULT__RENDERER__ || defaultRenderer; + var devUseDirtyRect = root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__; + defaultUseDirtyRect = devUseDirtyRect == null ? defaultUseDirtyRect : devUseDirtyRect; + } + + var zr = _this._zr = init(dom, { + renderer: opts.renderer || defaultRenderer, + devicePixelRatio: opts.devicePixelRatio, + width: opts.width, + height: opts.height, + ssr: opts.ssr, + useDirtyRect: opts.useDirtyRect == null ? defaultUseDirtyRect : opts.useDirtyRect + }); + _this._ssr = opts.ssr; // Expect 60 fps. + + _this._throttledZrFlush = throttle(bind(zr.flush, zr), 17); + theme = clone(theme); + theme && globalBackwardCompat(theme, true); + _this._theme = theme; + _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG); + _this._coordSysMgr = new CoordinateSystemManager(); + var api = _this._api = createExtensionAPI(_this); // Sort on demand + + function prioritySortFunc(a, b) { + return a.__prio - b.__prio; + } + + sort(visualFuncs, prioritySortFunc); + sort(dataProcessorFuncs, prioritySortFunc); + _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs); + _this._messageCenter = new MessageCenter(); // Init mouse events + + _this._initEvents(); // In case some people write `window.onresize = chart.resize` + + + _this.resize = bind(_this.resize, _this); + zr.animation.on('frame', _this._onframe, _this); + bindRenderedEvent(zr, _this); + bindMouseEvent(zr, _this); // ECharts instance can be used as value. + + setAsPrimitive(_this); + return _this; + } + + ECharts.prototype._onframe = function () { + if (this._disposed) { + return; + } + + applyChangedStates(this); + var scheduler = this._scheduler; // Lazy update + + if (this[PENDING_UPDATE]) { + var silent = this[PENDING_UPDATE].silent; + this[IN_MAIN_PROCESS_KEY] = true; + + try { + prepare(this); + updateMethods.update.call(this, null, this[PENDING_UPDATE].updateParams); + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + this[PENDING_UPDATE] = null; + throw e; + } // At present, in each frame, zrender performs: + // (1) animation step forward. + // (2) trigger('frame') (where this `_onframe` is called) + // (3) zrender flush (render). + // If we do nothing here, since we use `setToFinal: true`, the step (3) above + // will render the final state of the elements before the real animation started. + + + this._zr.flush(); + + this[IN_MAIN_PROCESS_KEY] = false; + this[PENDING_UPDATE] = null; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } // Avoid do both lazy update and progress in one frame. + else if (scheduler.unfinished) { + // Stream progress. + var remainTime = TEST_FRAME_REMAIN_TIME; + var ecModel = this._model; + var api = this._api; + scheduler.unfinished = false; + + do { + var startTime = +new Date(); + scheduler.performSeriesTasks(ecModel); // Currently dataProcessorFuncs do not check threshold. + + scheduler.performDataProcessorTasks(ecModel); + updateStreamModes(this, ecModel); // Do not update coordinate system here. Because that coord system update in + // each frame is not a good user experience. So we follow the rule that + // the extent of the coordinate system is determin in the first frame (the + // frame is executed immedietely after task reset. + // this._coordSysMgr.update(ecModel, api); + // console.log('--- ec frame visual ---', remainTime); + + scheduler.performVisualTasks(ecModel); + renderSeries(this, this._model, api, 'remain', {}); + remainTime -= +new Date() - startTime; + } while (remainTime > 0 && scheduler.unfinished); // Call flush explicitly for trigger finished event. + + + if (!scheduler.unfinished) { + this._zr.flush(); + } // Else, zr flushing be ensue within the same frame, + // because zr flushing is after onframe event. + + } + }; + + ECharts.prototype.getDom = function () { + return this._dom; + }; + + ECharts.prototype.getId = function () { + return this.id; + }; + + ECharts.prototype.getZr = function () { + return this._zr; + }; + + ECharts.prototype.isSSR = function () { + return this._ssr; + }; + /* eslint-disable-next-line */ + + + ECharts.prototype.setOption = function (option, notMerge, lazyUpdate) { + if (this[IN_MAIN_PROCESS_KEY]) { + if ("development" !== 'production') { + error('`setOption` should not be called during main process.'); + } + + return; + } + + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var silent; + var replaceMerge; + var transitionOpt; + + if (isObject(notMerge)) { + lazyUpdate = notMerge.lazyUpdate; + silent = notMerge.silent; + replaceMerge = notMerge.replaceMerge; + transitionOpt = notMerge.transition; + notMerge = notMerge.notMerge; + } + + this[IN_MAIN_PROCESS_KEY] = true; + + if (!this._model || notMerge) { + var optionManager = new OptionManager(this._api); + var theme = this._theme; + var ecModel = this._model = new GlobalModel(); + ecModel.scheduler = this._scheduler; + ecModel.ssr = this._ssr; + ecModel.init(null, null, null, theme, this._locale, optionManager); + } + + this._model.setOption(option, { + replaceMerge: replaceMerge + }, optionPreprocessorFuncs); + + var updateParams = { + seriesTransition: transitionOpt, + optionChanged: true + }; + + if (lazyUpdate) { + this[PENDING_UPDATE] = { + silent: silent, + updateParams: updateParams + }; + this[IN_MAIN_PROCESS_KEY] = false; // `setOption(option, {lazyMode: true})` may be called when zrender has been slept. + // It should wake it up to make sure zrender start to render at the next frame. + + this.getZr().wakeUp(); + } else { + try { + prepare(this); + updateMethods.update.call(this, null, updateParams); + } catch (e) { + this[PENDING_UPDATE] = null; + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } // Ensure zr refresh sychronously, and then pixel in canvas can be + // fetched after `setOption`. + + + if (!this._ssr) { + // not use flush when using ssr mode. + this._zr.flush(); + } + + this[PENDING_UPDATE] = null; + this[IN_MAIN_PROCESS_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } + }; + /** + * @deprecated + */ + + + ECharts.prototype.setTheme = function () { + deprecateLog('ECharts#setTheme() is DEPRECATED in ECharts 3.0'); + }; // We don't want developers to use getModel directly. + + + ECharts.prototype.getModel = function () { + return this._model; + }; + + ECharts.prototype.getOption = function () { + return this._model && this._model.getOption(); + }; + + ECharts.prototype.getWidth = function () { + return this._zr.getWidth(); + }; + + ECharts.prototype.getHeight = function () { + return this._zr.getHeight(); + }; + + ECharts.prototype.getDevicePixelRatio = function () { + return this._zr.painter.dpr + /* eslint-disable-next-line */ + || hasWindow && window.devicePixelRatio || 1; + }; + /** + * Get canvas which has all thing rendered + * @deprecated Use renderToCanvas instead. + */ + + + ECharts.prototype.getRenderedCanvas = function (opts) { + if ("development" !== 'production') { + deprecateReplaceLog('getRenderedCanvas', 'renderToCanvas'); + } + + return this.renderToCanvas(opts); + }; + + ECharts.prototype.renderToCanvas = function (opts) { + opts = opts || {}; + var painter = this._zr.painter; + + if ("development" !== 'production') { + if (painter.type !== 'canvas') { + throw new Error('renderToCanvas can only be used in the canvas renderer.'); + } + } + + return painter.getRenderedCanvas({ + backgroundColor: opts.backgroundColor || this._model.get('backgroundColor'), + pixelRatio: opts.pixelRatio || this.getDevicePixelRatio() + }); + }; + + ECharts.prototype.renderToSVGString = function (opts) { + opts = opts || {}; + var painter = this._zr.painter; + + if ("development" !== 'production') { + if (painter.type !== 'svg') { + throw new Error('renderToSVGString can only be used in the svg renderer.'); + } + } + + return painter.renderToString({ + useViewBox: opts.useViewBox + }); + }; + /** + * Get svg data url + */ + + + ECharts.prototype.getSvgDataURL = function () { + if (!env.svgSupported) { + return; + } + + var zr = this._zr; + var list = zr.storage.getDisplayList(); // Stop animations + + each(list, function (el) { + el.stopAnimation(null, true); + }); + return zr.painter.toDataURL(); + }; + + ECharts.prototype.getDataURL = function (opts) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + opts = opts || {}; + var excludeComponents = opts.excludeComponents; + var ecModel = this._model; + var excludesComponentViews = []; + var self = this; + each(excludeComponents, function (componentType) { + ecModel.eachComponent({ + mainType: componentType + }, function (component) { + var view = self._componentsMap[component.__viewId]; + + if (!view.group.ignore) { + excludesComponentViews.push(view); + view.group.ignore = true; + } + }); + }); + var url = this._zr.painter.getType() === 'svg' ? this.getSvgDataURL() : this.renderToCanvas(opts).toDataURL('image/' + (opts && opts.type || 'png')); + each(excludesComponentViews, function (view) { + view.group.ignore = false; + }); + return url; + }; + + ECharts.prototype.getConnectedDataURL = function (opts) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var isSvg = opts.type === 'svg'; + var groupId = this.group; + var mathMin = Math.min; + var mathMax = Math.max; + var MAX_NUMBER = Infinity; + + if (connectedGroups[groupId]) { + var left_1 = MAX_NUMBER; + var top_1 = MAX_NUMBER; + var right_1 = -MAX_NUMBER; + var bottom_1 = -MAX_NUMBER; + var canvasList_1 = []; + var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio(); + each(instances$1, function (chart, id) { + if (chart.group === groupId) { + var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.renderToCanvas(clone(opts)); + var boundingRect = chart.getDom().getBoundingClientRect(); + left_1 = mathMin(boundingRect.left, left_1); + top_1 = mathMin(boundingRect.top, top_1); + right_1 = mathMax(boundingRect.right, right_1); + bottom_1 = mathMax(boundingRect.bottom, bottom_1); + canvasList_1.push({ + dom: canvas, + left: boundingRect.left, + top: boundingRect.top + }); + } + }); + left_1 *= dpr_1; + top_1 *= dpr_1; + right_1 *= dpr_1; + bottom_1 *= dpr_1; + var width = right_1 - left_1; + var height = bottom_1 - top_1; + var targetCanvas = platformApi.createCanvas(); + var zr_1 = init(targetCanvas, { + renderer: isSvg ? 'svg' : 'canvas' + }); + zr_1.resize({ + width: width, + height: height + }); + + if (isSvg) { + var content_1 = ''; + each(canvasList_1, function (item) { + var x = item.left - left_1; + var y = item.top - top_1; + content_1 += '' + item.dom + ''; + }); + zr_1.painter.getSvgRoot().innerHTML = content_1; + + if (opts.connectedBackgroundColor) { + zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor); + } + + zr_1.refreshImmediately(); + return zr_1.painter.toDataURL(); + } else { + // Background between the charts + if (opts.connectedBackgroundColor) { + zr_1.add(new Rect({ + shape: { + x: 0, + y: 0, + width: width, + height: height + }, + style: { + fill: opts.connectedBackgroundColor + } + })); + } + + each(canvasList_1, function (item) { + var img = new ZRImage({ + style: { + x: item.left * dpr_1 - left_1, + y: item.top * dpr_1 - top_1, + image: item.dom + } + }); + zr_1.add(img); + }); + zr_1.refreshImmediately(); + return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png')); + } + } else { + return this.getDataURL(opts); + } + }; + + ECharts.prototype.convertToPixel = function (finder, value) { + return doConvertPixel(this, 'convertToPixel', finder, value); + }; + + ECharts.prototype.convertFromPixel = function (finder, value) { + return doConvertPixel(this, 'convertFromPixel', finder, value); + }; + /** + * Is the specified coordinate systems or components contain the given pixel point. + * @param {Array|number} value + * @return {boolean} result + */ + + + ECharts.prototype.containPixel = function (finder, value) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var ecModel = this._model; + var result; + var findResult = parseFinder(ecModel, finder); + each(findResult, function (models, key) { + key.indexOf('Models') >= 0 && each(models, function (model) { + var coordSys = model.coordinateSystem; + + if (coordSys && coordSys.containPoint) { + result = result || !!coordSys.containPoint(value); + } else if (key === 'seriesModels') { + var view = this._chartsMap[model.__viewId]; + + if (view && view.containPoint) { + result = result || view.containPoint(value, model); + } else { + if ("development" !== 'production') { + console.warn(key + ': ' + (view ? 'The found component do not support containPoint.' : 'No view mapping to the found component.')); + } + } + } else { + if ("development" !== 'production') { + console.warn(key + ': containPoint is not supported'); + } + } + }, this); + }, this); + return !!result; + }; + /** + * Get visual from series or data. + * @param finder + * If string, e.g., 'series', means {seriesIndex: 0}. + * If Object, could contain some of these properties below: + * { + * seriesIndex / seriesId / seriesName, + * dataIndex / dataIndexInside + * } + * If dataIndex is not specified, series visual will be fetched, + * but not data item visual. + * If all of seriesIndex, seriesId, seriesName are not specified, + * visual will be fetched from first series. + * @param visualType 'color', 'symbol', 'symbolSize' + */ + + + ECharts.prototype.getVisual = function (finder, visualType) { + var ecModel = this._model; + var parsedFinder = parseFinder(ecModel, finder, { + defaultMainType: 'series' + }); + var seriesModel = parsedFinder.seriesModel; + + if ("development" !== 'production') { + if (!seriesModel) { + console.warn('There is no specified seires model'); + } + } + + var data = seriesModel.getData(); + var dataIndexInside = parsedFinder.hasOwnProperty('dataIndexInside') ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty('dataIndex') ? data.indexOfRawIndex(parsedFinder.dataIndex) : null; + return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType); + }; + /** + * Get view of corresponding component model + */ + + + ECharts.prototype.getViewOfComponentModel = function (componentModel) { + return this._componentsMap[componentModel.__viewId]; + }; + /** + * Get view of corresponding series model + */ + + + ECharts.prototype.getViewOfSeriesModel = function (seriesModel) { + return this._chartsMap[seriesModel.__viewId]; + }; + + ECharts.prototype._initEvents = function () { + var _this = this; + + each(MOUSE_EVENT_NAMES, function (eveName) { + var handler = function (e) { + var ecModel = _this.getModel(); + + var el = e.target; + var params; + var isGlobalOut = eveName === 'globalout'; // no e.target when 'globalout'. + + if (isGlobalOut) { + params = {}; + } else { + el && findEventDispatcher(el, function (parent) { + var ecData = getECData(parent); + + if (ecData && ecData.dataIndex != null) { + var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex); + params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType) || {}; + return true; + } // If element has custom eventData of components + else if (ecData.eventData) { + params = extend({}, ecData.eventData); + return true; + } + }, true); + } // Contract: if params prepared in mouse event, + // these properties must be specified: + // { + // componentType: string (component main type) + // componentIndex: number + // } + // Otherwise event query can not work. + + + if (params) { + var componentType = params.componentType; + var componentIndex = params.componentIndex; // Special handling for historic reason: when trigger by + // markLine/markPoint/markArea, the componentType is + // 'markLine'/'markPoint'/'markArea', but we should better + // enable them to be queried by seriesIndex, since their + // option is set in each series. + + if (componentType === 'markLine' || componentType === 'markPoint' || componentType === 'markArea') { + componentType = 'series'; + componentIndex = params.seriesIndex; + } + + var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex); + var view = model && _this[model.mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]; + + if ("development" !== 'production') { + // `event.componentType` and `event[componentTpype + 'Index']` must not + // be missed, otherwise there is no way to distinguish source component. + // See `dataFormat.getDataParams`. + if (!isGlobalOut && !(model && view)) { + console.warn('model or view can not be found by params'); + } + } + + params.event = e; + params.type = eveName; + _this._$eventProcessor.eventInfo = { + targetEl: el, + packedEvent: params, + model: model, + view: view + }; + + _this.trigger(eveName, params); + } + }; // Consider that some component (like tooltip, brush, ...) + // register zr event handler, but user event handler might + // do anything, such as call `setOption` or `dispatchAction`, + // which probably update any of the content and probably + // cause problem if it is called previous other inner handlers. + + + handler.zrEventfulCallAtLast = true; + + _this._zr.on(eveName, handler, _this); + }); + each(eventActionMap, function (actionType, eventType) { + _this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, _this); + }); // Extra events + // TODO register? + + each(['selectchanged'], function (eventType) { + _this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, _this); + }); + handleLegacySelectEvents(this._messageCenter, this, this._api); + }; + + ECharts.prototype.isDisposed = function () { + return this._disposed; + }; + + ECharts.prototype.clear = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this.setOption({ + series: [] + }, true); + }; + + ECharts.prototype.dispose = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._disposed = true; + var dom = this.getDom(); + + if (dom) { + setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, ''); + } + + var chart = this; + var api = chart._api; + var ecModel = chart._model; + each(chart._componentsViews, function (component) { + component.dispose(ecModel, api); + }); + each(chart._chartsViews, function (chart) { + chart.dispose(ecModel, api); + }); // Dispose after all views disposed + + chart._zr.dispose(); // Set properties to null. + // To reduce the memory cost in case the top code still holds this instance unexpectedly. + + + chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null; + delete instances$1[chart.id]; + }; + /** + * Resize the chart + */ + + + ECharts.prototype.resize = function (opts) { + if (this[IN_MAIN_PROCESS_KEY]) { + if ("development" !== 'production') { + error('`resize` should not be called during main process.'); + } + + return; + } + + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._zr.resize(opts); + + var ecModel = this._model; // Resize loading effect + + this._loadingFX && this._loadingFX.resize(); + + if (!ecModel) { + return; + } + + var needPrepare = ecModel.resetOption('media'); + var silent = opts && opts.silent; // There is some real cases that: + // chart.setOption(option, { lazyUpdate: true }); + // chart.resize(); + + if (this[PENDING_UPDATE]) { + if (silent == null) { + silent = this[PENDING_UPDATE].silent; + } + + needPrepare = true; + this[PENDING_UPDATE] = null; + } + + this[IN_MAIN_PROCESS_KEY] = true; + + try { + needPrepare && prepare(this); + updateMethods.update.call(this, { + type: 'resize', + animation: extend({ + // Disable animation + duration: 0 + }, opts && opts.animation) + }); + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } + + this[IN_MAIN_PROCESS_KEY] = false; + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + }; + + ECharts.prototype.showLoading = function (name, cfg) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + if (isObject(name)) { + cfg = name; + name = ''; + } + + name = name || 'default'; + this.hideLoading(); + + if (!loadingEffects[name]) { + if ("development" !== 'production') { + console.warn('Loading effects ' + name + ' not exists.'); + } + + return; + } + + var el = loadingEffects[name](this._api, cfg); + var zr = this._zr; + this._loadingFX = el; + zr.add(el); + }; + /** + * Hide loading effect + */ + + + ECharts.prototype.hideLoading = function () { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + this._loadingFX && this._zr.remove(this._loadingFX); + this._loadingFX = null; + }; + + ECharts.prototype.makeActionFromEvent = function (eventObj) { + var payload = extend({}, eventObj); + payload.type = eventActionMap[eventObj.type]; + return payload; + }; + /** + * @param opt If pass boolean, means opt.silent + * @param opt.silent Default `false`. Whether trigger events. + * @param opt.flush Default `undefined`. + * true: Flush immediately, and then pixel in canvas can be fetched + * immediately. Caution: it might affect performance. + * false: Not flush. + * undefined: Auto decide whether perform flush. + */ + + + ECharts.prototype.dispatchAction = function (payload, opt) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + if (!isObject(opt)) { + opt = { + silent: !!opt + }; + } + + if (!actions[payload.type]) { + return; + } // Avoid dispatch action before setOption. Especially in `connect`. + + + if (!this._model) { + return; + } // May dispatchAction in rendering procedure + + + if (this[IN_MAIN_PROCESS_KEY]) { + this._pendingActions.push(payload); + + return; + } + + var silent = opt.silent; + doDispatchAction.call(this, payload, silent); + var flush = opt.flush; + + if (flush) { + this._zr.flush(); + } else if (flush !== false && env.browser.weChat) { + // In WeChat embeded browser, `requestAnimationFrame` and `setInterval` + // hang when sliding page (on touch event), which cause that zr does not + // refresh util user interaction finished, which is not expected. + // But `dispatchAction` may be called too frequently when pan on touch + // screen, which impacts performance if do not throttle them. + this._throttledZrFlush(); + } + + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + }; + + ECharts.prototype.updateLabelLayout = function () { + lifecycle.trigger('series:layoutlabels', this._model, this._api, { + // Not adding series labels. + // TODO + updatedSeries: [] + }); + }; + + ECharts.prototype.appendData = function (params) { + if (this._disposed) { + disposedWarning(this.id); + return; + } + + var seriesIndex = params.seriesIndex; + var ecModel = this.getModel(); + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + if ("development" !== 'production') { + assert(params.data && seriesModel); + } + + seriesModel.appendData(params); // Note: `appendData` does not support that update extent of coordinate + // system, util some scenario require that. In the expected usage of + // `appendData`, the initial extent of coordinate system should better + // be fixed by axis `min`/`max` setting or initial data, otherwise if + // the extent changed while `appendData`, the location of the painted + // graphic elements have to be changed, which make the usage of + // `appendData` meaningless. + + this._scheduler.unfinished = true; + this.getZr().wakeUp(); + }; // A work around for no `internal` modifier in ts yet but + // need to strictly hide private methods to JS users. + + + ECharts.internalField = function () { + prepare = function (ecIns) { + var scheduler = ecIns._scheduler; + scheduler.restorePipelines(ecIns._model); + scheduler.prepareStageTasks(); + prepareView(ecIns, true); + prepareView(ecIns, false); + scheduler.plan(); + }; + /** + * Prepare view instances of charts and components + */ + + + prepareView = function (ecIns, isComponent) { + var ecModel = ecIns._model; + var scheduler = ecIns._scheduler; + var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews; + var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap; + var zr = ecIns._zr; + var api = ecIns._api; + + for (var i = 0; i < viewList.length; i++) { + viewList[i].__alive = false; + } + + isComponent ? ecModel.eachComponent(function (componentType, model) { + componentType !== 'series' && doPrepare(model); + }) : ecModel.eachSeries(doPrepare); + + function doPrepare(model) { + // By defaut view will be reused if possible for the case that `setOption` with "notMerge" + // mode and need to enable transition animation. (Usually, when they have the same id, or + // especially no id but have the same type & name & index. See the `model.id` generation + // rule in `makeIdAndName` and `viewId` generation rule here). + // But in `replaceMerge` mode, this feature should be able to disabled when it is clear that + // the new model has nothing to do with the old model. + var requireNewView = model.__requireNewView; // This command should not work twice. + + model.__requireNewView = false; // Consider: id same and type changed. + + var viewId = '_ec_' + model.id + '_' + model.type; + var view = !requireNewView && viewMap[viewId]; + + if (!view) { + var classType = parseClassType(model.type); + var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) : // FIXME:TS + // (ChartView as ChartViewConstructor).getClass('series', classType.sub) + // For backward compat, still support a chart type declared as only subType + // like "liquidfill", but recommend "series.liquidfill" + // But need a base class to make a type series. + ChartView.getClass(classType.sub); + + if ("development" !== 'production') { + assert(Clazz, classType.sub + ' does not exist.'); + } + + view = new Clazz(); + view.init(ecModel, api); + viewMap[viewId] = view; + viewList.push(view); + zr.add(view.group); + } + + model.__viewId = view.__id = viewId; + view.__alive = true; + view.__model = model; + view.group.__ecComponentInfo = { + mainType: model.mainType, + index: model.componentIndex + }; + !isComponent && scheduler.prepareView(view, model, ecModel, api); + } + + for (var i = 0; i < viewList.length;) { + var view = viewList[i]; + + if (!view.__alive) { + !isComponent && view.renderTask.dispose(); + zr.remove(view.group); + view.dispose(ecModel, api); + viewList.splice(i, 1); + + if (viewMap[view.__id] === view) { + delete viewMap[view.__id]; + } + + view.__id = view.group.__ecComponentInfo = null; + } else { + i++; + } + } + }; + + updateDirectly = function (ecIns, method, payload, mainType, subType) { + var ecModel = ecIns._model; + ecModel.setUpdatePayload(payload); // broadcast + + if (!mainType) { + // FIXME + // Chart will not be update directly here, except set dirty. + // But there is no such scenario now. + each([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView); + return; + } + + var query = {}; + query[mainType + 'Id'] = payload[mainType + 'Id']; + query[mainType + 'Index'] = payload[mainType + 'Index']; + query[mainType + 'Name'] = payload[mainType + 'Name']; + var condition = { + mainType: mainType, + query: query + }; + subType && (condition.subType = subType); // subType may be '' by parseClassType; + + var excludeSeriesId = payload.excludeSeriesId; + var excludeSeriesIdMap; + + if (excludeSeriesId != null) { + excludeSeriesIdMap = createHashMap(); + each(normalizeToArray(excludeSeriesId), function (id) { + var modelId = convertOptionIdName(id, null); + + if (modelId != null) { + excludeSeriesIdMap.set(modelId, true); + } + }); + } // If dispatchAction before setOption, do nothing. + + + ecModel && ecModel.eachComponent(condition, function (model) { + var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) !== null; + + if (isExcluded) { + return; + } + + if (isHighDownPayload(payload)) { + if (model instanceof SeriesModel) { + if (payload.type === HIGHLIGHT_ACTION_TYPE && !payload.notBlur && !model.get(['emphasis', 'disabled'])) { + blurSeriesFromHighlightPayload(model, payload, ecIns._api); + } + } else { + var _a = findComponentHighDownDispatchers(model.mainType, model.componentIndex, payload.name, ecIns._api), + focusSelf = _a.focusSelf, + dispatchers = _a.dispatchers; + + if (payload.type === HIGHLIGHT_ACTION_TYPE && focusSelf && !payload.notBlur) { + blurComponent(model.mainType, model.componentIndex, ecIns._api); + } // PENDING: + // Whether to put this "enter emphasis" code in `ComponentView`, + // which will be the same as `ChartView` but might be not necessary + // and will be far from this logic. + + + if (dispatchers) { + each(dispatchers, function (dispatcher) { + payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher); + }); + } + } + } else if (isSelectChangePayload(payload)) { + // TODO geo + if (model instanceof SeriesModel) { + toggleSelectionFromPayload(model, payload, ecIns._api); + updateSeriesElementSelection(model); + markStatusToUpdate(ecIns); + } + } + }, ecIns); + ecModel && ecModel.eachComponent(condition, function (model) { + var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) !== null; + + if (isExcluded) { + return; + } + callView(ecIns[mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]); + }, ecIns); + + function callView(view) { + view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload); + } + }; + + updateMethods = { + prepareAndUpdate: function (payload) { + prepare(this); + updateMethods.update.call(this, payload, { + // Needs to mark option changed if newOption is given. + // It's from MagicType. + // TODO If use a separate flag optionChanged in payload? + optionChanged: payload.newOption != null + }); + }, + update: function (payload, updateParams) { + var ecModel = this._model; + var api = this._api; + var zr = this._zr; + var coordSysMgr = this._coordSysMgr; + var scheduler = this._scheduler; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); + scheduler.restoreData(ecModel, payload); + scheduler.performSeriesTasks(ecModel); // TODO + // Save total ecModel here for undo/redo (after restoring data and before processing data). + // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call. + // Create new coordinate system each update + // In LineView may save the old coordinate system and use it to get the orignal point + + coordSysMgr.create(ecModel, api); + scheduler.performDataProcessorTasks(ecModel, payload); // Current stream render is not supported in data process. So we can update + // stream modes after data processing, where the filtered data is used to + // deteming whether use progressive rendering. + + updateStreamModes(this, ecModel); // We update stream modes before coordinate system updated, then the modes info + // can be fetched when coord sys updating (consider the barGrid extent fix). But + // the drawback is the full coord info can not be fetched. Fortunately this full + // coord is not requied in stream mode updater currently. + + coordSysMgr.update(ecModel, api); + clearColorPalette(ecModel); + scheduler.performVisualTasks(ecModel, payload); + render(this, ecModel, api, payload, updateParams); // Set background + + var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; + var darkMode = ecModel.get('darkMode'); + zr.setBackgroundColor(backgroundColor); // Force set dark mode. + + if (darkMode != null && darkMode !== 'auto') { + zr.setDarkMode(darkMode); + } + + lifecycle.trigger('afterupdate', ecModel, api); + }, + updateTransform: function (payload) { + var _this = this; + + var ecModel = this._model; + var api = this._api; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); // ChartView.markUpdateMethod(payload, 'updateTransform'); + + var componentDirtyList = []; + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType === 'series') { + return; + } + + var componentView = _this.getViewOfComponentModel(componentModel); + + if (componentView && componentView.__alive) { + if (componentView.updateTransform) { + var result = componentView.updateTransform(componentModel, ecModel, api, payload); + result && result.update && componentDirtyList.push(componentView); + } else { + componentDirtyList.push(componentView); + } + } + }); + var seriesDirtyMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var chartView = _this._chartsMap[seriesModel.__viewId]; + + if (chartView.updateTransform) { + var result = chartView.updateTransform(seriesModel, ecModel, api, payload); + result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); + } else { + seriesDirtyMap.set(seriesModel.uid, 1); + } + }); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true); + + this._scheduler.performVisualTasks(ecModel, payload, { + setDirty: true, + dirtyMap: seriesDirtyMap + }); // Currently, not call render of components. Geo render cost a lot. + // renderComponents(ecIns, ecModel, api, payload, componentDirtyList); + + + renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap); + lifecycle.trigger('afterupdate', ecModel, api); + }, + updateView: function (payload) { + var ecModel = this._model; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); + ChartView.markUpdateMethod(payload, 'updateView'); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + + this._scheduler.performVisualTasks(ecModel, payload, { + setDirty: true + }); + + render(this, ecModel, this._api, payload, {}); + lifecycle.trigger('afterupdate', ecModel, this._api); + }, + updateVisual: function (payload) { + // updateMethods.update.call(this, payload); + var _this = this; + + var ecModel = this._model; // update before setOption + + if (!ecModel) { + return; + } + + ecModel.setUpdatePayload(payload); // clear all visual + + ecModel.eachSeries(function (seriesModel) { + seriesModel.getData().clearAllVisual(); + }); // Perform visual + + ChartView.markUpdateMethod(payload, 'updateVisual'); + clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + + this._scheduler.performVisualTasks(ecModel, payload, { + visualType: 'visual', + setDirty: true + }); + + ecModel.eachComponent(function (componentType, componentModel) { + if (componentType !== 'series') { + var componentView = _this.getViewOfComponentModel(componentModel); + + componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload); + } + }); + ecModel.eachSeries(function (seriesModel) { + var chartView = _this._chartsMap[seriesModel.__viewId]; + chartView.updateVisual(seriesModel, ecModel, _this._api, payload); + }); + lifecycle.trigger('afterupdate', ecModel, this._api); + }, + updateLayout: function (payload) { + updateMethods.update.call(this, payload); + } + }; + + doConvertPixel = function (ecIns, methodName, finder, value) { + if (ecIns._disposed) { + disposedWarning(ecIns.id); + return; + } + + var ecModel = ecIns._model; + + var coordSysList = ecIns._coordSysMgr.getCoordinateSystems(); + + var result; + var parsedFinder = parseFinder(ecModel, finder); + + for (var i = 0; i < coordSysList.length; i++) { + var coordSys = coordSysList[i]; + + if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value)) != null) { + return result; + } + } + + if ("development" !== 'production') { + console.warn('No coordinate system that supports ' + methodName + ' found by the given finder.'); + } + }; + + updateStreamModes = function (ecIns, ecModel) { + var chartsMap = ecIns._chartsMap; + var scheduler = ecIns._scheduler; + ecModel.eachSeries(function (seriesModel) { + scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]); + }); + }; + + doDispatchAction = function (payload, silent) { + var _this = this; + + var ecModel = this.getModel(); + var payloadType = payload.type; + var escapeConnect = payload.escapeConnect; + var actionWrap = actions[payloadType]; + var actionInfo = actionWrap.actionInfo; + var cptTypeTmp = (actionInfo.update || 'update').split(':'); + var updateMethod = cptTypeTmp.pop(); + var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]); + this[IN_MAIN_PROCESS_KEY] = true; + var payloads = [payload]; + var batched = false; // Batch action + + if (payload.batch) { + batched = true; + payloads = map(payload.batch, function (item) { + item = defaults(extend({}, item), payload); + item.batch = null; + return item; + }); + } + + var eventObjBatch = []; + var eventObj; + var isSelectChange = isSelectChangePayload(payload); + var isHighDown = isHighDownPayload(payload); // Only leave blur once if there are multiple batches. + + if (isHighDown) { + allLeaveBlur(this._api); + } + + each(payloads, function (batchItem) { + // Action can specify the event by return it. + eventObj = actionWrap.action(batchItem, _this._model, _this._api); // Emit event outside + + eventObj = eventObj || extend({}, batchItem); // Convert type to eventType + + eventObj.type = actionInfo.event || eventObj.type; + eventObjBatch.push(eventObj); // light update does not perform data process, layout and visual. + + if (isHighDown) { + var _a = preParseFinder(payload), + queryOptionMap = _a.queryOptionMap, + mainTypeSpecified = _a.mainTypeSpecified; + + var componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : 'series'; + updateDirectly(_this, updateMethod, batchItem, componentMainType); + markStatusToUpdate(_this); + } else if (isSelectChange) { + // At present `dispatchAction({ type: 'select', ... })` is not supported on components. + // geo still use 'geoselect'. + updateDirectly(_this, updateMethod, batchItem, 'series'); + markStatusToUpdate(_this); + } else if (cptType) { + updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub); + } + }); + + if (updateMethod !== 'none' && !isHighDown && !isSelectChange && !cptType) { + try { + // Still dirty + if (this[PENDING_UPDATE]) { + prepare(this); + updateMethods.update.call(this, payload); + this[PENDING_UPDATE] = null; + } else { + updateMethods[updateMethod].call(this, payload); + } + } catch (e) { + this[IN_MAIN_PROCESS_KEY] = false; + throw e; + } + } // Follow the rule of action batch + + + if (batched) { + eventObj = { + type: actionInfo.event || payloadType, + escapeConnect: escapeConnect, + batch: eventObjBatch + }; + } else { + eventObj = eventObjBatch[0]; + } + + this[IN_MAIN_PROCESS_KEY] = false; + + if (!silent) { + var messageCenter = this._messageCenter; + messageCenter.trigger(eventObj.type, eventObj); // Extra triggered 'selectchanged' event + + if (isSelectChange) { + var newObj = { + type: 'selectchanged', + escapeConnect: escapeConnect, + selected: getAllSelectedIndices(ecModel), + isFromClick: payload.isFromClick || false, + fromAction: payload.type, + fromActionPayload: payload + }; + messageCenter.trigger(newObj.type, newObj); + } + } + }; + + flushPendingActions = function (silent) { + var pendingActions = this._pendingActions; + + while (pendingActions.length) { + var payload = pendingActions.shift(); + doDispatchAction.call(this, payload, silent); + } + }; + + triggerUpdatedEvent = function (silent) { + !silent && this.trigger('updated'); + }; + /** + * Event `rendered` is triggered when zr + * rendered. It is useful for realtime + * snapshot (reflect animation). + * + * Event `finished` is triggered when: + * (1) zrender rendering finished. + * (2) initial animation finished. + * (3) progressive rendering finished. + * (4) no pending action. + * (5) no delayed setOption needs to be processed. + */ + + + bindRenderedEvent = function (zr, ecIns) { + zr.on('rendered', function (params) { + ecIns.trigger('rendered', params); // The `finished` event should not be triggered repeatly, + // so it should only be triggered when rendering indeed happend + // in zrender. (Consider the case that dipatchAction is keep + // triggering when mouse move). + + if ( // Although zr is dirty if initial animation is not finished + // and this checking is called on frame, we also check + // animation finished for robustness. + zr.animation.isFinished() && !ecIns[PENDING_UPDATE] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length) { + ecIns.trigger('finished'); + } + }); + }; + + bindMouseEvent = function (zr, ecIns) { + zr.on('mouseover', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, isHighDownDispatcher); + + if (dispatcher) { + handleGlobalMouseOverForHighDown(dispatcher, e, ecIns._api); + markStatusToUpdate(ecIns); + } + }).on('mouseout', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, isHighDownDispatcher); + + if (dispatcher) { + handleGlobalMouseOutForHighDown(dispatcher, e, ecIns._api); + markStatusToUpdate(ecIns); + } + }).on('click', function (e) { + var el = e.target; + var dispatcher = findEventDispatcher(el, function (target) { + return getECData(target).dataIndex != null; + }, true); + + if (dispatcher) { + var actionType = dispatcher.selected ? 'unselect' : 'select'; + var ecData = getECData(dispatcher); + + ecIns._api.dispatchAction({ + type: actionType, + dataType: ecData.dataType, + dataIndexInside: ecData.dataIndex, + seriesIndex: ecData.seriesIndex, + isFromClick: true + }); + } + }); + }; + + function clearColorPalette(ecModel) { + ecModel.clearColorPalette(); + ecModel.eachSeries(function (seriesModel) { + seriesModel.clearColorPalette(); + }); + } + + function allocateZlevels(ecModel) { + var componentZLevels = []; + var seriesZLevels = []; + var hasSeperateZLevel = false; + ecModel.eachComponent(function (componentType, componentModel) { + var zlevel = componentModel.get('zlevel') || 0; + var z = componentModel.get('z') || 0; + var zlevelKey = componentModel.getZLevelKey(); + hasSeperateZLevel = hasSeperateZLevel || !!zlevelKey; + (componentType === 'series' ? seriesZLevels : componentZLevels).push({ + zlevel: zlevel, + z: z, + idx: componentModel.componentIndex, + type: componentType, + key: zlevelKey + }); + }); + + if (hasSeperateZLevel) { + // Series after component + var zLevels = componentZLevels.concat(seriesZLevels); + var lastSeriesZLevel_1; + var lastSeriesKey_1; + sort(zLevels, function (a, b) { + if (a.zlevel === b.zlevel) { + return a.z - b.z; + } + + return a.zlevel - b.zlevel; + }); + each(zLevels, function (item) { + var componentModel = ecModel.getComponent(item.type, item.idx); + var zlevel = item.zlevel; + var key = item.key; + + if (lastSeriesZLevel_1 != null) { + zlevel = Math.max(lastSeriesZLevel_1, zlevel); + } + + if (key) { + if (zlevel === lastSeriesZLevel_1 && key !== lastSeriesKey_1) { + zlevel++; + } + + lastSeriesKey_1 = key; + } else if (lastSeriesKey_1) { + if (zlevel === lastSeriesZLevel_1) { + zlevel++; + } + + lastSeriesKey_1 = ''; + } + + lastSeriesZLevel_1 = zlevel; + componentModel.setZLevel(zlevel); + }); + } + } + + render = function (ecIns, ecModel, api, payload, updateParams) { + allocateZlevels(ecModel); + renderComponents(ecIns, ecModel, api, payload, updateParams); + each(ecIns._chartsViews, function (chart) { + chart.__alive = false; + }); + renderSeries(ecIns, ecModel, api, payload, updateParams); // Remove groups of unrendered charts + + each(ecIns._chartsViews, function (chart) { + if (!chart.__alive) { + chart.remove(ecModel, api); + } + }); + }; + + renderComponents = function (ecIns, ecModel, api, payload, updateParams, dirtyList) { + each(dirtyList || ecIns._componentsViews, function (componentView) { + var componentModel = componentView.__model; + clearStates(componentModel, componentView); + componentView.render(componentModel, ecModel, api, payload); + updateZ(componentModel, componentView); + updateStates(componentModel, componentView); + }); + }; + /** + * Render each chart and component + */ + + + renderSeries = function (ecIns, ecModel, api, payload, updateParams, dirtyMap) { + // Render all charts + var scheduler = ecIns._scheduler; + updateParams = extend(updateParams || {}, { + updatedSeries: ecModel.getSeries() + }); // TODO progressive? + + lifecycle.trigger('series:beforeupdate', ecModel, api, updateParams); + var unfinished = false; + ecModel.eachSeries(function (seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + chartView.__alive = true; + var renderTask = chartView.renderTask; + scheduler.updatePayload(renderTask, payload); // TODO states on marker. + + clearStates(seriesModel, chartView); + + if (dirtyMap && dirtyMap.get(seriesModel.uid)) { + renderTask.dirty(); + } + + if (renderTask.perform(scheduler.getPerformArgs(renderTask))) { + unfinished = true; + } + + chartView.group.silent = !!seriesModel.get('silent'); // Should not call markRedraw on group, because it will disable zrender + // increamental render (alway render from the __startIndex each frame) + // chartView.group.markRedraw(); + + updateBlend(seriesModel, chartView); + updateSeriesElementSelection(seriesModel); + }); + scheduler.unfinished = unfinished || scheduler.unfinished; + lifecycle.trigger('series:layoutlabels', ecModel, api, updateParams); // transition after label is layouted. + + lifecycle.trigger('series:transition', ecModel, api, updateParams); + ecModel.eachSeries(function (seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; // Update Z after labels updated. Before applying states. + + updateZ(seriesModel, chartView); // NOTE: Update states after label is updated. + // label should be in normal status when layouting. + + updateStates(seriesModel, chartView); + }); // If use hover layer + + updateHoverLayerStatus(ecIns, ecModel); + lifecycle.trigger('series:afterupdate', ecModel, api, updateParams); + }; + + markStatusToUpdate = function (ecIns) { + ecIns[STATUS_NEEDS_UPDATE_KEY] = true; // Wake up zrender if it's sleep. Let it update states in the next frame. + + ecIns.getZr().wakeUp(); + }; + + applyChangedStates = function (ecIns) { + if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) { + return; + } + + ecIns.getZr().storage.traverse(function (el) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + applyElementStates(el); + }); + ecIns[STATUS_NEEDS_UPDATE_KEY] = false; + }; + + function applyElementStates(el) { + var newStates = []; + var oldStates = el.currentStates; // Keep other states. + + for (var i = 0; i < oldStates.length; i++) { + var stateName = oldStates[i]; + + if (!(stateName === 'emphasis' || stateName === 'blur' || stateName === 'select')) { + newStates.push(stateName); + } + } // Only use states when it's exists. + + + if (el.selected && el.states.select) { + newStates.push('select'); + } + + if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) { + newStates.push('emphasis'); + } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) { + newStates.push('blur'); + } + + el.useStates(newStates); + } + + function updateHoverLayerStatus(ecIns, ecModel) { + var zr = ecIns._zr; + var storage = zr.storage; + var elCount = 0; + storage.traverse(function (el) { + if (!el.isGroup) { + elCount++; + } + }); + + if (elCount > ecModel.get('hoverLayerThreshold') && !env.node && !env.worker) { + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.preventUsingHoverLayer) { + return; + } + + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + + if (chartView.__alive) { + chartView.eachRendered(function (el) { + if (el.states.emphasis) { + el.states.emphasis.hoverLayer = true; + } + }); + } + }); + } + } + + /** + * Update chart and blend. + */ + + function updateBlend(seriesModel, chartView) { + var blendMode = seriesModel.get('blendMode') || null; + chartView.eachRendered(function (el) { + // FIXME marker and other components + if (!el.isGroup) { + // DONT mark the element dirty. In case element is incremental and don't wan't to rerender. + el.style.blend = blendMode; + } + }); + } + + function updateZ(model, view) { + if (model.preventAutoZ) { + return; + } + + var z = model.get('z') || 0; + var zlevel = model.get('zlevel') || 0; // Set z and zlevel + + view.eachRendered(function (el) { + doUpdateZ(el, z, zlevel, -Infinity); // Don't traverse the children because it has been traversed in _updateZ. + + return true; + }); + } + + function doUpdateZ(el, z, zlevel, maxZ2) { + // Group may also have textContent + var label = el.getTextContent(); + var labelLine = el.getTextGuideLine(); + var isGroup = el.isGroup; + + if (isGroup) { + // set z & zlevel of children elements of Group + var children = el.childrenRef(); + + for (var i = 0; i < children.length; i++) { + maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2); + } + } else { + // not Group + el.z = z; + el.zlevel = zlevel; + maxZ2 = Math.max(el.z2, maxZ2); + } // always set z and zlevel if label/labelLine exists + + + if (label) { + label.z = z; + label.zlevel = zlevel; // lift z2 of text content + // TODO if el.emphasis.z2 is spcefied, what about textContent. + + isFinite(maxZ2) && (label.z2 = maxZ2 + 2); + } + + if (labelLine) { + var textGuideLineConfig = el.textGuideLineConfig; + labelLine.z = z; + labelLine.zlevel = zlevel; + isFinite(maxZ2) && (labelLine.z2 = maxZ2 + (textGuideLineConfig && textGuideLineConfig.showAbove ? 1 : -1)); + } + + return maxZ2; + } // Clear states without animation. + // TODO States on component. + + + function clearStates(model, view) { + view.eachRendered(function (el) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); + + if (el.stateTransition) { + el.stateTransition = null; + } + + if (textContent && textContent.stateTransition) { + textContent.stateTransition = null; + } + + if (textGuide && textGuide.stateTransition) { + textGuide.stateTransition = null; + } // TODO If el is incremental. + + + if (el.hasState()) { + el.prevStates = el.currentStates; + el.clearStates(); + } else if (el.prevStates) { + el.prevStates = null; + } + }); + } + + function updateStates(model, view) { + var stateAnimationModel = model.getModel('stateAnimation'); + var enableAnimation = model.isAnimationEnabled(); + var duration = stateAnimationModel.get('duration'); + var stateTransition = duration > 0 ? { + duration: duration, + delay: stateAnimationModel.get('delay'), + easing: stateAnimationModel.get('easing') // additive: stateAnimationModel.get('additive') + + } : null; + view.eachRendered(function (el) { + if (el.states && el.states.emphasis) { + // Not applied on removed elements, it may still in fading. + if (isElementRemoved(el)) { + return; + } + + if (el instanceof Path) { + savePathStates(el); + } // Only updated on changed element. In case element is incremental and don't wan't to rerender. + // TODO, a more proper way? + + + if (el.__dirty) { + var prevStates = el.prevStates; // Restore states without animation + + if (prevStates) { + el.useStates(prevStates); + } + } // Update state transition and enable animation again. + + + if (enableAnimation) { + el.stateTransition = stateTransition; + var textContent = el.getTextContent(); + var textGuide = el.getTextGuideLine(); // TODO Is it necessary to animate label? + + if (textContent) { + textContent.stateTransition = stateTransition; + } + + if (textGuide) { + textGuide.stateTransition = stateTransition; + } + } // The use higlighted and selected flag to toggle states. + + + if (el.__dirty) { + applyElementStates(el); + } + } + }); + } + + createExtensionAPI = function (ecIns) { + return new ( + /** @class */ + function (_super) { + __extends(class_1, _super); + + function class_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + + class_1.prototype.getCoordinateSystems = function () { + return ecIns._coordSysMgr.getCoordinateSystems(); + }; + + class_1.prototype.getComponentByElement = function (el) { + while (el) { + var modelInfo = el.__ecComponentInfo; + + if (modelInfo != null) { + return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index); + } + + el = el.parent; + } + }; + + class_1.prototype.enterEmphasis = function (el, highlightDigit) { + enterEmphasis(el, highlightDigit); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveEmphasis = function (el, highlightDigit) { + leaveEmphasis(el, highlightDigit); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.enterBlur = function (el) { + enterBlur(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveBlur = function (el) { + leaveBlur(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.enterSelect = function (el) { + enterSelect(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.leaveSelect = function (el) { + leaveSelect(el); + markStatusToUpdate(ecIns); + }; + + class_1.prototype.getModel = function () { + return ecIns.getModel(); + }; + + class_1.prototype.getViewOfComponentModel = function (componentModel) { + return ecIns.getViewOfComponentModel(componentModel); + }; + + class_1.prototype.getViewOfSeriesModel = function (seriesModel) { + return ecIns.getViewOfSeriesModel(seriesModel); + }; + + return class_1; + }(ExtensionAPI))(ecIns); + }; + + enableConnect = function (chart) { + function updateConnectedChartsStatus(charts, status) { + for (var i = 0; i < charts.length; i++) { + var otherChart = charts[i]; + otherChart[CONNECT_STATUS_KEY] = status; + } + } + + each(eventActionMap, function (actionType, eventType) { + chart._messageCenter.on(eventType, function (event) { + if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) { + if (event && event.escapeConnect) { + return; + } + + var action_1 = chart.makeActionFromEvent(event); + var otherCharts_1 = []; + each(instances$1, function (otherChart) { + if (otherChart !== chart && otherChart.group === chart.group) { + otherCharts_1.push(otherChart); + } + }); + updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING); + each(otherCharts_1, function (otherChart) { + if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) { + otherChart.dispatchAction(action_1); + } + }); + updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED); + } + }); + }); + }; + }(); + + return ECharts; + }(Eventful); + + var echartsProto = ECharts.prototype; + echartsProto.on = createRegisterEventWithLowercaseECharts('on'); + echartsProto.off = createRegisterEventWithLowercaseECharts('off'); + /** + * @deprecated + */ + // @ts-ignore + + echartsProto.one = function (eventName, cb, ctx) { + var self = this; + deprecateLog('ECharts#one is deprecated.'); + + function wrapped() { + var args2 = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args2[_i] = arguments[_i]; + } + + cb && cb.apply && cb.apply(this, args2); // @ts-ignore + + self.off(eventName, wrapped); + } + + this.on.call(this, eventName, wrapped, ctx); + }; + + var MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu']; + + function disposedWarning(id) { + if ("development" !== 'production') { + console.warn('Instance ' + id + ' has been disposed'); + } + } + + var actions = {}; + /** + * Map eventType to actionType + */ + + var eventActionMap = {}; + var dataProcessorFuncs = []; + var optionPreprocessorFuncs = []; + var visualFuncs = []; + var themeStorage = {}; + var loadingEffects = {}; + var instances$1 = {}; + var connectedGroups = {}; + var idBase = +new Date() - 0; + var groupIdBase = +new Date() - 0; + var DOM_ATTRIBUTE_KEY = '_echarts_instance_'; + + /** + * @param opts.devicePixelRatio Use window.devicePixelRatio by default + * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart. + * @param opts.width Use clientWidth of the input `dom` by default. + * Can be 'auto' (the same as null/undefined) + * @param opts.height Use clientHeight of the input `dom` by default. + * Can be 'auto' (the same as null/undefined) + * @param opts.locale Specify the locale. + * @param opts.useDirtyRect Enable dirty rectangle rendering or not. + */ + + function init$1(dom, theme, opts) { + var isClient = !(opts && opts.ssr); + + if (isClient) { + if ("development" !== 'production') { + if (!dom) { + throw new Error('Initialize failed: invalid dom.'); + } + } + + var existInstance = getInstanceByDom(dom); + + if (existInstance) { + if ("development" !== 'production') { + console.warn('There is a chart instance already initialized on the dom.'); + } + + return existInstance; + } + + if ("development" !== 'production') { + if (isDom(dom) && dom.nodeName.toUpperCase() !== 'CANVAS' && (!dom.clientWidth && (!opts || opts.width == null) || !dom.clientHeight && (!opts || opts.height == null))) { + console.warn('Can\'t get DOM width or height. Please check ' + 'dom.clientWidth and dom.clientHeight. They should not be 0.' + 'For example, you may need to call this in the callback ' + 'of window.onload.'); + } + } + } + + var chart = new ECharts(dom, theme, opts); + chart.id = 'ec_' + idBase++; + instances$1[chart.id] = chart; + isClient && setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id); + enableConnect(chart); + lifecycle.trigger('afterinit', chart); + return chart; + } + + /** + * @usage + * (A) + * ```js + * let chart1 = echarts.init(dom1); + * let chart2 = echarts.init(dom2); + * chart1.group = 'xxx'; + * chart2.group = 'xxx'; + * echarts.connect('xxx'); + * ``` + * (B) + * ```js + * let chart1 = echarts.init(dom1); + * let chart2 = echarts.init(dom2); + * echarts.connect('xxx', [chart1, chart2]); + * ``` + */ + + function connect(groupId) { + // Is array of charts + if (isArray(groupId)) { + var charts = groupId; + groupId = null; // If any chart has group + + each(charts, function (chart) { + if (chart.group != null) { + groupId = chart.group; + } + }); + groupId = groupId || 'g_' + groupIdBase++; + each(charts, function (chart) { + chart.group = groupId; + }); + } + + connectedGroups[groupId] = true; + return groupId; + } + + /** + * @deprecated + */ + + function disConnect(groupId) { + connectedGroups[groupId] = false; + } + + /** + * Alias and backword compat + */ + + var disconnect = disConnect; + + /** + * Dispose a chart instance + */ + + function dispose$1(chart) { + if (isString(chart)) { + chart = instances$1[chart]; + } else if (!(chart instanceof ECharts)) { + // Try to treat as dom + chart = getInstanceByDom(chart); + } + + if (chart instanceof ECharts && !chart.isDisposed()) { + chart.dispose(); + } + } + + function getInstanceByDom(dom) { + return instances$1[getAttribute(dom, DOM_ATTRIBUTE_KEY)]; + } + + function getInstanceById(key) { + return instances$1[key]; + } + + /** + * Register theme + */ + + function registerTheme(name, theme) { + themeStorage[name] = theme; + } + + /** + * Register option preprocessor + */ + + function registerPreprocessor(preprocessorFunc) { + if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) { + optionPreprocessorFuncs.push(preprocessorFunc); + } + } + + function registerProcessor(priority, processor) { + normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT); + } + + /** + * Register postIniter + * @param {Function} postInitFunc + */ + + function registerPostInit(postInitFunc) { + registerUpdateLifecycle('afterinit', postInitFunc); + } + + /** + * Register postUpdater + * @param {Function} postUpdateFunc + */ + + function registerPostUpdate(postUpdateFunc) { + registerUpdateLifecycle('afterupdate', postUpdateFunc); + } + + function registerUpdateLifecycle(name, cb) { + lifecycle.on(name, cb); + } + + function registerAction(actionInfo, eventName, action) { + if (isFunction(eventName)) { + action = eventName; + eventName = ''; + } + + var actionType = isObject(actionInfo) ? actionInfo.type : [actionInfo, actionInfo = { + event: eventName + }][0]; // Event name is all lowercase + + actionInfo.event = (actionInfo.event || actionType).toLowerCase(); + eventName = actionInfo.event; + + if (eventActionMap[eventName]) { + // Already registered. + return; + } // Validate action type and event name. + + + assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName)); + + if (!actions[actionType]) { + actions[actionType] = { + action: action, + actionInfo: actionInfo + }; + } + + eventActionMap[eventName] = actionType; + } + + function registerCoordinateSystem(type, coordSysCreator) { + CoordinateSystemManager.register(type, coordSysCreator); + } + + /** + * Get dimensions of specified coordinate system. + * @param {string} type + * @return {Array.} + */ + + function getCoordinateSystemDimensions(type) { + var coordSysCreator = CoordinateSystemManager.get(type); + + if (coordSysCreator) { + return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice(); + } + } + + function registerLayout(priority, layoutTask) { + normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout'); + } + + function registerVisual(priority, visualTask) { + normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual'); + } + + var registeredTasks = []; + + function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) { + if (isFunction(priority) || isObject(priority)) { + fn = priority; + priority = defaultPriority; + } + + if ("development" !== 'production') { + if (isNaN(priority) || priority == null) { + throw new Error('Illegal priority'); + } // Check duplicate + + + each(targetList, function (wrap) { + assert(wrap.__raw !== fn); + }); + } // Already registered + + + if (indexOf(registeredTasks, fn) >= 0) { + return; + } + + registeredTasks.push(fn); + var stageHandler = Scheduler.wrapStageHandler(fn, visualType); + stageHandler.__prio = priority; + stageHandler.__raw = fn; + targetList.push(stageHandler); + } + + function registerLoading(name, loadingFx) { + loadingEffects[name] = loadingFx; + } + + /** + * ZRender need a canvas context to do measureText. + * But in node environment canvas may be created by node-canvas. + * So we need to specify how to create a canvas instead of using document.createElement('canvas') + * + * + * @deprecated use setPlatformAPI({ createCanvas }) instead. + * + * @example + * let Canvas = require('canvas'); + * let echarts = require('echarts'); + * echarts.setCanvasCreator(function () { + * // Small size is enough. + * return new Canvas(32, 32); + * }); + */ + + function setCanvasCreator(creator) { + if ("development" !== 'production') { + deprecateLog('setCanvasCreator is deprecated. Use setPlatformAPI({ createCanvas }) instead.'); + } + + setPlatformAPI({ + createCanvas: creator + }); + } + + /** + * The parameters and usage: see `geoSourceManager.registerMap`. + * Compatible with previous `echarts.registerMap`. + */ + + function registerMap(mapName, geoJson, specialAreas) { + var registerMap = getImpl('registerMap'); + registerMap && registerMap(mapName, geoJson, specialAreas); + } + + function getMap(mapName) { + var getMap = getImpl('getMap'); + return getMap && getMap(mapName); + } + + var registerTransform = registerExternalTransform; + /** + * Globa dispatchAction to a specified chart instance. + */ + // export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters[1]) { + // if (!payload || !payload.chartId) { + // // Must have chartId to find chart + // return; + // } + // const chart = instances[payload.chartId]; + // if (chart) { + // chart.dispatchAction(payload, opt); + // } + // } + // Buitlin global visual + + registerVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask); + registerVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask); + registerVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask); + registerVisual(PRIORITY_VISUAL_DECAL, decalVisual); + registerPreprocessor(globalBackwardCompat); + registerProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack); + registerLoading('default', defaultLoading); // Default actions + + registerAction({ + type: HIGHLIGHT_ACTION_TYPE, + event: HIGHLIGHT_ACTION_TYPE, + update: HIGHLIGHT_ACTION_TYPE + }, noop); + registerAction({ + type: DOWNPLAY_ACTION_TYPE, + event: DOWNPLAY_ACTION_TYPE, + update: DOWNPLAY_ACTION_TYPE + }, noop); + registerAction({ + type: SELECT_ACTION_TYPE, + event: SELECT_ACTION_TYPE, + update: SELECT_ACTION_TYPE + }, noop); + registerAction({ + type: UNSELECT_ACTION_TYPE, + event: UNSELECT_ACTION_TYPE, + update: UNSELECT_ACTION_TYPE + }, noop); + registerAction({ + type: TOGGLE_SELECT_ACTION_TYPE, + event: TOGGLE_SELECT_ACTION_TYPE, + update: TOGGLE_SELECT_ACTION_TYPE + }, noop); // Default theme + + registerTheme('light', lightTheme); + registerTheme('dark', theme); // For backward compatibility, where the namespace `dataTool` will + // be mounted on `echarts` is the extension `dataTool` is imported. + + var dataTool = {}; + + var extensions = []; + var extensionRegisters = { + registerPreprocessor: registerPreprocessor, + registerProcessor: registerProcessor, + registerPostInit: registerPostInit, + registerPostUpdate: registerPostUpdate, + registerUpdateLifecycle: registerUpdateLifecycle, + registerAction: registerAction, + registerCoordinateSystem: registerCoordinateSystem, + registerLayout: registerLayout, + registerVisual: registerVisual, + registerTransform: registerTransform, + registerLoading: registerLoading, + registerMap: registerMap, + registerImpl: registerImpl, + PRIORITY: PRIORITY, + ComponentModel: ComponentModel, + ComponentView: ComponentView, + SeriesModel: SeriesModel, + ChartView: ChartView, + // TODO Use ComponentModel and SeriesModel instead of Constructor + registerComponentModel: function (ComponentModelClass) { + ComponentModel.registerClass(ComponentModelClass); + }, + registerComponentView: function (ComponentViewClass) { + ComponentView.registerClass(ComponentViewClass); + }, + registerSeriesModel: function (SeriesModelClass) { + SeriesModel.registerClass(SeriesModelClass); + }, + registerChartView: function (ChartViewClass) { + ChartView.registerClass(ChartViewClass); + }, + registerSubTypeDefaulter: function (componentType, defaulter) { + ComponentModel.registerSubTypeDefaulter(componentType, defaulter); + }, + registerPainter: function (painterType, PainterCtor) { + registerPainter(painterType, PainterCtor); + } + }; + + function use(ext) { + if (isArray(ext)) { + // use([ChartLine, ChartBar]); + each(ext, function (singleExt) { + use(singleExt); + }); + return; + } + + if (indexOf(extensions, ext) >= 0) { + return; + } + + extensions.push(ext); + + if (isFunction(ext)) { + ext = { + install: ext + }; + } + + ext.install(extensionRegisters); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function dataIndexMapValueLength(valNumOrArrLengthMoreThan2) { + return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1; + } + + function defaultKeyGetter(item) { + return item; + } + + var DataDiffer = + /** @class */ + function () { + /** + * @param context Can be visited by this.context in callback. + */ + function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context, // By default: 'oneToOne'. + diffMode) { + this._old = oldArr; + this._new = newArr; + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; // Visible in callback via `this.context`; + + this.context = context; + this._diffModeMultiple = diffMode === 'multiple'; + } + + /** + * Callback function when add a data + */ + + + DataDiffer.prototype.add = function (func) { + this._add = func; + return this; + }; + /** + * Callback function when update a data + */ + + + DataDiffer.prototype.update = function (func) { + this._update = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateManyToOne = function (func) { + this._updateManyToOne = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateOneToMany = function (func) { + this._updateOneToMany = func; + return this; + }; + /** + * Callback function when update a data and only work in `cbMode: 'byKey'`. + */ + + + DataDiffer.prototype.updateManyToMany = function (func) { + this._updateManyToMany = func; + return this; + }; + /** + * Callback function when remove a data + */ + + + DataDiffer.prototype.remove = function (func) { + this._remove = func; + return this; + }; + + DataDiffer.prototype.execute = function () { + this[this._diffModeMultiple ? '_executeMultiple' : '_executeOneToOne'](); + }; + + DataDiffer.prototype._executeOneToOne = function () { + var oldArr = this._old; + var newArr = this._new; + var newDataIndexMap = {}; + var oldDataKeyArr = new Array(oldArr.length); + var newDataKeyArr = new Array(newArr.length); + + this._initIndexMap(oldArr, null, oldDataKeyArr, '_oldKeyGetter'); + + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + + for (var i = 0; i < oldArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); // idx can never be empty array here. see 'set null' logic below. + + if (newIdxMapValLen > 1) { + // Consider there is duplicate key (for example, use dataItem.name as key). + // We should make sure every item in newArr and oldArr can be visited. + var newIdx = newIdxMapVal.shift(); + + if (newIdxMapVal.length === 1) { + newDataIndexMap[oldKey] = newIdxMapVal[0]; + } + + this._update && this._update(newIdx, i); + } else if (newIdxMapValLen === 1) { + newDataIndexMap[oldKey] = null; + this._update && this._update(newIdxMapVal, i); + } else { + this._remove && this._remove(i); + } + } + + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + /** + * For example, consider the case: + * oldData: [o0, o1, o2, o3, o4, o5, o6, o7], + * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8], + * Where: + * o0, o1, n0 has key 'a' (many to one) + * o5, n4, n5, n6 has key 'b' (one to many) + * o2, n1 has key 'c' (one to one) + * n2, n3 has key 'd' (add) + * o3, o4 has key 'e' (remove) + * o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove) + * Then: + * (The order of the following directives are not ensured.) + * this._updateManyToOne(n0, [o0, o1]); + * this._updateOneToMany([n4, n5, n6], o5); + * this._update(n1, o2); + * this._remove(o3); + * this._remove(o4); + * this._remove(o6); + * this._remove(o7); + * this._add(n2); + * this._add(n3); + * this._add(n7); + * this._add(n8); + */ + + + DataDiffer.prototype._executeMultiple = function () { + var oldArr = this._old; + var newArr = this._new; + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var oldDataKeyArr = []; + var newDataKeyArr = []; + + this._initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter'); + + this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter'); + + for (var i = 0; i < oldDataKeyArr.length; i++) { + var oldKey = oldDataKeyArr[i]; + var oldIdxMapVal = oldDataIndexMap[oldKey]; + var newIdxMapVal = newDataIndexMap[oldKey]; + var oldIdxMapValLen = dataIndexMapValueLength(oldIdxMapVal); + var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal); + + if (oldIdxMapValLen > 1 && newIdxMapValLen === 1) { + this._updateManyToOne && this._updateManyToOne(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen > 1) { + this._updateOneToMany && this._updateOneToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen === 1 && newIdxMapValLen === 1) { + this._update && this._update(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1 && newIdxMapValLen > 1) { + this._updateManyToMany && this._updateManyToMany(newIdxMapVal, oldIdxMapVal); + newDataIndexMap[oldKey] = null; + } else if (oldIdxMapValLen > 1) { + for (var i_1 = 0; i_1 < oldIdxMapValLen; i_1++) { + this._remove && this._remove(oldIdxMapVal[i_1]); + } + } else { + this._remove && this._remove(oldIdxMapVal); + } + } + + this._performRestAdd(newDataKeyArr, newDataIndexMap); + }; + + DataDiffer.prototype._performRestAdd = function (newDataKeyArr, newDataIndexMap) { + for (var i = 0; i < newDataKeyArr.length; i++) { + var newKey = newDataKeyArr[i]; + var newIdxMapVal = newDataIndexMap[newKey]; + var idxMapValLen = dataIndexMapValueLength(newIdxMapVal); + + if (idxMapValLen > 1) { + for (var j = 0; j < idxMapValLen; j++) { + this._add && this._add(newIdxMapVal[j]); + } + } else if (idxMapValLen === 1) { + this._add && this._add(newIdxMapVal); + } // Support both `newDataKeyArr` are duplication removed or not removed. + + + newDataIndexMap[newKey] = null; + } + }; + + DataDiffer.prototype._initIndexMap = function (arr, // Can be null. + map, // In 'byKey', the output `keyArr` is duplication removed. + // In 'byIndex', the output `keyArr` is not duplication removed and + // its indices are accurately corresponding to `arr`. + keyArr, keyGetterName) { + var cbModeMultiple = this._diffModeMultiple; + + for (var i = 0; i < arr.length; i++) { + // Add prefix to avoid conflict with Object.prototype. + var key = '_ec_' + this[keyGetterName](arr[i], i); + + if (!cbModeMultiple) { + keyArr[i] = key; + } + + if (!map) { + continue; + } + + var idxMapVal = map[key]; + var idxMapValLen = dataIndexMapValueLength(idxMapVal); + + if (idxMapValLen === 0) { + // Simple optimize: in most cases, one index has one key, + // do not need array. + map[key] = i; + + if (cbModeMultiple) { + keyArr.push(key); + } + } else if (idxMapValLen === 1) { + map[key] = [idxMapVal, i]; + } else { + idxMapVal.push(i); + } + } + }; + + return DataDiffer; + }(); + + var DimensionUserOuput = + /** @class */ + function () { + function DimensionUserOuput(encode, dimRequest) { + this._encode = encode; + this._schema = dimRequest; + } + + DimensionUserOuput.prototype.get = function () { + return { + // Do not generate full dimension name until fist used. + fullDimensions: this._getFullDimensionNames(), + encode: this._encode + }; + }; + /** + * Get all data store dimension names. + * Theoretically a series data store is defined both by series and used dataset (if any). + * If some dimensions are omitted for performance reason in `this.dimensions`, + * the dimension name may not be auto-generated if user does not specify a dimension name. + * In this case, the dimension name is `null`/`undefined`. + */ + + + DimensionUserOuput.prototype._getFullDimensionNames = function () { + if (!this._cachedDimNames) { + this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : []; + } + + return this._cachedDimNames; + }; + + return DimensionUserOuput; + }(); + + function summarizeDimensions(data, schema) { + var summary = {}; + var encode = summary.encode = {}; + var notExtraCoordDimMap = createHashMap(); + var defaultedLabel = []; + var defaultedTooltip = []; + var userOutputEncode = {}; + each(data.dimensions, function (dimName) { + var dimItem = data.getDimensionInfo(dimName); + var coordDim = dimItem.coordDim; + + if (coordDim) { + if ("development" !== 'production') { + assert(VISUAL_DIMENSIONS.get(coordDim) == null); + } + + var coordDimIndex = dimItem.coordDimIndex; + getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName; + + if (!dimItem.isExtraCoord) { + notExtraCoordDimMap.set(coordDim, 1); // Use the last coord dim (and label friendly) as default label, + // because when dataset is used, it is hard to guess which dimension + // can be value dimension. If both show x, y on label is not look good, + // and conventionally y axis is focused more. + + if (mayLabelDimType(dimItem.type)) { + defaultedLabel[0] = dimName; + } // User output encode do not contain generated coords. + // And it only has index. User can use index to retrieve value from the raw item array. + + + getOrCreateEncodeArr(userOutputEncode, coordDim)[coordDimIndex] = data.getDimensionIndex(dimItem.name); + } + + if (dimItem.defaultTooltip) { + defaultedTooltip.push(dimName); + } + } + + VISUAL_DIMENSIONS.each(function (v, otherDim) { + var encodeArr = getOrCreateEncodeArr(encode, otherDim); + var dimIndex = dimItem.otherDims[otherDim]; + + if (dimIndex != null && dimIndex !== false) { + encodeArr[dimIndex] = dimItem.name; + } + }); + }); + var dataDimsOnCoord = []; + var encodeFirstDimNotExtra = {}; + notExtraCoordDimMap.each(function (v, coordDim) { + var dimArr = encode[coordDim]; + encodeFirstDimNotExtra[coordDim] = dimArr[0]; // Not necessary to remove duplicate, because a data + // dim canot on more than one coordDim. + + dataDimsOnCoord = dataDimsOnCoord.concat(dimArr); + }); + summary.dataDimsOnCoord = dataDimsOnCoord; + summary.dataDimIndicesOnCoord = map(dataDimsOnCoord, function (dimName) { + return data.getDimensionInfo(dimName).storeDimIndex; + }); + summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra; + var encodeLabel = encode.label; // FIXME `encode.label` is not recommanded, because formatter can not be set + // in this way. Use label.formatter instead. May be remove this approach someday. + + if (encodeLabel && encodeLabel.length) { + defaultedLabel = encodeLabel.slice(); + } + + var encodeTooltip = encode.tooltip; + + if (encodeTooltip && encodeTooltip.length) { + defaultedTooltip = encodeTooltip.slice(); + } else if (!defaultedTooltip.length) { + defaultedTooltip = defaultedLabel.slice(); + } + + encode.defaultedLabel = defaultedLabel; + encode.defaultedTooltip = defaultedTooltip; + summary.userOutput = new DimensionUserOuput(userOutputEncode, schema); + return summary; + } + + function getOrCreateEncodeArr(encode, dim) { + if (!encode.hasOwnProperty(dim)) { + encode[dim] = []; + } + + return encode[dim]; + } // FIXME:TS should be type `AxisType` + + + function getDimensionTypeByAxis(axisType) { + return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float'; + } + + function mayLabelDimType(dimType) { + // In most cases, ordinal and time do not suitable for label. + // Ordinal info can be displayed on axis. Time is too long. + return !(dimType === 'ordinal' || dimType === 'time'); + } // function findTheLastDimMayLabel(data) { + // // Get last value dim + // let dimensions = data.dimensions.slice(); + // let valueType; + // let valueDim; + // while (dimensions.length && ( + // valueDim = dimensions.pop(), + // valueType = data.getDimensionInfo(valueDim).type, + // valueType === 'ordinal' || valueType === 'time' + // )) {} // jshint ignore:line + // return valueDim; + // } + + var SeriesDimensionDefine = + /** @class */ + function () { + /** + * @param opt All of the fields will be shallow copied. + */ + function SeriesDimensionDefine(opt) { + /** + * The format of `otherDims` is: + * ```js + * { + * tooltip?: number + * label?: number + * itemName?: number + * seriesName?: number + * } + * ``` + * + * A `series.encode` can specified these fields: + * ```js + * encode: { + * // "3, 1, 5" is the index of data dimension. + * tooltip: [3, 1, 5], + * label: [0, 3], + * ... + * } + * ``` + * `otherDims` is the parse result of the `series.encode` above, like: + * ```js + * // Suppose the index of this data dimension is `3`. + * this.otherDims = { + * // `3` is at the index `0` of the `encode.tooltip` + * tooltip: 0, + * // `3` is at the index `1` of the `encode.label` + * label: 1 + * }; + * ``` + * + * This prop should never be `null`/`undefined` after initialized. + */ + this.otherDims = {}; + + if (opt != null) { + extend(this, opt); + } + } + + return SeriesDimensionDefine; + }(); + + var inner$4 = makeInner(); + var dimTypeShort = { + float: 'f', + int: 'i', + ordinal: 'o', + number: 'n', + time: 't' + }; + /** + * Represents the dimension requirement of a series. + * + * NOTICE: + * When there are too many dimensions in dataset and many series, only the used dimensions + * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`. + * But users may query data by other unused dimension names. + * In this case, users can only query data if and only if they have defined dimension names + * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from + * `source` dimensions. + */ + + var SeriesDataSchema = + /** @class */ + function () { + function SeriesDataSchema(opt) { + this.dimensions = opt.dimensions; + this._dimOmitted = opt.dimensionOmitted; + this.source = opt.source; + this._fullDimCount = opt.fullDimensionCount; + + this._updateDimOmitted(opt.dimensionOmitted); + } + + SeriesDataSchema.prototype.isDimensionOmitted = function () { + return this._dimOmitted; + }; + + SeriesDataSchema.prototype._updateDimOmitted = function (dimensionOmitted) { + this._dimOmitted = dimensionOmitted; + + if (!dimensionOmitted) { + return; + } + + if (!this._dimNameMap) { + this._dimNameMap = ensureSourceDimNameMap(this.source); + } + }; + /** + * @caution Can only be used when `dimensionOmitted: true`. + * + * Get index by user defined dimension name (i.e., not internal generate name). + * That is, get index from `dimensionsDefine`. + * If no `dimensionsDefine`, or no name get, return -1. + */ + + + SeriesDataSchema.prototype.getSourceDimensionIndex = function (dimName) { + return retrieve2(this._dimNameMap.get(dimName), -1); + }; + /** + * @caution Can only be used when `dimensionOmitted: true`. + * + * Notice: may return `null`/`undefined` if user not specify dimension names. + */ + + + SeriesDataSchema.prototype.getSourceDimension = function (dimIndex) { + var dimensionsDefine = this.source.dimensionsDefine; + + if (dimensionsDefine) { + return dimensionsDefine[dimIndex]; + } + }; + + SeriesDataSchema.prototype.makeStoreSchema = function () { + var dimCount = this._fullDimCount; + var willRetrieveDataByName = shouldRetrieveDataByName(this.source); + var makeHashStrict = !shouldOmitUnusedDimensions(dimCount); // If source don't have dimensions or series don't omit unsed dimensions. + // Generate from seriesDimList directly + + var dimHash = ''; + var dims = []; + + for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < dimCount; fullDimIdx++) { + var property = void 0; + var type = void 0; + var ordinalMeta = void 0; + var seriesDimDef = this.dimensions[seriesDimIdx]; // The list has been sorted by `storeDimIndex` asc. + + if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { + property = willRetrieveDataByName ? seriesDimDef.name : null; + type = seriesDimDef.type; + ordinalMeta = seriesDimDef.ordinalMeta; + seriesDimIdx++; + } else { + var sourceDimDef = this.getSourceDimension(fullDimIdx); + + if (sourceDimDef) { + property = willRetrieveDataByName ? sourceDimDef.name : null; + type = sourceDimDef.type; + } + } + + dims.push({ + property: property, + type: type, + ordinalMeta: ordinalMeta + }); // If retrieving data by index, + // use to determine whether data can be shared. + // (Becuase in this case there might be no dimension name defined in dataset, but indices always exists). + // (indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash). + // Otherwise if retrieving data by property name (like `data: [{aa: 123, bb: 765}, ...]`), + // use in hash. + + if (willRetrieveDataByName && property != null // For data stack, we have make sure each series has its own dim on this store. + // So we do not add property to hash to make sure they can share this store. + && (!seriesDimDef || !seriesDimDef.isCalculationCoord)) { + dimHash += makeHashStrict // Use escape character '`' in case that property name contains '$'. + ? property.replace(/\`/g, '`1').replace(/\$/g, '`2') // For better performance, when there are large dimensions, tolerant this defects that hardly meet. + : property; + } + + dimHash += '$'; + dimHash += dimTypeShort[type] || 'f'; + + if (ordinalMeta) { + dimHash += ordinalMeta.uid; + } + + dimHash += '$'; + } // Source from endpoint(usually series) will be read differently + // when seriesLayoutBy or startIndex(which is affected by sourceHeader) are different. + // So we use this three props as key. + + + var source = this.source; + var hash = [source.seriesLayoutBy, source.startIndex, dimHash].join('$$'); + return { + dimensions: dims, + hash: hash + }; + }; + + SeriesDataSchema.prototype.makeOutputDimensionNames = function () { + var result = []; + + for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < this._fullDimCount; fullDimIdx++) { + var name_1 = void 0; + var seriesDimDef = this.dimensions[seriesDimIdx]; // The list has been sorted by `storeDimIndex` asc. + + if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { + if (!seriesDimDef.isCalculationCoord) { + name_1 = seriesDimDef.name; + } + + seriesDimIdx++; + } else { + var sourceDimDef = this.getSourceDimension(fullDimIdx); + + if (sourceDimDef) { + name_1 = sourceDimDef.name; + } + } + + result.push(name_1); + } + + return result; + }; + + SeriesDataSchema.prototype.appendCalculationDimension = function (dimDef) { + this.dimensions.push(dimDef); + dimDef.isCalculationCoord = true; + this._fullDimCount++; // If append dimension on a data store, consider the store + // might be shared by different series, series dimensions not + // really map to store dimensions. + + this._updateDimOmitted(true); + }; + + return SeriesDataSchema; + }(); + + function isSeriesDataSchema(schema) { + return schema instanceof SeriesDataSchema; + } + + function createDimNameMap(dimsDef) { + var dataDimNameMap = createHashMap(); + + for (var i = 0; i < (dimsDef || []).length; i++) { + var dimDefItemRaw = dimsDef[i]; + var userDimName = isObject(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw; + + if (userDimName != null && dataDimNameMap.get(userDimName) == null) { + dataDimNameMap.set(userDimName, i); + } + } + + return dataDimNameMap; + } + + function ensureSourceDimNameMap(source) { + var innerSource = inner$4(source); + return innerSource.dimNameMap || (innerSource.dimNameMap = createDimNameMap(source.dimensionsDefine)); + } + + function shouldOmitUnusedDimensions(dimCount) { + return dimCount > 30; + } + + var isObject$2 = isObject; + var map$1 = map; + var CtorInt32Array$1 = typeof Int32Array === 'undefined' ? Array : Int32Array; // Use prefix to avoid index to be the same as otherIdList[idx], + // which will cause weird udpate animation. + + var ID_PREFIX = 'e\0\0'; + var INDEX_NOT_FOUND = -1; // type SeriesDimensionIndex = DimensionIndex; + + var TRANSFERABLE_PROPERTIES = ['hasItemOption', '_nameList', '_idList', '_invertedIndicesMap', '_dimSummary', 'userOutput', '_rawData', '_dimValueGetter', '_nameDimIdx', '_idDimIdx', '_nameRepeatCount']; + var CLONE_PROPERTIES = ['_approximateExtent']; // ----------------------------- + // Internal method declarations: + // ----------------------------- + + var prepareInvertedIndex; + var getId; + var getIdNameFromStore; + var normalizeDimensions; + var transferProperties; + var cloneListForMapAndSample; + var makeIdFromName; + + var SeriesData = + /** @class */ + function () { + /** + * @param dimensionsInput.dimensions + * For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...]. + * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius + */ + function SeriesData(dimensionsInput, hostModel) { + this.type = 'list'; + this._dimOmitted = false; + this._nameList = []; + this._idList = []; // Models of data option is stored sparse for optimizing memory cost + // Never used yet (not used yet). + // private _optionModels: Model[] = []; + // Global visual properties after visual coding + + this._visual = {}; // Globel layout properties. + + this._layout = {}; // Item visual properties after visual coding + + this._itemVisuals = []; // Item layout properties after layout + + this._itemLayouts = []; // Graphic elemnents + + this._graphicEls = []; // key: dim, value: extent + + this._approximateExtent = {}; + this._calculationInfo = {}; // Having detected that there is data item is non primitive type + // (in type `OptionDataItemObject`). + // Like `data: [ { value: xx, itemStyle: {...} }, ...]` + // At present it only happen in `SOURCE_FORMAT_ORIGINAL`. + + this.hasItemOption = false; // Methods that create a new list based on this list should be listed here. + // Notice that those method should `RETURN` the new list. + + this.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'lttbDownSample', 'map']; // Methods that change indices of this list should be listed here. + + this.CHANGABLE_METHODS = ['filterSelf', 'selectRange']; + this.DOWNSAMPLE_METHODS = ['downSample', 'lttbDownSample']; + var dimensions; + var assignStoreDimIdx = false; + + if (isSeriesDataSchema(dimensionsInput)) { + dimensions = dimensionsInput.dimensions; + this._dimOmitted = dimensionsInput.isDimensionOmitted(); + this._schema = dimensionsInput; + } else { + assignStoreDimIdx = true; + dimensions = dimensionsInput; + } + + dimensions = dimensions || ['x', 'y']; + var dimensionInfos = {}; + var dimensionNames = []; + var invertedIndicesMap = {}; + var needsHasOwn = false; + var emptyObj = {}; + + for (var i = 0; i < dimensions.length; i++) { + // Use the original dimensions[i], where other flag props may exists. + var dimInfoInput = dimensions[i]; + var dimensionInfo = isString(dimInfoInput) ? new SeriesDimensionDefine({ + name: dimInfoInput + }) : !(dimInfoInput instanceof SeriesDimensionDefine) ? new SeriesDimensionDefine(dimInfoInput) : dimInfoInput; + var dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || 'float'; + + if (!dimensionInfo.coordDim) { + dimensionInfo.coordDim = dimensionName; + dimensionInfo.coordDimIndex = 0; + } + + var otherDims = dimensionInfo.otherDims = dimensionInfo.otherDims || {}; + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + + if (emptyObj[dimensionName] != null) { + needsHasOwn = true; + } + + if (dimensionInfo.createInvertedIndices) { + invertedIndicesMap[dimensionName] = []; + } + + if (otherDims.itemName === 0) { + this._nameDimIdx = i; + } + + if (otherDims.itemId === 0) { + this._idDimIdx = i; + } + + if ("development" !== 'production') { + assert(assignStoreDimIdx || dimensionInfo.storeDimIndex >= 0); + } + + if (assignStoreDimIdx) { + dimensionInfo.storeDimIndex = i; + } + } + + this.dimensions = dimensionNames; + this._dimInfos = dimensionInfos; + + this._initGetDimensionInfo(needsHasOwn); + + this.hostModel = hostModel; + this._invertedIndicesMap = invertedIndicesMap; + + if (this._dimOmitted) { + var dimIdxToName_1 = this._dimIdxToName = createHashMap(); + each(dimensionNames, function (dimName) { + dimIdxToName_1.set(dimensionInfos[dimName].storeDimIndex, dimName); + }); + } + } + + /** + * + * Get concrete dimension name by dimension name or dimension index. + * If input a dimension name, do not validate whether the dimension name exits. + * + * @caution + * @param dim Must make sure the dimension is `SeriesDimensionLoose`. + * Because only those dimensions will have auto-generated dimension names if not + * have a user-specified name, and other dimensions will get a return of null/undefined. + * + * @notice Becuause of this reason, should better use `getDimensionIndex` instead, for examples: + * ```js + * const val = data.getStore().get(data.getDimensionIndex(dim), dataIdx); + * ``` + * + * @return Concrete dim name. + */ + + + SeriesData.prototype.getDimension = function (dim) { + var dimIdx = this._recognizeDimIndex(dim); + + if (dimIdx == null) { + return dim; + } + + dimIdx = dim; + + if (!this._dimOmitted) { + return this.dimensions[dimIdx]; + } // Retrieve from series dimension definition becuase it probably contains + // generated dimension name (like 'x', 'y'). + + + var dimName = this._dimIdxToName.get(dimIdx); + + if (dimName != null) { + return dimName; + } + + var sourceDimDef = this._schema.getSourceDimension(dimIdx); + + if (sourceDimDef) { + return sourceDimDef.name; + } + }; + /** + * Get dimension index in data store. Return -1 if not found. + * Can be used to index value from getRawValue. + */ + + + SeriesData.prototype.getDimensionIndex = function (dim) { + var dimIdx = this._recognizeDimIndex(dim); + + if (dimIdx != null) { + return dimIdx; + } + + if (dim == null) { + return -1; + } + + var dimInfo = this._getDimInfo(dim); + + return dimInfo ? dimInfo.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(dim) : -1; + }; + /** + * The meanings of the input parameter `dim`: + * + * + If dim is a number (e.g., `1`), it means the index of the dimension. + * For example, `getDimension(0)` will return 'x' or 'lng' or 'radius'. + * + If dim is a number-like string (e.g., `"1"`): + * + If there is the same concrete dim name defined in `series.dimensions` or `dataset.dimensions`, + * it means that concrete name. + * + If not, it will be converted to a number, which means the index of the dimension. + * (why? because of the backward compatbility. We have been tolerating number-like string in + * dimension setting, although now it seems that it is not a good idea.) + * For example, `visualMap[i].dimension: "1"` is the same meaning as `visualMap[i].dimension: 1`, + * if no dimension name is defined as `"1"`. + * + If dim is a not-number-like string, it means the concrete dim name. + * For example, it can be be default name `"x"`, `"y"`, `"z"`, `"lng"`, `"lat"`, `"angle"`, `"radius"`, + * or customized in `dimensions` property of option like `"age"`. + * + * @return recogonized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`). + */ + + + SeriesData.prototype._recognizeDimIndex = function (dim) { + if (isNumber(dim) // If being a number-like string but not being defined as a dimension name. + || dim != null && !isNaN(dim) && !this._getDimInfo(dim) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(dim) < 0)) { + return +dim; + } + }; + + SeriesData.prototype._getStoreDimIndex = function (dim) { + var dimIdx = this.getDimensionIndex(dim); + + if ("development" !== 'production') { + if (dimIdx == null) { + throw new Error('Unkown dimension ' + dim); + } + } + + return dimIdx; + }; + /** + * Get type and calculation info of particular dimension + * @param dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + + + SeriesData.prototype.getDimensionInfo = function (dim) { + // Do not clone, because there may be categories in dimInfo. + return this._getDimInfo(this.getDimension(dim)); + }; + + SeriesData.prototype._initGetDimensionInfo = function (needsHasOwn) { + var dimensionInfos = this._dimInfos; + this._getDimInfo = needsHasOwn ? function (dimName) { + return dimensionInfos.hasOwnProperty(dimName) ? dimensionInfos[dimName] : undefined; + } : function (dimName) { + return dimensionInfos[dimName]; + }; + }; + /** + * concrete dimension name list on coord. + */ + + + SeriesData.prototype.getDimensionsOnCoord = function () { + return this._dimSummary.dataDimsOnCoord.slice(); + }; + + SeriesData.prototype.mapDimension = function (coordDim, idx) { + var dimensionsSummary = this._dimSummary; + + if (idx == null) { + return dimensionsSummary.encodeFirstDimNotExtra[coordDim]; + } + + var dims = dimensionsSummary.encode[coordDim]; + return dims ? dims[idx] : null; + }; + + SeriesData.prototype.mapDimensionsAll = function (coordDim) { + var dimensionsSummary = this._dimSummary; + var dims = dimensionsSummary.encode[coordDim]; + return (dims || []).slice(); + }; + + SeriesData.prototype.getStore = function () { + return this._store; + }; + /** + * Initialize from data + * @param data source or data or data store. + * @param nameList The name of a datum is used on data diff and + * default label/tooltip. + * A name can be specified in encode.itemName, + * or dataItem.name (only for series option data), + * or provided in nameList from outside. + */ + + + SeriesData.prototype.initData = function (data, nameList, dimValueGetter) { + var _this = this; + + var store; + + if (data instanceof DataStore) { + store = data; + } + + if (!store) { + var dimensions = this.dimensions; + var provider = isSourceInstance(data) || isArrayLike(data) ? new DefaultDataProvider(data, dimensions.length) : data; + store = new DataStore(); + var dimensionInfos = map$1(dimensions, function (dimName) { + return { + type: _this._dimInfos[dimName].type, + property: dimName + }; + }); + store.initData(provider, dimensionInfos, dimValueGetter); + } + + this._store = store; // Reset + + this._nameList = (nameList || []).slice(); + this._idList = []; + this._nameRepeatCount = {}; + + this._doInit(0, store.count()); // Cache summary info for fast visit. See "dimensionHelper". + // Needs to be initialized after store is prepared. + + + this._dimSummary = summarizeDimensions(this, this._schema); + this.userOutput = this._dimSummary.userOutput; + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + */ + + + SeriesData.prototype.appendData = function (data) { + var range = this._store.appendData(data); + + this._doInit(range[0], range[1]); + }; + /** + * Caution: Can be only called on raw data (before `this._indices` created). + * This method does not modify `rawData` (`dataProvider`), but only + * add values to store. + * + * The final count will be increased by `Math.max(values.length, names.length)`. + * + * @param values That is the SourceType: 'arrayRows', like + * [ + * [12, 33, 44], + * [NaN, 43, 1], + * ['-', 'asdf', 0] + * ] + * Each item is exaclty cooresponding to a dimension. + */ + + + SeriesData.prototype.appendValues = function (values, names) { + var _a = this._store.appendValues(values, names.length), + start = _a.start, + end = _a.end; + + var shouldMakeIdFromName = this._shouldMakeIdFromName(); + + this._updateOrdinalMeta(); + + if (names) { + for (var idx = start; idx < end; idx++) { + var sourceIdx = idx - start; + this._nameList[idx] = names[sourceIdx]; + + if (shouldMakeIdFromName) { + makeIdFromName(this, idx); + } + } + } + }; + + SeriesData.prototype._updateOrdinalMeta = function () { + var store = this._store; + var dimensions = this.dimensions; + + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = this._dimInfos[dimensions[i]]; + + if (dimInfo.ordinalMeta) { + store.collectOrdinalMeta(dimInfo.storeDimIndex, dimInfo.ordinalMeta); + } + } + }; + + SeriesData.prototype._shouldMakeIdFromName = function () { + var provider = this._store.getProvider(); + + return this._idDimIdx == null && provider.getSource().sourceFormat !== SOURCE_FORMAT_TYPED_ARRAY && !provider.fillStorage; + }; + + SeriesData.prototype._doInit = function (start, end) { + if (start >= end) { + return; + } + + var store = this._store; + var provider = store.getProvider(); + + this._updateOrdinalMeta(); + + var nameList = this._nameList; + var idList = this._idList; + var sourceFormat = provider.getSource().sourceFormat; + var isFormatOriginal = sourceFormat === SOURCE_FORMAT_ORIGINAL; // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of category + // Use a tempValue to normalize the value to be a (x, y) value + // If dataItem is {name: ...} or {id: ...}, it has highest priority. + // This kind of ids and names are always stored `_nameList` and `_idList`. + + if (isFormatOriginal && !provider.pure) { + var sharedDataItem = []; + + for (var idx = start; idx < end; idx++) { + // NOTICE: Try not to write things into dataItem + var dataItem = provider.getItem(idx, sharedDataItem); + + if (!this.hasItemOption && isDataItemOption(dataItem)) { + this.hasItemOption = true; + } + + if (dataItem) { + var itemName = dataItem.name; + + if (nameList[idx] == null && itemName != null) { + nameList[idx] = convertOptionIdName(itemName, null); + } + + var itemId = dataItem.id; + + if (idList[idx] == null && itemId != null) { + idList[idx] = convertOptionIdName(itemId, null); + } + } + } + } + + if (this._shouldMakeIdFromName()) { + for (var idx = start; idx < end; idx++) { + makeIdFromName(this, idx); + } + } + + prepareInvertedIndex(this); + }; + /** + * PENDING: In fact currently this function is only used to short-circuit + * the calling of `scale.unionExtentFromData` when data have been filtered by modules + * like "dataZoom". `scale.unionExtentFromData` is used to calculate data extent for series on + * an axis, but if a "axis related data filter module" is used, the extent of the axis have + * been fixed and no need to calling `scale.unionExtentFromData` actually. + * But if we add "custom data filter" in future, which is not "axis related", this method may + * be still needed. + * + * Optimize for the scenario that data is filtered by a given extent. + * Consider that if data amount is more than hundreds of thousand, + * extent calculation will cost more than 10ms and the cache will + * be erased because of the filtering. + */ + + + SeriesData.prototype.getApproximateExtent = function (dim) { + return this._approximateExtent[dim] || this._store.getDataExtent(this._getStoreDimIndex(dim)); + }; + /** + * Calculate extent on a filtered data might be time consuming. + * Approximate extent is only used for: calculte extent of filtered data outside. + */ + + + SeriesData.prototype.setApproximateExtent = function (extent, dim) { + dim = this.getDimension(dim); + this._approximateExtent[dim] = extent.slice(); + }; + + SeriesData.prototype.getCalculationInfo = function (key) { + return this._calculationInfo[key]; + }; + + SeriesData.prototype.setCalculationInfo = function (key, value) { + isObject$2(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value; + }; + /** + * @return Never be null/undefined. `number` will be converted to string. Becuase: + * In most cases, name is used in display, where returning a string is more convenient. + * In other cases, name is used in query (see `indexOfName`), where we can keep the + * rule that name `2` equals to name `'2'`. + */ + + + SeriesData.prototype.getName = function (idx) { + var rawIndex = this.getRawIndex(idx); + var name = this._nameList[rawIndex]; + + if (name == null && this._nameDimIdx != null) { + name = getIdNameFromStore(this, this._nameDimIdx, rawIndex); + } + + if (name == null) { + name = ''; + } + + return name; + }; + + SeriesData.prototype._getCategory = function (dimIdx, idx) { + var ordinal = this._store.get(dimIdx, idx); + + var ordinalMeta = this._store.getOrdinalMeta(dimIdx); + + if (ordinalMeta) { + return ordinalMeta.categories[ordinal]; + } + + return ordinal; + }; + /** + * @return Never null/undefined. `number` will be converted to string. Becuase: + * In all cases having encountered at present, id is used in making diff comparison, which + * are usually based on hash map. We can keep the rule that the internal id are always string + * (treat `2` is the same as `'2'`) to make the related logic simple. + */ + + + SeriesData.prototype.getId = function (idx) { + return getId(this, this.getRawIndex(idx)); + }; + + SeriesData.prototype.count = function () { + return this._store.count(); + }; + /** + * Get value. Return NaN if idx is out of range. + * + * @notice Should better to use `data.getStore().get(dimIndex, dataIdx)` instead. + */ + + + SeriesData.prototype.get = function (dim, idx) { + var store = this._store; + var dimInfo = this._dimInfos[dim]; + + if (dimInfo) { + return store.get(dimInfo.storeDimIndex, idx); + } + }; + /** + * @notice Should better to use `data.getStore().getByRawIndex(dimIndex, dataIdx)` instead. + */ + + + SeriesData.prototype.getByRawIndex = function (dim, rawIdx) { + var store = this._store; + var dimInfo = this._dimInfos[dim]; + + if (dimInfo) { + return store.getByRawIndex(dimInfo.storeDimIndex, rawIdx); + } + }; + + SeriesData.prototype.getIndices = function () { + return this._store.getIndices(); + }; + + SeriesData.prototype.getDataExtent = function (dim) { + return this._store.getDataExtent(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getSum = function (dim) { + return this._store.getSum(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getMedian = function (dim) { + return this._store.getMedian(this._getStoreDimIndex(dim)); + }; + + SeriesData.prototype.getValues = function (dimensions, idx) { + var _this = this; + + var store = this._store; + return isArray(dimensions) ? store.getValues(map$1(dimensions, function (dim) { + return _this._getStoreDimIndex(dim); + }), idx) : store.getValues(dimensions); + }; + /** + * If value is NaN. Inlcuding '-' + * Only check the coord dimensions. + */ + + + SeriesData.prototype.hasValue = function (idx) { + var dataDimIndicesOnCoord = this._dimSummary.dataDimIndicesOnCoord; + + for (var i = 0, len = dataDimIndicesOnCoord.length; i < len; i++) { + // Ordinal type originally can be string or number. + // But when an ordinal type is used on coord, it can + // not be string but only number. So we can also use isNaN. + if (isNaN(this._store.get(dataDimIndicesOnCoord[i], idx))) { + return false; + } + } + + return true; + }; + /** + * Retreive the index with given name + */ + + + SeriesData.prototype.indexOfName = function (name) { + for (var i = 0, len = this._store.count(); i < len; i++) { + if (this.getName(i) === name) { + return i; + } + } + + return -1; + }; + + SeriesData.prototype.getRawIndex = function (idx) { + return this._store.getRawIndex(idx); + }; + + SeriesData.prototype.indexOfRawIndex = function (rawIndex) { + return this._store.indexOfRawIndex(rawIndex); + }; + /** + * Only support the dimension which inverted index created. + * Do not support other cases until required. + * @param dim concrete dim + * @param value ordinal index + * @return rawIndex + */ + + + SeriesData.prototype.rawIndexOf = function (dim, value) { + var invertedIndices = dim && this._invertedIndicesMap[dim]; + + if ("development" !== 'production') { + if (!invertedIndices) { + throw new Error('Do not supported yet'); + } + } + + var rawIndex = invertedIndices[value]; + + if (rawIndex == null || isNaN(rawIndex)) { + return INDEX_NOT_FOUND; + } + + return rawIndex; + }; + /** + * Retreive the index of nearest value + * @param dim + * @param value + * @param [maxDistance=Infinity] + * @return If and only if multiple indices has + * the same value, they are put to the result. + */ + + + SeriesData.prototype.indicesOfNearest = function (dim, value, maxDistance) { + return this._store.indicesOfNearest(this._getStoreDimIndex(dim), value, maxDistance); + }; + + SeriesData.prototype.each = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + var fCtx = ctx || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + + this._store.each(dimIndices, fCtx ? bind(cb, fCtx) : cb); + }; + + SeriesData.prototype.filterSelf = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + var fCtx = ctx || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + this._store = this._store.filter(dimIndices, fCtx ? bind(cb, fCtx) : cb); + return this; + }; + /** + * Select data in range. (For optimization of filter) + * (Manually inline code, support 5 million data filtering in data zoom.) + */ + + + SeriesData.prototype.selectRange = function (range) { + + var _this = this; + + var innerRange = {}; + var dims = keys(range); + each(dims, function (dim) { + var dimIdx = _this._getStoreDimIndex(dim); + + innerRange[dimIdx] = range[dim]; + }); + this._store = this._store.selectRange(innerRange); + return this; + }; + /* eslint-enable max-len */ + + + SeriesData.prototype.mapArray = function (dims, cb, ctx) { + + if (isFunction(dims)) { + ctx = cb; + cb = dims; + dims = []; + } // ctxCompat just for compat echarts3 + + + ctx = ctx || this; + var result = []; + this.each(dims, function () { + result.push(cb && cb.apply(this, arguments)); + }, ctx); + return result; + }; + + SeriesData.prototype.map = function (dims, cb, ctx, ctxCompat) { + + var fCtx = ctx || ctxCompat || this; + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); + var list = cloneListForMapAndSample(this); + list._store = this._store.map(dimIndices, fCtx ? bind(cb, fCtx) : cb); + return list; + }; + + SeriesData.prototype.modify = function (dims, cb, ctx, ctxCompat) { + var _this = this; // ctxCompat just for compat echarts3 + + + var fCtx = ctx || ctxCompat || this; + + if ("development" !== 'production') { + each(normalizeDimensions(dims), function (dim) { + var dimInfo = _this.getDimensionInfo(dim); + + if (!dimInfo.isCalculationCoord) { + console.error('Danger: only stack dimension can be modified'); + } + }); + } + + var dimIndices = map$1(normalizeDimensions(dims), this._getStoreDimIndex, this); // If do shallow clone here, if there are too many stacked series, + // it still cost lots of memory, becuase `_store.dimensions` are not shared. + // We should consider there probably be shallow clone happen in each sereis + // in consequent filter/map. + + this._store.modify(dimIndices, fCtx ? bind(cb, fCtx) : cb); + }; + /** + * Large data down sampling on given dimension + * @param sampleIndex Sample index for name and id + */ + + + SeriesData.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this); + list._store = this._store.downSample(this._getStoreDimIndex(dimension), rate, sampleValue, sampleIndex); + return list; + }; + /** + * Large data down sampling using largest-triangle-three-buckets + * @param {string} valueDimension + * @param {number} targetCount + */ + + + SeriesData.prototype.lttbDownSample = function (valueDimension, rate) { + var list = cloneListForMapAndSample(this); + list._store = this._store.lttbDownSample(this._getStoreDimIndex(valueDimension), rate); + return list; + }; + + SeriesData.prototype.getRawDataItem = function (idx) { + return this._store.getRawDataItem(idx); + }; + /** + * Get model of one data item. + */ + // TODO: Type of data item + + + SeriesData.prototype.getItemModel = function (idx) { + var hostModel = this.hostModel; + var dataItem = this.getRawDataItem(idx); + return new Model(dataItem, hostModel, hostModel && hostModel.ecModel); + }; + /** + * Create a data differ + */ + + + SeriesData.prototype.diff = function (otherList) { + var thisList = this; + return new DataDiffer(otherList ? otherList.getStore().getIndices() : [], this.getStore().getIndices(), function (idx) { + return getId(otherList, idx); + }, function (idx) { + return getId(thisList, idx); + }); + }; + /** + * Get visual property. + */ + + + SeriesData.prototype.getVisual = function (key) { + var visual = this._visual; + return visual && visual[key]; + }; + + SeriesData.prototype.setVisual = function (kvObj, val) { + this._visual = this._visual || {}; + + if (isObject$2(kvObj)) { + extend(this._visual, kvObj); + } else { + this._visual[kvObj] = val; + } + }; + /** + * Get visual property of single data item + */ + // eslint-disable-next-line + + + SeriesData.prototype.getItemVisual = function (idx, key) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + + if (val == null) { + // Use global visual property + return this.getVisual(key); + } + + return val; + }; + /** + * If exists visual property of single data item + */ + + + SeriesData.prototype.hasItemVisual = function () { + return this._itemVisuals.length > 0; + }; + /** + * Make sure itemVisual property is unique + */ + // TODO: use key to save visual to reduce memory. + + + SeriesData.prototype.ensureUniqueItemVisual = function (idx, key) { + var itemVisuals = this._itemVisuals; + var itemVisual = itemVisuals[idx]; + + if (!itemVisual) { + itemVisual = itemVisuals[idx] = {}; + } + + var val = itemVisual[key]; + + if (val == null) { + val = this.getVisual(key); // TODO Performance? + + if (isArray(val)) { + val = val.slice(); + } else if (isObject$2(val)) { + val = extend({}, val); + } + + itemVisual[key] = val; + } + + return val; + }; // eslint-disable-next-line + + + SeriesData.prototype.setItemVisual = function (idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + this._itemVisuals[idx] = itemVisual; + + if (isObject$2(key)) { + extend(itemVisual, key); + } else { + itemVisual[key] = value; + } + }; + /** + * Clear itemVisuals and list visual. + */ + + + SeriesData.prototype.clearAllVisual = function () { + this._visual = {}; + this._itemVisuals = []; + }; + + SeriesData.prototype.setLayout = function (key, val) { + isObject$2(key) ? extend(this._layout, key) : this._layout[key] = val; + }; + /** + * Get layout property. + */ + + + SeriesData.prototype.getLayout = function (key) { + return this._layout[key]; + }; + /** + * Get layout of single data item + */ + + + SeriesData.prototype.getItemLayout = function (idx) { + return this._itemLayouts[idx]; + }; + /** + * Set layout of single data item + */ + + + SeriesData.prototype.setItemLayout = function (idx, layout, merge) { + this._itemLayouts[idx] = merge ? extend(this._itemLayouts[idx] || {}, layout) : layout; + }; + /** + * Clear all layout of single data item + */ + + + SeriesData.prototype.clearItemLayouts = function () { + this._itemLayouts.length = 0; + }; + /** + * Set graphic element relative to data. It can be set as null + */ + + + SeriesData.prototype.setItemGraphicEl = function (idx, el) { + var seriesIndex = this.hostModel && this.hostModel.seriesIndex; + setCommonECData(seriesIndex, this.dataType, idx, el); + this._graphicEls[idx] = el; + }; + + SeriesData.prototype.getItemGraphicEl = function (idx) { + return this._graphicEls[idx]; + }; + + SeriesData.prototype.eachItemGraphicEl = function (cb, context) { + each(this._graphicEls, function (el, idx) { + if (el) { + cb && cb.call(context, el, idx); + } + }); + }; + /** + * Shallow clone a new list except visual and layout properties, and graph elements. + * New list only change the indices. + */ + + + SeriesData.prototype.cloneShallow = function (list) { + if (!list) { + list = new SeriesData(this._schema ? this._schema : map$1(this.dimensions, this._getDimInfo, this), this.hostModel); + } + + transferProperties(list, this); + list._store = this._store; + return list; + }; + /** + * Wrap some method to add more feature + */ + + + SeriesData.prototype.wrapMethod = function (methodName, injectFunction) { + var originalMethod = this[methodName]; + + if (!isFunction(originalMethod)) { + return; + } + + this.__wrappedMethods = this.__wrappedMethods || []; + + this.__wrappedMethods.push(methodName); + + this[methodName] = function () { + var res = originalMethod.apply(this, arguments); + return injectFunction.apply(this, [res].concat(slice(arguments))); + }; + }; // ---------------------------------------------------------- + // A work around for internal method visiting private member. + // ---------------------------------------------------------- + + + SeriesData.internalField = function () { + prepareInvertedIndex = function (data) { + var invertedIndicesMap = data._invertedIndicesMap; + each(invertedIndicesMap, function (invertedIndices, dim) { + var dimInfo = data._dimInfos[dim]; // Currently, only dimensions that has ordinalMeta can create inverted indices. + + var ordinalMeta = dimInfo.ordinalMeta; + var store = data._store; + + if (ordinalMeta) { + invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array$1(ordinalMeta.categories.length); // The default value of TypedArray is 0. To avoid miss + // mapping to 0, we should set it as INDEX_NOT_FOUND. + + for (var i = 0; i < invertedIndices.length; i++) { + invertedIndices[i] = INDEX_NOT_FOUND; + } + + for (var i = 0; i < store.count(); i++) { + // Only support the case that all values are distinct. + invertedIndices[store.get(dimInfo.storeDimIndex, i)] = i; + } + } + }); + }; + + getIdNameFromStore = function (data, dimIdx, idx) { + return convertOptionIdName(data._getCategory(dimIdx, idx), null); + }; + /** + * @see the comment of `List['getId']`. + */ + + + getId = function (data, rawIndex) { + var id = data._idList[rawIndex]; + + if (id == null && data._idDimIdx != null) { + id = getIdNameFromStore(data, data._idDimIdx, rawIndex); + } + + if (id == null) { + id = ID_PREFIX + rawIndex; + } + + return id; + }; + + normalizeDimensions = function (dimensions) { + if (!isArray(dimensions)) { + dimensions = dimensions != null ? [dimensions] : []; + } + + return dimensions; + }; + /** + * Data in excludeDimensions is copied, otherwise transfered. + */ + + + cloneListForMapAndSample = function (original) { + var list = new SeriesData(original._schema ? original._schema : map$1(original.dimensions, original._getDimInfo, original), original.hostModel); // FIXME If needs stackedOn, value may already been stacked + + transferProperties(list, original); + return list; + }; + + transferProperties = function (target, source) { + each(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function (propName) { + if (source.hasOwnProperty(propName)) { + target[propName] = source[propName]; + } + }); + target.__wrappedMethods = source.__wrappedMethods; + each(CLONE_PROPERTIES, function (propName) { + target[propName] = clone(source[propName]); + }); + target._calculationInfo = extend({}, source._calculationInfo); + }; + + makeIdFromName = function (data, idx) { + var nameList = data._nameList; + var idList = data._idList; + var nameDimIdx = data._nameDimIdx; + var idDimIdx = data._idDimIdx; + var name = nameList[idx]; + var id = idList[idx]; + + if (name == null && nameDimIdx != null) { + nameList[idx] = name = getIdNameFromStore(data, nameDimIdx, idx); + } + + if (id == null && idDimIdx != null) { + idList[idx] = id = getIdNameFromStore(data, idDimIdx, idx); + } + + if (id == null && name != null) { + var nameRepeatCount = data._nameRepeatCount; + var nmCnt = nameRepeatCount[name] = (nameRepeatCount[name] || 0) + 1; + id = name; + + if (nmCnt > 1) { + id += '__ec__' + nmCnt; + } + + idList[idx] = id; + } + }; + }(); + + return SeriesData; + }(); + + /** + * For outside usage compat (like echarts-gl are using it). + */ + + function createDimensions(source, opt) { + return prepareSeriesDataSchema(source, opt).dimensions; + } + + /** + * This method builds the relationship between: + * + "what the coord sys or series requires (see `coordDimensions`)", + * + "what the user defines (in `encode` and `dimensions`, see `opt.dimensionsDefine` and `opt.encodeDefine`)" + * + "what the data source provids (see `source`)". + * + * Some guess strategy will be adapted if user does not define something. + * If no 'value' dimension specified, the first no-named dimension will be + * named as 'value'. + * + * @return The results are always sorted by `storeDimIndex` asc. + */ + + function prepareSeriesDataSchema( // TODO: TYPE completeDimensions type + source, opt) { + if (!isSourceInstance(source)) { + source = createSourceFromSeriesDataOption(source); + } + + opt = opt || {}; + var sysDims = opt.coordDimensions || []; + var dimsDef = opt.dimensionsDefine || source.dimensionsDefine || []; + var coordDimNameMap = createHashMap(); + var resultList = []; + var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount); // Try to ignore unsed dimensions if sharing a high dimension datastore + // 30 is an experience value. + + var omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount); + var isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine; + var dataDimNameMap = isUsingSourceDimensionsDef ? ensureSourceDimNameMap(source) : createDimNameMap(dimsDef); + var encodeDef = opt.encodeDefine; + + if (!encodeDef && opt.encodeDefaulter) { + encodeDef = opt.encodeDefaulter(source, dimCount); + } + + var encodeDefMap = createHashMap(encodeDef); + var indicesMap = new CtorInt32Array(dimCount); + + for (var i = 0; i < indicesMap.length; i++) { + indicesMap[i] = -1; + } + + function getResultItem(dimIdx) { + var idx = indicesMap[dimIdx]; + + if (idx < 0) { + var dimDefItemRaw = dimsDef[dimIdx]; + var dimDefItem = isObject(dimDefItemRaw) ? dimDefItemRaw : { + name: dimDefItemRaw + }; + var resultItem = new SeriesDimensionDefine(); + var userDimName = dimDefItem.name; + + if (userDimName != null && dataDimNameMap.get(userDimName) != null) { + // Only if `series.dimensions` is defined in option + // displayName, will be set, and dimension will be diplayed vertically in + // tooltip by default. + resultItem.name = resultItem.displayName = userDimName; + } + + dimDefItem.type != null && (resultItem.type = dimDefItem.type); + dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName); + var newIdx = resultList.length; + indicesMap[dimIdx] = newIdx; + resultItem.storeDimIndex = dimIdx; + resultList.push(resultItem); + return resultItem; + } + + return resultList[idx]; + } + + if (!omitUnusedDimensions) { + for (var i = 0; i < dimCount; i++) { + getResultItem(i); + } + } // Set `coordDim` and `coordDimIndex` by `encodeDefMap` and normalize `encodeDefMap`. + + + encodeDefMap.each(function (dataDimsRaw, coordDim) { + var dataDims = normalizeToArray(dataDimsRaw).slice(); // Note: It is allowed that `dataDims.length` is `0`, e.g., options is + // `{encode: {x: -1, y: 1}}`. Should not filter anything in + // this case. + + if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 0) { + encodeDefMap.set(coordDim, false); + return; + } + + var validDataDims = encodeDefMap.set(coordDim, []); + each(dataDims, function (resultDimIdxOrName, idx) { + // The input resultDimIdx can be dim name or index. + var resultDimIdx = isString(resultDimIdxOrName) ? dataDimNameMap.get(resultDimIdxOrName) : resultDimIdxOrName; + + if (resultDimIdx != null && resultDimIdx < dimCount) { + validDataDims[idx] = resultDimIdx; + applyDim(getResultItem(resultDimIdx), coordDim, idx); + } + }); + }); // Apply templetes and default order from `sysDims`. + + var availDimIdx = 0; + each(sysDims, function (sysDimItemRaw) { + var coordDim; + var sysDimItemDimsDef; + var sysDimItemOtherDims; + var sysDimItem; + + if (isString(sysDimItemRaw)) { + coordDim = sysDimItemRaw; + sysDimItem = {}; + } else { + sysDimItem = sysDimItemRaw; + coordDim = sysDimItem.name; + var ordinalMeta = sysDimItem.ordinalMeta; + sysDimItem.ordinalMeta = null; + sysDimItem = extend({}, sysDimItem); + sysDimItem.ordinalMeta = ordinalMeta; // `coordDimIndex` should not be set directly. + + sysDimItemDimsDef = sysDimItem.dimsDef; + sysDimItemOtherDims = sysDimItem.otherDims; + sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null; + } + + var dataDims = encodeDefMap.get(coordDim); // negative resultDimIdx means no need to mapping. + + if (dataDims === false) { + return; + } + + dataDims = normalizeToArray(dataDims); // dimensions provides default dim sequences. + + if (!dataDims.length) { + for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) { + while (availDimIdx < dimCount && getResultItem(availDimIdx).coordDim != null) { + availDimIdx++; + } + + availDimIdx < dimCount && dataDims.push(availDimIdx++); + } + } // Apply templates. + + + each(dataDims, function (resultDimIdx, coordDimIndex) { + var resultItem = getResultItem(resultDimIdx); // Coordinate system has a higher priority on dim type than source. + + if (isUsingSourceDimensionsDef && sysDimItem.type != null) { + resultItem.type = sysDimItem.type; + } + + applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex); + + if (resultItem.name == null && sysDimItemDimsDef) { + var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex]; + !isObject(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = { + name: sysDimItemDimsDefItem + }); + resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name; + resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip; + } // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}} + + + sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims); + }); + }); + + function applyDim(resultItem, coordDim, coordDimIndex) { + if (VISUAL_DIMENSIONS.get(coordDim) != null) { + resultItem.otherDims[coordDim] = coordDimIndex; + } else { + resultItem.coordDim = coordDim; + resultItem.coordDimIndex = coordDimIndex; + coordDimNameMap.set(coordDim, true); + } + } // Make sure the first extra dim is 'value'. + + + var generateCoord = opt.generateCoord; + var generateCoordCount = opt.generateCoordCount; + var fromZero = generateCoordCount != null; + generateCoordCount = generateCoord ? generateCoordCount || 1 : 0; + var extra = generateCoord || 'value'; + + function ifNoNameFillWithCoordName(resultItem) { + if (resultItem.name == null) { + // Duplication will be removed in the next step. + resultItem.name = resultItem.coordDim; + } + } // Set dim `name` and other `coordDim` and other props. + + + if (!omitUnusedDimensions) { + for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) { + var resultItem = getResultItem(resultDimIdx); + var coordDim = resultItem.coordDim; + + if (coordDim == null) { + // TODO no need to generate coordDim for isExtraCoord? + resultItem.coordDim = genCoordDimName(extra, coordDimNameMap, fromZero); + resultItem.coordDimIndex = 0; // Series specified generateCoord is using out. + + if (!generateCoord || generateCoordCount <= 0) { + resultItem.isExtraCoord = true; + } + + generateCoordCount--; + } + + ifNoNameFillWithCoordName(resultItem); + + if (resultItem.type == null && (guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must // Consider the case: + // { + // dataset: {source: [ + // ['2001', 123], + // ['2002', 456], + // ... + // ['The others', 987], + // ]}, + // series: {type: 'pie'} + // } + // The first colum should better be treated as a "ordinal" although it + // might not able to be detected as an "ordinal" by `guessOrdinal`. + || resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null))) { + resultItem.type = 'ordinal'; + } + } + } else { + each(resultList, function (resultItem) { + // PENDING: guessOrdinal or let user specify type: 'ordinal' manually? + ifNoNameFillWithCoordName(resultItem); + }); // Sort dimensions: there are some rule that use the last dim as label, + // and for some latter travel process easier. + + resultList.sort(function (item0, item1) { + return item0.storeDimIndex - item1.storeDimIndex; + }); + } + + removeDuplication(resultList); + return new SeriesDataSchema({ + source: source, + dimensions: resultList, + fullDimensionCount: dimCount, + dimensionOmitted: omitUnusedDimensions + }); + } + + function removeDuplication(result) { + var duplicationMap = createHashMap(); + + for (var i = 0; i < result.length; i++) { + var dim = result[i]; + var dimOriginalName = dim.name; + var count = duplicationMap.get(dimOriginalName) || 0; + + if (count > 0) { + // Starts from 0. + dim.name = dimOriginalName + (count - 1); + } + + count++; + duplicationMap.set(dimOriginalName, count); + } + } // ??? TODO + // Originally detect dimCount by data[0]. Should we + // optimize it to only by sysDims and dimensions and encode. + // So only necessary dims will be initialized. + // But + // (1) custom series should be considered. where other dims + // may be visited. + // (2) sometimes user need to calcualte bubble size or use visualMap + // on other dimensions besides coordSys needed. + // So, dims that is not used by system, should be shared in data store? + + + function getDimCount(source, sysDims, dimsDef, optDimCount) { + // Note that the result dimCount should not small than columns count + // of data, otherwise `dataDimNameMap` checking will be incorrect. + var dimCount = Math.max(source.dimensionsDetectedCount || 1, sysDims.length, dimsDef.length, optDimCount || 0); + each(sysDims, function (sysDimItem) { + var sysDimItemDimsDef; + + if (isObject(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) { + dimCount = Math.max(dimCount, sysDimItemDimsDef.length); + } + }); + return dimCount; + } + + function genCoordDimName(name, map, fromZero) { + var mapData = map.data; + + if (fromZero || mapData.hasOwnProperty(name)) { + var i = 0; + + while (mapData.hasOwnProperty(name + i)) { + i++; + } + + name += i; + } + + map.set(name, true); + return name; + } + + /** + * @class + * For example: + * { + * coordSysName: 'cartesian2d', + * coordSysDims: ['x', 'y', ...], + * axisMap: HashMap({ + * x: xAxisModel, + * y: yAxisModel + * }), + * categoryAxisMap: HashMap({ + * x: xAxisModel, + * y: undefined + * }), + * // The index of the first category axis in `coordSysDims`. + * // `null/undefined` means no category axis exists. + * firstCategoryDimIndex: 1, + * // To replace user specified encode. + * } + */ + + var CoordSysInfo = + /** @class */ + function () { + function CoordSysInfo(coordSysName) { + this.coordSysDims = []; + this.axisMap = createHashMap(); + this.categoryAxisMap = createHashMap(); + this.coordSysName = coordSysName; + } + + return CoordSysInfo; + }(); + + function getCoordSysInfoBySeries(seriesModel) { + var coordSysName = seriesModel.get('coordinateSystem'); + var result = new CoordSysInfo(coordSysName); + var fetch = fetchers[coordSysName]; + + if (fetch) { + fetch(seriesModel, result, result.axisMap, result.categoryAxisMap); + return result; + } + } + + var fetchers = { + cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) { + var xAxisModel = seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0]; + var yAxisModel = seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!xAxisModel) { + throw new Error('xAxis "' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('xAxisId'), 0) + '" not found'); + } + + if (!yAxisModel) { + throw new Error('yAxis "' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('yAxisId'), 0) + '" not found'); + } + } + + result.coordSysDims = ['x', 'y']; + axisMap.set('x', xAxisModel); + axisMap.set('y', yAxisModel); + + if (isCategory(xAxisModel)) { + categoryAxisMap.set('x', xAxisModel); + result.firstCategoryDimIndex = 0; + } + + if (isCategory(yAxisModel)) { + categoryAxisMap.set('y', yAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!singleAxisModel) { + throw new Error('singleAxis should be specified.'); + } + } + + result.coordSysDims = ['single']; + axisMap.set('single', singleAxisModel); + + if (isCategory(singleAxisModel)) { + categoryAxisMap.set('single', singleAxisModel); + result.firstCategoryDimIndex = 0; + } + }, + polar: function (seriesModel, result, axisMap, categoryAxisMap) { + var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + + if ("development" !== 'production') { + if (!angleAxisModel) { + throw new Error('angleAxis option not found'); + } + + if (!radiusAxisModel) { + throw new Error('radiusAxis option not found'); + } + } + + result.coordSysDims = ['radius', 'angle']; + axisMap.set('radius', radiusAxisModel); + axisMap.set('angle', angleAxisModel); + + if (isCategory(radiusAxisModel)) { + categoryAxisMap.set('radius', radiusAxisModel); + result.firstCategoryDimIndex = 0; + } + + if (isCategory(angleAxisModel)) { + categoryAxisMap.set('angle', angleAxisModel); + result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1); + } + }, + geo: function (seriesModel, result, axisMap, categoryAxisMap) { + result.coordSysDims = ['lng', 'lat']; + }, + parallel: function (seriesModel, result, axisMap, categoryAxisMap) { + var ecModel = seriesModel.ecModel; + var parallelModel = ecModel.getComponent('parallel', seriesModel.get('parallelIndex')); + var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice(); + each(parallelModel.parallelAxisIndex, function (axisIndex, index) { + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + var axisDim = coordSysDims[index]; + axisMap.set(axisDim, axisModel); + + if (isCategory(axisModel)) { + categoryAxisMap.set(axisDim, axisModel); + + if (result.firstCategoryDimIndex == null) { + result.firstCategoryDimIndex = index; + } + } + }); + } + }; + + function isCategory(axisModel) { + return axisModel.get('type') === 'category'; + } + + /** + * Note that it is too complicated to support 3d stack by value + * (have to create two-dimension inverted index), so in 3d case + * we just support that stacked by index. + * + * @param seriesModel + * @param dimensionsInput The same as the input of . + * The input will be modified. + * @param opt + * @param opt.stackedCoordDimension Specify a coord dimension if needed. + * @param opt.byIndex=false + * @return calculationInfo + * { + * stackedDimension: string + * stackedByDimension: string + * isStackedByIndex: boolean + * stackedOverDimension: string + * stackResultDimension: string + * } + */ + + function enableDataStack(seriesModel, dimensionsInput, opt) { + opt = opt || {}; + var byIndex = opt.byIndex; + var stackedCoordDimension = opt.stackedCoordDimension; + var dimensionDefineList; + var schema; + var store; + + if (isLegacyDimensionsInput(dimensionsInput)) { + dimensionDefineList = dimensionsInput; + } else { + schema = dimensionsInput.schema; + dimensionDefineList = schema.dimensions; + store = dimensionsInput.store; + } // Compatibal: when `stack` is set as '', do not stack. + + + var mayStack = !!(seriesModel && seriesModel.get('stack')); + var stackedByDimInfo; + var stackedDimInfo; + var stackResultDimension; + var stackedOverDimension; + each(dimensionDefineList, function (dimensionInfo, index) { + if (isString(dimensionInfo)) { + dimensionDefineList[index] = dimensionInfo = { + name: dimensionInfo + }; + } + + if (mayStack && !dimensionInfo.isExtraCoord) { + // Find the first ordinal dimension as the stackedByDimInfo. + if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) { + stackedByDimInfo = dimensionInfo; + } // Find the first stackable dimension as the stackedDimInfo. + + + if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) { + stackedDimInfo = dimensionInfo; + } + } + }); + + if (stackedDimInfo && !byIndex && !stackedByDimInfo) { + // Compatible with previous design, value axis (time axis) only stack by index. + // It may make sense if the user provides elaborately constructed data. + byIndex = true; + } // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`. + // That put stack logic in List is for using conveniently in echarts extensions, but it + // might not be a good way. + + + if (stackedDimInfo) { + // Use a weird name that not duplicated with other names. + // Also need to use seriesModel.id as postfix because different + // series may share same data store. The stack dimension needs to be distinguished. + stackResultDimension = '__\0ecstackresult_' + seriesModel.id; + stackedOverDimension = '__\0ecstackedover_' + seriesModel.id; // Create inverted index to fast query index by value. + + if (stackedByDimInfo) { + stackedByDimInfo.createInvertedIndices = true; + } + + var stackedDimCoordDim_1 = stackedDimInfo.coordDim; + var stackedDimType = stackedDimInfo.type; + var stackedDimCoordIndex_1 = 0; + each(dimensionDefineList, function (dimensionInfo) { + if (dimensionInfo.coordDim === stackedDimCoordDim_1) { + stackedDimCoordIndex_1++; + } + }); + var stackedOverDimensionDefine = { + name: stackResultDimension, + coordDim: stackedDimCoordDim_1, + coordDimIndex: stackedDimCoordIndex_1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true, + storeDimIndex: dimensionDefineList.length + }; + var stackResultDimensionDefine = { + name: stackedOverDimension, + // This dimension contains stack base (generally, 0), so do not set it as + // `stackedDimCoordDim` to avoid extent calculation, consider log scale. + coordDim: stackedOverDimension, + coordDimIndex: stackedDimCoordIndex_1 + 1, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true, + storeDimIndex: dimensionDefineList.length + 1 + }; + + if (schema) { + if (store) { + stackedOverDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackedOverDimension, stackedDimType); + stackResultDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackResultDimension, stackedDimType); + } + + schema.appendCalculationDimension(stackedOverDimensionDefine); + schema.appendCalculationDimension(stackResultDimensionDefine); + } else { + dimensionDefineList.push(stackedOverDimensionDefine); + dimensionDefineList.push(stackResultDimensionDefine); + } + } + + return { + stackedDimension: stackedDimInfo && stackedDimInfo.name, + stackedByDimension: stackedByDimInfo && stackedByDimInfo.name, + isStackedByIndex: byIndex, + stackedOverDimension: stackedOverDimension, + stackResultDimension: stackResultDimension + }; + } + + function isLegacyDimensionsInput(dimensionsInput) { + return !isSeriesDataSchema(dimensionsInput.schema); + } + + function isDimensionStacked(data, stackedDim) { + // Each single series only maps to one pair of axis. So we do not need to + // check stackByDim, whatever stacked by a dimension or stacked by index. + return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension'); + } + + function getStackedDimension(data, targetDim) { + return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim; + } + + function getCoordSysDimDefs(seriesModel, coordSysInfo) { + var coordSysName = seriesModel.get('coordinateSystem'); + var registeredCoordSys = CoordinateSystemManager.get(coordSysName); + var coordSysDimDefs; + + if (coordSysInfo && coordSysInfo.coordSysDims) { + coordSysDimDefs = map(coordSysInfo.coordSysDims, function (dim) { + var dimInfo = { + name: dim + }; + var axisModel = coordSysInfo.axisMap.get(dim); + + if (axisModel) { + var axisType = axisModel.get('type'); + dimInfo.type = getDimensionTypeByAxis(axisType); + } + + return dimInfo; + }); + } + + if (!coordSysDimDefs) { + // Get dimensions from registered coordinate system + coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y']; + } + + return coordSysDimDefs; + } + + function injectOrdinalMeta(dimInfoList, createInvertedIndices, coordSysInfo) { + var firstCategoryDimIndex; + var hasNameEncode; + coordSysInfo && each(dimInfoList, function (dimInfo, dimIndex) { + var coordDim = dimInfo.coordDim; + var categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim); + + if (categoryAxisModel) { + if (firstCategoryDimIndex == null) { + firstCategoryDimIndex = dimIndex; + } + + dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta(); + + if (createInvertedIndices) { + dimInfo.createInvertedIndices = true; + } + } + + if (dimInfo.otherDims.itemName != null) { + hasNameEncode = true; + } + }); + + if (!hasNameEncode && firstCategoryDimIndex != null) { + dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0; + } + + return firstCategoryDimIndex; + } + + /** + * Caution: there are side effects to `sourceManager` in this method. + * Should better only be called in `Series['getInitialData']`. + */ + + + function createSeriesData(sourceRaw, seriesModel, opt) { + opt = opt || {}; + var sourceManager = seriesModel.getSourceManager(); + var source; + var isOriginalSource = false; + + if (sourceRaw) { + isOriginalSource = true; + source = createSourceFromSeriesDataOption(sourceRaw); + } else { + source = sourceManager.getSource(); // Is series.data. not dataset. + + isOriginalSource = source.sourceFormat === SOURCE_FORMAT_ORIGINAL; + } + + var coordSysInfo = getCoordSysInfoBySeries(seriesModel); + var coordSysDimDefs = getCoordSysDimDefs(seriesModel, coordSysInfo); + var useEncodeDefaulter = opt.useEncodeDefaulter; + var encodeDefaulter = isFunction(useEncodeDefaulter) ? useEncodeDefaulter : useEncodeDefaulter ? curry(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) : null; + var createDimensionOptions = { + coordDimensions: coordSysDimDefs, + generateCoord: opt.generateCoord, + encodeDefine: seriesModel.getEncode(), + encodeDefaulter: encodeDefaulter, + canOmitUnusedDimensions: !isOriginalSource + }; + var schema = prepareSeriesDataSchema(source, createDimensionOptions); + var firstCategoryDimIndex = injectOrdinalMeta(schema.dimensions, opt.createInvertedIndices, coordSysInfo); + var store = !isOriginalSource ? sourceManager.getSharedDataStore(schema) : null; + var stackCalculationInfo = enableDataStack(seriesModel, { + schema: schema, + store: store + }); + var data = new SeriesData(schema, seriesModel); + data.setCalculationInfo(stackCalculationInfo); + var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source) ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex); + } : null; + data.hasItemOption = false; + data.initData( // Try to reuse the data store in sourceManager if using dataset. + isOriginalSource ? source : store, null, dimValueGetter); + return data; + } + + function isNeedCompleteOrdinalData(source) { + if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var sampleItem = firstDataNotNull(source.data || []); + return !isArray(getDataItemValue(sampleItem)); + } + } + + function firstDataNotNull(arr) { + var i = 0; + + while (i < arr.length && arr[i] == null) { + i++; + } + + return arr[i]; + } + + var Scale = + /** @class */ + function () { + function Scale(setting) { + this._setting = setting || {}; + this._extent = [Infinity, -Infinity]; + } + + Scale.prototype.getSetting = function (name) { + return this._setting[name]; + }; + /** + * Set extent from data + */ + + + Scale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); + }; + /** + * Set extent from data + */ + + + Scale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Get extent + * + * Extent is always in increase order. + */ + + + Scale.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Set extent + */ + + + Scale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; + + if (!isNaN(start)) { + thisExtent[0] = start; + } + + if (!isNaN(end)) { + thisExtent[1] = end; + } + }; + /** + * If value is in extent range + */ + + + Scale.prototype.isInExtentRange = function (value) { + return this._extent[0] <= value && this._extent[1] >= value; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + + + Scale.prototype.isBlank = function () { + return this._isBlank; + }; + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + + + Scale.prototype.setBlank = function (isBlank) { + this._isBlank = isBlank; + }; + + return Scale; + }(); + + enableClassManagement(Scale); + + var uidBase = 0; + + var OrdinalMeta = + /** @class */ + function () { + function OrdinalMeta(opt) { + this.categories = opt.categories || []; + this._needCollect = opt.needCollect; + this._deduplication = opt.deduplication; + this.uid = ++uidBase; + } + + OrdinalMeta.createByAxisModel = function (axisModel) { + var option = axisModel.option; + var data = option.data; + var categories = data && map(data, getName); + return new OrdinalMeta({ + categories: categories, + needCollect: !categories, + // deduplication is default in axis. + deduplication: option.dedplication !== false + }); + }; + + OrdinalMeta.prototype.getOrdinal = function (category) { + // @ts-ignore + return this._getOrCreateMap().get(category); + }; + /** + * @return The ordinal. If not found, return NaN. + */ + + + OrdinalMeta.prototype.parseAndCollect = function (category) { + var index; + var needCollect = this._needCollect; // The value of category dim can be the index of the given category set. + // This feature is only supported when !needCollect, because we should + // consider a common case: a value is 2017, which is a number but is + // expected to be tread as a category. This case usually happen in dataset, + // where it happent to be no need of the index feature. + + if (!isString(category) && !needCollect) { + return category; + } // Optimize for the scenario: + // category is ['2012-01-01', '2012-01-02', ...], where the input + // data has been ensured not duplicate and is large data. + // Notice, if a dataset dimension provide categroies, usually echarts + // should remove duplication except user tell echarts dont do that + // (set axis.deduplication = false), because echarts do not know whether + // the values in the category dimension has duplication (consider the + // parallel-aqi example) + + + if (needCollect && !this._deduplication) { + index = this.categories.length; + this.categories[index] = category; + return index; + } + + var map = this._getOrCreateMap(); // @ts-ignore + + + index = map.get(category); + + if (index == null) { + if (needCollect) { + index = this.categories.length; + this.categories[index] = category; // @ts-ignore + + map.set(category, index); + } else { + index = NaN; + } + } + + return index; + }; // Consider big data, do not create map until needed. + + + OrdinalMeta.prototype._getOrCreateMap = function () { + return this._map || (this._map = createHashMap(this.categories)); + }; + + return OrdinalMeta; + }(); + + function getName(obj) { + if (isObject(obj) && obj.value != null) { + return obj.value; + } else { + return obj + ''; + } + } + + function isValueNice(val) { + var exp10 = Math.pow(10, quantityExponent(Math.abs(val))); + var f = Math.abs(val / exp10); + return f === 0 || f === 1 || f === 2 || f === 3 || f === 5; + } + + function isIntervalOrLogScale(scale) { + return scale.type === 'interval' || scale.type === 'log'; + } + + /** + * @param extent Both extent[0] and extent[1] should be valid number. + * Should be extent[0] < extent[1]. + * @param splitNumber splitNumber should be >= 1. + */ + + function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) { + var result = {}; + var span = extent[1] - extent[0]; + var interval = result.interval = nice(span / splitNumber, true); + + if (minInterval != null && interval < minInterval) { + interval = result.interval = minInterval; + } + + if (maxInterval != null && interval > maxInterval) { + interval = result.interval = maxInterval; + } // Tow more digital for tick. + + + var precision = result.intervalPrecision = getIntervalPrecision(interval); // Niced extent inside original extent + + var niceTickExtent = result.niceTickExtent = [round(Math.ceil(extent[0] / interval) * interval, precision), round(Math.floor(extent[1] / interval) * interval, precision)]; + fixExtent(niceTickExtent, extent); + return result; + } + + function increaseInterval(interval) { + var exp10 = Math.pow(10, quantityExponent(interval)); // Increase interval + + var f = interval / exp10; + + if (!f) { + f = 1; + } else if (f === 2) { + f = 3; + } else if (f === 3) { + f = 5; + } else { + // f is 1 or 5 + f *= 2; + } + + return round(f * exp10); + } + + /** + * @return interval precision + */ + + function getIntervalPrecision(interval) { + // Tow more digital for tick. + return getPrecision(interval) + 2; + } + + function clamp(niceTickExtent, idx, extent) { + niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]); + } // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent. + + + function fixExtent(niceTickExtent, extent) { + !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]); + !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]); + clamp(niceTickExtent, 0, extent); + clamp(niceTickExtent, 1, extent); + + if (niceTickExtent[0] > niceTickExtent[1]) { + niceTickExtent[0] = niceTickExtent[1]; + } + } + + function contain$1(val, extent) { + return val >= extent[0] && val <= extent[1]; + } + + function normalize$1(val, extent) { + if (extent[1] === extent[0]) { + return 0.5; + } + + return (val - extent[0]) / (extent[1] - extent[0]); + } + + function scale$2(val, extent) { + return val * (extent[1] - extent[0]) + extent[0]; + } + + var OrdinalScale = + /** @class */ + function (_super) { + __extends(OrdinalScale, _super); + + function OrdinalScale(setting) { + var _this = _super.call(this, setting) || this; + + _this.type = 'ordinal'; + + var ordinalMeta = _this.getSetting('ordinalMeta'); // Caution: Should not use instanceof, consider ec-extensions using + // import approach to get OrdinalMeta class. + + + if (!ordinalMeta) { + ordinalMeta = new OrdinalMeta({}); + } + + if (isArray(ordinalMeta)) { + ordinalMeta = new OrdinalMeta({ + categories: map(ordinalMeta, function (item) { + return isObject(item) ? item.value : item; + }) + }); + } + + _this._ordinalMeta = ordinalMeta; + _this._extent = _this.getSetting('extent') || [0, ordinalMeta.categories.length - 1]; + return _this; + } + + OrdinalScale.prototype.parse = function (val) { + // Caution: Math.round(null) will return `0` rather than `NaN` + if (val == null) { + return NaN; + } + + return isString(val) ? this._ordinalMeta.getOrdinal(val) // val might be float. + : Math.round(val); + }; + + OrdinalScale.prototype.contain = function (rank) { + rank = this.parse(rank); + return contain$1(rank, this._extent) && this._ordinalMeta.categories[rank] != null; + }; + /** + * Normalize given rank or name to linear [0, 1] + * @param val raw ordinal number. + * @return normalized value in [0, 1]. + */ + + + OrdinalScale.prototype.normalize = function (val) { + val = this._getTickNumber(this.parse(val)); + return normalize$1(val, this._extent); + }; + /** + * @param val normalized value in [0, 1]. + * @return raw ordinal number. + */ + + + OrdinalScale.prototype.scale = function (val) { + val = Math.round(scale$2(val, this._extent)); + return this.getRawOrdinalNumber(val); + }; + + OrdinalScale.prototype.getTicks = function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + + while (rank <= extent[1]) { + ticks.push({ + value: rank + }); + rank++; + } + + return ticks; + }; + + OrdinalScale.prototype.getMinorTicks = function (splitNumber) { + // Not support. + return; + }; + /** + * @see `Ordinal['_ordinalNumbersByTick']` + */ + + + OrdinalScale.prototype.setSortInfo = function (info) { + if (info == null) { + this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null; + return; + } + + var infoOrdinalNumbers = info.ordinalNumbers; + var ordinalsByTick = this._ordinalNumbersByTick = []; + var ticksByOrdinal = this._ticksByOrdinalNumber = []; // Unnecessary support negative tick in `realtimeSort`. + + var tickNum = 0; + var allCategoryLen = this._ordinalMeta.categories.length; + + for (var len = Math.min(allCategoryLen, infoOrdinalNumbers.length); tickNum < len; ++tickNum) { + var ordinalNumber = infoOrdinalNumbers[tickNum]; + ordinalsByTick[tickNum] = ordinalNumber; + ticksByOrdinal[ordinalNumber] = tickNum; + } // Handle that `series.data` only covers part of the `axis.category.data`. + + + var unusedOrdinal = 0; + + for (; tickNum < allCategoryLen; ++tickNum) { + while (ticksByOrdinal[unusedOrdinal] != null) { + unusedOrdinal++; + } + ordinalsByTick.push(unusedOrdinal); + ticksByOrdinal[unusedOrdinal] = tickNum; + } + }; + + OrdinalScale.prototype._getTickNumber = function (ordinal) { + var ticksByOrdinalNumber = this._ticksByOrdinalNumber; // also support ordinal out of range of `ordinalMeta.categories.length`, + // where ordinal numbers are used as tick value directly. + + return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal; + }; + /** + * @usage + * ```js + * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal); + * + * // case0 + * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber]; + * // case1 + * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber]; + * // case2 + * const coord = axis.dataToCoord(ordinalNumber); + * ``` + * + * @param {OrdinalNumber} tickNumber index of display + */ + + + OrdinalScale.prototype.getRawOrdinalNumber = function (tickNumber) { + var ordinalNumbersByTick = this._ordinalNumbersByTick; // tickNumber may be out of range, e.g., when axis max is larger than `ordinalMeta.categories.length`., + // where ordinal numbers are used as tick value directly. + + return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber; + }; + /** + * Get item on tick + */ + + + OrdinalScale.prototype.getLabel = function (tick) { + if (!this.isBlank()) { + var ordinalNumber = this.getRawOrdinalNumber(tick.value); + var cateogry = this._ordinalMeta.categories[ordinalNumber]; // Note that if no data, ordinalMeta.categories is an empty array. + // Return empty if it's not exist. + + return cateogry == null ? '' : cateogry + ''; + } + }; + + OrdinalScale.prototype.count = function () { + return this._extent[1] - this._extent[0] + 1; + }; + + OrdinalScale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * @override + * If value is in extent range + */ + + + OrdinalScale.prototype.isInExtentRange = function (value) { + value = this._getTickNumber(value); + return this._extent[0] <= value && this._extent[1] >= value; + }; + + OrdinalScale.prototype.getOrdinalMeta = function () { + return this._ordinalMeta; + }; + + OrdinalScale.prototype.calcNiceTicks = function () { + }; + + OrdinalScale.prototype.calcNiceExtent = function () { + }; + + OrdinalScale.type = 'ordinal'; + return OrdinalScale; + }(Scale); + + Scale.registerClass(OrdinalScale); + + var roundNumber = round; + + var IntervalScale = + /** @class */ + function (_super) { + __extends(IntervalScale, _super); + + function IntervalScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'interval'; // Step is calculated in adjustExtent. + + _this._interval = 0; + _this._intervalPrecision = 2; + return _this; + } + + IntervalScale.prototype.parse = function (val) { + return val; + }; + + IntervalScale.prototype.contain = function (val) { + return contain$1(val, this._extent); + }; + + IntervalScale.prototype.normalize = function (val) { + return normalize$1(val, this._extent); + }; + + IntervalScale.prototype.scale = function (val) { + return scale$2(val, this._extent); + }; + + IntervalScale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; // start,end may be a Number like '25',so... + + if (!isNaN(start)) { + thisExtent[0] = parseFloat(start); + } + + if (!isNaN(end)) { + thisExtent[1] = parseFloat(end); + } + }; + + IntervalScale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); // unionExtent may called by it's sub classes + + this.setExtent(extent[0], extent[1]); + }; + + IntervalScale.prototype.getInterval = function () { + return this._interval; + }; + + IntervalScale.prototype.setInterval = function (interval) { + this._interval = interval; // Dropped auto calculated niceExtent and use user setted extent + // We assume user wan't to set both interval, min, max to get a better result + + this._niceExtent = this._extent.slice(); + this._intervalPrecision = getIntervalPrecision(interval); + }; + /** + * @param expandToNicedExtent Whether expand the ticks to niced extent. + */ + + + IntervalScale.prototype.getTicks = function (expandToNicedExtent) { + var interval = this._interval; + var extent = this._extent; + var niceTickExtent = this._niceExtent; + var intervalPrecision = this._intervalPrecision; + var ticks = []; // If interval is 0, return []; + + if (!interval) { + return ticks; + } // Consider this case: using dataZoom toolbox, zoom and zoom. + + + var safeLimit = 10000; + + if (extent[0] < niceTickExtent[0]) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber(niceTickExtent[0] - interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[0] + }); + } + } + + var tick = niceTickExtent[0]; + + while (tick <= niceTickExtent[1]) { + ticks.push({ + value: tick + }); // Avoid rounding error + + tick = roundNumber(tick + interval, intervalPrecision); + + if (tick === ticks[ticks.length - 1].value) { + // Consider out of safe float point, e.g., + // -3711126.9907707 + 2e-10 === -3711126.9907707 + break; + } + + if (ticks.length > safeLimit) { + return []; + } + } // Consider this case: the last item of ticks is smaller + // than niceTickExtent[1] and niceTickExtent[1] === extent[1]. + + + var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1]; + + if (extent[1] > lastNiceTick) { + if (expandToNicedExtent) { + ticks.push({ + value: roundNumber(lastNiceTick + interval, intervalPrecision) + }); + } else { + ticks.push({ + value: extent[1] + }); + } + } + + return ticks; + }; + + IntervalScale.prototype.getMinorTicks = function (splitNumber) { + var ticks = this.getTicks(true); + var minorTicks = []; + var extent = this.getExtent(); + + for (var i = 1; i < ticks.length; i++) { + var nextTick = ticks[i]; + var prevTick = ticks[i - 1]; + var count = 0; + var minorTicksGroup = []; + var interval = nextTick.value - prevTick.value; + var minorInterval = interval / splitNumber; + + while (count < splitNumber - 1) { + var minorTick = roundNumber(prevTick.value + (count + 1) * minorInterval); // For the first and last interval. The count may be less than splitNumber. + + if (minorTick > extent[0] && minorTick < extent[1]) { + minorTicksGroup.push(minorTick); + } + + count++; + } + + minorTicks.push(minorTicksGroup); + } + + return minorTicks; + }; + /** + * @param opt.precision If 'auto', use nice presision. + * @param opt.pad returns 1.50 but not 1.5 if precision is 2. + */ + + + IntervalScale.prototype.getLabel = function (data, opt) { + if (data == null) { + return ''; + } + + var precision = opt && opt.precision; + + if (precision == null) { + precision = getPrecision(data.value) || 0; + } else if (precision === 'auto') { + // Should be more precise then tick. + precision = this._intervalPrecision; + } // (1) If `precision` is set, 12.005 should be display as '12.00500'. + // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'. + + + var dataNum = roundNumber(data.value, precision, true); + return addCommas(dataNum); + }; + /** + * @param splitNumber By default `5`. + */ + + + IntervalScale.prototype.calcNiceTicks = function (splitNumber, minInterval, maxInterval) { + splitNumber = splitNumber || 5; + var extent = this._extent; + var span = extent[1] - extent[0]; + + if (!isFinite(span)) { + return; + } // User may set axis min 0 and data are all negative + // FIXME If it needs to reverse ? + + + if (span < 0) { + span = -span; + extent.reverse(); + } + + var result = intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval); + this._intervalPrecision = result.intervalPrecision; + this._interval = result.interval; + this._niceExtent = result.niceTickExtent; + }; + + IntervalScale.prototype.calcNiceExtent = function (opt) { + var extent = this._extent; // If extent start and end are same, expand them + + if (extent[0] === extent[1]) { + if (extent[0] !== 0) { + // Expand extent + var expandSize = extent[0]; // In the fowllowing case + // Axis has been fixed max 100 + // Plus data are all 100 and axis extent are [100, 100]. + // Extend to the both side will cause expanded max is larger than fixed max. + // So only expand to the smaller side. + + if (!opt.fixMax) { + extent[1] += expandSize / 2; + extent[0] -= expandSize / 2; + } else { + extent[0] -= expandSize / 2; + } + } else { + extent[1] = 1; + } + } + + var span = extent[1] - extent[0]; // If there are no data and extent are [Infinity, -Infinity] + + if (!isFinite(span)) { + extent[0] = 0; + extent[1] = 1; + } + + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); // let extent = this._extent; + + var interval = this._interval; + + if (!opt.fixMin) { + extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval); + } + + if (!opt.fixMax) { + extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval); + } + }; + + IntervalScale.prototype.setNiceExtent = function (min, max) { + this._niceExtent = [min, max]; + }; + + IntervalScale.type = 'interval'; + return IntervalScale; + }(Scale); + + Scale.registerClass(IntervalScale); + + /* global Float32Array */ + + var supportFloat32Array = typeof Float32Array !== 'undefined'; + var Float32ArrayCtor = !supportFloat32Array ? Array : Float32Array; + + function createFloat32Array(arg) { + if (isArray(arg)) { + // Return self directly if don't support TypedArray. + return supportFloat32Array ? new Float32Array(arg) : arg; + } // Else is number + + + return new Float32ArrayCtor(arg); + } + + var STACK_PREFIX = '__ec_stack_'; + + function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex; + } + + function getAxisKey(axis) { + return axis.dim + axis.index; + } + + /** + * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined. + */ + + + function getLayoutOnAxis(opt) { + var params = []; + var baseAxis = opt.axis; + var axisKey = 'axis0'; + + if (baseAxis.type !== 'category') { + return; + } + + var bandWidth = baseAxis.getBandWidth(); + + for (var i = 0; i < opt.count || 0; i++) { + params.push(defaults({ + bandWidth: bandWidth, + axisKey: axisKey, + stackId: STACK_PREFIX + i + }, opt)); + } + + var widthAndOffsets = doCalBarWidthAndOffset(params); + var result = []; + + for (var i = 0; i < opt.count; i++) { + var item = widthAndOffsets[axisKey][STACK_PREFIX + i]; + item.offsetCenter = item.offset + item.width / 2; + result.push(item); + } + + return result; + } + + function prepareLayoutBarSeries(seriesType, ecModel) { + var seriesModels = []; + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for cartesian2d only + if (isOnCartesian(seriesModel)) { + seriesModels.push(seriesModel); + } + }); + return seriesModels; + } + + /** + * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent + * values. + * This works for time axes, value axes, and log axes. + * For a single time axis, return value is in the form like + * {'x_0': [1000000]}. + * The value of 1000000 is in milliseconds. + */ + + function getValueAxesMinGaps(barSeries) { + /** + * Map from axis.index to values. + * For a single time axis, axisValues is in the form like + * {'x_0': [1495555200000, 1495641600000, 1495728000000]}. + * Items in axisValues[x], e.g. 1495555200000, are time values of all + * series. + */ + var axisValues = {}; + each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + + if (baseAxis.type !== 'time' && baseAxis.type !== 'value') { + return; + } + + var data = seriesModel.getData(); + var key = baseAxis.dim + '_' + baseAxis.index; + var dimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); + var store = data.getStore(); + + for (var i = 0, cnt = store.count(); i < cnt; ++i) { + var value = store.get(dimIdx, i); + + if (!axisValues[key]) { + // No previous data for the axis + axisValues[key] = [value]; + } else { + // No value in previous series + axisValues[key].push(value); + } // Ignore duplicated time values in the same axis + + } + }); + var axisMinGaps = {}; + + for (var key in axisValues) { + if (axisValues.hasOwnProperty(key)) { + var valuesInAxis = axisValues[key]; + + if (valuesInAxis) { + // Sort axis values into ascending order to calculate gaps + valuesInAxis.sort(function (a, b) { + return a - b; + }); + var min = null; + + for (var j = 1; j < valuesInAxis.length; ++j) { + var delta = valuesInAxis[j] - valuesInAxis[j - 1]; + + if (delta > 0) { + // Ignore 0 delta because they are of the same axis value + min = min === null ? delta : Math.min(min, delta); + } + } // Set to null if only have one data + + + axisMinGaps[key] = min; + } + } + } + + return axisMinGaps; + } + + function makeColumnLayout(barSeries) { + var axisMinGaps = getValueAxesMinGaps(barSeries); + var seriesInfoList = []; + each(barSeries, function (seriesModel) { + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var axisExtent = baseAxis.getExtent(); + var bandWidth; + + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } else if (baseAxis.type === 'value' || baseAxis.type === 'time') { + var key = baseAxis.dim + '_' + baseAxis.index; + var minGap = axisMinGaps[key]; + var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]); + var scale = baseAxis.scale.getExtent(); + var scaleSpan = Math.abs(scale[1] - scale[0]); + bandWidth = minGap ? extentSpan / scaleSpan * minGap : extentSpan; // When there is only one data value + } else { + var data = seriesModel.getData(); + bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + } + + var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth); + var barMinWidth = parsePercent$1( // barMinWidth by default is 0.5 / 1 in cartesian. Because in value axis, + // the auto-calculated bar width might be less than 0.5 / 1. + seriesModel.get('barMinWidth') || (isInLargeMode(seriesModel) ? 0.5 : 1), bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + seriesInfoList.push({ + bandWidth: bandWidth, + barWidth: barWidth, + barMaxWidth: barMaxWidth, + barMinWidth: barMinWidth, + barGap: barGap, + barCategoryGap: barCategoryGap, + axisKey: getAxisKey(baseAxis), + stackId: getSeriesStackId(seriesModel) + }); + }); + return doCalBarWidthAndOffset(seriesInfoList); + } + + function doCalBarWidthAndOffset(seriesInfoList) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + each(seriesInfoList, function (seriesInfo, idx) { + var axisKey = seriesInfo.axisKey; + var bandWidth = seriesInfo.bandWidth; + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: null, + gap: '20%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = seriesInfo.stackId; + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; // Caution: In a single coordinate system, these barGrid attributes + // will be shared by series. Consider that they have default values, + // only the attributes set on the last series will work. + // Do not change this fact unless there will be a break change. + + var barWidth = seriesInfo.barWidth; + + if (barWidth && !stacks[stackId].width) { + // See #6312, do not restrict width. + stacks[stackId].width = barWidth; + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + columnsOnAxis.remainedWidth -= barWidth; + } + + var barMaxWidth = seriesInfo.barMaxWidth; + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + var barMinWidth = seriesInfo.barMinWidth; + barMinWidth && (stacks[stackId].minWidth = barMinWidth); + var barGap = seriesInfo.barGap; + barGap != null && (columnsOnAxis.gap = barGap); + var barCategoryGap = seriesInfo.barCategoryGap; + barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); + }); + var result = {}; + each(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGapPercent = columnsOnAxis.categoryGap; + + if (categoryGapPercent == null) { + var columnCount = keys(stacks).length; // More columns in one group + // the spaces between group is smaller. Or the column will be too thin. + + categoryGapPercent = Math.max(35 - columnCount * 4, 15) + '%'; + } + + var categoryGap = parsePercent$1(categoryGapPercent, bandWidth); + var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1); + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); // Find if any auto calculated bar exceeded maxBarWidth + + each(stacks, function (column) { + var maxWidth = column.maxWidth; + var minWidth = column.minWidth; + + if (!column.width) { + var finalWidth = autoWidth; + + if (maxWidth && maxWidth < finalWidth) { + finalWidth = Math.min(maxWidth, remainedWidth); + } // `minWidth` has higher priority. `minWidth` decide that wheter the + // bar is able to be visible. So `minWidth` should not be restricted + // by `maxWidth` or `remainedWidth` (which is from `bandWidth`). In + // the extreme cases for `value` axis, bars are allowed to overlap + // with each other if `minWidth` specified. + + + if (minWidth && minWidth > finalWidth) { + finalWidth = minWidth; + } + + if (finalWidth !== autoWidth) { + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + } else { + // `barMinWidth/barMaxWidth` has higher priority than `barWidth`, as + // CSS does. Becuase barWidth can be a percent value, where + // `barMaxWidth` can be used to restrict the final width. + var finalWidth = column.width; + + if (maxWidth) { + finalWidth = Math.min(finalWidth, maxWidth); + } // `minWidth` has higher priority, as described above + + + if (minWidth) { + finalWidth = Math.max(finalWidth, minWidth); + } + + column.width = finalWidth; + remainedWidth -= finalWidth + barGapPercent * finalWidth; + autoWidthCount--; + } + }); // Recalculate width again + + autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + var widthSum = 0; + var lastColumn; + each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + bandWidth: bandWidth, + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; + } + + function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) { + if (barWidthAndOffset && axis) { + var result = barWidthAndOffset[getAxisKey(axis)]; + + if (result != null && seriesModel != null) { + return result[getSeriesStackId(seriesModel)]; + } + + return result; + } + } + + function layout(seriesType, ecModel) { + var seriesModels = prepareLayoutBarSeries(seriesType, ecModel); + var barWidthAndOffset = makeColumnLayout(seriesModels); + each(seriesModels, function (seriesModel) { + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var stackId = getSeriesStackId(seriesModel); + var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + data.setLayout({ + bandWidth: columnLayoutInfo.bandWidth, + offset: columnOffset, + size: columnWidth + }); + }); + } // TODO: Do not support stack in large mode yet. + + function createProgressiveLayout(seriesType) { + return { + seriesType: seriesType, + plan: createRenderPlanner(), + reset: function (seriesModel) { + if (!isOnCartesian(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var valueAxis = cartesian.getOtherAxis(baseAxis); + var valueDimIdx = data.getDimensionIndex(data.mapDimension(valueAxis.dim)); + var baseDimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim)); + var drawBackground = seriesModel.get('showBackground', true); + var valueDim = data.mapDimension(valueAxis.dim); + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + var stacked = isDimensionStacked(data, valueDim) && !!data.getCalculationInfo('stackedOnSeries'); + var isValueAxisH = valueAxis.isHorizontal(); + var valueAxisStart = getValueAxisStart(baseAxis, valueAxis); + var isLarge = isInLargeMode(seriesModel); + var barMinHeight = seriesModel.get('barMinHeight') || 0; + var stackedDimIdx = stackResultDim && data.getDimensionIndex(stackResultDim); // Layout info. + + var columnWidth = data.getLayout('size'); + var columnOffset = data.getLayout('offset'); + return { + progress: function (params, data) { + var count = params.count; + var largePoints = isLarge && createFloat32Array(count * 3); + var largeBackgroundPoints = isLarge && drawBackground && createFloat32Array(count * 3); + var largeDataIndices = isLarge && createFloat32Array(count); + var coordLayout = cartesian.master.getRect(); + var bgSize = isValueAxisH ? coordLayout.width : coordLayout.height; + var dataIndex; + var store = data.getStore(); + var idxOffset = 0; + + while ((dataIndex = params.next()) != null) { + var value = store.get(stacked ? stackedDimIdx : valueDimIdx, dataIndex); + var baseValue = store.get(baseDimIdx, dataIndex); + var baseCoord = valueAxisStart; + var startValue = void 0; // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + + if (stacked) { + startValue = +value - store.get(valueDimIdx, dataIndex); + } + + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + + if (isValueAxisH) { + var coord = cartesian.dataToPoint([value, baseValue]); + + if (stacked) { + var startCoord = cartesian.dataToPoint([startValue, baseValue]); + baseCoord = startCoord[0]; + } + + x = baseCoord; + y = coord[1] + columnOffset; + width = coord[0] - baseCoord; + height = columnWidth; + + if (Math.abs(width) < barMinHeight) { + width = (width < 0 ? -1 : 1) * barMinHeight; + } + } else { + var coord = cartesian.dataToPoint([baseValue, value]); + + if (stacked) { + var startCoord = cartesian.dataToPoint([baseValue, startValue]); + baseCoord = startCoord[1]; + } + + x = coord[0] + columnOffset; + y = baseCoord; + width = columnWidth; + height = coord[1] - baseCoord; + + if (Math.abs(height) < barMinHeight) { + // Include zero to has a positive bar + height = (height <= 0 ? -1 : 1) * barMinHeight; + } + } + + if (!isLarge) { + data.setItemLayout(dataIndex, { + x: x, + y: y, + width: width, + height: height + }); + } else { + largePoints[idxOffset] = x; + largePoints[idxOffset + 1] = y; + largePoints[idxOffset + 2] = isValueAxisH ? width : height; + + if (largeBackgroundPoints) { + largeBackgroundPoints[idxOffset] = isValueAxisH ? coordLayout.x : x; + largeBackgroundPoints[idxOffset + 1] = isValueAxisH ? y : coordLayout.y; + largeBackgroundPoints[idxOffset + 2] = bgSize; + } + + largeDataIndices[dataIndex] = dataIndex; + } + + idxOffset += 3; + } + + if (isLarge) { + data.setLayout({ + largePoints: largePoints, + largeDataIndices: largeDataIndices, + largeBackgroundPoints: largeBackgroundPoints, + valueAxisHorizontal: isValueAxisH + }); + } + } + }; + } + }; + } + + function isOnCartesian(seriesModel) { + return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d'; + } + + function isInLargeMode(seriesModel) { + return seriesModel.pipelineContext && seriesModel.pipelineContext.large; + } // See cases in `test/bar-start.html` and `#7412`, `#8747`. + + + function getValueAxisStart(baseAxis, valueAxis) { + return valueAxis.toGlobalCoord(valueAxis.dataToCoord(valueAxis.type === 'log' ? 1 : 0)); + } + + var bisect = function (a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + + if (a[mid][1] < x) { + lo = mid + 1; + } else { + hi = mid; + } + } + + return lo; + }; + + var TimeScale = + /** @class */ + function (_super) { + __extends(TimeScale, _super); + + function TimeScale(settings) { + var _this = _super.call(this, settings) || this; + + _this.type = 'time'; + return _this; + } + + /** + * Get label is mainly for other components like dataZoom, tooltip. + */ + + + TimeScale.prototype.getLabel = function (tick) { + var useUTC = this.getSetting('useUTC'); + return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting('locale')); + }; + + TimeScale.prototype.getFormattedLabel = function (tick, idx, labelFormatter) { + var isUTC = this.getSetting('useUTC'); + var lang = this.getSetting('locale'); + return leveledFormat(tick, idx, labelFormatter, lang, isUTC); + }; + /** + * @override + */ + + + TimeScale.prototype.getTicks = function () { + var interval = this._interval; + var extent = this._extent; + var ticks = []; // If interval is 0, return []; + + if (!interval) { + return ticks; + } + + ticks.push({ + value: extent[0], + level: 0 + }); + var useUTC = this.getSetting('useUTC'); + var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent); + ticks = ticks.concat(innerTicks); + ticks.push({ + value: extent[1], + level: 0 + }); + return ticks; + }; + + TimeScale.prototype.calcNiceExtent = function (opt) { + var extent = this._extent; // If extent start and end are same, expand them + + if (extent[0] === extent[1]) { + // Expand extent + extent[0] -= ONE_DAY; + extent[1] += ONE_DAY; + } // If there are no data and extent are [Infinity, -Infinity] + + + if (extent[1] === -Infinity && extent[0] === Infinity) { + var d = new Date(); + extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate()); + extent[0] = extent[1] - ONE_DAY; + } + + this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); + }; + + TimeScale.prototype.calcNiceTicks = function (approxTickNum, minInterval, maxInterval) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + this._approxInterval = span / approxTickNum; + + if (minInterval != null && this._approxInterval < minInterval) { + this._approxInterval = minInterval; + } + + if (maxInterval != null && this._approxInterval > maxInterval) { + this._approxInterval = maxInterval; + } + + var scaleIntervalsLen = scaleIntervals.length; + var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1); // Interval that can be used to calculate ticks + + this._interval = scaleIntervals[idx][1]; // Min level used when picking ticks from top down. + // We check one more level to avoid the ticks are to sparse in some case. + + this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0]; + }; + + TimeScale.prototype.parse = function (val) { + // val might be float. + return isNumber(val) ? val : +parseDate(val); + }; + + TimeScale.prototype.contain = function (val) { + return contain$1(this.parse(val), this._extent); + }; + + TimeScale.prototype.normalize = function (val) { + return normalize$1(this.parse(val), this._extent); + }; + + TimeScale.prototype.scale = function (val) { + return scale$2(val, this._extent); + }; + + TimeScale.type = 'time'; + return TimeScale; + }(IntervalScale); + /** + * This implementation was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + + var scaleIntervals = [// Format interval + ['second', ONE_SECOND], ['minute', ONE_MINUTE], ['hour', ONE_HOUR], ['quarter-day', ONE_HOUR * 6], ['half-day', ONE_HOUR * 12], ['day', ONE_DAY * 1.2], ['half-week', ONE_DAY * 3.5], ['week', ONE_DAY * 7], ['month', ONE_DAY * 31], ['quarter', ONE_DAY * 95], ['half-year', ONE_YEAR / 2], ['year', ONE_YEAR] // 1Y + ]; + + function isUnitValueSame(unit, valueA, valueB, isUTC) { + var dateA = parseDate(valueA); + var dateB = parseDate(valueB); + + var isSame = function (unit) { + return getUnitValue(dateA, unit, isUTC) === getUnitValue(dateB, unit, isUTC); + }; + + var isSameYear = function () { + return isSame('year'); + }; // const isSameHalfYear = () => isSameYear() && isSame('half-year'); + // const isSameQuater = () => isSameYear() && isSame('quarter'); + + + var isSameMonth = function () { + return isSameYear() && isSame('month'); + }; + + var isSameDay = function () { + return isSameMonth() && isSame('day'); + }; // const isSameHalfDay = () => isSameDay() && isSame('half-day'); + + + var isSameHour = function () { + return isSameDay() && isSame('hour'); + }; + + var isSameMinute = function () { + return isSameHour() && isSame('minute'); + }; + + var isSameSecond = function () { + return isSameMinute() && isSame('second'); + }; + + var isSameMilliSecond = function () { + return isSameSecond() && isSame('millisecond'); + }; + + switch (unit) { + case 'year': + return isSameYear(); + + case 'month': + return isSameMonth(); + + case 'day': + return isSameDay(); + + case 'hour': + return isSameHour(); + + case 'minute': + return isSameMinute(); + + case 'second': + return isSameSecond(); + + case 'millisecond': + return isSameMilliSecond(); + } + } // const primaryUnitGetters = { + // year: fullYearGetterName(), + // month: monthGetterName(), + // day: dateGetterName(), + // hour: hoursGetterName(), + // minute: minutesGetterName(), + // second: secondsGetterName(), + // millisecond: millisecondsGetterName() + // }; + // const primaryUnitUTCGetters = { + // year: fullYearGetterName(true), + // month: monthGetterName(true), + // day: dateGetterName(true), + // hour: hoursGetterName(true), + // minute: minutesGetterName(true), + // second: secondsGetterName(true), + // millisecond: millisecondsGetterName(true) + // }; + // function moveTick(date: Date, unitName: TimeUnit, step: number, isUTC: boolean) { + // step = step || 1; + // switch (getPrimaryTimeUnit(unitName)) { + // case 'year': + // date[fullYearSetterName(isUTC)](date[fullYearGetterName(isUTC)]() + step); + // break; + // case 'month': + // date[monthSetterName(isUTC)](date[monthGetterName(isUTC)]() + step); + // break; + // case 'day': + // date[dateSetterName(isUTC)](date[dateGetterName(isUTC)]() + step); + // break; + // case 'hour': + // date[hoursSetterName(isUTC)](date[hoursGetterName(isUTC)]() + step); + // break; + // case 'minute': + // date[minutesSetterName(isUTC)](date[minutesGetterName(isUTC)]() + step); + // break; + // case 'second': + // date[secondsSetterName(isUTC)](date[secondsGetterName(isUTC)]() + step); + // break; + // case 'millisecond': + // date[millisecondsSetterName(isUTC)](date[millisecondsGetterName(isUTC)]() + step); + // break; + // } + // return date.getTime(); + // } + // const DATE_INTERVALS = [[8, 7.5], [4, 3.5], [2, 1.5]]; + // const MONTH_INTERVALS = [[6, 5.5], [3, 2.5], [2, 1.5]]; + // const MINUTES_SECONDS_INTERVALS = [[30, 30], [20, 20], [15, 15], [10, 10], [5, 5], [2, 2]]; + + + function getDateInterval(approxInterval, daysInMonth) { + approxInterval /= ONE_DAY; + return approxInterval > 16 ? 16 // Math.floor(daysInMonth / 2) + 1 // In this case we only want one tick betwen two month. + : approxInterval > 7.5 ? 7 // TODO week 7 or day 8? + : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1; + } + + function getMonthInterval(approxInterval) { + var APPROX_ONE_MONTH = 30 * ONE_DAY; + approxInterval /= APPROX_ONE_MONTH; + return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1; + } + + function getHourInterval(approxInterval) { + approxInterval /= ONE_HOUR; + return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1; + } + + function getMinutesAndSecondsInterval(approxInterval, isMinutes) { + approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND; + return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1; + } + + function getMillisecondsInterval(approxInterval) { + return nice(approxInterval, true); + } + + function getFirstTimestampOfUnit(date, unitName, isUTC) { + var outDate = new Date(date); + + switch (getPrimaryTimeUnit(unitName)) { + case 'year': + case 'month': + outDate[monthSetterName(isUTC)](0); + + case 'day': + outDate[dateSetterName(isUTC)](1); + + case 'hour': + outDate[hoursSetterName(isUTC)](0); + + case 'minute': + outDate[minutesSetterName(isUTC)](0); + + case 'second': + outDate[secondsSetterName(isUTC)](0); + outDate[millisecondsSetterName(isUTC)](0); + } + + return outDate.getTime(); + } + + function getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent) { + var safeLimit = 10000; + var unitNames = timeUnits; + var iter = 0; + + function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) { + var date = new Date(minTimestamp); + var dateTime = minTimestamp; + var d = date[getMethodName](); // if (isDate) { + // d -= 1; // Starts with 0; PENDING + // } + + while (dateTime < maxTimestamp && dateTime <= extent[1]) { + out.push({ + value: dateTime + }); + d += interval; + date[setMethodName](d); + dateTime = date.getTime(); + } // This extra tick is for calcuating ticks of next level. Will not been added to the final result + + + out.push({ + value: dateTime, + notAdd: true + }); + } + + function addLevelTicks(unitName, lastLevelTicks, levelTicks) { + var newAddedTicks = []; + var isFirstLevel = !lastLevelTicks.length; + + if (isUnitValueSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) { + return; + } + + if (isFirstLevel) { + lastLevelTicks = [{ + // TODO Optimize. Not include so may ticks. + value: getFirstTimestampOfUnit(new Date(extent[0]), unitName, isUTC) + }, { + value: extent[1] + }]; + } + + for (var i = 0; i < lastLevelTicks.length - 1; i++) { + var startTick = lastLevelTicks[i].value; + var endTick = lastLevelTicks[i + 1].value; + + if (startTick === endTick) { + continue; + } + + var interval = void 0; + var getterName = void 0; + var setterName = void 0; + var isDate = false; + + switch (unitName) { + case 'year': + interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365)); + getterName = fullYearGetterName(isUTC); + setterName = fullYearSetterName(isUTC); + break; + + case 'half-year': + case 'quarter': + case 'month': + interval = getMonthInterval(approxInterval); + getterName = monthGetterName(isUTC); + setterName = monthSetterName(isUTC); + break; + + case 'week': // PENDING If week is added. Ignore day. + + case 'half-week': + case 'day': + interval = getDateInterval(approxInterval); // Use 32 days and let interval been 16 + + getterName = dateGetterName(isUTC); + setterName = dateSetterName(isUTC); + isDate = true; + break; + + case 'half-day': + case 'quarter-day': + case 'hour': + interval = getHourInterval(approxInterval); + getterName = hoursGetterName(isUTC); + setterName = hoursSetterName(isUTC); + break; + + case 'minute': + interval = getMinutesAndSecondsInterval(approxInterval, true); + getterName = minutesGetterName(isUTC); + setterName = minutesSetterName(isUTC); + break; + + case 'second': + interval = getMinutesAndSecondsInterval(approxInterval, false); + getterName = secondsGetterName(isUTC); + setterName = secondsSetterName(isUTC); + break; + + case 'millisecond': + interval = getMillisecondsInterval(approxInterval); + getterName = millisecondsGetterName(isUTC); + setterName = millisecondsSetterName(isUTC); + break; + } + + addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks); + + if (unitName === 'year' && levelTicks.length > 1 && i === 0) { + // Add nearest years to the left extent. + levelTicks.unshift({ + value: levelTicks[0].value - interval + }); + } + } + + for (var i = 0; i < newAddedTicks.length; i++) { + levelTicks.push(newAddedTicks[i]); + } // newAddedTicks.length && console.log(unitName, newAddedTicks); + + + return newAddedTicks; + } + + var levelsTicks = []; + var currentLevelTicks = []; + var tickCount = 0; + var lastLevelTickCount = 0; + + for (var i = 0; i < unitNames.length && iter++ < safeLimit; ++i) { + var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]); + + if (!isPrimaryTimeUnit(unitNames[i])) { + // TODO + continue; + } + + addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks); + var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null; + + if (primaryTimeUnit !== nextPrimaryTimeUnit) { + if (currentLevelTicks.length) { + lastLevelTickCount = tickCount; // Remove the duplicate so the tick count can be precisely. + + currentLevelTicks.sort(function (a, b) { + return a.value - b.value; + }); + var levelTicksRemoveDuplicated = []; + + for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) { + var tickValue = currentLevelTicks[i_1].value; + + if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) { + levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]); + + if (tickValue >= extent[0] && tickValue <= extent[1]) { + tickCount++; + } + } + } + + var targetTickNum = (extent[1] - extent[0]) / approxInterval; // Added too much in this level and not too less in last level + + if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) { + break; + } // Only treat primary time unit as one level. + + + levelsTicks.push(levelTicksRemoveDuplicated); + + if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) { + break; + } + } // Reset if next unitName is primary + + + currentLevelTicks = []; + } + } + + if ("development" !== 'production') { + if (iter >= safeLimit) { + warn('Exceed safe limit.'); + } + } + + var levelsTicksInExtent = filter(map(levelsTicks, function (levelTicks) { + return filter(levelTicks, function (tick) { + return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd; + }); + }), function (levelTicks) { + return levelTicks.length > 0; + }); + var ticks = []; + var maxLevel = levelsTicksInExtent.length - 1; + + for (var i = 0; i < levelsTicksInExtent.length; ++i) { + var levelTicks = levelsTicksInExtent[i]; + + for (var k = 0; k < levelTicks.length; ++k) { + ticks.push({ + value: levelTicks[k].value, + level: maxLevel - i + }); + } + } + + ticks.sort(function (a, b) { + return a.value - b.value; + }); // Remove duplicates + + var result = []; + + for (var i = 0; i < ticks.length; ++i) { + if (i === 0 || ticks[i].value !== ticks[i - 1].value) { + result.push(ticks[i]); + } + } + + return result; + } + + Scale.registerClass(TimeScale); + + var scaleProto = Scale.prototype; // FIXME:TS refactor: not good to call it directly with `this`? + + var intervalScaleProto = IntervalScale.prototype; + var roundingErrorFix = round; + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + var mathPow$1 = Math.pow; + var mathLog = Math.log; + + var LogScale = + /** @class */ + function (_super) { + __extends(LogScale, _super); + + function LogScale() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'log'; + _this.base = 10; + _this._originalScale = new IntervalScale(); // FIXME:TS actually used by `IntervalScale` + + _this._interval = 0; + return _this; + } + + /** + * @param Whether expand the ticks to niced extent. + */ + + + LogScale.prototype.getTicks = function (expandToNicedExtent) { + var originalScale = this._originalScale; + var extent = this._extent; + var originalExtent = originalScale.getExtent(); + var ticks = intervalScaleProto.getTicks.call(this, expandToNicedExtent); + return map(ticks, function (tick) { + var val = tick.value; + var powVal = round(mathPow$1(this.base, val)); // Fix #4158 + + powVal = val === extent[0] && this._fixMin ? fixRoundingError(powVal, originalExtent[0]) : powVal; + powVal = val === extent[1] && this._fixMax ? fixRoundingError(powVal, originalExtent[1]) : powVal; + return { + value: powVal + }; + }, this); + }; + + LogScale.prototype.setExtent = function (start, end) { + var base = this.base; + start = mathLog(start) / mathLog(base); + end = mathLog(end) / mathLog(base); + intervalScaleProto.setExtent.call(this, start, end); + }; + /** + * @return {number} end + */ + + + LogScale.prototype.getExtent = function () { + var base = this.base; + var extent = scaleProto.getExtent.call(this); + extent[0] = mathPow$1(base, extent[0]); + extent[1] = mathPow$1(base, extent[1]); // Fix #4158 + + var originalScale = this._originalScale; + var originalExtent = originalScale.getExtent(); + this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); + this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); + return extent; + }; + + LogScale.prototype.unionExtent = function (extent) { + this._originalScale.unionExtent(extent); + + var base = this.base; + extent[0] = mathLog(extent[0]) / mathLog(base); + extent[1] = mathLog(extent[1]) / mathLog(base); + scaleProto.unionExtent.call(this, extent); + }; + + LogScale.prototype.unionExtentFromData = function (data, dim) { + // TODO + // filter value that <= 0 + this.unionExtent(data.getApproximateExtent(dim)); + }; + /** + * Update interval and extent of intervals for nice ticks + * @param approxTickNum default 10 Given approx tick number + */ + + + LogScale.prototype.calcNiceTicks = function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + + if (span === Infinity || span <= 0) { + return; + } + + var interval = quantity(span); + var err = approxTickNum / span * interval; // Filter ticks to get closer to the desired count. + + if (err <= 0.5) { + interval *= 10; + } // Interval should be integer + + + while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) { + interval *= 10; + } + + var niceExtent = [round(mathCeil(extent[0] / interval) * interval), round(mathFloor(extent[1] / interval) * interval)]; + this._interval = interval; + this._niceExtent = niceExtent; + }; + + LogScale.prototype.calcNiceExtent = function (opt) { + intervalScaleProto.calcNiceExtent.call(this, opt); + this._fixMin = opt.fixMin; + this._fixMax = opt.fixMax; + }; + + LogScale.prototype.parse = function (val) { + return val; + }; + + LogScale.prototype.contain = function (val) { + val = mathLog(val) / mathLog(this.base); + return contain$1(val, this._extent); + }; + + LogScale.prototype.normalize = function (val) { + val = mathLog(val) / mathLog(this.base); + return normalize$1(val, this._extent); + }; + + LogScale.prototype.scale = function (val) { + val = scale$2(val, this._extent); + return mathPow$1(this.base, val); + }; + + LogScale.type = 'log'; + return LogScale; + }(Scale); + + var proto = LogScale.prototype; + proto.getMinorTicks = intervalScaleProto.getMinorTicks; + proto.getLabel = intervalScaleProto.getLabel; + + function fixRoundingError(val, originalVal) { + return roundingErrorFix(val, getPrecision(originalVal)); + } + + Scale.registerClass(LogScale); + + var ScaleRawExtentInfo = + /** @class */ + function () { + function ScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis. + originalExtent) { + this._prepareParams(scale, model, originalExtent); + } + + /** + * Parameters depending on ouside (like model, user callback) + * are prepared and fixed here. + */ + + + ScaleRawExtentInfo.prototype._prepareParams = function (scale, model, // Usually: data extent from all series on this axis. + dataExtent) { + if (dataExtent[1] < dataExtent[0]) { + dataExtent = [NaN, NaN]; + } + + this._dataMin = dataExtent[0]; + this._dataMax = dataExtent[1]; + var isOrdinal = this._isOrdinal = scale.type === 'ordinal'; + this._needCrossZero = scale.type === 'interval' && model.getNeedCrossZero && model.getNeedCrossZero(); + var modelMinRaw = this._modelMinRaw = model.get('min', true); + + if (isFunction(modelMinRaw)) { + // This callback alway provide users the full data extent (before data filtered). + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMinRaw !== 'dataMin') { + this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw); + } + + var modelMaxRaw = this._modelMaxRaw = model.get('max', true); + + if (isFunction(modelMaxRaw)) { + // This callback alway provide users the full data extent (before data filtered). + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw({ + min: dataExtent[0], + max: dataExtent[1] + })); + } else if (modelMaxRaw !== 'dataMax') { + this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw); + } + + if (isOrdinal) { + // FIXME: there is a flaw here: if there is no "block" data processor like `dataZoom`, + // and progressive rendering is using, here the category result might just only contain + // the processed chunk rather than the entire result. + this._axisDataLen = model.getCategories().length; + } else { + var boundaryGap = model.get('boundaryGap'); + var boundaryGapArr = isArray(boundaryGap) ? boundaryGap : [boundaryGap || 0, boundaryGap || 0]; + + if (typeof boundaryGapArr[0] === 'boolean' || typeof boundaryGapArr[1] === 'boolean') { + if ("development" !== 'production') { + console.warn('Boolean type for boundaryGap is only ' + 'allowed for ordinal axis. Please use string in ' + 'percentage instead, e.g., "20%". Currently, ' + 'boundaryGap is set to be 0.'); + } + + this._boundaryGapInner = [0, 0]; + } else { + this._boundaryGapInner = [parsePercent(boundaryGapArr[0], 1), parsePercent(boundaryGapArr[1], 1)]; + } + } + }; + /** + * Calculate extent by prepared parameters. + * This method has no external dependency and can be called duplicatedly, + * getting the same result. + * If parameters changed, should call this method to recalcuate. + */ + + + ScaleRawExtentInfo.prototype.calculate = function () { + // Notice: When min/max is not set (that is, when there are null/undefined, + // which is the most common case), these cases should be ensured: + // (1) For 'ordinal', show all axis.data. + // (2) For others: + // + `boundaryGap` is applied (if min/max set, boundaryGap is + // disabled). + // + If `needCrossZero`, min/max should be zero, otherwise, min/max should + // be the result that originalExtent enlarged by boundaryGap. + // (3) If no data, it should be ensured that `scale.setBlank` is set. + var isOrdinal = this._isOrdinal; + var dataMin = this._dataMin; + var dataMax = this._dataMax; + var axisDataLen = this._axisDataLen; + var boundaryGapInner = this._boundaryGapInner; + var span = !isOrdinal ? dataMax - dataMin || Math.abs(dataMin) : null; // Currently if a `'value'` axis model min is specified as 'dataMin'/'dataMax', + // `boundaryGap` will not be used. It's the different from specifying as `null`/`undefined`. + + var min = this._modelMinRaw === 'dataMin' ? dataMin : this._modelMinNum; + var max = this._modelMaxRaw === 'dataMax' ? dataMax : this._modelMaxNum; // If `_modelMinNum`/`_modelMaxNum` is `null`/`undefined`, should not be fixed. + + var minFixed = min != null; + var maxFixed = max != null; + + if (min == null) { + min = isOrdinal ? axisDataLen ? 0 : NaN : dataMin - boundaryGapInner[0] * span; + } + + if (max == null) { + max = isOrdinal ? axisDataLen ? axisDataLen - 1 : NaN : dataMax + boundaryGapInner[1] * span; + } + + (min == null || !isFinite(min)) && (min = NaN); + (max == null || !isFinite(max)) && (max = NaN); + var isBlank = eqNaN(min) || eqNaN(max) || isOrdinal && !axisDataLen; // If data extent modified, need to recalculated to ensure cross zero. + + if (this._needCrossZero) { + // Axis is over zero and min is not set + if (min > 0 && max > 0 && !minFixed) { + min = 0; // minFixed = true; + } // Axis is under zero and max is not set + + + if (min < 0 && max < 0 && !maxFixed) { + max = 0; // maxFixed = true; + } // PENDING: + // When `needCrossZero` and all data is positive/negative, should it be ensured + // that the results processed by boundaryGap are positive/negative? + // If so, here `minFixed`/`maxFixed` need to be set. + + } + + var determinedMin = this._determinedMin; + var determinedMax = this._determinedMax; + + if (determinedMin != null) { + min = determinedMin; + minFixed = true; + } + + if (determinedMax != null) { + max = determinedMax; + maxFixed = true; + } // Ensure min/max be finite number or NaN here. (not to be null/undefined) + // `NaN` means min/max axis is blank. + + + return { + min: min, + max: max, + minFixed: minFixed, + maxFixed: maxFixed, + isBlank: isBlank + }; + }; + + ScaleRawExtentInfo.prototype.modifyDataMinMax = function (minMaxName, val) { + if ("development" !== 'production') { + assert(!this.frozen); + } + + this[DATA_MIN_MAX_ATTR[minMaxName]] = val; + }; + + ScaleRawExtentInfo.prototype.setDeterminedMinMax = function (minMaxName, val) { + var attr = DETERMINED_MIN_MAX_ATTR[minMaxName]; + + if ("development" !== 'production') { + assert(!this.frozen // Earse them usually means logic flaw. + && this[attr] == null); + } + + this[attr] = val; + }; + + ScaleRawExtentInfo.prototype.freeze = function () { + // @ts-ignore + this.frozen = true; + }; + + return ScaleRawExtentInfo; + }(); + var DETERMINED_MIN_MAX_ATTR = { + min: '_determinedMin', + max: '_determinedMax' + }; + var DATA_MIN_MAX_ATTR = { + min: '_dataMin', + max: '_dataMax' + }; + + /** + * Get scale min max and related info only depends on model settings. + * This method can be called after coordinate system created. + * For example, in data processing stage. + * + * Scale extent info probably be required multiple times during a workflow. + * For example: + * (1) `dataZoom` depends it to get the axis extent in "100%" state. + * (2) `processor/extentCalculator` depends it to make sure whether axis extent is specified. + * (3) `coordSys.update` use it to finally decide the scale extent. + * But the callback of `min`/`max` should not be called multiple times. + * The code below should not be implemented repeatedly either. + * So we cache the result in the scale instance, which will be recreated at the begining + * of the workflow (because `scale` instance will be recreated each round of the workflow). + */ + + function ensureScaleRawExtentInfo(scale, model, // Usually: data extent from all series on this axis. + originalExtent) { + // Do not permit to recreate. + var rawExtentInfo = scale.rawExtentInfo; + + if (rawExtentInfo) { + return rawExtentInfo; + } + + rawExtentInfo = new ScaleRawExtentInfo(scale, model, originalExtent); // @ts-ignore + + scale.rawExtentInfo = rawExtentInfo; + return rawExtentInfo; + } + + function parseAxisModelMinMax(scale, minMax) { + return minMax == null ? null : eqNaN(minMax) ? NaN : scale.parse(minMax); + } + + /** + * Get axis scale extent before niced. + * Item of returned array can only be number (including Infinity and NaN). + * + * Caution: + * Precondition of calling this method: + * The scale extent has been initialized using series data extent via + * `scale.setExtent` or `scale.unionExtentFromData`; + */ + + function getScaleExtent(scale, model) { + var scaleType = scale.type; + var rawExtentResult = ensureScaleRawExtentInfo(scale, model, scale.getExtent()).calculate(); + scale.setBlank(rawExtentResult.isBlank); + var min = rawExtentResult.min; + var max = rawExtentResult.max; // If bars are placed on a base axis of type time or interval account for axis boundary overflow and current axis + // is base axis + // FIXME + // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly. + // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent? + // Should not depend on series type `bar`? + // (3) Fix that might overlap when using dataZoom. + // (4) Consider other chart types using `barGrid`? + // See #6728, #4862, `test/bar-overflow-time-plot.html` + + var ecModel = model.ecModel; + + if (ecModel && scaleType === 'time' + /*|| scaleType === 'interval' */ + ) { + var barSeriesModels = prepareLayoutBarSeries('bar', ecModel); + var isBaseAxisAndHasBarSeries_1 = false; + each(barSeriesModels, function (seriesModel) { + isBaseAxisAndHasBarSeries_1 = isBaseAxisAndHasBarSeries_1 || seriesModel.getBaseAxis() === model.axis; + }); + + if (isBaseAxisAndHasBarSeries_1) { + // Calculate placement of bars on axis. TODO should be decoupled + // with barLayout + var barWidthAndOffset = makeColumnLayout(barSeriesModels); // Adjust axis min and max to account for overflow + + var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset); + min = adjustedScale.min; + max = adjustedScale.max; + } + } + + return { + extent: [min, max], + // "fix" means "fixed", the value should not be + // changed in the subsequent steps. + fixMin: rawExtentResult.minFixed, + fixMax: rawExtentResult.maxFixed + }; + } + + function adjustScaleForOverflow(min, max, model, // Only support cartesian coord yet. + barWidthAndOffset) { + // Get Axis Length + var axisExtent = model.axis.getExtent(); + var axisLength = axisExtent[1] - axisExtent[0]; // Get bars on current base axis and calculate min and max overflow + + var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis); + + if (barsOnCurrentAxis === undefined) { + return { + min: min, + max: max + }; + } + + var minOverflow = Infinity; + each(barsOnCurrentAxis, function (item) { + minOverflow = Math.min(item.offset, minOverflow); + }); + var maxOverflow = -Infinity; + each(barsOnCurrentAxis, function (item) { + maxOverflow = Math.max(item.offset + item.width, maxOverflow); + }); + minOverflow = Math.abs(minOverflow); + maxOverflow = Math.abs(maxOverflow); + var totalOverFlow = minOverflow + maxOverflow; // Calculate required buffer based on old range and overflow + + var oldRange = max - min; + var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength; + var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange; + max += overflowBuffer * (maxOverflow / totalOverFlow); + min -= overflowBuffer * (minOverflow / totalOverFlow); + return { + min: min, + max: max + }; + } // Precondition of calling this method: + // The scale extent has been initailized using series data extent via + // `scale.setExtent` or `scale.unionExtentFromData`; + + + function niceScaleExtent(scale, inModel) { + var model = inModel; + var extentInfo = getScaleExtent(scale, model); + var extent = extentInfo.extent; + var splitNumber = model.get('splitNumber'); + + if (scale instanceof LogScale) { + scale.base = model.get('logBase'); + } + + var scaleType = scale.type; + var interval = model.get('interval'); + var isIntervalOrTime = scaleType === 'interval' || scaleType === 'time'; + scale.setExtent(extent[0], extent[1]); + scale.calcNiceExtent({ + splitNumber: splitNumber, + fixMin: extentInfo.fixMin, + fixMax: extentInfo.fixMax, + minInterval: isIntervalOrTime ? model.get('minInterval') : null, + maxInterval: isIntervalOrTime ? model.get('maxInterval') : null + }); // If some one specified the min, max. And the default calculated interval + // is not good enough. He can specify the interval. It is often appeared + // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard + // to be 60. + // FIXME + + if (interval != null) { + scale.setInterval && scale.setInterval(interval); + } + } + + /** + * @param axisType Default retrieve from model.type + */ + + function createScaleByModel(model, axisType) { + axisType = axisType || model.get('type'); + + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(), + extent: [Infinity, -Infinity] + }); + + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + + default: + // case 'value'/'interval', 'log', or others. + return new (Scale.getClass(axisType) || IntervalScale)(); + } + } + } + + /** + * Check if the axis cross 0 + */ + + function ifAxisCrossZero(axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !(min > 0 && max > 0 || min < 0 && max < 0); + } + + /** + * @param axis + * @return Label formatter function. + * param: {number} tickValue, + * param: {number} idx, the index in all ticks. + * If category axis, this param is not required. + * return: {string} label string. + */ + + function makeLabelFormatter(axis) { + var labelFormatter = axis.getLabelModel().get('formatter'); + var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null; + + if (axis.scale.type === 'time') { + return function (tpl) { + return function (tick, idx) { + return axis.scale.getFormattedLabel(tick, idx, tpl); + }; + }(labelFormatter); + } else if (isString(labelFormatter)) { + return function (tpl) { + return function (tick) { + // For category axis, get raw value; for numeric axis, + // get formatted label like '1,333,444'. + var label = axis.scale.getLabel(tick); + var text = tpl.replace('{value}', label != null ? label : ''); + return text; + }; + }(labelFormatter); + } else if (isFunction(labelFormatter)) { + return function (cb) { + return function (tick, idx) { + // The original intention of `idx` is "the index of the tick in all ticks". + // But the previous implementation of category axis do not consider the + // `axisLabel.interval`, which cause that, for example, the `interval` is + // `1`, then the ticks "name5", "name7", "name9" are displayed, where the + // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep + // the definition here for back compatibility. + if (categoryTickStart != null) { + idx = tick.value - categoryTickStart; + } + + return cb(getAxisRawValue(axis, tick), idx, tick.level != null ? { + level: tick.level + } : null); + }; + }(labelFormatter); + } else { + return function (tick) { + return axis.scale.getLabel(tick); + }; + } + } + + function getAxisRawValue(axis, tick) { + // In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + return axis.type === 'category' ? axis.scale.getLabel(tick) : tick.value; + } + + /** + * @param axis + * @return Be null/undefined if no labels. + */ + + function estimateLabelUnionRect(axis) { + var axisModel = axis.model; + var scale = axis.scale; + + if (!axisModel.get(['axisLabel', 'show']) || scale.isBlank()) { + return; + } + + var realNumberScaleTicks; + var tickCount; + var categoryScaleExtent = scale.getExtent(); // Optimize for large category data, avoid call `getTicks()`. + + if (scale instanceof OrdinalScale) { + tickCount = scale.count(); + } else { + realNumberScaleTicks = scale.getTicks(); + tickCount = realNumberScaleTicks.length; + } + + var axisLabelModel = axis.getLabelModel(); + var labelFormatter = makeLabelFormatter(axis); + var rect; + var step = 1; // Simple optimization for large amount of labels + + if (tickCount > 40) { + step = Math.ceil(tickCount / 40); + } + + for (var i = 0; i < tickCount; i += step) { + var tick = realNumberScaleTicks ? realNumberScaleTicks[i] : { + value: categoryScaleExtent[0] + i + }; + var label = labelFormatter(tick, i); + var unrotatedSingleRect = axisLabelModel.getTextRect(label); + var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0); + rect ? rect.union(singleRect) : rect = singleRect; + } + + return rect; + } + + function rotateTextRect(textRect, rotate) { + var rotateRadians = rotate * Math.PI / 180; + var beforeWidth = textRect.width; + var beforeHeight = textRect.height; + var afterWidth = beforeWidth * Math.abs(Math.cos(rotateRadians)) + Math.abs(beforeHeight * Math.sin(rotateRadians)); + var afterHeight = beforeWidth * Math.abs(Math.sin(rotateRadians)) + Math.abs(beforeHeight * Math.cos(rotateRadians)); + var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight); + return rotatedRect; + } + + /** + * @param model axisLabelModel or axisTickModel + * @return {number|String} Can be null|'auto'|number|function + */ + + + function getOptionCategoryInterval(model) { + var interval = model.get('interval'); + return interval == null ? 'auto' : interval; + } + + /** + * Set `categoryInterval` as 0 implicitly indicates that + * show all labels reguardless of overlap. + * @param {Object} axis axisModel.axis + */ + + function shouldShowAllLabels(axis) { + return axis.type === 'category' && getOptionCategoryInterval(axis.getLabelModel()) === 0; + } + + function getDataDimensionsOnAxis(data, axisDim) { + // Remove duplicated dat dimensions caused by `getStackedDimension`. + var dataDimMap = {}; // Currently `mapDimensionsAll` will contain stack result dimension ('__\0ecstackresult'). + // PENDING: is it reasonable? Do we need to remove the original dim from "coord dim" since + // there has been stacked result dim? + + each(data.mapDimensionsAll(axisDim), function (dataDim) { + // For example, the extent of the original dimension + // is [0.1, 0.5], the extent of the `stackResultDimension` + // is [7, 9], the final extent should NOT include [0.1, 0.5], + // because there is no graphic corresponding to [0.1, 0.5]. + // See the case in `test/area-stack.html` `main1`, where area line + // stack needs `yAxis` not start from 0. + dataDimMap[getStackedDimension(data, dataDim)] = true; + }); + return keys(dataDimMap); + } + + function unionAxisExtentFromData(dataExtent, data, axisDim) { + if (data) { + each(getDataDimensionsOnAxis(data, axisDim), function (dim) { + var seriesExtent = data.getApproximateExtent(dim); + seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]); + seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]); + }); + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var AxisModelCommonMixin = + /** @class */ + function () { + function AxisModelCommonMixin() { + } + + AxisModelCommonMixin.prototype.getNeedCrossZero = function () { + var option = this.option; + return !option.scale; + }; + /** + * Should be implemented by each axis model if necessary. + * @return coordinate system model + */ + + + AxisModelCommonMixin.prototype.getCoordSysModel = function () { + return; + }; + + return AxisModelCommonMixin; + }(); + + /** + * Create a muti dimension List structure from seriesModel. + */ + + function createList(seriesModel) { + return createSeriesData(null, seriesModel); + } // export function createGraph(seriesModel) { + var dataStack$1 = { + isDimensionStacked: isDimensionStacked, + enableDataStack: enableDataStack, + getStackedDimension: getStackedDimension + }; + + /** + * Create scale + * @param {Array.} dataExtent + * @param {Object|module:echarts/Model} option If `optoin.type` + * is secified, it can only be `'value'` currently. + */ + + function createScale(dataExtent, option) { + var axisModel = option; + + if (!(option instanceof Model)) { + axisModel = new Model(option); // FIXME + // Currently AxisModelCommonMixin has nothing to do with the + // the requirements of `axisHelper.createScaleByModel`. For + // example the method `getCategories` and `getOrdinalMeta` + // are required for `'category'` axis, and ecModel are required + // for `'time'` axis. But occationally echarts-gl happened + // to only use `'value'` axis. + // zrUtil.mixin(axisModel, AxisModelCommonMixin); + } + + var scale = createScaleByModel(axisModel); + scale.setExtent(dataExtent[0], dataExtent[1]); + niceScaleExtent(scale, axisModel); + return scale; + } + + /** + * Mixin common methods to axis model, + * + * Inlcude methods + * `getFormattedLabels() => Array.` + * `getCategories() => Array.` + * `getMin(origin: boolean) => number` + * `getMax(origin: boolean) => number` + * `getNeedCrossZero() => boolean` + */ + + function mixinAxisModelCommonMethods(Model) { + mixin(Model, AxisModelCommonMixin); + } + + function createTextStyle$1(textStyleModel, opts) { + opts = opts || {}; + return createTextStyle(textStyleModel, null, null, opts.state !== 'normal'); + } + + var helper = /*#__PURE__*/Object.freeze({ + __proto__: null, + createList: createList, + getLayoutRect: getLayoutRect, + dataStack: dataStack$1, + createScale: createScale, + mixinAxisModelCommonMethods: mixinAxisModelCommonMethods, + getECData: getECData, + createTextStyle: createTextStyle$1, + createDimensions: createDimensions, + createSymbol: createSymbol, + enableHoverEmphasis: enableHoverEmphasis + }); + + var EPSILON$4 = 1e-8; + + function isAroundEqual$1(a, b) { + return Math.abs(a - b) < EPSILON$4; + } + + function contain$2(points, x, y) { + var w = 0; + var p = points[0]; + if (!p) { + return false; + } + for (var i = 1; i < points.length; i++) { + var p2 = points[i]; + w += windingLine(p[0], p[1], p2[0], p2[1], x, y); + p = p2; + } + var p0 = points[0]; + if (!isAroundEqual$1(p[0], p0[0]) || !isAroundEqual$1(p[1], p0[1])) { + w += windingLine(p[0], p[1], p0[0], p0[1], x, y); + } + return w !== 0; + } + + var TMP_TRANSFORM = []; + + function transformPoints(points, transform) { + for (var p = 0; p < points.length; p++) { + applyTransform(points[p], points[p], transform); + } + } + + function updateBBoxFromPoints(points, min$1, max$1, projection) { + for (var i = 0; i < points.length; i++) { + var p = points[i]; + + if (projection) { + // projection may return null point. + p = projection.project(p); + } + + if (p && isFinite(p[0]) && isFinite(p[1])) { + min(min$1, min$1, p); + max(max$1, max$1, p); + } + } + } + + function centroid(points) { + var signedArea = 0; + var cx = 0; + var cy = 0; + var len = points.length; + var x0 = points[len - 1][0]; + var y0 = points[len - 1][1]; // Polygon should been closed. + + for (var i = 0; i < len; i++) { + var x1 = points[i][0]; + var y1 = points[i][1]; + var a = x0 * y1 - x1 * y0; + signedArea += a; + cx += (x0 + x1) * a; + cy += (y0 + y1) * a; + x0 = x1; + y0 = y1; + } + + return signedArea ? [cx / signedArea / 3, cy / signedArea / 3, signedArea] : [points[0][0] || 0, points[0][1] || 0]; + } + + var Region = + /** @class */ + function () { + function Region(name) { + this.name = name; + } + + Region.prototype.setCenter = function (center) { + this._center = center; + }; + /** + * Get center point in data unit. That is, + * for GeoJSONRegion, the unit is lat/lng, + * for GeoSVGRegion, the unit is SVG local coord. + */ + + + Region.prototype.getCenter = function () { + var center = this._center; + + if (!center) { + // In most cases there are no need to calculate this center. + // So calculate only when called. + center = this._center = this.calcCenter(); + } + + return center; + }; + + return Region; + }(); + + var GeoJSONPolygonGeometry = + /** @class */ + function () { + function GeoJSONPolygonGeometry(exterior, interiors) { + this.type = 'polygon'; + this.exterior = exterior; + this.interiors = interiors; + } + + return GeoJSONPolygonGeometry; + }(); + + var GeoJSONLineStringGeometry = + /** @class */ + function () { + function GeoJSONLineStringGeometry(points) { + this.type = 'linestring'; + this.points = points; + } + + return GeoJSONLineStringGeometry; + }(); + + var GeoJSONRegion = + /** @class */ + function (_super) { + __extends(GeoJSONRegion, _super); + + function GeoJSONRegion(name, geometries, cp) { + var _this = _super.call(this, name) || this; + + _this.type = 'geoJSON'; + _this.geometries = geometries; + _this._center = cp && [cp[0], cp[1]]; + return _this; + } + + GeoJSONRegion.prototype.calcCenter = function () { + var geometries = this.geometries; + var largestGeo; + var largestGeoSize = 0; + + for (var i = 0; i < geometries.length; i++) { + var geo = geometries[i]; + var exterior = geo.exterior; // Simple trick to use points count instead of polygon area as region size. + // Ignore linestring + + var size = exterior && exterior.length; + + if (size > largestGeoSize) { + largestGeo = geo; + largestGeoSize = size; + } + } + + if (largestGeo) { + return centroid(largestGeo.exterior); + } // from bounding rect by default. + + + var rect = this.getBoundingRect(); + return [rect.x + rect.width / 2, rect.y + rect.height / 2]; + }; + + GeoJSONRegion.prototype.getBoundingRect = function (projection) { + var rect = this._rect; // Always recalculate if using projection. + + if (rect && !projection) { + return rect; + } + + var min = [Infinity, Infinity]; + var max = [-Infinity, -Infinity]; + var geometries = this.geometries; + each(geometries, function (geo) { + if (geo.type === 'polygon') { + // Doesn't consider hole + updateBBoxFromPoints(geo.exterior, min, max, projection); + } else { + each(geo.points, function (points) { + updateBBoxFromPoints(points, min, max, projection); + }); + } + }); // Normalie invalid bounding. + + if (!(isFinite(min[0]) && isFinite(min[1]) && isFinite(max[0]) && isFinite(max[1]))) { + min[0] = min[1] = max[0] = max[1] = 0; + } + + rect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + + if (!projection) { + this._rect = rect; + } + + return rect; + }; + + GeoJSONRegion.prototype.contain = function (coord) { + var rect = this.getBoundingRect(); + var geometries = this.geometries; + + if (!rect.contain(coord[0], coord[1])) { + return false; + } + + loopGeo: for (var i = 0, len = geometries.length; i < len; i++) { + var geo = geometries[i]; // Only support polygon. + + if (geo.type !== 'polygon') { + continue; + } + + var exterior = geo.exterior; + var interiors = geo.interiors; + + if (contain$2(exterior, coord[0], coord[1])) { + // Not in the region if point is in the hole. + for (var k = 0; k < (interiors ? interiors.length : 0); k++) { + if (contain$2(interiors[k], coord[0], coord[1])) { + continue loopGeo; + } + } + + return true; + } + } + + return false; + }; + /** + * Transform the raw coords to target bounding. + * @param x + * @param y + * @param width + * @param height + */ + + + GeoJSONRegion.prototype.transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var aspect = rect.width / rect.height; + + if (!width) { + width = aspect * height; + } else if (!height) { + height = width / aspect; + } + + var target = new BoundingRect(x, y, width, height); + var transform = rect.calculateTransform(target); + var geometries = this.geometries; + + for (var i = 0; i < geometries.length; i++) { + var geo = geometries[i]; + + if (geo.type === 'polygon') { + transformPoints(geo.exterior, transform); + each(geo.interiors, function (interior) { + transformPoints(interior, transform); + }); + } else { + each(geo.points, function (points) { + transformPoints(points, transform); + }); + } + } + + rect = this._rect; + rect.copy(target); // Update center + + this._center = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + }; + + GeoJSONRegion.prototype.cloneShallow = function (name) { + name == null && (name = this.name); + var newRegion = new GeoJSONRegion(name, this.geometries, this._center); + newRegion._rect = this._rect; + newRegion.transformTo = null; // Simply avoid to be called. + + return newRegion; + }; + + return GeoJSONRegion; + }(Region); + + var GeoSVGRegion = + /** @class */ + function (_super) { + __extends(GeoSVGRegion, _super); + + function GeoSVGRegion(name, elOnlyForCalculate) { + var _this = _super.call(this, name) || this; + + _this.type = 'geoSVG'; + _this._elOnlyForCalculate = elOnlyForCalculate; + return _this; + } + + GeoSVGRegion.prototype.calcCenter = function () { + var el = this._elOnlyForCalculate; + var rect = el.getBoundingRect(); + var center = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + var mat = identity(TMP_TRANSFORM); + var target = el; + + while (target && !target.isGeoSVGGraphicRoot) { + mul$1(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + invert(mat, mat); + applyTransform(center, center, mat); + return center; + }; + + return GeoSVGRegion; + }(Region); + + function decode(json) { + if (!json.UTF8Encoding) { + return json; + } + + var jsonCompressed = json; + var encodeScale = jsonCompressed.UTF8Scale; + + if (encodeScale == null) { + encodeScale = 1024; + } + + var features = jsonCompressed.features; + each(features, function (feature) { + var geometry = feature.geometry; + var encodeOffsets = geometry.encodeOffsets; + var coordinates = geometry.coordinates; // Geometry may be appeded manually in the script after json loaded. + // In this case this geometry is usually not encoded. + + if (!encodeOffsets) { + return; + } + + switch (geometry.type) { + case 'LineString': + geometry.coordinates = decodeRing(coordinates, encodeOffsets, encodeScale); + break; + + case 'Polygon': + decodeRings(coordinates, encodeOffsets, encodeScale); + break; + + case 'MultiLineString': + decodeRings(coordinates, encodeOffsets, encodeScale); + break; + + case 'MultiPolygon': + each(coordinates, function (rings, idx) { + return decodeRings(rings, encodeOffsets[idx], encodeScale); + }); + } + }); // Has been decoded + + jsonCompressed.UTF8Encoding = false; + return jsonCompressed; + } + + function decodeRings(rings, encodeOffsets, encodeScale) { + for (var c = 0; c < rings.length; c++) { + rings[c] = decodeRing(rings[c], encodeOffsets[c], encodeScale); + } + } + + function decodeRing(coordinate, encodeOffsets, encodeScale) { + var result = []; + var prevX = encodeOffsets[0]; + var prevY = encodeOffsets[1]; + + for (var i = 0; i < coordinate.length; i += 2) { + var x = coordinate.charCodeAt(i) - 64; + var y = coordinate.charCodeAt(i + 1) - 64; // ZigZag decoding + + x = x >> 1 ^ -(x & 1); + y = y >> 1 ^ -(y & 1); // Delta deocding + + x += prevX; + y += prevY; + prevX = x; + prevY = y; // Dequantize + + result.push([x / encodeScale, y / encodeScale]); + } + + return result; + } + + function parseGeoJSON(geoJson, nameProperty) { + geoJson = decode(geoJson); + return map(filter(geoJson.features, function (featureObj) { + // Output of mapshaper may have geometry null + return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0; + }), function (featureObj) { + var properties = featureObj.properties; + var geo = featureObj.geometry; + var geometries = []; + + switch (geo.type) { + case 'Polygon': + var coordinates = geo.coordinates; // According to the GeoJSON specification. + // First must be exterior, and the rest are all interior(holes). + + geometries.push(new GeoJSONPolygonGeometry(coordinates[0], coordinates.slice(1))); + break; + + case 'MultiPolygon': + each(geo.coordinates, function (item) { + if (item[0]) { + geometries.push(new GeoJSONPolygonGeometry(item[0], item.slice(1))); + } + }); + break; + + case 'LineString': + geometries.push(new GeoJSONLineStringGeometry([geo.coordinates])); + break; + + case 'MultiLineString': + geometries.push(new GeoJSONLineStringGeometry(geo.coordinates)); + } + + var region = new GeoJSONRegion(properties[nameProperty || 'name'], geometries, properties.cp); + region.properties = properties; + return region; + }); + } + + var number = /*#__PURE__*/Object.freeze({ + __proto__: null, + linearMap: linearMap, + round: round, + asc: asc, + getPrecision: getPrecision, + getPrecisionSafe: getPrecisionSafe, + getPixelPrecision: getPixelPrecision, + getPercentWithPrecision: getPercentWithPrecision, + MAX_SAFE_INTEGER: MAX_SAFE_INTEGER, + remRadian: remRadian, + isRadianAroundZero: isRadianAroundZero, + parseDate: parseDate, + quantity: quantity, + quantityExponent: quantityExponent, + nice: nice, + quantile: quantile, + reformIntervals: reformIntervals, + isNumeric: isNumeric, + numericToNumber: numericToNumber + }); + + var time = /*#__PURE__*/Object.freeze({ + __proto__: null, + parse: parseDate, + format: format + }); + + var graphic$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + extendShape: extendShape, + extendPath: extendPath, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath$1, + resizePath: resizePath, + createIcon: createIcon, + updateProps: updateProps, + initProps: initProps, + getTransform: getTransform, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + registerShape: registerShape, + getShapeClass: getShapeClass, + Group: Group, + Image: ZRImage, + Text: ZRText, + Circle: Circle, + Ellipse: Ellipse, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayable, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect + }); + + var format$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + addCommas: addCommas, + toCamelCase: toCamelCase, + normalizeCssArray: normalizeCssArray$1, + encodeHTML: encodeHTML, + formatTpl: formatTpl, + getTooltipMarker: getTooltipMarker, + formatTime: formatTime, + capitalFirst: capitalFirst, + truncateText: truncateText, + getTextRect: getTextRect + }); + + var util$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + map: map, + each: each, + indexOf: indexOf, + inherits: inherits, + reduce: reduce, + filter: filter, + bind: bind, + curry: curry, + isArray: isArray, + isString: isString, + isObject: isObject, + isFunction: isFunction, + extend: extend, + defaults: defaults, + clone: clone, + merge: merge + }); + + var inner$5 = makeInner(); + + function createAxisLabels(axis) { + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryLabels(axis) : makeRealNumberLabels(axis); + } + + /** + * @param {module:echats/coord/Axis} axis + * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea. + * @return {Object} { + * ticks: Array. + * tickCategoryInterval: number + * } + */ + + function createAxisTicks(axis, tickModel) { + // Only ordinal scale support tick interval + return axis.type === 'category' ? makeCategoryTicks(axis, tickModel) : { + ticks: map(axis.scale.getTicks(), function (tick) { + return tick.value; + }) + }; + } + + function makeCategoryLabels(axis) { + var labelModel = axis.getLabelModel(); + var result = makeCategoryLabelsActually(axis, labelModel); + return !labelModel.get('show') || axis.scale.isBlank() ? { + labels: [], + labelCategoryInterval: result.labelCategoryInterval + } : result; + } + + function makeCategoryLabelsActually(axis, labelModel) { + var labelsCache = getListCache(axis, 'labels'); + var optionLabelInterval = getOptionCategoryInterval(labelModel); + var result = listCacheGet(labelsCache, optionLabelInterval); + + if (result) { + return result; + } + + var labels; + var numericLabelInterval; + + if (isFunction(optionLabelInterval)) { + labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval); + } else { + numericLabelInterval = optionLabelInterval === 'auto' ? makeAutoCategoryInterval(axis) : optionLabelInterval; + labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval); + } // Cache to avoid calling interval function repeatly. + + + return listCacheSet(labelsCache, optionLabelInterval, { + labels: labels, + labelCategoryInterval: numericLabelInterval + }); + } + + function makeCategoryTicks(axis, tickModel) { + var ticksCache = getListCache(axis, 'ticks'); + var optionTickInterval = getOptionCategoryInterval(tickModel); + var result = listCacheGet(ticksCache, optionTickInterval); + + if (result) { + return result; + } + + var ticks; + var tickCategoryInterval; // Optimize for the case that large category data and no label displayed, + // we should not return all ticks. + + if (!tickModel.get('show') || axis.scale.isBlank()) { + ticks = []; + } + + if (isFunction(optionTickInterval)) { + ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true); + } // Always use label interval by default despite label show. Consider this + // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows + // labels. `splitLine` and `axisTick` should be consistent in this case. + else if (optionTickInterval === 'auto') { + var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel()); + tickCategoryInterval = labelsResult.labelCategoryInterval; + ticks = map(labelsResult.labels, function (labelItem) { + return labelItem.tickValue; + }); + } else { + tickCategoryInterval = optionTickInterval; + ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true); + } // Cache to avoid calling interval function repeatly. + + + return listCacheSet(ticksCache, optionTickInterval, { + ticks: ticks, + tickCategoryInterval: tickCategoryInterval + }); + } + + function makeRealNumberLabels(axis) { + var ticks = axis.scale.getTicks(); + var labelFormatter = makeLabelFormatter(axis); + return { + labels: map(ticks, function (tick, idx) { + return { + level: tick.level, + formattedLabel: labelFormatter(tick, idx), + rawLabel: axis.scale.getLabel(tick), + tickValue: tick.value + }; + }) + }; + } + + function getListCache(axis, prop) { + // Because key can be funciton, and cache size always be small, we use array cache. + return inner$5(axis)[prop] || (inner$5(axis)[prop] = []); + } + + function listCacheGet(cache, key) { + for (var i = 0; i < cache.length; i++) { + if (cache[i].key === key) { + return cache[i].value; + } + } + } + + function listCacheSet(cache, key, value) { + cache.push({ + key: key, + value: value + }); + return value; + } + + function makeAutoCategoryInterval(axis) { + var result = inner$5(axis).autoInterval; + return result != null ? result : inner$5(axis).autoInterval = axis.calculateCategoryInterval(); + } + + /** + * Calculate interval for category axis ticks and labels. + * To get precise result, at least one of `getRotate` and `isHorizontal` + * should be implemented in axis. + */ + + + function calculateCategoryInterval(axis) { + var params = fetchAutoCategoryIntervalCalculationParams(axis); + var labelFormatter = makeLabelFormatter(axis); + var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI; + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var step = 1; // Simple optimization. Empirical value: tick count should less than 40. + + if (tickCount > 40) { + step = Math.max(1, Math.floor(tickCount / 40)); + } + + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitW = Math.abs(unitSpan * Math.cos(rotation)); + var unitH = Math.abs(unitSpan * Math.sin(rotation)); + var maxW = 0; + var maxH = 0; // Caution: Performance sensitive for large category data. + // Consider dataZoom, we should make appropriate step to avoid O(n) loop. + + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + var width = 0; + var height = 0; // Not precise, do not consider align and vertical align + // and each distance from axis line yet. + + var rect = getBoundingRect(labelFormatter({ + value: tickValue + }), params.font, 'center', 'top'); // Magic number + + width = rect.width * 1.3; + height = rect.height * 1.3; // Min size, void long loop. + + maxW = Math.max(maxW, width, 7); + maxH = Math.max(maxH, height, 7); + } + + var dw = maxW / unitW; + var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity. + + isNaN(dw) && (dw = Infinity); + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(Math.min(dw, dh))); + var cache = inner$5(axis.model); + var axisExtent = axis.getExtent(); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + // For example, if all of the axis labels are `a, b, c, d, e, f, g`. + // The jitter will cause that sometimes the displayed labels are + // `a, d, g` (interval: 2) sometimes `a, c, e`(interval: 1). + + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval // If the axis change is caused by chart resize, the cache should not + // be used. Otherwise some hiden labels might not be shown again. + && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1]) { + interval = lastAutoInterval; + } // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + cache.axisExtent0 = axisExtent[0]; + cache.axisExtent1 = axisExtent[1]; + } + + return interval; + } + + function fetchAutoCategoryIntervalCalculationParams(axis) { + var labelModel = axis.getLabelModel(); + return { + axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0, + labelRotate: labelModel.get('rotate') || 0, + font: labelModel.getFont() + }; + } + + function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) { + var labelFormatter = makeLabelFormatter(axis); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); + var labelModel = axis.getLabelModel(); + var result = []; // TODO: axisType: ordinalTime, pick the tick from each month/day/year/... + + var step = Math.max((categoryInterval || 0) + 1, 1); + var startTick = ordinalExtent[0]; + var tickCount = ordinalScale.count(); // Calculate start tick based on zero if possible to keep label consistent + // while zooming and moving while interval > 0. Otherwise the selection + // of displayable ticks and symbols probably keep changing. + // 3 is empirical value. + + if (startTick !== 0 && step > 1 && tickCount / step > 2) { + startTick = Math.round(Math.ceil(startTick / step) * step); + } // (1) Only add min max label here but leave overlap checking + // to render stage, which also ensure the returned list + // suitable for splitLine and splitArea rendering. + // (2) Scales except category always contain min max label so + // do not need to perform this process. + + + var showAllLabel = shouldShowAllLabels(axis); + var includeMinLabel = labelModel.get('showMinLabel') || showAllLabel; + var includeMaxLabel = labelModel.get('showMaxLabel') || showAllLabel; + + if (includeMinLabel && startTick !== ordinalExtent[0]) { + addItem(ordinalExtent[0]); + } // Optimize: avoid generating large array by `ordinalScale.getTicks()`. + + + var tickValue = startTick; + + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + addItem(tickValue); + } + + if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) { + addItem(ordinalExtent[1]); + } + + function addItem(tickValue) { + var tickObj = { + value: tickValue + }; + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tickObj), + rawLabel: ordinalScale.getLabel(tickObj), + tickValue: tickValue + }); + } + + return result; + } + + function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) { + var ordinalScale = axis.scale; + var labelFormatter = makeLabelFormatter(axis); + var result = []; + each(ordinalScale.getTicks(), function (tick) { + var rawLabel = ordinalScale.getLabel(tick); + var tickValue = tick.value; + + if (categoryInterval(tick.value, rawLabel)) { + result.push(onlyTick ? tickValue : { + formattedLabel: labelFormatter(tick), + rawLabel: rawLabel, + tickValue: tickValue + }); + } + }); + return result; + } + + var NORMALIZED_EXTENT = [0, 1]; + /** + * Base class of Axis. + */ + + var Axis = + /** @class */ + function () { + function Axis(dim, scale, extent) { + this.onBand = false; + this.inverse = false; + this.dim = dim; + this.scale = scale; + this._extent = extent || [0, 0]; + } + + /** + * If axis extent contain given coord + */ + + + Axis.prototype.contain = function (coord) { + var extent = this._extent; + var min = Math.min(extent[0], extent[1]); + var max = Math.max(extent[0], extent[1]); + return coord >= min && coord <= max; + }; + /** + * If axis extent contain given data + */ + + + Axis.prototype.containData = function (data) { + return this.scale.contain(data); + }; + /** + * Get coord extent. + */ + + + Axis.prototype.getExtent = function () { + return this._extent.slice(); + }; + /** + * Get precision used for formatting + */ + + + Axis.prototype.getPixelPrecision = function (dataExtent) { + return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent); + }; + /** + * Set coord extent + */ + + + Axis.prototype.setExtent = function (start, end) { + var extent = this._extent; + extent[0] = start; + extent[1] = end; + }; + /** + * Convert data to coord. Data is the rank if it has an ordinal scale + */ + + + Axis.prototype.dataToCoord = function (data, clamp) { + var extent = this._extent; + var scale = this.scale; + data = scale.normalize(data); + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + return linearMap(data, NORMALIZED_EXTENT, extent, clamp); + }; + /** + * Convert coord to data. Data is the rank if it has an ordinal scale + */ + + + Axis.prototype.coordToData = function (coord, clamp) { + var extent = this._extent; + var scale = this.scale; + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp); + return this.scale.scale(t); + }; + /** + * Convert pixel point to data in axis + */ + + + Axis.prototype.pointToData = function (point, clamp) { + // Should be implemented in derived class if necessary. + return; + }; + /** + * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`, + * `axis.getTicksCoords` considers `onBand`, which is used by + * `boundaryGap:true` of category axis and splitLine and splitArea. + * @param opt.tickModel default: axis.model.getModel('axisTick') + * @param opt.clamp If `true`, the first and the last + * tick must be at the axis end points. Otherwise, clip ticks + * that outside the axis extent. + */ + + + Axis.prototype.getTicksCoords = function (opt) { + opt = opt || {}; + var tickModel = opt.tickModel || this.getTickModel(); + var result = createAxisTicks(this, tickModel); + var ticks = result.ticks; + var ticksCoords = map(ticks, function (tickVal) { + return { + coord: this.dataToCoord(this.scale.type === 'ordinal' ? this.scale.getRawOrdinalNumber(tickVal) : tickVal), + tickValue: tickVal + }; + }, this); + var alignWithLabel = tickModel.get('alignWithLabel'); + fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp); + return ticksCoords; + }; + + Axis.prototype.getMinorTicksCoords = function () { + if (this.scale.type === 'ordinal') { + // Category axis doesn't support minor ticks + return []; + } + + var minorTickModel = this.model.getModel('minorTick'); + var splitNumber = minorTickModel.get('splitNumber'); // Protection. + + if (!(splitNumber > 0 && splitNumber < 100)) { + splitNumber = 5; + } + + var minorTicks = this.scale.getMinorTicks(splitNumber); + var minorTicksCoords = map(minorTicks, function (minorTicksGroup) { + return map(minorTicksGroup, function (minorTick) { + return { + coord: this.dataToCoord(minorTick), + tickValue: minorTick + }; + }, this); + }, this); + return minorTicksCoords; + }; + + Axis.prototype.getViewLabels = function () { + return createAxisLabels(this).labels; + }; + + Axis.prototype.getLabelModel = function () { + return this.model.getModel('axisLabel'); + }; + /** + * Notice here we only get the default tick model. For splitLine + * or splitArea, we should pass the splitLineModel or splitAreaModel + * manually when calling `getTicksCoords`. + * In GL, this method may be overrided to: + * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));` + */ + + + Axis.prototype.getTickModel = function () { + return this.model.getModel('axisTick'); + }; + /** + * Get width of band + */ + + + Axis.prototype.getBandWidth = function () { + var axisExtent = this._extent; + var dataExtent = this.scale.getExtent(); + var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); // Fix #2728, avoid NaN when only one data. + + len === 0 && (len = 1); + var size = Math.abs(axisExtent[1] - axisExtent[0]); + return Math.abs(size) / len; + }; + /** + * Only be called in category axis. + * Can be overrided, consider other axes like in 3D. + * @return Auto interval for cateogry axis tick and label + */ + + + Axis.prototype.calculateCategoryInterval = function () { + return calculateCategoryInterval(this); + }; + + return Axis; + }(); + + function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; + } // If axis has labels [1, 2, 3, 4]. Bands on the axis are + // |---1---|---2---|---3---|---4---|. + // So the displayed ticks and splitLine/splitArea should between + // each data item, otherwise cause misleading (e.g., split tow bars + // of a single data item when there are two bar series). + // Also consider if tickCategoryInterval > 0 and onBand, ticks and + // splitLine/spliteArea should layout appropriately corresponding + // to displayed labels. (So we should not use `getBandWidth` in this + // case). + + + function fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp) { + var ticksLen = ticksCoords.length; + + if (!axis.onBand || alignWithLabel || !ticksLen) { + return; + } + + var axisExtent = axis.getExtent(); + var last; + var diffSize; + + if (ticksLen === 1) { + ticksCoords[0].coord = axisExtent[0]; + last = ticksCoords[1] = { + coord: axisExtent[0] + }; + } else { + var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue; + var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen; + each(ticksCoords, function (ticksItem) { + ticksItem.coord -= shift_1 / 2; + }); + var dataExtent = axis.scale.getExtent(); + diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue; + last = { + coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize + }; + ticksCoords.push(last); + } + + var inverse = axisExtent[0] > axisExtent[1]; // Handling clamp. + + if (littleThan(ticksCoords[0].coord, axisExtent[0])) { + clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift(); + } + + if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) { + ticksCoords.unshift({ + coord: axisExtent[0] + }); + } + + if (littleThan(axisExtent[1], last.coord)) { + clamp ? last.coord = axisExtent[1] : ticksCoords.pop(); + } + + if (clamp && littleThan(last.coord, axisExtent[1])) { + ticksCoords.push({ + coord: axisExtent[1] + }); + } + + function littleThan(a, b) { + // Avoid rounding error cause calculated tick coord different with extent. + // It may cause an extra unecessary tick added. + a = round(a); + b = round(b); + return inverse ? a > b : a < b; + } + } + + // Should use `ComponentModel.extend` or `class XXXX extend ComponentModel` to create class. + // Then use `registerComponentModel` in `install` parameter when `use` this extension. For example: + // class Bar3DModel extends ComponentModel {} + // export function install(registers) { regsiters.registerComponentModel(Bar3DModel); } + // echarts.use(install); + + function extendComponentModel(proto) { + var Model = ComponentModel.extend(proto); + ComponentModel.registerClass(Model); + return Model; + } + + function extendComponentView(proto) { + var View = ComponentView.extend(proto); + ComponentView.registerClass(View); + return View; + } + + function extendSeriesModel(proto) { + var Model = SeriesModel.extend(proto); + SeriesModel.registerClass(Model); + return Model; + } + + function extendChartView(proto) { + var View = ChartView.extend(proto); + ChartView.registerClass(View); + return View; + } + + var PI2$6 = Math.PI * 2; + var CMD$3 = PathProxy.CMD; + var DEFAULT_SEARCH_SPACE = ['top', 'right', 'bottom', 'left']; + + function getCandidateAnchor(pos, distance, rect, outPt, outDir) { + var width = rect.width; + var height = rect.height; + + switch (pos) { + case 'top': + outPt.set(rect.x + width / 2, rect.y - distance); + outDir.set(0, -1); + break; + + case 'bottom': + outPt.set(rect.x + width / 2, rect.y + height + distance); + outDir.set(0, 1); + break; + + case 'left': + outPt.set(rect.x - distance, rect.y + height / 2); + outDir.set(-1, 0); + break; + + case 'right': + outPt.set(rect.x + width + distance, rect.y + height / 2); + outDir.set(1, 0); + break; + } + } + + function projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) { + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + x /= d; + y /= d; // Intersect point. + + var ox = x * r + cx; + var oy = y * r + cy; + + if (Math.abs(startAngle - endAngle) % PI2$6 < 1e-4) { + // Is a circle + out[0] = ox; + out[1] = oy; + return d - r; + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + + if (startAngle > endAngle) { + endAngle += PI2$6; + } + + var angle = Math.atan2(y, x); + + if (angle < 0) { + angle += PI2$6; + } + + if (angle >= startAngle && angle <= endAngle || angle + PI2$6 >= startAngle && angle + PI2$6 <= endAngle) { + // Project point is on the arc. + out[0] = ox; + out[1] = oy; + return d - r; + } + + var x1 = r * Math.cos(startAngle) + cx; + var y1 = r * Math.sin(startAngle) + cy; + var x2 = r * Math.cos(endAngle) + cx; + var y2 = r * Math.sin(endAngle) + cy; + var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y); + var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y); + + if (d1 < d2) { + out[0] = x1; + out[1] = y1; + return Math.sqrt(d1); + } else { + out[0] = x2; + out[1] = y2; + return Math.sqrt(d2); + } + } + + function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) { + var dx = x - x1; + var dy = y - y1; + var dx1 = x2 - x1; + var dy1 = y2 - y1; + var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1); + dx1 /= lineLen; + dy1 /= lineLen; // dot product + + var projectedLen = dx * dx1 + dy * dy1; + var t = projectedLen / lineLen; + + if (limitToEnds) { + t = Math.min(Math.max(t, 0), 1); + } + + t *= lineLen; + var ox = out[0] = x1 + t * dx1; + var oy = out[1] = y1 + t * dy1; + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); + } + + function projectPointToRect(x1, y1, width, height, x, y, out) { + if (width < 0) { + x1 = x1 + width; + width = -width; + } + + if (height < 0) { + y1 = y1 + height; + height = -height; + } + + var x2 = x1 + width; + var y2 = y1 + height; + var ox = out[0] = Math.min(Math.max(x, x1), x2); + var oy = out[1] = Math.min(Math.max(y, y1), y2); + return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y)); + } + + var tmpPt = []; + + function nearestPointOnRect(pt, rect, out) { + var dist = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt); + out.set(tmpPt[0], tmpPt[1]); + return dist; + } + + /** + * Calculate min distance corresponding point. + * This method won't evaluate if point is in the path. + */ + + + function nearestPointOnPath(pt, path, out) { + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + var x1; + var y1; + var minDist = Infinity; + var data = path.data; + var x = pt.x; + var y = pt.y; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + + if (i === 1) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + } + + var d = minDist; + + switch (cmd) { + case CMD$3.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + + case CMD$3.L: + d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.C: + d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.Q: + d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt); + xi = data[i++]; + yi = data[i++]; + break; + + case CMD$3.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; // TODO Arc 旋转 + + i += 1; + var anticlockwise = !!(1 - data[i++]); + x1 = Math.cos(theta) * rx + cx; + y1 = Math.sin(theta) * ry + cy; // 不是直接使用 arc 命令 + + if (i <= 1) { + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + + + var _x = (x - cx) * ry / rx + cx; + + d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt); + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + + case CMD$3.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + d = projectPointToRect(x0, y0, width, height, x, y, tmpPt); + break; + + case CMD$3.Z: + d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true); + xi = x0; + yi = y0; + break; + } + + if (d < minDist) { + minDist = d; + out.set(tmpPt[0], tmpPt[1]); + } + } + + return minDist; + } // Temporal varible for intermediate usage. + + + var pt0 = new Point(); + var pt1 = new Point(); + var pt2 = new Point(); + var dir = new Point(); + var dir2 = new Point(); + + /** + * Calculate a proper guide line based on the label position and graphic element definition + * @param label + * @param labelRect + * @param target + * @param targetRect + */ + + function updateLabelLinePoints(target, labelLineModel) { + if (!target) { + return; + } + + var labelLine = target.getTextGuideLine(); + var label = target.getTextContent(); // Needs to create text guide in each charts. + + if (!(label && labelLine)) { + return; + } + + var labelGuideConfig = target.textGuideLineConfig || {}; + var points = [[0, 0], [0, 0], [0, 0]]; + var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE; + var labelRect = label.getBoundingRect().clone(); + labelRect.applyTransform(label.getComputedTransform()); + var minDist = Infinity; + var anchorPoint = labelGuideConfig.anchor; + var targetTransform = target.getComputedTransform(); + var targetInversedTransform = targetTransform && invert([], targetTransform); + var len = labelLineModel.get('length2') || 0; + + if (anchorPoint) { + pt2.copy(anchorPoint); + } + + for (var i = 0; i < searchSpace.length; i++) { + var candidate = searchSpace[i]; + getCandidateAnchor(candidate, 0, labelRect, pt0, dir); + Point.scaleAndAdd(pt1, pt0, dir, len); // Transform to target coord space. + + pt1.transform(targetInversedTransform); // Note: getBoundingRect will ensure the `path` being created. + + var boundingRect = target.getBoundingRect(); + var dist = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2); // TODO pt2 is in the path + + if (dist < minDist) { + minDist = dist; // Transform back to global space. + + pt1.transform(targetTransform); + pt2.transform(targetTransform); + pt2.toArray(points[0]); + pt1.toArray(points[1]); + pt0.toArray(points[2]); + } + } + + limitTurnAngle(points, labelLineModel.get('minTurnAngle')); + labelLine.setShape({ + points: points + }); + } // Temporal variable for the limitTurnAngle function + + var tmpArr = []; + var tmpProjPoint = new Point(); + + /** + * Reduce the line segment attached to the label to limit the turn angle between two segments. + * @param linePoints + * @param minTurnAngle Radian of minimum turn angle. 0 - 180 + */ + + function limitTurnAngle(linePoints, minTurnAngle) { + if (!(minTurnAngle <= 180 && minTurnAngle > 0)) { + return; + } + + minTurnAngle = minTurnAngle / 180 * Math.PI; // The line points can be + // /pt1----pt2 (label) + // / + // pt0/ + + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt0, pt1); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(dir2); + var minTurnAngleCos = Math.cos(minTurnAngle); + + if (minTurnAngleCos < angleCos) { + // Smaller than minTurnAngle + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); + tmpProjPoint.fromArray(tmpArr); // Calculate new projected length with limited minTurnAngle and get the new connect point + + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); // Limit the new calculated connect point between pt1 and pt2. + + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + + if (isNaN(t)) { + return; + } + + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + + tmpProjPoint.toArray(linePoints[1]); + } + } + + /** + * Limit the angle of line and the surface + * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite + */ + + function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) { + if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) { + return; + } + + maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI; + pt0.fromArray(linePoints[0]); + pt1.fromArray(linePoints[1]); + pt2.fromArray(linePoints[2]); + Point.sub(dir, pt1, pt0); + Point.sub(dir2, pt2, pt1); + var len1 = dir.len(); + var len2 = dir2.len(); + + if (len1 < 1e-3 || len2 < 1e-3) { + return; + } + + dir.scale(1 / len1); + dir2.scale(1 / len2); + var angleCos = dir.dot(surfaceNormal); + var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle); + + if (angleCos < maxSurfaceAngleCos) { + // Calculate project point of pt0 on pt1-pt2 + var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false); + tmpProjPoint.fromArray(tmpArr); + var HALF_PI = Math.PI / 2; + var angle2 = Math.acos(dir2.dot(surfaceNormal)); + var newAngle = HALF_PI + angle2 - maxSurfaceAngle; + + if (newAngle >= HALF_PI) { + // parallel + Point.copy(tmpProjPoint, pt2); + } else { + // Calculate new projected length with limited minTurnAngle and get the new connect point + tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle)); // Limit the new calculated connect point between pt1 and pt2. + + var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y); + + if (isNaN(t)) { + return; + } + + if (t < 0) { + Point.copy(tmpProjPoint, pt1); + } else if (t > 1) { + Point.copy(tmpProjPoint, pt2); + } + } + + tmpProjPoint.toArray(linePoints[1]); + } + } + + function setLabelLineState(labelLine, ignore, stateName, stateModel) { + var isNormal = stateName === 'normal'; + var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName); // Make sure display. + + stateObj.ignore = ignore; // Set smooth + + var smooth = stateModel.get('smooth'); + + if (smooth && smooth === true) { + smooth = 0.3; + } + + stateObj.shape = stateObj.shape || {}; + + if (smooth > 0) { + stateObj.shape.smooth = smooth; + } + + var styleObj = stateModel.getModel('lineStyle').getLineStyle(); + isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj; + } + + function buildLabelLinePath(path, shape) { + var smooth = shape.smooth; + var points = shape.points; + + if (!points) { + return; + } + + path.moveTo(points[0][0], points[0][1]); + + if (smooth > 0 && points.length >= 3) { + var len1 = dist(points[0], points[1]); + var len2 = dist(points[1], points[2]); + + if (!len1 || !len2) { + path.lineTo(points[1][0], points[1][1]); + path.lineTo(points[2][0], points[2][1]); + return; + } + + var moveLen = Math.min(len1, len2) * smooth; + var midPoint0 = lerp([], points[1], points[0], moveLen / len1); + var midPoint2 = lerp([], points[1], points[2], moveLen / len2); + var midPoint1 = lerp([], midPoint0, midPoint2, 0.5); + path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]); + path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]); + } else { + for (var i = 1; i < points.length; i++) { + path.lineTo(points[i][0], points[i][1]); + } + } + } + + /** + * Create a label line if necessary and set it's style. + */ + + + function setLabelLineStyle(targetEl, statesModels, defaultStyle) { + var labelLine = targetEl.getTextGuideLine(); + var label = targetEl.getTextContent(); + + if (!label) { + // Not show label line if there is no label. + if (labelLine) { + targetEl.removeTextGuideLine(); + } + + return; + } + + var normalModel = statesModels.normal; + var showNormal = normalModel.get('show'); + var labelIgnoreNormal = label.ignore; + + for (var i = 0; i < DISPLAY_STATES.length; i++) { + var stateName = DISPLAY_STATES[i]; + var stateModel = statesModels[stateName]; + var isNormal = stateName === 'normal'; + + if (stateModel) { + var stateShow = stateModel.get('show'); + var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal); + + if (isLabelIgnored // Not show when label is not shown in this state. + || !retrieve2(stateShow, showNormal) // Use normal state by default if not set. + ) { + var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName]; + + if (stateObj) { + stateObj.ignore = true; + } + + continue; + } // Create labelLine if not exists + + + if (!labelLine) { + labelLine = new Polyline(); + targetEl.setTextGuideLine(labelLine); // Reset state of normal because it's new created. + // NOTE: NORMAL should always been the first! + + if (!isNormal && (labelIgnoreNormal || !showNormal)) { + setLabelLineState(labelLine, true, 'normal', statesModels.normal); + } // Use same state proxy. + + + if (targetEl.stateProxy) { + labelLine.stateProxy = targetEl.stateProxy; + } + } + + setLabelLineState(labelLine, false, stateName, stateModel); + } + } + + if (labelLine) { + defaults(labelLine.style, defaultStyle); // Not fill. + + labelLine.style.fill = null; + var showAbove = normalModel.get('showAbove'); + var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {}; + labelLineConfig.showAbove = showAbove || false; // Custom the buildPath. + + labelLine.buildPath = buildLabelLinePath; + } + } + + function getLabelLineStatesModels(itemModel, labelLineName) { + labelLineName = labelLineName || 'labelLine'; + var statesModels = { + normal: itemModel.getModel(labelLineName) + }; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + statesModels[stateName] = itemModel.getModel([stateName, labelLineName]); + } + + return statesModels; + } + + function prepareLayoutList(input) { + var list = []; + + for (var i = 0; i < input.length; i++) { + var rawItem = input[i]; + + if (rawItem.defaultAttr.ignore) { + continue; + } + + var label = rawItem.label; + var transform = label.getComputedTransform(); // NOTE: Get bounding rect after getComputedTransform, or label may not been updated by the host el. + + var localRect = label.getBoundingRect(); + var isAxisAligned = !transform || transform[1] < 1e-5 && transform[2] < 1e-5; + var minMargin = label.style.margin || 0; + var globalRect = localRect.clone(); + globalRect.applyTransform(transform); + globalRect.x -= minMargin / 2; + globalRect.y -= minMargin / 2; + globalRect.width += minMargin; + globalRect.height += minMargin; + var obb = isAxisAligned ? new OrientedBoundingRect(localRect, transform) : null; + list.push({ + label: label, + labelLine: rawItem.labelLine, + rect: globalRect, + localRect: localRect, + obb: obb, + priority: rawItem.priority, + defaultAttr: rawItem.defaultAttr, + layoutOption: rawItem.computedLayoutOption, + axisAligned: isAxisAligned, + transform: transform + }); + } + + return list; + } + + function shiftLayout(list, xyDim, sizeDim, minBound, maxBound, balanceShift) { + var len = list.length; + + if (len < 2) { + return; + } + + list.sort(function (a, b) { + return a.rect[xyDim] - b.rect[xyDim]; + }); + var lastPos = 0; + var delta; + var adjusted = false; + var totalShifts = 0; + + for (var i = 0; i < len; i++) { + var item = list[i]; + var rect = item.rect; + delta = rect[xyDim] - lastPos; + + if (delta < 0) { + // shiftForward(i, len, -delta); + rect[xyDim] -= delta; + item.label[xyDim] -= delta; + adjusted = true; + } + + var shift = Math.max(-delta, 0); + totalShifts += shift; + lastPos = rect[xyDim] + rect[sizeDim]; + } + + if (totalShifts > 0 && balanceShift) { + // Shift back to make the distribution more equally. + shiftList(-totalShifts / len, 0, len); + } // TODO bleedMargin? + + + var first = list[0]; + var last = list[len - 1]; + var minGap; + var maxGap; + updateMinMaxGap(); // If ends exceed two bounds, squeeze at most 80%, then take the gap of two bounds. + + minGap < 0 && squeezeGaps(-minGap, 0.8); + maxGap < 0 && squeezeGaps(maxGap, 0.8); + updateMinMaxGap(); + takeBoundsGap(minGap, maxGap, 1); + takeBoundsGap(maxGap, minGap, -1); // Handle bailout when there is not enough space. + + updateMinMaxGap(); + + if (minGap < 0) { + squeezeWhenBailout(-minGap); + } + + if (maxGap < 0) { + squeezeWhenBailout(maxGap); + } + + function updateMinMaxGap() { + minGap = first.rect[xyDim] - minBound; + maxGap = maxBound - last.rect[xyDim] - last.rect[sizeDim]; + } + + function takeBoundsGap(gapThisBound, gapOtherBound, moveDir) { + if (gapThisBound < 0) { + // Move from other gap if can. + var moveFromMaxGap = Math.min(gapOtherBound, -gapThisBound); + + if (moveFromMaxGap > 0) { + shiftList(moveFromMaxGap * moveDir, 0, len); + var remained = moveFromMaxGap + gapThisBound; + + if (remained < 0) { + squeezeGaps(-remained * moveDir, 1); + } + } else { + squeezeGaps(-gapThisBound * moveDir, 1); + } + } + } + + function shiftList(delta, start, end) { + if (delta !== 0) { + adjusted = true; + } + + for (var i = start; i < end; i++) { + var item = list[i]; + var rect = item.rect; + rect[xyDim] += delta; + item.label[xyDim] += delta; + } + } // Squeeze gaps if the labels exceed margin. + + + function squeezeGaps(delta, maxSqeezePercent) { + var gaps = []; + var totalGaps = 0; + + for (var i = 1; i < len; i++) { + var prevItemRect = list[i - 1].rect; + var gap = Math.max(list[i].rect[xyDim] - prevItemRect[xyDim] - prevItemRect[sizeDim], 0); + gaps.push(gap); + totalGaps += gap; + } + + if (!totalGaps) { + return; + } + + var squeezePercent = Math.min(Math.abs(delta) / totalGaps, maxSqeezePercent); + + if (delta > 0) { + for (var i = 0; i < len - 1; i++) { + // Distribute the shift delta to all gaps. + var movement = gaps[i] * squeezePercent; // Forward + + shiftList(movement, 0, i + 1); + } + } else { + // Backward + for (var i = len - 1; i > 0; i--) { + // Distribute the shift delta to all gaps. + var movement = gaps[i - 1] * squeezePercent; + shiftList(-movement, i, len); + } + } + } + + /** + * Squeeze to allow overlap if there is no more space available. + * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds. + */ + + + function squeezeWhenBailout(delta) { + var dir = delta < 0 ? -1 : 1; + delta = Math.abs(delta); + var moveForEachLabel = Math.ceil(delta / (len - 1)); + + for (var i = 0; i < len - 1; i++) { + if (dir > 0) { + // Forward + shiftList(moveForEachLabel, 0, i + 1); + } else { + // Backward + shiftList(-moveForEachLabel, len - i - 1, len); + } + + delta -= moveForEachLabel; + + if (delta <= 0) { + return; + } + } + } + + return adjusted; + } + + /** + * Adjust labels on x direction to avoid overlap. + */ + + + function shiftLayoutOnX(list, leftBound, rightBound, // If average the shifts on all labels and add them to 0 + // TODO: Not sure if should enable it. + // Pros: The angle of lines will distribute more equally + // Cons: In some layout. It may not what user wanted. like in pie. the label of last sector is usually changed unexpectedly. + balanceShift) { + return shiftLayout(list, 'x', 'width', leftBound, rightBound, balanceShift); + } + + /** + * Adjust labels on y direction to avoid overlap. + */ + + function shiftLayoutOnY(list, topBound, bottomBound, // If average the shifts on all labels and add them to 0 + balanceShift) { + return shiftLayout(list, 'y', 'height', topBound, bottomBound, balanceShift); + } + + function hideOverlap(labelList) { + var displayedLabels = []; // TODO, render overflow visible first, put in the displayedLabels. + + labelList.sort(function (a, b) { + return b.priority - a.priority; + }); + var globalRect = new BoundingRect(0, 0, 0, 0); + + function hideEl(el) { + if (!el.ignore) { + // Show on emphasis. + var emphasisState = el.ensureState('emphasis'); + + if (emphasisState.ignore == null) { + emphasisState.ignore = false; + } + } + + el.ignore = true; + } + + for (var i = 0; i < labelList.length; i++) { + var labelItem = labelList[i]; + var isAxisAligned = labelItem.axisAligned; + var localRect = labelItem.localRect; + var transform = labelItem.transform; + var label = labelItem.label; + var labelLine = labelItem.labelLine; + globalRect.copy(labelItem.rect); // Add a threshold because layout may be aligned precisely. + + globalRect.width -= 0.1; + globalRect.height -= 0.1; + globalRect.x += 0.05; + globalRect.y += 0.05; + var obb = labelItem.obb; + var overlapped = false; + + for (var j = 0; j < displayedLabels.length; j++) { + var existsTextCfg = displayedLabels[j]; // Fast rejection. + + if (!globalRect.intersect(existsTextCfg.rect)) { + continue; + } + + if (isAxisAligned && existsTextCfg.axisAligned) { + // Is overlapped + overlapped = true; + break; + } + + if (!existsTextCfg.obb) { + // If self is not axis aligned. But other is. + existsTextCfg.obb = new OrientedBoundingRect(existsTextCfg.localRect, existsTextCfg.transform); + } + + if (!obb) { + // If self is axis aligned. But other is not. + obb = new OrientedBoundingRect(localRect, transform); + } + + if (obb.intersect(existsTextCfg.obb)) { + overlapped = true; + break; + } + } // TODO Callback to determine if this overlap should be handled? + + + if (overlapped) { + hideEl(label); + labelLine && hideEl(labelLine); + } else { + label.attr('ignore', labelItem.defaultAttr.ignore); + labelLine && labelLine.attr('ignore', labelItem.defaultAttr.labelGuideIgnore); + displayedLabels.push(labelItem); + } + } + } + + function cloneArr(points) { + if (points) { + var newPoints = []; + + for (var i = 0; i < points.length; i++) { + newPoints.push(points[i].slice()); + } + + return newPoints; + } + } + + function prepareLayoutCallbackParams(labelItem, hostEl) { + var label = labelItem.label; + var labelLine = hostEl && hostEl.getTextGuideLine(); + return { + dataIndex: labelItem.dataIndex, + dataType: labelItem.dataType, + seriesIndex: labelItem.seriesModel.seriesIndex, + text: labelItem.label.style.text, + rect: labelItem.hostRect, + labelRect: labelItem.rect, + // x: labelAttr.x, + // y: labelAttr.y, + align: label.style.align, + verticalAlign: label.style.verticalAlign, + labelLinePoints: cloneArr(labelLine && labelLine.shape.points) + }; + } + + var LABEL_OPTION_TO_STYLE_KEYS = ['align', 'verticalAlign', 'width', 'height', 'fontSize']; + var dummyTransformable = new Transformable(); + var labelLayoutInnerStore = makeInner(); + var labelLineAnimationStore = makeInner(); + + function extendWithKeys(target, source, keys) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (source[key] != null) { + target[key] = source[key]; + } + } + } + + var LABEL_LAYOUT_PROPS = ['x', 'y', 'rotation']; + + var LabelManager = + /** @class */ + function () { + function LabelManager() { + this._labelList = []; + this._chartViewList = []; + } + + LabelManager.prototype.clearLabels = function () { + this._labelList = []; + this._chartViewList = []; + }; + /** + * Add label to manager + */ + + + LabelManager.prototype._addLabel = function (dataIndex, dataType, seriesModel, label, layoutOption) { + var labelStyle = label.style; + var hostEl = label.__hostTarget; + var textConfig = hostEl.textConfig || {}; // TODO: If label is in other state. + + var labelTransform = label.getComputedTransform(); + var labelRect = label.getBoundingRect().plain(); + BoundingRect.applyTransform(labelRect, labelRect, labelTransform); + + if (labelTransform) { + dummyTransformable.setLocalTransform(labelTransform); + } else { + // Identity transform. + dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0; + dummyTransformable.scaleX = dummyTransformable.scaleY = 1; + } + + var host = label.__hostTarget; + var hostRect; + + if (host) { + hostRect = host.getBoundingRect().plain(); + var transform = host.getComputedTransform(); + BoundingRect.applyTransform(hostRect, hostRect, transform); + } + + var labelGuide = hostRect && host.getTextGuideLine(); + + this._labelList.push({ + label: label, + labelLine: labelGuide, + seriesModel: seriesModel, + dataIndex: dataIndex, + dataType: dataType, + layoutOption: layoutOption, + computedLayoutOption: null, + rect: labelRect, + hostRect: hostRect, + // Label with lower priority will be hidden when overlapped + // Use rect size as default priority + priority: hostRect ? hostRect.width * hostRect.height : 0, + // Save default label attributes. + // For restore if developers want get back to default value in callback. + defaultAttr: { + ignore: label.ignore, + labelGuideIgnore: labelGuide && labelGuide.ignore, + x: dummyTransformable.x, + y: dummyTransformable.y, + scaleX: dummyTransformable.scaleX, + scaleY: dummyTransformable.scaleY, + rotation: dummyTransformable.rotation, + style: { + x: labelStyle.x, + y: labelStyle.y, + align: labelStyle.align, + verticalAlign: labelStyle.verticalAlign, + width: labelStyle.width, + height: labelStyle.height, + fontSize: labelStyle.fontSize + }, + cursor: label.cursor, + attachedPos: textConfig.position, + attachedRot: textConfig.rotation + } + }); + }; + + LabelManager.prototype.addLabelsOfSeries = function (chartView) { + var _this = this; + + this._chartViewList.push(chartView); + + var seriesModel = chartView.__model; + var layoutOption = seriesModel.get('labelLayout'); + /** + * Ignore layouting if it's not specified anything. + */ + + if (!(isFunction(layoutOption) || keys(layoutOption).length)) { + return; + } + + chartView.group.traverse(function (child) { + if (child.ignore) { + return true; // Stop traverse descendants. + } // Only support label being hosted on graphic elements. + + + var textEl = child.getTextContent(); + var ecData = getECData(child); // Can only attach the text on the element with dataIndex + + if (textEl && !textEl.disableLabelLayout) { + _this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption); + } + }); + }; + + LabelManager.prototype.updateLayoutConfig = function (api) { + var width = api.getWidth(); + var height = api.getHeight(); + + function createDragHandler(el, labelLineModel) { + return function () { + updateLabelLinePoints(el, labelLineModel); + }; + } + + for (var i = 0; i < this._labelList.length; i++) { + var labelItem = this._labelList[i]; + var label = labelItem.label; + var hostEl = label.__hostTarget; + var defaultLabelAttr = labelItem.defaultAttr; + var layoutOption = void 0; // TODO A global layout option? + + if (isFunction(labelItem.layoutOption)) { + layoutOption = labelItem.layoutOption(prepareLayoutCallbackParams(labelItem, hostEl)); + } else { + layoutOption = labelItem.layoutOption; + } + + layoutOption = layoutOption || {}; + labelItem.computedLayoutOption = layoutOption; + var degreeToRadian = Math.PI / 180; // TODO hostEl should always exists. + // Or label should not have parent because the x, y is all in global space. + + if (hostEl) { + hostEl.setTextConfig({ + // Force to set local false. + local: false, + // Ignore position and rotation config on the host el if x or y is changed. + position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos, + // Ignore rotation config on the host el if rotation is changed. + rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot, + offset: [layoutOption.dx || 0, layoutOption.dy || 0] + }); + } + + var needsUpdateLabelLine = false; + + if (layoutOption.x != null) { + // TODO width of chart view. + label.x = parsePercent$1(layoutOption.x, width); + label.setStyle('x', 0); // Ignore movement in style. TODO: origin. + + needsUpdateLabelLine = true; + } else { + label.x = defaultLabelAttr.x; + label.setStyle('x', defaultLabelAttr.style.x); + } + + if (layoutOption.y != null) { + // TODO height of chart view. + label.y = parsePercent$1(layoutOption.y, height); + label.setStyle('y', 0); // Ignore movement in style. + + needsUpdateLabelLine = true; + } else { + label.y = defaultLabelAttr.y; + label.setStyle('y', defaultLabelAttr.style.y); + } + + if (layoutOption.labelLinePoints) { + var guideLine = hostEl.getTextGuideLine(); + + if (guideLine) { + guideLine.setShape({ + points: layoutOption.labelLinePoints + }); // Not update + + needsUpdateLabelLine = false; + } + } + + var labelLayoutStore = labelLayoutInnerStore(label); + labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine; + label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation; + label.scaleX = defaultLabelAttr.scaleX; + label.scaleY = defaultLabelAttr.scaleY; + + for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) { + var key = LABEL_OPTION_TO_STYLE_KEYS[k]; + label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]); + } + + if (layoutOption.draggable) { + label.draggable = true; + label.cursor = 'move'; + + if (hostEl) { + var hostModel = labelItem.seriesModel; + + if (labelItem.dataIndex != null) { + var data = labelItem.seriesModel.getData(labelItem.dataType); + hostModel = data.getItemModel(labelItem.dataIndex); + } + + label.on('drag', createDragHandler(hostEl, hostModel.getModel('labelLine'))); + } + } else { + // TODO Other drag functions? + label.off('drag'); + label.cursor = defaultLabelAttr.cursor; + } + } + }; + + LabelManager.prototype.layout = function (api) { + var width = api.getWidth(); + var height = api.getHeight(); + var labelList = prepareLayoutList(this._labelList); + var labelsNeedsAdjustOnX = filter(labelList, function (item) { + return item.layoutOption.moveOverlap === 'shiftX'; + }); + var labelsNeedsAdjustOnY = filter(labelList, function (item) { + return item.layoutOption.moveOverlap === 'shiftY'; + }); + shiftLayoutOnX(labelsNeedsAdjustOnX, 0, width); + shiftLayoutOnY(labelsNeedsAdjustOnY, 0, height); + var labelsNeedsHideOverlap = filter(labelList, function (item) { + return item.layoutOption.hideOverlap; + }); + hideOverlap(labelsNeedsHideOverlap); + }; + /** + * Process all labels. Not only labels with layoutOption. + */ + + + LabelManager.prototype.processLabelsOverall = function () { + var _this = this; + + each(this._chartViewList, function (chartView) { + var seriesModel = chartView.__model; + var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate; + var animationEnabled = seriesModel.isAnimationEnabled(); + chartView.group.traverse(function (child) { + if (child.ignore && !child.forceLabelAnimation) { + return true; // Stop traverse descendants. + } + + var needsUpdateLabelLine = !ignoreLabelLineUpdate; + var label = child.getTextContent(); + + if (!needsUpdateLabelLine && label) { + needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine; + } + + if (needsUpdateLabelLine) { + _this._updateLabelLine(child, seriesModel); + } + + if (animationEnabled) { + _this._animateLabels(child, seriesModel); + } + }); + }); + }; + + LabelManager.prototype._updateLabelLine = function (el, seriesModel) { + // Only support label being hosted on graphic elements. + var textEl = el.getTextContent(); // Update label line style. + + var ecData = getECData(el); + var dataIndex = ecData.dataIndex; // Only support labelLine on the labels represent data. + + if (textEl && dataIndex != null) { + var data = seriesModel.getData(ecData.dataType); + var itemModel = data.getItemModel(dataIndex); + var defaultStyle = {}; + var visualStyle = data.getItemVisual(dataIndex, 'style'); + var visualType = data.getVisual('drawType'); // Default to be same with main color + + defaultStyle.stroke = visualStyle[visualType]; + var labelLineModel = itemModel.getModel('labelLine'); + setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle); + updateLabelLinePoints(el, labelLineModel); + } + }; + + LabelManager.prototype._animateLabels = function (el, seriesModel) { + var textEl = el.getTextContent(); + var guideLine = el.getTextGuideLine(); // Animate + + if (textEl // `forceLabelAnimation` has the highest priority + && (el.forceLabelAnimation || !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el))) { + var layoutStore = labelLayoutInnerStore(textEl); + var oldLayout = layoutStore.oldLayout; + var ecData = getECData(el); + var dataIndex = ecData.dataIndex; + var newProps = { + x: textEl.x, + y: textEl.y, + rotation: textEl.rotation + }; + var data = seriesModel.getData(ecData.dataType); + + if (!oldLayout) { + textEl.attr(newProps); // Disable fade in animation if value animation is enabled. + + if (!labelInner(textEl).valueAnimation) { + var oldOpacity = retrieve2(textEl.style.opacity, 1); // Fade in animation + + textEl.style.opacity = 0; + initProps(textEl, { + style: { + opacity: oldOpacity + } + }, seriesModel, dataIndex); + } + } else { + textEl.attr(oldLayout); // Make sure the animation from is in the right status. + + var prevStates = el.prevStates; + + if (prevStates) { + if (indexOf(prevStates, 'select') >= 0) { + textEl.attr(layoutStore.oldLayoutSelect); + } + + if (indexOf(prevStates, 'emphasis') >= 0) { + textEl.attr(layoutStore.oldLayoutEmphasis); + } + } + + updateProps(textEl, newProps, seriesModel, dataIndex); + } + + layoutStore.oldLayout = newProps; + + if (textEl.states.select) { + var layoutSelect = layoutStore.oldLayoutSelect = {}; + extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS); + extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS); + } + + if (textEl.states.emphasis) { + var layoutEmphasis = layoutStore.oldLayoutEmphasis = {}; + extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS); + extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS); + } + + animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel); + } + + if (guideLine && !guideLine.ignore && !guideLine.invisible) { + var layoutStore = labelLineAnimationStore(guideLine); + var oldLayout = layoutStore.oldLayout; + var newLayout = { + points: guideLine.shape.points + }; + + if (!oldLayout) { + guideLine.setShape(newLayout); + guideLine.style.strokePercent = 0; + initProps(guideLine, { + style: { + strokePercent: 1 + } + }, seriesModel); + } else { + guideLine.attr({ + shape: oldLayout + }); + updateProps(guideLine, { + shape: newLayout + }, seriesModel); + } + + layoutStore.oldLayout = newLayout; + } + }; + + return LabelManager; + }(); + + var getLabelManager = makeInner(); + + function installLabelLayout(registers) { + registers.registerUpdateLifecycle('series:beforeupdate', function (ecModel, api, params) { + // TODO api provide an namespace that can save stuff per instance + var labelManager = getLabelManager(api).labelManager; + + if (!labelManager) { + labelManager = getLabelManager(api).labelManager = new LabelManager(); + } + + labelManager.clearLabels(); + }); + registers.registerUpdateLifecycle('series:layoutlabels', function (ecModel, api, params) { + var labelManager = getLabelManager(api).labelManager; + params.updatedSeries.forEach(function (series) { + labelManager.addLabelsOfSeries(api.getViewOfSeriesModel(series)); + }); + labelManager.updateLayoutConfig(api); + labelManager.layout(api); + labelManager.processLabelsOverall(); + }); + } + + var mathSin$4 = Math.sin; + var mathCos$4 = Math.cos; + var PI$4 = Math.PI; + var PI2$7 = Math.PI * 2; + var degree = 180 / PI$4; + var SVGPathRebuilder = (function () { + function SVGPathRebuilder() { + } + + SVGPathRebuilder.prototype.reset = function (precision) { + this._start = true; + this._d = []; + this._str = ''; + this._p = Math.pow(10, precision || 4); + }; + SVGPathRebuilder.prototype.moveTo = function (x, y) { + this._add('M', x, y); + }; + SVGPathRebuilder.prototype.lineTo = function (x, y) { + this._add('L', x, y); + }; + SVGPathRebuilder.prototype.bezierCurveTo = function (x, y, x2, y2, x3, y3) { + this._add('C', x, y, x2, y2, x3, y3); + }; + SVGPathRebuilder.prototype.quadraticCurveTo = function (x, y, x2, y2) { + this._add('Q', x, y, x2, y2); + }; + SVGPathRebuilder.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this.ellipse(cx, cy, r, r, 0, startAngle, endAngle, anticlockwise); + }; + SVGPathRebuilder.prototype.ellipse = function (cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise) { + var dTheta = endAngle - startAngle; + var clockwise = !anticlockwise; + var dThetaPositive = Math.abs(dTheta); + var isCircle = isAroundZero$1(dThetaPositive - PI2$7) + || (clockwise ? dTheta >= PI2$7 : -dTheta >= PI2$7); + var unifiedTheta = dTheta > 0 ? dTheta % PI2$7 : (dTheta % PI2$7 + PI2$7); + var large = false; + if (isCircle) { + large = true; + } else if (isAroundZero$1(dThetaPositive)) { + large = false; + } else { + large = (unifiedTheta >= PI$4) === !!clockwise; + } + var x0 = cx + rx * mathCos$4(startAngle); + var y0 = cy + ry * mathSin$4(startAngle); + if (this._start) { + this._add('M', x0, y0); + } + var xRot = Math.round(psi * degree); + if (isCircle) { + var p = 1 / this._p; + var dTheta_1 = (clockwise ? 1 : -1) * (PI2$7 - p); + this._add('A', rx, ry, xRot, 1, +clockwise, cx + rx * mathCos$4(startAngle + dTheta_1), cy + ry * mathSin$4(startAngle + dTheta_1)); + if (p > 1e-2) { + this._add('A', rx, ry, xRot, 0, +clockwise, x0, y0); + } + } else { + var x = cx + rx * mathCos$4(endAngle); + var y = cy + ry * mathSin$4(endAngle); + this._add('A', rx, ry, xRot, +large, +clockwise, x, y); + } + }; + SVGPathRebuilder.prototype.rect = function (x, y, w, h) { + this._add('M', x, y); + this._add('l', w, 0); + this._add('l', 0, h); + this._add('l', -w, 0); + this._add('Z'); + }; + SVGPathRebuilder.prototype.closePath = function () { + if (this._d.length > 0) { + this._add('Z'); + } + }; + SVGPathRebuilder.prototype._add = function (cmd, a, b, c, d, e, f, g, h) { + var vals = []; + var p = this._p; + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (isNaN(val)) { + this._invalid = true; + return; + } + vals.push(Math.round(val * p) / p); + } + this._d.push(cmd + vals.join(' ')); + this._start = cmd === 'Z'; + }; + SVGPathRebuilder.prototype.generateStr = function () { + this._str = this._invalid ? '' : this._d.join(''); + this._d = []; + }; + SVGPathRebuilder.prototype.getStr = function () { + return this._str; + }; + return SVGPathRebuilder; + }()); + + var NONE = 'none'; + var mathRound$1 = Math.round; + + function pathHasFill(style) { + var fill = style.fill; + return fill != null && fill !== NONE; + } + + function pathHasStroke(style) { + var stroke = style.stroke; + return stroke != null && stroke !== NONE; + } + + var strokeProps = ['lineCap', 'miterLimit', 'lineJoin']; + var svgStrokeProps = map(strokeProps, function (prop) { + return "stroke-" + prop.toLowerCase(); + }); + + function mapStyleToAttrs(updateAttr, style, el, forceUpdate) { + var opacity = style.opacity == null ? 1 : style.opacity; + if (el instanceof ZRImage) { + updateAttr('opacity', opacity); + return; + } + if (pathHasFill(style)) { + var fill = normalizeColor(style.fill); + updateAttr('fill', fill.color); + var fillOpacity = style.fillOpacity != null + ? style.fillOpacity * fill.opacity * opacity + : fill.opacity * opacity; + if (forceUpdate || fillOpacity < 1) { + updateAttr('fill-opacity', fillOpacity); + } + } else { + updateAttr('fill', NONE); + } + if (pathHasStroke(style)) { + var stroke = normalizeColor(style.stroke); + updateAttr('stroke', stroke.color); + var strokeScale = style.strokeNoScale + ? el.getLineScale() + : 1; + var strokeWidth = (strokeScale ? (style.lineWidth || 0) / strokeScale : 0); + var strokeOpacity = style.strokeOpacity != null + ? style.strokeOpacity * stroke.opacity * opacity + : stroke.opacity * opacity; + var strokeFirst = style.strokeFirst; + if (forceUpdate || strokeWidth !== 1) { + updateAttr('stroke-width', strokeWidth); + } + if (forceUpdate || strokeFirst) { + updateAttr('paint-order', strokeFirst ? 'stroke' : 'fill'); + } + if (forceUpdate || strokeOpacity < 1) { + updateAttr('stroke-opacity', strokeOpacity); + } + if (style.lineDash) { + var _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1]; + if (lineDash) { + lineDashOffset = mathRound$1(lineDashOffset || 0); + updateAttr('stroke-dasharray', lineDash.join(',')); + if (lineDashOffset || forceUpdate) { + updateAttr('stroke-dashoffset', lineDashOffset); + } + } + } else if (forceUpdate) { + updateAttr('stroke-dasharray', NONE); + } + for (var i = 0; i < strokeProps.length; i++) { + var propName = strokeProps[i]; + if (forceUpdate || style[propName] !== DEFAULT_PATH_STYLE[propName]) { + var val = style[propName] || DEFAULT_PATH_STYLE[propName]; + val && updateAttr(svgStrokeProps[i], val); + } + } + } else if (forceUpdate) { + updateAttr('stroke', NONE); + } + } + + var SVGNS = 'http://www.w3.org/2000/svg'; + var XLINKNS = 'http://www.w3.org/1999/xlink'; + var XMLNS = 'http://www.w3.org/2000/xmlns/'; + var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'; + + function createElement(name) { + return document.createElementNS(SVGNS, name); + } + + function createVNode(tag, key, attrs, children, text) { + return { + tag: tag, + attrs: attrs || {}, + children: children, + text: text, + key: key + }; + } + + function createElementOpen(name, attrs) { + var attrsStr = []; + if (attrs) { + for (var key in attrs) { + var val = attrs[key]; + var part = key; + if (val === false) { + continue; + } else if (val !== true && val != null) { + part += "=\"" + val + "\""; + } + attrsStr.push(part); + } + } + return "<" + name + " " + attrsStr.join(' ') + ">"; + } + + function createElementClose(name) { + return ""; + } + + function vNodeToString(el, opts) { + opts = opts || {}; + var S = opts.newline ? '\n' : ''; + + function convertElToString(el) { + var children = el.children, tag = el.tag, attrs = el.attrs; + return createElementOpen(tag, attrs) + + (el.text || '') + + (children ? "" + S + map(children, function (child) { + return convertElToString(child); + }).join(S) + S : '') + + createElementClose(tag); + } + + return convertElToString(el); + } + + function getCssString(selectorNodes, animationNodes, opts) { + opts = opts || {}; + var S = opts.newline ? '\n' : ''; + var bracketBegin = " {" + S; + var bracketEnd = S + "}"; + var selectors = map(keys(selectorNodes), function (className) { + return className + bracketBegin + map(keys(selectorNodes[className]), function (attrName) { + return attrName + ":" + selectorNodes[className][attrName] + ";"; + }).join(S) + bracketEnd; + }).join(S); + var animations = map(keys(animationNodes), function (animationName) { + return "@keyframes " + animationName + bracketBegin + map(keys(animationNodes[animationName]), function (percent) { + return percent + bracketBegin + map(keys(animationNodes[animationName][percent]), function (attrName) { + var val = animationNodes[animationName][percent][attrName]; + if (attrName === 'd') { + val = "path(\"" + val + "\")"; + } + return attrName + ":" + val + ";"; + }).join(S) + bracketEnd; + }).join(S) + bracketEnd; + }).join(S); + if (!selectors && !animations) { + return ''; + } + return [''].join(S); + } + + function createBrushScope(zrId) { + return { + zrId: zrId, + shadowCache: {}, + patternCache: {}, + gradientCache: {}, + clipPathCache: {}, + defs: {}, + cssNodes: {}, + cssAnims: {}, + cssClassIdx: 0, + cssAnimIdx: 0, + shadowIdx: 0, + gradientIdx: 0, + patternIdx: 0, + clipPathIdx: 0 + }; + } + + function createSVGVNode(width, height, children, useViewBox) { + return createVNode('svg', 'root', { + 'width': width, + 'height': height, + 'xmlns': SVGNS, + 'xmlns:xlink': XLINKNS, + 'version': '1.1', + 'baseProfile': 'full', + 'viewBox': useViewBox ? "0 0 " + width + " " + height : false + }, children); + } + + var EASING_MAP = { + cubicIn: '0.32,0,0.67,0', + cubicOut: '0.33,1,0.68,1', + cubicInOut: '0.65,0,0.35,1', + quadraticIn: '0.11,0,0.5,0', + quadraticOut: '0.5,1,0.89,1', + quadraticInOut: '0.45,0,0.55,1', + quarticIn: '0.5,0,0.75,0', + quarticOut: '0.25,1,0.5,1', + quarticInOut: '0.76,0,0.24,1', + quinticIn: '0.64,0,0.78,0', + quinticOut: '0.22,1,0.36,1', + quinticInOut: '0.83,0,0.17,1', + sinusoidalIn: '0.12,0,0.39,0', + sinusoidalOut: '0.61,1,0.88,1', + sinusoidalInOut: '0.37,0,0.63,1', + exponentialIn: '0.7,0,0.84,0', + exponentialOut: '0.16,1,0.3,1', + exponentialInOut: '0.87,0,0.13,1', + circularIn: '0.55,0,1,0.45', + circularOut: '0,0.55,0.45,1', + circularInOut: '0.85,0,0.15,1' + }; + var transformOriginKey = 'transform-origin'; + + function buildPathString(el, kfShape, path) { + var shape = extend({}, el.shape); + extend(shape, kfShape); + el.buildPath(path, shape); + var svgPathBuilder = new SVGPathRebuilder(); + svgPathBuilder.reset(getPathPrecision(el)); + path.rebuildPath(svgPathBuilder, 1); + svgPathBuilder.generateStr(); + return svgPathBuilder.getStr(); + } + + function setTransformOrigin(target, transform) { + var originX = transform.originX, originY = transform.originY; + if (originX || originY) { + target[transformOriginKey] = originX + "px " + originY + "px"; + } + } + + var ANIMATE_STYLE_MAP = { + fill: 'fill', + opacity: 'opacity', + lineWidth: 'stroke-width', + lineDashOffset: 'stroke-dashoffset' + }; + + function addAnimation(cssAnim, scope) { + var animationName = scope.zrId + '-ani-' + scope.cssAnimIdx++; + scope.cssAnims[animationName] = cssAnim; + return animationName; + } + + function createCompoundPathCSSAnimation(el, attrs, scope) { + var paths = el.shape.paths; + var composedAnim = {}; + var cssAnimationCfg; + var cssAnimationName; + each(paths, function (path) { + var subScope = createBrushScope(scope.zrId); + subScope.animation = true; + createCSSAnimation(path, {}, subScope, true); + var cssAnims = subScope.cssAnims; + var cssNodes = subScope.cssNodes; + var animNames = keys(cssAnims); + var len = animNames.length; + if (!len) { + return; + } + cssAnimationName = animNames[len - 1]; + var lastAnim = cssAnims[cssAnimationName]; + for (var percent in lastAnim) { + var kf = lastAnim[percent]; + composedAnim[percent] = composedAnim[percent] || {d: ''}; + composedAnim[percent].d += kf.d || ''; + } + for (var className in cssNodes) { + var val = cssNodes[className].animation; + if (val.indexOf(cssAnimationName) >= 0) { + cssAnimationCfg = val; + } + } + }); + if (!cssAnimationCfg) { + return; + } + attrs.d = false; + var animationName = addAnimation(composedAnim, scope); + return cssAnimationCfg.replace(cssAnimationName, animationName); + } + + function getEasingFunc(easing) { + return isString(easing) + ? EASING_MAP[easing] + ? "cubic-bezier(" + EASING_MAP[easing] + ")" + : createCubicEasingFunc(easing) ? easing : '' + : ''; + } + + function createCSSAnimation(el, attrs, scope, onlyShape) { + var animators = el.animators; + var len = animators.length; + var cssAnimations = []; + if (el instanceof CompoundPath) { + var animationCfg = createCompoundPathCSSAnimation(el, attrs, scope); + if (animationCfg) { + cssAnimations.push(animationCfg); + } else if (!len) { + return; + } + } else if (!len) { + return; + } + var groupAnimators = {}; + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var cfgArr = [animator.getMaxTime() / 1000 + 's']; + var easing = getEasingFunc(animator.getClip().easing); + var delay = animator.getDelay(); + if (easing) { + cfgArr.push(easing); + } else { + cfgArr.push('linear'); + } + if (delay) { + cfgArr.push(delay / 1000 + 's'); + } + if (animator.getLoop()) { + cfgArr.push('infinite'); + } + var cfg = cfgArr.join(' '); + groupAnimators[cfg] = groupAnimators[cfg] || [cfg, []]; + groupAnimators[cfg][1].push(animator); + } + + function createSingleCSSAnimation(groupAnimator) { + var animators = groupAnimator[1]; + var len = animators.length; + var transformKfs = {}; + var shapeKfs = {}; + var finalKfs = {}; + var animationTimingFunctionAttrName = 'animation-timing-function'; + + function saveAnimatorTrackToCssKfs(animator, cssKfs, toCssAttrName) { + var tracks = animator.getTracks(); + var maxTime = animator.getMaxTime(); + for (var k = 0; k < tracks.length; k++) { + var track = tracks[k]; + if (track.needsAnimate()) { + var kfs = track.keyframes; + var attrName = track.propName; + toCssAttrName && (attrName = toCssAttrName(attrName)); + if (attrName) { + for (var i = 0; i < kfs.length; i++) { + var kf = kfs[i]; + var percent = Math.round(kf.time / maxTime * 100) + '%'; + var kfEasing = getEasingFunc(kf.easing); + var rawValue = kf.rawValue; + if (isString(rawValue) || isNumber(rawValue)) { + cssKfs[percent] = cssKfs[percent] || {}; + cssKfs[percent][attrName] = kf.rawValue; + if (kfEasing) { + cssKfs[percent][animationTimingFunctionAttrName] = kfEasing; + } + } + } + } + } + } + } + + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var targetProp = animator.targetName; + if (!targetProp) { + !onlyShape && saveAnimatorTrackToCssKfs(animator, transformKfs); + } else if (targetProp === 'shape') { + saveAnimatorTrackToCssKfs(animator, shapeKfs); + } + } + for (var percent in transformKfs) { + var transform = {}; + copyTransform(transform, el); + extend(transform, transformKfs[percent]); + var str = getSRTTransformString(transform); + var timingFunction = transformKfs[percent][animationTimingFunctionAttrName]; + finalKfs[percent] = str ? { + transform: str + } : {}; + setTransformOrigin(finalKfs[percent], transform); + if (timingFunction) { + finalKfs[percent][animationTimingFunctionAttrName] = timingFunction; + } + } + var path; + var canAnimateShape = true; + for (var percent in shapeKfs) { + finalKfs[percent] = finalKfs[percent] || {}; + var isFirst = !path; + var timingFunction = shapeKfs[percent][animationTimingFunctionAttrName]; + if (isFirst) { + path = new PathProxy(); + } + var len_1 = path.len(); + path.reset(); + finalKfs[percent].d = buildPathString(el, shapeKfs[percent], path); + var newLen = path.len(); + if (!isFirst && len_1 !== newLen) { + canAnimateShape = false; + break; + } + if (timingFunction) { + finalKfs[percent][animationTimingFunctionAttrName] = timingFunction; + } + } + if (!canAnimateShape) { + for (var percent in finalKfs) { + delete finalKfs[percent].d; + } + } + if (!onlyShape) { + for (var i = 0; i < len; i++) { + var animator = animators[i]; + var targetProp = animator.targetName; + if (targetProp === 'style') { + saveAnimatorTrackToCssKfs(animator, finalKfs, function (propName) { + return ANIMATE_STYLE_MAP[propName]; + }); + } + } + } + var percents = keys(finalKfs); + var allTransformOriginSame = true; + var transformOrigin; + for (var i = 1; i < percents.length; i++) { + var p0 = percents[i - 1]; + var p1 = percents[i]; + if (finalKfs[p0][transformOriginKey] !== finalKfs[p1][transformOriginKey]) { + allTransformOriginSame = false; + break; + } + transformOrigin = finalKfs[p0][transformOriginKey]; + } + if (allTransformOriginSame && transformOrigin) { + for (var percent in finalKfs) { + if (finalKfs[percent][transformOriginKey]) { + delete finalKfs[percent][transformOriginKey]; + } + } + attrs[transformOriginKey] = transformOrigin; + } + if (filter(percents, function (percent) { + return keys(finalKfs[percent]).length > 0; + }).length) { + var animationName = addAnimation(finalKfs, scope); + return animationName + " " + groupAnimator[0] + " both"; + } + } + + for (var key in groupAnimators) { + var animationCfg = createSingleCSSAnimation(groupAnimators[key]); + if (animationCfg) { + cssAnimations.push(animationCfg); + } + } + if (cssAnimations.length) { + var className = scope.zrId + '-cls-' + scope.cssClassIdx++; + scope.cssNodes['.' + className] = { + animation: cssAnimations.join(',') + }; + attrs["class"] = className; + } + } + + var round$2 = Math.round; + + function isImageLike$1(val) { + return val && isString(val.src); + } + + function isCanvasLike(val) { + return val && isFunction(val.toDataURL); + } + + function setStyleAttrs(attrs, style, el, scope) { + mapStyleToAttrs(function (key, val) { + var isFillStroke = key === 'fill' || key === 'stroke'; + if (isFillStroke && isGradient(val)) { + setGradient(style, attrs, key, scope); + } else if (isFillStroke && isPattern(val)) { + setPattern(el, attrs, key, scope); + } else { + attrs[key] = val; + } + }, style, el, false); + setShadow(el, attrs, scope); + } + + function noRotateScale(m) { + return isAroundZero$1(m[0] - 1) + && isAroundZero$1(m[1]) + && isAroundZero$1(m[2]) + && isAroundZero$1(m[3] - 1); + } + + function noTranslate(m) { + return isAroundZero$1(m[4]) && isAroundZero$1(m[5]); + } + + function setTransform(attrs, m, compress) { + if (m && !(noTranslate(m) && noRotateScale(m))) { + var mul = compress ? 10 : 1e4; + attrs.transform = noRotateScale(m) + ? "translate(" + round$2(m[4] * mul) / mul + " " + round$2(m[5] * mul) / mul + ")" : getMatrixStr(m); + } + } + + function convertPolyShape(shape, attrs, mul) { + var points = shape.points; + var strArr = []; + for (var i = 0; i < points.length; i++) { + strArr.push(round$2(points[i][0] * mul) / mul); + strArr.push(round$2(points[i][1] * mul) / mul); + } + attrs.points = strArr.join(' '); + } + + function validatePolyShape(shape) { + return !shape.smooth; + } + + function createAttrsConvert(desc) { + var normalizedDesc = map(desc, function (item) { + return (typeof item === 'string' ? [item, item] : item); + }); + return function (shape, attrs, mul) { + for (var i = 0; i < normalizedDesc.length; i++) { + var item = normalizedDesc[i]; + var val = shape[item[0]]; + if (val != null) { + attrs[item[1]] = round$2(val * mul) / mul; + } + } + }; + } + + var buitinShapesDef = { + circle: [createAttrsConvert(['cx', 'cy', 'r'])], + polyline: [convertPolyShape, validatePolyShape], + polygon: [convertPolyShape, validatePolyShape] + }; + + function hasShapeAnimation(el) { + var animators = el.animators; + for (var i = 0; i < animators.length; i++) { + if (animators[i].targetName === 'shape') { + return true; + } + } + return false; + } + + function brushSVGPath(el, scope) { + var style = el.style; + var shape = el.shape; + var builtinShpDef = buitinShapesDef[el.type]; + var attrs = {}; + var needsAnimate = scope.animation; + var svgElType = 'path'; + var strokePercent = el.style.strokePercent; + var precision = (scope.compress && getPathPrecision(el)) || 4; + if (builtinShpDef + && !scope.willUpdate + && !(builtinShpDef[1] && !builtinShpDef[1](shape)) + && !(needsAnimate && hasShapeAnimation(el)) + && !(strokePercent < 1)) { + svgElType = el.type; + var mul = Math.pow(10, precision); + builtinShpDef[0](shape, attrs, mul); + } else { + if (!el.path) { + el.createPathProxy(); + } + var path = el.path; + if (el.shapeChanged()) { + path.beginPath(); + el.buildPath(path, el.shape); + el.pathUpdated(); + } + var pathVersion = path.getVersion(); + var elExt = el; + var svgPathBuilder = elExt.__svgPathBuilder; + if (elExt.__svgPathVersion !== pathVersion + || !svgPathBuilder + || strokePercent !== elExt.__svgPathStrokePercent) { + if (!svgPathBuilder) { + svgPathBuilder = elExt.__svgPathBuilder = new SVGPathRebuilder(); + } + svgPathBuilder.reset(precision); + path.rebuildPath(svgPathBuilder, strokePercent); + svgPathBuilder.generateStr(); + elExt.__svgPathVersion = pathVersion; + elExt.__svgPathStrokePercent = strokePercent; + } + attrs.d = svgPathBuilder.getStr(); + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode(svgElType, el.id + '', attrs); + } + + function brushSVGImage(el, scope) { + var style = el.style; + var image = style.image; + if (image && !isString(image)) { + if (isImageLike$1(image)) { + image = image.src; + } else if (isCanvasLike(image)) { + image = image.toDataURL(); + } + } + if (!image) { + return; + } + var x = style.x || 0; + var y = style.y || 0; + var dw = style.width; + var dh = style.height; + var attrs = { + href: image, + width: dw, + height: dh + }; + if (x) { + attrs.x = x; + } + if (y) { + attrs.y = y; + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode('image', el.id + '', attrs); + } + + function brushSVGTSpan(el, scope) { + var style = el.style; + var text = style.text; + text != null && (text += ''); + if (!text || isNaN(style.x) || isNaN(style.y)) { + return; + } + var font = style.font || DEFAULT_FONT; + var x = style.x || 0; + var y = adjustTextY(style.y || 0, getLineHeight(font), style.textBaseline); + var textAlign = TEXT_ALIGN_TO_ANCHOR[style.textAlign] + || style.textAlign; + var attrs = { + 'dominant-baseline': 'central', + 'text-anchor': textAlign + }; + if (hasSeparateFont(style)) { + var separatedFontStr = ''; + var fontStyle = style.fontStyle; + var fontSize = parseFontSize(style.fontSize); + if (!parseFloat(fontSize)) { + return; + } + var fontFamily = style.fontFamily || DEFAULT_FONT_FAMILY; + var fontWeight = style.fontWeight; + separatedFontStr += "font-size:" + fontSize + ";font-family:" + fontFamily + ";"; + if (fontStyle && fontStyle !== 'normal') { + separatedFontStr += "font-style:" + fontStyle + ";"; + } + if (fontWeight && fontWeight !== 'normal') { + separatedFontStr += "font-weight:" + fontWeight + ";"; + } + attrs.style = separatedFontStr; + } else { + attrs.style = "font: " + font; + } + if (text.match(/\s/)) { + attrs['xml:space'] = 'preserve'; + } + if (x) { + attrs.x = x; + } + if (y) { + attrs.y = y; + } + setTransform(attrs, el.transform); + setStyleAttrs(attrs, style, el, scope); + scope.animation && createCSSAnimation(el, attrs, scope); + return createVNode('text', el.id + '', attrs, undefined, text); + } + + function brush$1(el, scope) { + if (el instanceof Path) { + return brushSVGPath(el, scope); + } else if (el instanceof ZRImage) { + return brushSVGImage(el, scope); + } else if (el instanceof TSpan) { + return brushSVGTSpan(el, scope); + } + } + + function setShadow(el, attrs, scope) { + var style = el.style; + if (hasShadow(style)) { + var shadowKey = getShadowKey(el); + var shadowCache = scope.shadowCache; + var shadowId = shadowCache[shadowKey]; + if (!shadowId) { + var globalScale = el.getGlobalScale(); + var scaleX = globalScale[0]; + var scaleY = globalScale[1]; + if (!scaleX || !scaleY) { + return; + } + var offsetX = style.shadowOffsetX || 0; + var offsetY = style.shadowOffsetY || 0; + var blur_1 = style.shadowBlur; + var _a = normalizeColor(style.shadowColor), opacity = _a.opacity, color = _a.color; + var stdDx = blur_1 / 2 / scaleX; + var stdDy = blur_1 / 2 / scaleY; + var stdDeviation = stdDx + ' ' + stdDy; + shadowId = scope.zrId + '-s' + scope.shadowIdx++; + scope.defs[shadowId] = createVNode('filter', shadowId, { + 'id': shadowId, + 'x': '-100%', + 'y': '-100%', + 'width': '300%', + 'height': '300%' + }, [ + createVNode('feDropShadow', '', { + 'dx': offsetX / scaleX, + 'dy': offsetY / scaleY, + 'stdDeviation': stdDeviation, + 'flood-color': color, + 'flood-opacity': opacity + }) + ]); + shadowCache[shadowKey] = shadowId; + } + attrs.filter = getIdURL(shadowId); + } + } + + function setGradient(style, attrs, target, scope) { + var val = style[target]; + var gradientTag; + var gradientAttrs = { + 'gradientUnits': val.global + ? 'userSpaceOnUse' + : 'objectBoundingBox' + }; + if (isLinearGradient(val)) { + gradientTag = 'linearGradient'; + gradientAttrs.x1 = val.x; + gradientAttrs.y1 = val.y; + gradientAttrs.x2 = val.x2; + gradientAttrs.y2 = val.y2; + } else if (isRadialGradient(val)) { + gradientTag = 'radialGradient'; + gradientAttrs.cx = retrieve2(val.x, 0.5); + gradientAttrs.cy = retrieve2(val.y, 0.5); + gradientAttrs.r = retrieve2(val.r, 0.5); + } else { + if ("development" !== 'production') { + logError('Illegal gradient type.'); + } + return; + } + var colors = val.colorStops; + var colorStops = []; + for (var i = 0, len = colors.length; i < len; ++i) { + var offset = round4(colors[i].offset) * 100 + '%'; + var stopColor = colors[i].color; + var _a = normalizeColor(stopColor), color = _a.color, opacity = _a.opacity; + var stopsAttrs = { + 'offset': offset + }; + stopsAttrs['stop-color'] = color; + if (opacity < 1) { + stopsAttrs['stop-opacity'] = opacity; + } + colorStops.push(createVNode('stop', i + '', stopsAttrs)); + } + var gradientVNode = createVNode(gradientTag, '', gradientAttrs, colorStops); + var gradientKey = vNodeToString(gradientVNode); + var gradientCache = scope.gradientCache; + var gradientId = gradientCache[gradientKey]; + if (!gradientId) { + gradientId = scope.zrId + '-g' + scope.gradientIdx++; + gradientCache[gradientKey] = gradientId; + gradientAttrs.id = gradientId; + scope.defs[gradientId] = createVNode(gradientTag, gradientId, gradientAttrs, colorStops); + } + attrs[target] = getIdURL(gradientId); + } + + function setPattern(el, attrs, target, scope) { + var val = el.style[target]; + var patternAttrs = { + 'patternUnits': 'userSpaceOnUse' + }; + var child; + if (isImagePattern(val)) { + var imageWidth_1 = val.imageWidth; + var imageHeight_1 = val.imageHeight; + var imageSrc = void 0; + var patternImage = val.image; + if (isString(patternImage)) { + imageSrc = patternImage; + } else if (isImageLike$1(patternImage)) { + imageSrc = patternImage.src; + } else if (isCanvasLike(patternImage)) { + imageSrc = patternImage.toDataURL(); + } + if (typeof Image === 'undefined') { + var errMsg = 'Image width/height must been given explictly in svg-ssr renderer.'; + assert(imageWidth_1, errMsg); + assert(imageHeight_1, errMsg); + } else if (imageWidth_1 == null || imageHeight_1 == null) { + var setSizeToVNode_1 = function (vNode, img) { + if (vNode) { + var svgEl = vNode.elm; + var width = (vNode.attrs.width = imageWidth_1 || img.width); + var height = (vNode.attrs.height = imageHeight_1 || img.height); + if (svgEl) { + svgEl.setAttribute('width', width); + svgEl.setAttribute('height', height); + } + } + }; + var createdImage = createOrUpdateImage(imageSrc, null, el, function (img) { + setSizeToVNode_1(patternVNode, img); + setSizeToVNode_1(child, img); + }); + if (createdImage && createdImage.width && createdImage.height) { + imageWidth_1 = imageWidth_1 || createdImage.width; + imageHeight_1 = imageHeight_1 || createdImage.height; + } + } + child = createVNode('image', 'img', { + href: imageSrc, + width: imageWidth_1, + height: imageHeight_1 + }); + patternAttrs.width = imageWidth_1; + patternAttrs.height = imageHeight_1; + } else if (val.svgElement) { + child = clone(val.svgElement); + patternAttrs.width = val.svgWidth; + patternAttrs.height = val.svgHeight; + } + if (!child) { + return; + } + patternAttrs.patternTransform = getSRTTransformString(val); + var patternVNode = createVNode('pattern', '', patternAttrs, [child]); + var patternKey = vNodeToString(patternVNode); + var patternCache = scope.patternCache; + var patternId = patternCache[patternKey]; + if (!patternId) { + patternId = scope.zrId + '-p' + scope.patternIdx++; + patternCache[patternKey] = patternId; + patternAttrs.id = patternId; + patternVNode = scope.defs[patternId] = createVNode('pattern', patternId, patternAttrs, [child]); + } + attrs[target] = getIdURL(patternId); + } + + function setClipPath(clipPath, attrs, scope) { + var clipPathCache = scope.clipPathCache, defs = scope.defs; + var clipPathId = clipPathCache[clipPath.id]; + if (!clipPathId) { + clipPathId = scope.zrId + '-c' + scope.clipPathIdx++; + var clipPathAttrs = { + id: clipPathId + }; + clipPathCache[clipPath.id] = clipPathId; + defs[clipPathId] = createVNode('clipPath', clipPathId, clipPathAttrs, [brushSVGPath(clipPath, scope)]); + } + attrs['clip-path'] = getIdURL(clipPathId); + } + + function createTextNode(text) { + return document.createTextNode(text); + } + + function insertBefore(parentNode, newNode, referenceNode) { + parentNode.insertBefore(newNode, referenceNode); + } + + function removeChild(node, child) { + node.removeChild(child); + } + + function appendChild(node, child) { + node.appendChild(child); + } + + function parentNode(node) { + return node.parentNode; + } + + function nextSibling(node) { + return node.nextSibling; + } + + function setTextContent(node, text) { + node.textContent = text; + } + + var colonChar = 58; + var xChar = 120; + var emptyNode = createVNode('', ''); + + function isUndef(s) { + return s === undefined; + } + + function isDef(s) { + return s !== undefined; + } + + function createKeyToOldIdx(children, beginIdx, endIdx) { + var map = {}; + for (var i = beginIdx; i <= endIdx; ++i) { + var key = children[i].key; + if (key !== undefined) { + if ("development" !== 'production') { + if (map[key] != null) { + console.error("Duplicate key " + key); + } + } + map[key] = i; + } + } + return map; + } + + function sameVnode(vnode1, vnode2) { + var isSameKey = vnode1.key === vnode2.key; + var isSameTag = vnode1.tag === vnode2.tag; + return isSameTag && isSameKey; + } + + function createElm(vnode) { + var i; + var children = vnode.children; + var tag = vnode.tag; + if (isDef(tag)) { + var elm = (vnode.elm = createElement(tag)); + updateAttrs(emptyNode, vnode); + if (isArray(children)) { + for (i = 0; i < children.length; ++i) { + var ch = children[i]; + if (ch != null) { + appendChild(elm, createElm(ch)); + } + } + } else if (isDef(vnode.text) && !isObject(vnode.text)) { + appendChild(elm, createTextNode(vnode.text)); + } + } else { + vnode.elm = createTextNode(vnode.text); + } + return vnode.elm; + } + + function addVnodes(parentElm, before, vnodes, startIdx, endIdx) { + for (; startIdx <= endIdx; ++startIdx) { + var ch = vnodes[startIdx]; + if (ch != null) { + insertBefore(parentElm, createElm(ch), before); + } + } + } + + function removeVnodes(parentElm, vnodes, startIdx, endIdx) { + for (; startIdx <= endIdx; ++startIdx) { + var ch = vnodes[startIdx]; + if (ch != null) { + if (isDef(ch.tag)) { + var parent_1 = parentNode(ch.elm); + removeChild(parent_1, ch.elm); + } else { + removeChild(parentElm, ch.elm); + } + } + } + } + + function updateAttrs(oldVnode, vnode) { + var key; + var elm = vnode.elm; + var oldAttrs = oldVnode && oldVnode.attrs || {}; + var attrs = vnode.attrs || {}; + if (oldAttrs === attrs) { + return; + } + for (key in attrs) { + var cur = attrs[key]; + var old = oldAttrs[key]; + if (old !== cur) { + if (cur === true) { + elm.setAttribute(key, ''); + } else if (cur === false) { + elm.removeAttribute(key); + } else { + if (key.charCodeAt(0) !== xChar) { + elm.setAttribute(key, cur); + } else if (key === 'xmlns:xlink' || key === 'xmlns') { + elm.setAttributeNS(XMLNS, key, cur); + } else if (key.charCodeAt(3) === colonChar) { + elm.setAttributeNS(XML_NAMESPACE, key, cur); + } else if (key.charCodeAt(5) === colonChar) { + elm.setAttributeNS(XLINKNS, key, cur); + } else { + elm.setAttribute(key, cur); + } + } + } + } + for (key in oldAttrs) { + if (!(key in attrs)) { + elm.removeAttribute(key); + } + } + } + + function updateChildren(parentElm, oldCh, newCh) { + var oldStartIdx = 0; + var newStartIdx = 0; + var oldEndIdx = oldCh.length - 1; + var oldStartVnode = oldCh[0]; + var oldEndVnode = oldCh[oldEndIdx]; + var newEndIdx = newCh.length - 1; + var newStartVnode = newCh[0]; + var newEndVnode = newCh[newEndIdx]; + var oldKeyToIdx; + var idxInOld; + var elmToMove; + var before; + while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { + if (oldStartVnode == null) { + oldStartVnode = oldCh[++oldStartIdx]; + } else if (oldEndVnode == null) { + oldEndVnode = oldCh[--oldEndIdx]; + } else if (newStartVnode == null) { + newStartVnode = newCh[++newStartIdx]; + } else if (newEndVnode == null) { + newEndVnode = newCh[--newEndIdx]; + } else if (sameVnode(oldStartVnode, newStartVnode)) { + patchVnode(oldStartVnode, newStartVnode); + oldStartVnode = oldCh[++oldStartIdx]; + newStartVnode = newCh[++newStartIdx]; + } else if (sameVnode(oldEndVnode, newEndVnode)) { + patchVnode(oldEndVnode, newEndVnode); + oldEndVnode = oldCh[--oldEndIdx]; + newEndVnode = newCh[--newEndIdx]; + } else if (sameVnode(oldStartVnode, newEndVnode)) { + patchVnode(oldStartVnode, newEndVnode); + insertBefore(parentElm, oldStartVnode.elm, nextSibling(oldEndVnode.elm)); + oldStartVnode = oldCh[++oldStartIdx]; + newEndVnode = newCh[--newEndIdx]; + } else if (sameVnode(oldEndVnode, newStartVnode)) { + patchVnode(oldEndVnode, newStartVnode); + insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm); + oldEndVnode = oldCh[--oldEndIdx]; + newStartVnode = newCh[++newStartIdx]; + } else { + if (isUndef(oldKeyToIdx)) { + oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); + } + idxInOld = oldKeyToIdx[newStartVnode.key]; + if (isUndef(idxInOld)) { + insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm); + } else { + elmToMove = oldCh[idxInOld]; + if (elmToMove.tag !== newStartVnode.tag) { + insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm); + } else { + patchVnode(elmToMove, newStartVnode); + oldCh[idxInOld] = undefined; + insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm); + } + } + newStartVnode = newCh[++newStartIdx]; + } + } + if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) { + if (oldStartIdx > oldEndIdx) { + before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm; + addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx); + } else { + removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx); + } + } + } + + function patchVnode(oldVnode, vnode) { + var elm = (vnode.elm = oldVnode.elm); + var oldCh = oldVnode.children; + var ch = vnode.children; + if (oldVnode === vnode) { + return; + } + updateAttrs(oldVnode, vnode); + if (isUndef(vnode.text)) { + if (isDef(oldCh) && isDef(ch)) { + if (oldCh !== ch) { + updateChildren(elm, oldCh, ch); + } + } else if (isDef(ch)) { + if (isDef(oldVnode.text)) { + setTextContent(elm, ''); + } + addVnodes(elm, null, ch, 0, ch.length - 1); + } else if (isDef(oldCh)) { + removeVnodes(elm, oldCh, 0, oldCh.length - 1); + } else if (isDef(oldVnode.text)) { + setTextContent(elm, ''); + } + } else if (oldVnode.text !== vnode.text) { + if (isDef(oldCh)) { + removeVnodes(elm, oldCh, 0, oldCh.length - 1); + } + setTextContent(elm, vnode.text); + } + } + + function patch(oldVnode, vnode) { + if (sameVnode(oldVnode, vnode)) { + patchVnode(oldVnode, vnode); + } else { + var elm = oldVnode.elm; + var parent_2 = parentNode(elm); + createElm(vnode); + if (parent_2 !== null) { + insertBefore(parent_2, vnode.elm, nextSibling(elm)); + removeVnodes(parent_2, [oldVnode], 0, 0); + } + } + return vnode; + } + + var svgId = 0; + var SVGPainter = (function () { + function SVGPainter(root, storage, opts) { + this.type = 'svg'; + this.refreshHover = createMethodNotSupport('refreshHover'); + this.configLayer = createMethodNotSupport('configLayer'); + this.storage = storage; + this._opts = opts = extend({}, opts); + this.root = root; + this._id = 'zr' + svgId++; + this._oldVNode = createSVGVNode(opts.width, opts.height); + if (root && !opts.ssr) { + var viewport = this._viewport = document.createElement('div'); + viewport.style.cssText = 'position:relative;overflow:hidden'; + var svgDom = this._svgDom = this._oldVNode.elm = createElement('svg'); + updateAttrs(null, this._oldVNode); + viewport.appendChild(svgDom); + root.appendChild(viewport); + } + this.resize(opts.width, opts.height); + } + + SVGPainter.prototype.getType = function () { + return this.type; + }; + SVGPainter.prototype.getViewportRoot = function () { + return this._viewport; + }; + SVGPainter.prototype.getViewportRootOffset = function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + SVGPainter.prototype.getSvgDom = function () { + return this._svgDom; + }; + SVGPainter.prototype.refresh = function () { + if (this.root) { + var vnode = this.renderToVNode({ + willUpdate: true + }); + vnode.attrs.style = 'position:absolute;left:0;top:0;user-select:none'; + patch(this._oldVNode, vnode); + this._oldVNode = vnode; + } + }; + SVGPainter.prototype.renderOneToVNode = function (el) { + return brush$1(el, createBrushScope(this._id)); + }; + SVGPainter.prototype.renderToVNode = function (opts) { + opts = opts || {}; + var list = this.storage.getDisplayList(true); + var bgColor = this._backgroundColor; + var width = this._width; + var height = this._height; + var scope = createBrushScope(this._id); + scope.animation = opts.animation; + scope.willUpdate = opts.willUpdate; + scope.compress = opts.compress; + var children = []; + if (bgColor && bgColor !== 'none') { + var _a = normalizeColor(bgColor), color = _a.color, opacity = _a.opacity; + this._bgVNode = createVNode('rect', 'bg', { + width: width, + height: height, + x: '0', + y: '0', + id: '0', + fill: color, + 'fill-opacity': opacity + }); + children.push(this._bgVNode); + } else { + this._bgVNode = null; + } + var mainVNode = !opts.compress + ? (this._mainVNode = createVNode('g', 'main', {}, [])) : null; + this._paintList(list, scope, mainVNode ? mainVNode.children : children); + mainVNode && children.push(mainVNode); + var defs = map(keys(scope.defs), function (id) { + return scope.defs[id]; + }); + if (defs.length) { + children.push(createVNode('defs', 'defs', {}, defs)); + } + if (opts.animation) { + var animationCssStr = getCssString(scope.cssNodes, scope.cssAnims, {newline: true}); + if (animationCssStr) { + var styleNode = createVNode('style', 'stl', {}, [], animationCssStr); + children.push(styleNode); + } + } + return createSVGVNode(width, height, children, opts.useViewBox); + }; + SVGPainter.prototype.renderToString = function (opts) { + opts = opts || {}; + return vNodeToString(this.renderToVNode({ + animation: retrieve2(opts.cssAnimation, true), + willUpdate: false, + compress: true, + useViewBox: retrieve2(opts.useViewBox, true) + }), {newline: true}); + }; + SVGPainter.prototype.setBackgroundColor = function (backgroundColor) { + this._backgroundColor = backgroundColor; + var bgVNode = this._bgVNode; + if (bgVNode && bgVNode.elm) { + var _a = normalizeColor(backgroundColor), color = _a.color, opacity = _a.opacity; + bgVNode.elm.setAttribute('fill', color); + if (opacity < 1) { + bgVNode.elm.setAttribute('fill-opacity', opacity); + } + } + }; + SVGPainter.prototype.getSvgRoot = function () { + return this._mainVNode && this._mainVNode.elm; + }; + SVGPainter.prototype._paintList = function (list, scope, out) { + var listLen = list.length; + var clipPathsGroupsStack = []; + var clipPathsGroupsStackDepth = 0; + var currentClipPathGroup; + var prevClipPaths; + var clipGroupNodeIdx = 0; + for (var i = 0; i < listLen; i++) { + var displayable = list[i]; + if (!displayable.invisible) { + var clipPaths = displayable.__clipPaths; + var len = clipPaths && clipPaths.length || 0; + var prevLen = prevClipPaths && prevClipPaths.length || 0; + var lca = void 0; + for (lca = Math.max(len - 1, prevLen - 1); lca >= 0; lca--) { + if (clipPaths && prevClipPaths + && clipPaths[lca] === prevClipPaths[lca]) { + break; + } + } + for (var i_1 = prevLen - 1; i_1 > lca; i_1--) { + clipPathsGroupsStackDepth--; + currentClipPathGroup = clipPathsGroupsStack[clipPathsGroupsStackDepth - 1]; + } + for (var i_2 = lca + 1; i_2 < len; i_2++) { + var groupAttrs = {}; + setClipPath(clipPaths[i_2], groupAttrs, scope); + var g = createVNode('g', 'clip-g-' + clipGroupNodeIdx++, groupAttrs, []); + (currentClipPathGroup ? currentClipPathGroup.children : out).push(g); + clipPathsGroupsStack[clipPathsGroupsStackDepth++] = g; + currentClipPathGroup = g; + } + prevClipPaths = clipPaths; + var ret = brush$1(displayable, scope); + if (ret) { + (currentClipPathGroup ? currentClipPathGroup.children : out).push(ret); + } + } + } + }; + SVGPainter.prototype.resize = function (width, height) { + var opts = this._opts; + var root = this.root; + var viewport = this._viewport; + width != null && (opts.width = width); + height != null && (opts.height = height); + if (root && viewport) { + viewport.style.display = 'none'; + width = getSize(root, 0, opts); + height = getSize(root, 1, opts); + viewport.style.display = ''; + } + if (this._width !== width || this._height !== height) { + this._width = width; + this._height = height; + if (viewport) { + var viewportStyle = viewport.style; + viewportStyle.width = width + 'px'; + viewportStyle.height = height + 'px'; + } + var svgDom = this._svgDom; + if (svgDom) { + svgDom.setAttribute('width', width); + svgDom.setAttribute('height', height); + } + } + }; + SVGPainter.prototype.getWidth = function () { + return this._width; + }; + SVGPainter.prototype.getHeight = function () { + return this._height; + }; + SVGPainter.prototype.dispose = function () { + if (this.root) { + this.root.innerHTML = ''; + } + this._svgDom = + this._viewport = + this.storage = + this._oldVNode = + this._bgVNode = + this._mainVNode = null; + }; + SVGPainter.prototype.clear = function () { + if (this._svgDom) { + this._svgDom.innerHTML = null; + } + this._oldVNode = null; + }; + SVGPainter.prototype.toDataURL = function (base64) { + var str = encodeURIComponent(this.renderToString()); + var prefix = 'data:image/svg+xml;'; + if (base64) { + str = encodeBase64(str); + return str && prefix + 'base64,' + str; + } + return prefix + 'charset=UTF-8,' + str; + }; + return SVGPainter; + }()); + + function createMethodNotSupport(method) { + return function () { + if ("development" !== 'production') { + logError('In SVG mode painter not support method "' + method + '"'); + } + }; + } + + function install(registers) { + registers.registerPainter('svg', SVGPainter); + } + + function createDom(id, painter, dpr) { + var newDom = platformApi.createCanvas(); + var width = painter.getWidth(); + var height = painter.getHeight(); + var newDomStyle = newDom.style; + if (newDomStyle) { + newDomStyle.position = 'absolute'; + newDomStyle.left = '0'; + newDomStyle.top = '0'; + newDomStyle.width = width + 'px'; + newDomStyle.height = height + 'px'; + newDom.setAttribute('data-zr-dom-id', id); + } + newDom.width = width * dpr; + newDom.height = height * dpr; + return newDom; + } + + var Layer = (function (_super) { + __extends(Layer, _super); + + function Layer(id, painter, dpr) { + var _this = _super.call(this) || this; + _this.motionBlur = false; + _this.lastFrameAlpha = 0.7; + _this.dpr = 1; + _this.virtual = false; + _this.config = {}; + _this.incremental = false; + _this.zlevel = 0; + _this.maxRepaintRectCount = 5; + _this.__dirty = true; + _this.__firstTimePaint = true; + _this.__used = false; + _this.__drawIndex = 0; + _this.__startIndex = 0; + _this.__endIndex = 0; + _this.__prevStartIndex = null; + _this.__prevEndIndex = null; + var dom; + dpr = dpr || devicePixelRatio; + if (typeof id === 'string') { + dom = createDom(id, painter, dpr); + } else if (isObject(id)) { + dom = id; + id = dom.id; + } + _this.id = id; + _this.dom = dom; + var domStyle = dom.style; + if (domStyle) { + disableUserSelect(dom); + dom.onselectstart = function () { + return false; + }; + domStyle.padding = '0'; + domStyle.margin = '0'; + domStyle.borderWidth = '0'; + } + _this.painter = painter; + _this.dpr = dpr; + return _this; + } + + Layer.prototype.getElementCount = function () { + return this.__endIndex - this.__startIndex; + }; + Layer.prototype.afterBrush = function () { + this.__prevStartIndex = this.__startIndex; + this.__prevEndIndex = this.__endIndex; + }; + Layer.prototype.initContext = function () { + this.ctx = this.dom.getContext('2d'); + this.ctx.dpr = this.dpr; + }; + Layer.prototype.setUnpainted = function () { + this.__firstTimePaint = true; + }; + Layer.prototype.createBackBuffer = function () { + var dpr = this.dpr; + this.domBack = createDom('back-' + this.id, this.painter, dpr); + this.ctxBack = this.domBack.getContext('2d'); + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + }; + Layer.prototype.createRepaintRects = function (displayList, prevList, viewWidth, viewHeight) { + if (this.__firstTimePaint) { + this.__firstTimePaint = false; + return null; + } + var mergedRepaintRects = []; + var maxRepaintRectCount = this.maxRepaintRectCount; + var full = false; + var pendingRect = new BoundingRect(0, 0, 0, 0); + + function addRectToMergePool(rect) { + if (!rect.isFinite() || rect.isZero()) { + return; + } + if (mergedRepaintRects.length === 0) { + var boundingRect = new BoundingRect(0, 0, 0, 0); + boundingRect.copy(rect); + mergedRepaintRects.push(boundingRect); + } else { + var isMerged = false; + var minDeltaArea = Infinity; + var bestRectToMergeIdx = 0; + for (var i = 0; i < mergedRepaintRects.length; ++i) { + var mergedRect = mergedRepaintRects[i]; + if (mergedRect.intersect(rect)) { + var pendingRect_1 = new BoundingRect(0, 0, 0, 0); + pendingRect_1.copy(mergedRect); + pendingRect_1.union(rect); + mergedRepaintRects[i] = pendingRect_1; + isMerged = true; + break; + } else if (full) { + pendingRect.copy(rect); + pendingRect.union(mergedRect); + var aArea = rect.width * rect.height; + var bArea = mergedRect.width * mergedRect.height; + var pendingArea = pendingRect.width * pendingRect.height; + var deltaArea = pendingArea - aArea - bArea; + if (deltaArea < minDeltaArea) { + minDeltaArea = deltaArea; + bestRectToMergeIdx = i; + } + } + } + if (full) { + mergedRepaintRects[bestRectToMergeIdx].union(rect); + isMerged = true; + } + if (!isMerged) { + var boundingRect = new BoundingRect(0, 0, 0, 0); + boundingRect.copy(rect); + mergedRepaintRects.push(boundingRect); + } + if (!full) { + full = mergedRepaintRects.length >= maxRepaintRectCount; + } + } + } + + for (var i = this.__startIndex; i < this.__endIndex; ++i) { + var el = displayList[i]; + if (el) { + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + var prevRect = el.__isRendered && ((el.__dirty & REDRAW_BIT) || !shouldPaint) + ? el.getPrevPaintRect() + : null; + if (prevRect) { + addRectToMergePool(prevRect); + } + var curRect = shouldPaint && ((el.__dirty & REDRAW_BIT) || !el.__isRendered) + ? el.getPaintRect() + : null; + if (curRect) { + addRectToMergePool(curRect); + } + } + } + for (var i = this.__prevStartIndex; i < this.__prevEndIndex; ++i) { + var el = prevList[i]; + var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true); + if (el && (!shouldPaint || !el.__zr) && el.__isRendered) { + var prevRect = el.getPrevPaintRect(); + if (prevRect) { + addRectToMergePool(prevRect); + } + } + } + var hasIntersections; + do { + hasIntersections = false; + for (var i = 0; i < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].isZero()) { + mergedRepaintRects.splice(i, 1); + continue; + } + for (var j = i + 1; j < mergedRepaintRects.length;) { + if (mergedRepaintRects[i].intersect(mergedRepaintRects[j])) { + hasIntersections = true; + mergedRepaintRects[i].union(mergedRepaintRects[j]); + mergedRepaintRects.splice(j, 1); + } else { + j++; + } + } + i++; + } + } while (hasIntersections); + this._paintRects = mergedRepaintRects; + return mergedRepaintRects; + }; + Layer.prototype.debugGetPaintRects = function () { + return (this._paintRects || []).slice(); + }; + Layer.prototype.resize = function (width, height) { + var dpr = this.dpr; + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + if (domStyle) { + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + } + dom.width = width * dpr; + dom.height = height * dpr; + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + if (dpr !== 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }; + Layer.prototype.clear = function (clearAll, clearColor, repaintRects) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + clearColor = clearColor || this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + var dpr = this.dpr; + var self = this; + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr); + } + var domBack = this.domBack; + + function doClear(x, y, width, height) { + ctx.clearRect(x, y, width, height); + if (clearColor && clearColor !== 'transparent') { + var clearColorGradientOrPattern = void 0; + if (isGradientObject(clearColor)) { + clearColorGradientOrPattern = clearColor.__canvasGradient + || getCanvasGradient(ctx, clearColor, { + x: 0, + y: 0, + width: width, + height: height + }); + clearColor.__canvasGradient = clearColorGradientOrPattern; + } else if (isImagePatternObject(clearColor)) { + clearColorGradientOrPattern = createCanvasPattern(ctx, clearColor, { + dirty: function () { + self.setUnpainted(); + self.__painter.refresh(); + } + }); + } + ctx.save(); + ctx.fillStyle = clearColorGradientOrPattern || clearColor; + ctx.fillRect(x, y, width, height); + ctx.restore(); + } + if (haveMotionBLur) { + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, x, y, width, height); + ctx.restore(); + } + } + + if (!repaintRects || haveMotionBLur) { + doClear(0, 0, width, height); + } else if (repaintRects.length) { + each(repaintRects, function (rect) { + doClear(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + }); + } + }; + return Layer; + }(Eventful)); + + var HOVER_LAYER_ZLEVEL = 1e5; + var CANVAS_ZLEVEL = 314159; + var EL_AFTER_INCREMENTAL_INC = 0.01; + var INCREMENTAL_INC = 0.001; + + function isLayerValid(layer) { + if (!layer) { + return false; + } + if (layer.__builtin__) { + return true; + } + if (typeof (layer.resize) !== 'function' + || typeof (layer.refresh) !== 'function') { + return false; + } + return true; + } + + function createRoot(width, height) { + var domRoot = document.createElement('div'); + domRoot.style.cssText = [ + 'position:relative', + 'width:' + width + 'px', + 'height:' + height + 'px', + 'padding:0', + 'margin:0', + 'border-width:0' + ].join(';') + ';'; + return domRoot; + } + + var CanvasPainter = (function () { + function CanvasPainter(root, storage, opts, id) { + this.type = 'canvas'; + this._zlevelList = []; + this._prevDisplayList = []; + this._layers = {}; + this._layerConfig = {}; + this._needsManuallyCompositing = false; + this.type = 'canvas'; + var singleCanvas = !root.nodeName + || root.nodeName.toUpperCase() === 'CANVAS'; + this._opts = opts = extend({}, opts || {}); + this.dpr = opts.devicePixelRatio || devicePixelRatio; + this._singleCanvas = singleCanvas; + this.root = root; + var rootStyle = root.style; + if (rootStyle) { + disableUserSelect(root); + root.innerHTML = ''; + } + this.storage = storage; + var zlevelList = this._zlevelList; + this._prevDisplayList = []; + var layers = this._layers; + if (!singleCanvas) { + this._width = getSize(root, 0, opts); + this._height = getSize(root, 1, opts); + var domRoot = this._domRoot = createRoot(this._width, this._height); + root.appendChild(domRoot); + } else { + var rootCanvas = root; + var width = rootCanvas.width; + var height = rootCanvas.height; + if (opts.width != null) { + width = opts.width; + } + if (opts.height != null) { + height = opts.height; + } + this.dpr = opts.devicePixelRatio || 1; + rootCanvas.width = width * this.dpr; + rootCanvas.height = height * this.dpr; + this._width = width; + this._height = height; + var mainLayer = new Layer(rootCanvas, this, this.dpr); + mainLayer.__builtin__ = true; + mainLayer.initContext(); + layers[CANVAS_ZLEVEL] = mainLayer; + mainLayer.zlevel = CANVAS_ZLEVEL; + zlevelList.push(CANVAS_ZLEVEL); + this._domRoot = root; + } + } + + CanvasPainter.prototype.getType = function () { + return 'canvas'; + }; + CanvasPainter.prototype.isSingleCanvas = function () { + return this._singleCanvas; + }; + CanvasPainter.prototype.getViewportRoot = function () { + return this._domRoot; + }; + CanvasPainter.prototype.getViewportRootOffset = function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }; + CanvasPainter.prototype.refresh = function (paintAll) { + var list = this.storage.getDisplayList(true); + var prevList = this._prevDisplayList; + var zlevelList = this._zlevelList; + this._redrawId = Math.random(); + this._paintList(list, prevList, paintAll, this._redrawId); + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__ && layer.refresh) { + var clearColor = i === 0 ? this._backgroundColor : null; + layer.refresh(clearColor); + } + } + if (this._opts.useDirtyRect) { + this._prevDisplayList = list.slice(); + } + return this; + }; + CanvasPainter.prototype.refreshHover = function () { + this._paintHoverList(this.storage.getDisplayList(false)); + }; + CanvasPainter.prototype._paintHoverList = function (list) { + var len = list.length; + var hoverLayer = this._hoverlayer; + hoverLayer && hoverLayer.clear(); + if (!len) { + return; + } + var scope = { + inHover: true, + viewWidth: this._width, + viewHeight: this._height + }; + var ctx; + for (var i = 0; i < len; i++) { + var el = list[i]; + if (el.__inHover) { + if (!hoverLayer) { + hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL); + } + if (!ctx) { + ctx = hoverLayer.ctx; + ctx.save(); + } + brush(ctx, el, scope, i === len - 1); + } + } + if (ctx) { + ctx.restore(); + } + }; + CanvasPainter.prototype.getHoverLayer = function () { + return this.getLayer(HOVER_LAYER_ZLEVEL); + }; + CanvasPainter.prototype.paintOne = function (ctx, el) { + brushSingle(ctx, el); + }; + CanvasPainter.prototype._paintList = function (list, prevList, paintAll, redrawId) { + if (this._redrawId !== redrawId) { + return; + } + paintAll = paintAll || false; + this._updateLayerStatus(list); + var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, + needsRefreshHover = _a.needsRefreshHover; + if (this._needsManuallyCompositing) { + this._compositeManually(); + } + if (needsRefreshHover) { + this._paintHoverList(list); + } + if (!finished) { + var self_1 = this; + requestAnimationFrame$1(function () { + self_1._paintList(list, prevList, paintAll, redrawId); + }); + } else { + this.eachLayer(function (layer) { + layer.afterBrush && layer.afterBrush(); + }); + } + }; + CanvasPainter.prototype._compositeManually = function () { + var ctx = this.getLayer(CANVAS_ZLEVEL).ctx; + var width = this._domRoot.width; + var height = this._domRoot.height; + ctx.clearRect(0, 0, width, height); + this.eachBuiltinLayer(function (layer) { + if (layer.virtual) { + ctx.drawImage(layer.dom, 0, 0, width, height); + } + }); + }; + CanvasPainter.prototype._doPaintList = function (list, prevList, paintAll) { + var _this = this; + var layerList = []; + var useDirtyRect = this._opts.useDirtyRect; + for (var zi = 0; zi < this._zlevelList.length; zi++) { + var zlevel = this._zlevelList[zi]; + var layer = this._layers[zlevel]; + if (layer.__builtin__ + && layer !== this._hoverlayer + && (layer.__dirty || paintAll)) { + layerList.push(layer); + } + } + var finished = true; + var needsRefreshHover = false; + var _loop_1 = function (k) { + var layer = layerList[k]; + var ctx = layer.ctx; + var repaintRects = useDirtyRect + && layer.createRepaintRects(list, prevList, this_1._width, this_1._height); + var start = paintAll ? layer.__startIndex : layer.__drawIndex; + var useTimer = !paintAll && layer.incremental && Date.now; + var startTime = useTimer && Date.now(); + var clearColor = layer.zlevel === this_1._zlevelList[0] + ? this_1._backgroundColor : null; + if (layer.__startIndex === layer.__endIndex) { + layer.clear(false, clearColor, repaintRects); + } else if (start === layer.__startIndex) { + var firstEl = list[start]; + if (!firstEl.incremental || !firstEl.notClear || paintAll) { + layer.clear(false, clearColor, repaintRects); + } + } + if (start === -1) { + console.error('For some unknown reason. drawIndex is -1'); + start = layer.__startIndex; + } + var i; + var repaint = function (repaintRect) { + var scope = { + inHover: false, + allClipped: false, + prevEl: null, + viewWidth: _this._width, + viewHeight: _this._height + }; + for (i = start; i < layer.__endIndex; i++) { + var el = list[i]; + if (el.__inHover) { + needsRefreshHover = true; + } + _this._doPaintEl(el, layer, useDirtyRect, repaintRect, scope, i === layer.__endIndex - 1); + if (useTimer) { + var dTime = Date.now() - startTime; + if (dTime > 15) { + break; + } + } + } + if (scope.prevElClipPaths) { + ctx.restore(); + } + }; + if (repaintRects) { + if (repaintRects.length === 0) { + i = layer.__endIndex; + } else { + var dpr = this_1.dpr; + for (var r = 0; r < repaintRects.length; ++r) { + var rect = repaintRects[r]; + ctx.save(); + ctx.beginPath(); + ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); + ctx.clip(); + repaint(rect); + ctx.restore(); + } + } + } else { + ctx.save(); + repaint(); + ctx.restore(); + } + layer.__drawIndex = i; + if (layer.__drawIndex < layer.__endIndex) { + finished = false; + } + }; + var this_1 = this; + for (var k = 0; k < layerList.length; k++) { + _loop_1(k); + } + if (env.wxa) { + each(this._layers, function (layer) { + if (layer && layer.ctx && layer.ctx.draw) { + layer.ctx.draw(); + } + }); + } + return { + finished: finished, + needsRefreshHover: needsRefreshHover + }; + }; + CanvasPainter.prototype._doPaintEl = function (el, currentLayer, useDirtyRect, repaintRect, scope, isLast) { + var ctx = currentLayer.ctx; + if (useDirtyRect) { + var paintRect = el.getPaintRect(); + if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) { + brush(ctx, el, scope, isLast); + el.setPrevPaintRect(paintRect); + } + } else { + brush(ctx, el, scope, isLast); + } + }; + CanvasPainter.prototype.getLayer = function (zlevel, virtual) { + if (this._singleCanvas && !this._needsManuallyCompositing) { + zlevel = CANVAS_ZLEVEL; + } + var layer = this._layers[zlevel]; + if (!layer) { + layer = new Layer('zr_' + zlevel, this, this.dpr); + layer.zlevel = zlevel; + layer.__builtin__ = true; + if (this._layerConfig[zlevel]) { + merge(layer, this._layerConfig[zlevel], true); + } else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) { + merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true); + } + if (virtual) { + layer.virtual = virtual; + } + this.insertLayer(zlevel, layer); + layer.initContext(); + } + return layer; + }; + CanvasPainter.prototype.insertLayer = function (zlevel, layer) { + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var domRoot = this._domRoot; + var prevLayer = null; + var i = -1; + if (layersMap[zlevel]) { + if ("development" !== 'production') { + logError('ZLevel ' + zlevel + ' has been used already'); + } + return; + } + if (!isLayerValid(layer)) { + if ("development" !== 'production') { + logError('Layer of zlevel ' + zlevel + ' is not valid'); + } + return; + } + if (len > 0 && zlevel > zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if (zlevelList[i] < zlevel + && zlevelList[i + 1] > zlevel) { + break; + } + } + prevLayer = layersMap[zlevelList[i]]; + } + zlevelList.splice(i + 1, 0, zlevel); + layersMap[zlevel] = layer; + if (!layer.virtual) { + if (prevLayer) { + var prevDom = prevLayer.dom; + if (prevDom.nextSibling) { + domRoot.insertBefore(layer.dom, prevDom.nextSibling); + } else { + domRoot.appendChild(layer.dom); + } + } else { + if (domRoot.firstChild) { + domRoot.insertBefore(layer.dom, domRoot.firstChild); + } else { + domRoot.appendChild(layer.dom); + } + } + } + layer.__painter = this; + }; + CanvasPainter.prototype.eachLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }; + CanvasPainter.prototype.eachBuiltinLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter.prototype.eachOtherLayer = function (cb, context) { + var zlevelList = this._zlevelList; + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__) { + cb.call(context, layer, z); + } + } + }; + CanvasPainter.prototype.getLayers = function () { + return this._layers; + }; + CanvasPainter.prototype._updateLayerStatus = function (list) { + this.eachBuiltinLayer(function (layer, z) { + layer.__dirty = layer.__used = false; + }); + + function updatePrevLayer(idx) { + if (prevLayer) { + if (prevLayer.__endIndex !== idx) { + prevLayer.__dirty = true; + } + prevLayer.__endIndex = idx; + } + } + + if (this._singleCanvas) { + for (var i_1 = 1; i_1 < list.length; i_1++) { + var el = list[i_1]; + if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) { + this._needsManuallyCompositing = true; + break; + } + } + } + var prevLayer = null; + var incrementalLayerCount = 0; + var prevZlevel; + var i; + for (i = 0; i < list.length; i++) { + var el = list[i]; + var zlevel = el.zlevel; + var layer = void 0; + if (prevZlevel !== zlevel) { + prevZlevel = zlevel; + incrementalLayerCount = 0; + } + if (el.incremental) { + layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing); + layer.incremental = true; + incrementalLayerCount = 1; + } else { + layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing); + } + if (!layer.__builtin__) { + logError('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id); + } + if (layer !== prevLayer) { + layer.__used = true; + if (layer.__startIndex !== i) { + layer.__dirty = true; + } + layer.__startIndex = i; + if (!layer.incremental) { + layer.__drawIndex = i; + } else { + layer.__drawIndex = -1; + } + updatePrevLayer(i); + prevLayer = layer; + } + if ((el.__dirty & REDRAW_BIT) && !el.__inHover) { + layer.__dirty = true; + if (layer.incremental && layer.__drawIndex < 0) { + layer.__drawIndex = i; + } + } + } + updatePrevLayer(i); + this.eachBuiltinLayer(function (layer, z) { + if (!layer.__used && layer.getElementCount() > 0) { + layer.__dirty = true; + layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0; + } + if (layer.__dirty && layer.__drawIndex < 0) { + layer.__drawIndex = layer.__startIndex; + } + }); + }; + CanvasPainter.prototype.clear = function () { + this.eachBuiltinLayer(this._clearLayer); + return this; + }; + CanvasPainter.prototype._clearLayer = function (layer) { + layer.clear(); + }; + CanvasPainter.prototype.setBackgroundColor = function (backgroundColor) { + this._backgroundColor = backgroundColor; + each(this._layers, function (layer) { + layer.setUnpainted(); + }); + }; + CanvasPainter.prototype.configLayer = function (zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } else { + merge(layerConfig[zlevel], config, true); + } + for (var i = 0; i < this._zlevelList.length; i++) { + var _zlevel = this._zlevelList[i]; + if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) { + var layer = this._layers[_zlevel]; + merge(layer, layerConfig[zlevel], true); + } + } + } + }; + CanvasPainter.prototype.delLayer = function (zlevel) { + var layers = this._layers; + var zlevelList = this._zlevelList; + var layer = layers[zlevel]; + if (!layer) { + return; + } + layer.dom.parentNode.removeChild(layer.dom); + delete layers[zlevel]; + zlevelList.splice(indexOf(zlevelList, zlevel), 1); + }; + CanvasPainter.prototype.resize = function (width, height) { + if (!this._domRoot.style) { + if (width == null || height == null) { + return; + } + this._width = width; + this._height = height; + this.getLayer(CANVAS_ZLEVEL).resize(width, height); + } else { + var domRoot = this._domRoot; + domRoot.style.display = 'none'; + var opts = this._opts; + var root = this.root; + width != null && (opts.width = width); + height != null && (opts.height = height); + width = getSize(root, 0, opts); + height = getSize(root, 1, opts); + domRoot.style.display = ''; + if (this._width !== width || height !== this._height) { + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + for (var id in this._layers) { + if (this._layers.hasOwnProperty(id)) { + this._layers[id].resize(width, height); + } + } + this.refresh(true); + } + this._width = width; + this._height = height; + } + return this; + }; + CanvasPainter.prototype.clearLayer = function (zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }; + CanvasPainter.prototype.dispose = function () { + this.root.innerHTML = ''; + this.root = + this.storage = + this._domRoot = + this._layers = null; + }; + CanvasPainter.prototype.getRenderedCanvas = function (opts) { + opts = opts || {}; + if (this._singleCanvas && !this._compositeManually) { + return this._layers[CANVAS_ZLEVEL].dom; + } + var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + imageLayer.clear(false, opts.backgroundColor || this._backgroundColor); + var ctx = imageLayer.ctx; + if (opts.pixelRatio <= this.dpr) { + this.refresh(); + var width_1 = imageLayer.dom.width; + var height_1 = imageLayer.dom.height; + this.eachLayer(function (layer) { + if (layer.__builtin__) { + ctx.drawImage(layer.dom, 0, 0, width_1, height_1); + } else if (layer.renderToCanvas) { + ctx.save(); + layer.renderToCanvas(ctx); + ctx.restore(); + } + }); + } else { + var scope = { + inHover: false, + viewWidth: this._width, + viewHeight: this._height + }; + var displayList = this.storage.getDisplayList(true); + for (var i = 0, len = displayList.length; i < len; i++) { + var el = displayList[i]; + brush(ctx, el, scope, i === len - 1); + } + } + return imageLayer.dom; + }; + CanvasPainter.prototype.getWidth = function () { + return this._width; + }; + CanvasPainter.prototype.getHeight = function () { + return this._height; + }; + return CanvasPainter; + }()); + + function install$1(registers) { + registers.registerPainter('canvas', CanvasPainter); + } + + var LineSeriesModel = + /** @class */ + function (_super) { + __extends(LineSeriesModel, _super); + + function LineSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LineSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + LineSeriesModel.prototype.getInitialData = function (option) { + if ("development" !== 'production') { + var coordSys = option.coordinateSystem; + + if (coordSys !== 'polar' && coordSys !== 'cartesian2d') { + throw new Error('Line not support coordinateSystem besides cartesian and polar'); + } + } + + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + LineSeriesModel.prototype.getLegendIcon = function (opt) { + var group = new Group(); + var line = createSymbol('line', 0, opt.itemHeight / 2, opt.itemWidth, 0, opt.lineStyle.stroke, false); + group.add(line); + line.setStyle(opt.lineStyle); + var visualType = this.getData().getVisual('symbol'); + var visualRotate = this.getData().getVisual('symbolRotate'); + var symbolType = visualType === 'none' ? 'circle' : visualType; // Symbol size is 80% when there is a line + + var size = opt.itemHeight * 0.8; + var symbol = createSymbol(symbolType, (opt.itemWidth - size) / 2, (opt.itemHeight - size) / 2, size, size, opt.itemStyle.fill); + group.add(symbol); + symbol.setStyle(opt.itemStyle); + var symbolRotate = opt.iconRotate === 'inherit' ? visualRotate : opt.iconRotate || 0; + symbol.rotation = symbolRotate * Math.PI / 180; + symbol.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); + + if (symbolType.indexOf('empty') > -1) { + symbol.style.stroke = symbol.style.fill; + symbol.style.fill = '#fff'; + symbol.style.lineWidth = 2; + } + + return group; + }; + + LineSeriesModel.type = 'series.line'; + LineSeriesModel.dependencies = ['grid', 'polar']; + LineSeriesModel.defaultOption = { + // zlevel: 0, + z: 3, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + clip: true, + label: { + position: 'top' + }, + // itemStyle: { + // }, + endLabel: { + show: false, + valueAnimation: true, + distance: 8 + }, + lineStyle: { + width: 2, + type: 'solid' + }, + emphasis: { + scale: true + }, + // areaStyle: { + // origin of areaStyle. Valid values: + // `'auto'/null/undefined`: from axisLine to data + // `'start'`: from min to data + // `'end'`: from data to max + // origin: 'auto' + // }, + // false, 'start', 'end', 'middle' + step: false, + // Disabled if step is true + smooth: false, + smoothMonotone: null, + symbol: 'emptyCircle', + symbolSize: 4, + symbolRotate: null, + showSymbol: true, + // `false`: follow the label interval strategy. + // `true`: show all symbols. + // `'auto'`: If possible, show all symbols, otherwise + // follow the label interval strategy. + showAllSymbol: 'auto', + // Whether to connect break point. + connectNulls: false, + // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'. + sampling: 'none', + animationEasing: 'linear', + // Disable progressive + progressive: 0, + hoverLayerThreshold: Infinity, + universalTransition: { + divideShape: 'clone' + }, + triggerLineEvent: false + }; + return LineSeriesModel; + }(SeriesModel); + + /** + * @return label string. Not null/undefined + */ + + function getDefaultLabel(data, dataIndex) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + var len = labelDims.length; // Simple optimization (in lots of cases, label dims length is 1) + + if (len === 1) { + var rawVal = retrieveRawValue(data, dataIndex, labelDims[0]); + return rawVal != null ? rawVal + '' : null; + } else if (len) { + var vals = []; + + for (var i = 0; i < labelDims.length; i++) { + vals.push(retrieveRawValue(data, dataIndex, labelDims[i])); + } + + return vals.join(' '); + } + } + + function getDefaultInterpolatedLabel(data, interpolatedValue) { + var labelDims = data.mapDimensionsAll('defaultedLabel'); + + if (!isArray(interpolatedValue)) { + return interpolatedValue + ''; + } + + var vals = []; + + for (var i = 0; i < labelDims.length; i++) { + var dimIndex = data.getDimensionIndex(labelDims[i]); + + if (dimIndex >= 0) { + vals.push(interpolatedValue[dimIndex]); + } + } + + return vals.join(' '); + } + + var Symbol = + /** @class */ + function (_super) { + __extends(Symbol, _super); + + function Symbol(data, idx, seriesScope, opts) { + var _this = _super.call(this) || this; + + _this.updateData(data, idx, seriesScope, opts); + + return _this; + } + + Symbol.prototype._createSymbol = function (symbolType, data, idx, symbolSize, keepAspect) { + // Remove paths created before + this.removeAll(); // let symbolPath = createSymbol( + // symbolType, -0.5, -0.5, 1, 1, color + // ); + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4150. + + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, null, keepAspect); + symbolPath.attr({ + z2: 100, + culling: true, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }); // Rewrite drift method + + symbolPath.drift = driftSymbol; + this._symbolType = symbolType; + this.add(symbolPath); + }; + /** + * Stop animation + * @param {boolean} toLastFrame + */ + + + Symbol.prototype.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(null, toLastFrame); + }; + + Symbol.prototype.getSymbolType = function () { + return this._symbolType; + }; + /** + * FIXME: + * Caution: This method breaks the encapsulation of this module, + * but it indeed brings convenience. So do not use the method + * unless you detailedly know all the implements of `Symbol`, + * especially animation. + * + * Get symbol path element. + */ + + + Symbol.prototype.getSymbolPath = function () { + return this.childAt(0); + }; + /** + * Highlight symbol + */ + + + Symbol.prototype.highlight = function () { + enterEmphasis(this.childAt(0)); + }; + /** + * Downplay symbol + */ + + + Symbol.prototype.downplay = function () { + leaveEmphasis(this.childAt(0)); + }; + /** + * @param {number} zlevel + * @param {number} z + */ + + + Symbol.prototype.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; + }; + + Symbol.prototype.setDraggable = function (draggable) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = draggable ? 'move' : symbolPath.cursor; + }; + /** + * Update symbol properties + */ + + + Symbol.prototype.updateData = function (data, idx, seriesScope, opts) { + this.silent = false; + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = Symbol.getSymbolSize(data, idx); + var isInit = symbolType !== this._symbolType; + var disableAnimation = opts && opts.disableAnimation; + + if (isInit) { + var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect'); + + this._createSymbol(symbolType, data, idx, symbolSize, keepAspect); + } else { + var symbolPath = this.childAt(0); + symbolPath.silent = false; + var target = { + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2 + }; + disableAnimation ? symbolPath.attr(target) : updateProps(symbolPath, target, seriesModel, idx); + saveOldStyle(symbolPath); + } + + this._updateCommon(data, idx, symbolSize, seriesScope, opts); + + if (isInit) { + var symbolPath = this.childAt(0); + + if (!disableAnimation) { + var target = { + scaleX: this._sizeX, + scaleY: this._sizeY, + style: { + // Always fadeIn. Because it has fadeOut animation when symbol is removed.. + opacity: symbolPath.style.opacity + } + }; + symbolPath.scaleX = symbolPath.scaleY = 0; + symbolPath.style.opacity = 0; + initProps(symbolPath, target, seriesModel, idx); + } + } + + if (disableAnimation) { + // Must stop leave transition manually if don't call initProps or updateProps. + this.childAt(0).stopAnimation('leave'); + } + }; + + Symbol.prototype._updateCommon = function (data, idx, symbolSize, seriesScope, opts) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var emphasisItemStyle; + var blurItemStyle; + var selectItemStyle; + var focus; + var blurScope; + var emphasisDisabled; + var labelStatesModels; + var hoverScale; + var cursorStyle; + + if (seriesScope) { + emphasisItemStyle = seriesScope.emphasisItemStyle; + blurItemStyle = seriesScope.blurItemStyle; + selectItemStyle = seriesScope.selectItemStyle; + focus = seriesScope.focus; + blurScope = seriesScope.blurScope; + labelStatesModels = seriesScope.labelStatesModels; + hoverScale = seriesScope.hoverScale; + cursorStyle = seriesScope.cursorStyle; + emphasisDisabled = seriesScope.emphasisDisabled; + } + + if (!seriesScope || data.hasItemOption) { + var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + selectItemStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + blurItemStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + emphasisDisabled = emphasisModel.get('disabled'); + labelStatesModels = getLabelStatesModels(itemModel); + hoverScale = emphasisModel.getShallow('scale'); + cursorStyle = itemModel.getShallow('cursor'); + } + + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0); + var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize); + + if (symbolOffset) { + symbolPath.x = symbolOffset[0]; + symbolPath.y = symbolOffset[1]; + } + + cursorStyle && symbolPath.attr('cursor', cursorStyle); + var symbolStyle = data.getItemVisual(idx, 'style'); + var visualColor = symbolStyle.fill; + + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolStyle)); + } else { + if (symbolPath.__isEmptyBrush) { + // fill and stroke will be swapped if it's empty. + // So we cloned a new style to avoid it affecting the original style in visual storage. + // TODO Better implementation. No empty logic! + symbolPath.useStyle(extend({}, symbolStyle)); + } else { + symbolPath.useStyle(symbolStyle); + } // Disable decal because symbol scale will been applied on the decal. + + + symbolPath.style.decal = null; + symbolPath.setColor(visualColor, opts && opts.symbolInnerColor); + symbolPath.style.strokeNoScale = true; + } + + var liftZ = data.getItemVisual(idx, 'liftZ'); + var z2Origin = this._z2; + + if (liftZ != null) { + if (z2Origin == null) { + this._z2 = symbolPath.z2; + symbolPath.z2 += liftZ; + } + } else if (z2Origin != null) { + symbolPath.z2 = z2Origin; + this._z2 = null; + } + + var useNameLabel = opts && opts.useNameLabel; + setLabelStyle(symbolPath, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultText: getLabelDefaultText, + inheritColor: visualColor, + defaultOpacity: symbolStyle.opacity + }); // Do not execute util needed. + + function getLabelDefaultText(idx) { + return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx); + } + + this._sizeX = symbolSize[0] / 2; + this._sizeY = symbolSize[1] / 2; + var emphasisState = symbolPath.ensureState('emphasis'); + emphasisState.style = emphasisItemStyle; + symbolPath.ensureState('select').style = selectItemStyle; + symbolPath.ensureState('blur').style = blurItemStyle; + + if (hoverScale) { + var scaleRatio = Math.max(isNumber(hoverScale) ? hoverScale : 1.1, 3 / this._sizeY); + emphasisState.scaleX = this._sizeX * scaleRatio; + emphasisState.scaleY = this._sizeY * scaleRatio; + } + + this.setSymbolScale(1); + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Symbol.prototype.setSymbolScale = function (scale) { + this.scaleX = this.scaleY = scale; + }; + + Symbol.prototype.fadeOut = function (cb, seriesModel, opt) { + var symbolPath = this.childAt(0); + var dataIndex = getECData(this).dataIndex; + var animationOpt = opt && opt.animation; // Avoid mistaken hover when fading out + + this.silent = symbolPath.silent = true; // Not show text when animating + + if (opt && opt.fadeLabel) { + var textContent = symbolPath.getTextContent(); + + if (textContent) { + removeElement(textContent, { + style: { + opacity: 0 + } + }, seriesModel, { + dataIndex: dataIndex, + removeOpt: animationOpt, + cb: function () { + symbolPath.removeTextContent(); + } + }); + } + } else { + symbolPath.removeTextContent(); + } + + removeElement(symbolPath, { + style: { + opacity: 0 + }, + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: dataIndex, + cb: cb, + removeOpt: animationOpt + }); + }; + + Symbol.getSymbolSize = function (data, idx) { + return normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + }; + + return Symbol; + }(Group); + + function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); + } + + function symbolNeedsDraw(data, point, idx, opt) { + return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx)) // We do not set clipShape on group, because it will cut part of + // the symbol element shape. We use the same clip shape here as + // the line clip. + && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, 'symbol') !== 'none'; + } + + function normalizeUpdateOpt(opt) { + if (opt != null && !isObject(opt)) { + opt = { + isIgnore: opt + }; + } + + return opt || {}; + } + + function makeSeriesScope(data) { + var seriesModel = data.hostModel; + var emphasisModel = seriesModel.getModel('emphasis'); + return { + emphasisItemStyle: emphasisModel.getModel('itemStyle').getItemStyle(), + blurItemStyle: seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(), + selectItemStyle: seriesModel.getModel(['select', 'itemStyle']).getItemStyle(), + focus: emphasisModel.get('focus'), + blurScope: emphasisModel.get('blurScope'), + emphasisDisabled: emphasisModel.get('disabled'), + hoverScale: emphasisModel.get('scale'), + labelStatesModels: getLabelStatesModels(seriesModel), + cursorStyle: seriesModel.get('cursor') + }; + } + + var SymbolDraw = + /** @class */ + function () { + function SymbolDraw(SymbolCtor) { + this.group = new Group(); + this._SymbolCtor = SymbolCtor || Symbol; + } + + /** + * Update symbols draw by new data + */ + + + SymbolDraw.prototype.updateData = function (data, opt) { + // Remove progressive els. + this._progressiveEls = null; + opt = normalizeUpdateOpt(opt); + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + var SymbolCtor = this._SymbolCtor; + var disableAnimation = opt.disableAnimation; + var seriesScope = makeSeriesScope(data); + var symbolUpdateOpt = { + disableAnimation: disableAnimation + }; + + var getSymbolPoint = opt.getSymbolPoint || function (idx) { + return data.getItemLayout(idx); + }; // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + + if (!oldData) { + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + var point = getSymbolPoint(newIdx); + + if (symbolNeedsDraw(data, point, newIdx, opt)) { + var symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = getSymbolPoint(newIdx); + + if (!symbolNeedsDraw(data, point, newIdx, opt)) { + group.remove(symbolEl); + return; + } + + var newSymbolType = data.getItemVisual(newIdx, 'symbol') || 'circle'; + var oldSymbolType = symbolEl && symbolEl.getSymbolType && symbolEl.getSymbolType(); + + if (!symbolEl // Create a new if symbol type changed. + || oldSymbolType && oldSymbolType !== newSymbolType) { + group.remove(symbolEl); + symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt); + symbolEl.setPosition(point); + } else { + symbolEl.updateData(data, newIdx, seriesScope, symbolUpdateOpt); + var target = { + x: point[0], + y: point[1] + }; + disableAnimation ? symbolEl.attr(target) : updateProps(symbolEl, target, seriesModel); + } // Add back + + + group.add(symbolEl); + data.setItemGraphicEl(newIdx, symbolEl); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && el.fadeOut(function () { + group.remove(el); + }, seriesModel); + }).execute(); + this._getSymbolPoint = getSymbolPoint; + this._data = data; + }; + + SymbolDraw.prototype.updateLayout = function () { + var _this = this; + + var data = this._data; + + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + var point = _this._getSymbolPoint(idx); + + el.setPosition(point); + el.markRedraw(); + }); + } + }; + + SymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this._seriesScope = makeSeriesScope(data); + this._data = null; + this.group.removeAll(); + }; + /** + * Update symbols draw by new data + */ + + SymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + // Clear + this._progressiveEls = []; + opt = normalizeUpdateOpt(opt); + + function updateIncrementalAndHover(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var point = data.getItemLayout(idx); + + if (symbolNeedsDraw(data, point, idx, opt)) { + var el = new this._SymbolCtor(data, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + el.setPosition(point); + this.group.add(el); + data.setItemGraphicEl(idx, el); + + this._progressiveEls.push(el); + } + } + }; + + SymbolDraw.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + SymbolDraw.prototype.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; // Incremental model do not have this._data. + + if (data && enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }, data.hostModel); + }); + } else { + group.removeAll(); + } + }; + return SymbolDraw; + }(); + + function prepareDataCoordInfo(coordSys, data, valueOrigin) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = getValueStart(valueAxis, valueOrigin); + var baseAxisDim = baseAxis.dim; + var valueAxisDim = valueAxis.dim; + var valueDim = data.mapDimension(valueAxisDim); + var baseDim = data.mapDimension(baseAxisDim); + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var dims = map(coordSys.dimensions, function (coordDim) { + return data.mapDimension(coordDim); + }); + var stacked = false; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + + if (isDimensionStacked(data, dims[0] + /*, dims[1]*/ + )) { + // jshint ignore:line + stacked = true; + dims[0] = stackResultDim; + } + + if (isDimensionStacked(data, dims[1] + /*, dims[0]*/ + )) { + // jshint ignore:line + stacked = true; + dims[1] = stackResultDim; + } + + return { + dataDimsForPoint: dims, + valueStart: valueStart, + valueAxisDim: valueAxisDim, + baseAxisDim: baseAxisDim, + stacked: !!stacked, + valueDim: valueDim, + baseDim: baseDim, + baseDataOffset: baseDataOffset, + stackedOverDimension: data.getCalculationInfo('stackedOverDimension') + }; + } + + function getValueStart(valueAxis, valueOrigin) { + var valueStart = 0; + var extent = valueAxis.scale.getExtent(); + + if (valueOrigin === 'start') { + valueStart = extent[0]; + } else if (valueOrigin === 'end') { + valueStart = extent[1]; + } // If origin is specified as a number, use it as + // valueStart directly + else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) { + valueStart = valueOrigin; + } // auto + else { + // Both positive + if (extent[0] > 0) { + valueStart = extent[0]; + } // Both negative + else if (extent[1] < 0) { + valueStart = extent[1]; + } // If is one positive, and one negative, onZero shall be true + + } + + return valueStart; + } + + function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) { + var value = NaN; + + if (dataCoordInfo.stacked) { + value = data.get(data.getCalculationInfo('stackedOverDimension'), idx); + } + + if (isNaN(value)) { + value = dataCoordInfo.valueStart; + } + + var baseDataOffset = dataCoordInfo.baseDataOffset; + var stackedData = []; + stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); + stackedData[1 - baseDataOffset] = value; + return coordSys.dataToPoint(stackedData); + } + + function diffData(oldData, newData) { + var diffResult = []; + newData.diff(oldData).add(function (idx) { + diffResult.push({ + cmd: '+', + idx: idx + }); + }).update(function (newIdx, oldIdx) { + diffResult.push({ + cmd: '=', + idx: oldIdx, + idx1: newIdx + }); + }).remove(function (idx) { + diffResult.push({ + cmd: '-', + idx: idx + }); + }).execute(); + return diffResult; + } + + function lineAnimationDiff(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) { + var diff = diffData(oldData, newData); // let newIdList = newData.mapArray(newData.getId); + // let oldIdList = oldData.mapArray(oldData.getId); + // convertToIntId(newIdList, oldIdList); + // // FIXME One data ? + // diff = arrayDiff(oldIdList, newIdList); + + var currPoints = []; + var nextPoints = []; // Points for stacking base line + + var currStackedPoints = []; + var nextStackedPoints = []; + var status = []; + var sortedIndices = []; + var rawIndices = []; + var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin); // const oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin); + + var oldPoints = oldData.getLayout('points') || []; + var newPoints = newData.getLayout('points') || []; + + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + var oldIdx2 = void 0; + var newIdx2 = void 0; // FIXME, animation is not so perfect when dataZoom window moves fast + // Which is in case remvoing or add more than one data in the tail or head + + switch (diffItem.cmd) { + case '=': + oldIdx2 = diffItem.idx * 2; + newIdx2 = diffItem.idx1 * 2; + var currentX = oldPoints[oldIdx2]; + var currentY = oldPoints[oldIdx2 + 1]; + var nextX = newPoints[newIdx2]; + var nextY = newPoints[newIdx2 + 1]; // If previous data is NaN, use next point directly + + if (isNaN(currentX) || isNaN(currentY)) { + currentX = nextX; + currentY = nextY; + } + + currPoints.push(currentX, currentY); + nextPoints.push(nextX, nextY); + currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + + case '+': + var newIdx = diffItem.idx; + var newDataDimsForPoint = newDataOldCoordInfo.dataDimsForPoint; + var oldPt = oldCoordSys.dataToPoint([newData.get(newDataDimsForPoint[0], newIdx), newData.get(newDataDimsForPoint[1], newIdx)]); + newIdx2 = newIdx * 2; + currPoints.push(oldPt[0], oldPt[1]); + nextPoints.push(newPoints[newIdx2], newPoints[newIdx2 + 1]); + var stackedOnPoint = getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, newIdx); + currStackedPoints.push(stackedOnPoint[0], stackedOnPoint[1]); + nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]); + rawIndices.push(newData.getRawIndex(newIdx)); + break; + + case '-': + pointAdded = false; + } // Original indices + + + if (pointAdded) { + status.push(diffItem); + sortedIndices.push(sortedIndices.length); + } + } // Diff result may be crossed if all items are changed + // Sort by data index + + + sortedIndices.sort(function (a, b) { + return rawIndices[a] - rawIndices[b]; + }); + var len = currPoints.length; + var sortedCurrPoints = createFloat32Array(len); + var sortedNextPoints = createFloat32Array(len); + var sortedCurrStackedPoints = createFloat32Array(len); + var sortedNextStackedPoints = createFloat32Array(len); + var sortedStatus = []; + + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + var i2 = i * 2; + var idx2 = idx * 2; + sortedCurrPoints[i2] = currPoints[idx2]; + sortedCurrPoints[i2 + 1] = currPoints[idx2 + 1]; + sortedNextPoints[i2] = nextPoints[idx2]; + sortedNextPoints[i2 + 1] = nextPoints[idx2 + 1]; + sortedCurrStackedPoints[i2] = currStackedPoints[idx2]; + sortedCurrStackedPoints[i2 + 1] = currStackedPoints[idx2 + 1]; + sortedNextStackedPoints[i2] = nextStackedPoints[idx2]; + sortedNextStackedPoints[i2 + 1] = nextStackedPoints[idx2 + 1]; + sortedStatus[i] = status[idx]; + } + + return { + current: sortedCurrPoints, + next: sortedNextPoints, + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + status: sortedStatus + }; + } + + var mathMin$5 = Math.min; + var mathMax$5 = Math.max; + + function isPointNull(x, y) { + return isNaN(x) || isNaN(y); + } + + /** + * Draw smoothed line in non-monotone, in may cause undesired curve in extreme + * situations. This should be used when points are non-monotone neither in x or + * y dimension. + */ + + + function drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) { + var prevX; + var prevY; + var cpx0; + var cpy0; + var cpx1; + var cpy1; + var idx = start; + var k = 0; + + for (; k < segLen; k++) { + var x = points[idx * 2]; + var y = points[idx * 2 + 1]; + + if (idx >= allLen || idx < 0) { + break; + } + + if (isPointNull(x, y)) { + if (connectNulls) { + idx += dir; + continue; + } + + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y); + cpx0 = x; + cpy0 = y; + } else { + var dx = x - prevX; + var dy = y - prevY; // Ignore tiny segment. + + if (dx * dx + dy * dy < 0.5) { + idx += dir; + continue; + } + + if (smooth > 0) { + var nextIdx = idx + dir; + var nextX = points[nextIdx * 2]; + var nextY = points[nextIdx * 2 + 1]; // Ignore duplicate point + + while (nextX === x && nextY === y && k < segLen) { + k++; + nextIdx += dir; + idx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + x = points[idx * 2]; + y = points[idx * 2 + 1]; + dx = x - prevX; + dy = y - prevY; + } + + var tmpK = k + 1; + + if (connectNulls) { + // Find next point not null + while (isPointNull(nextX, nextY) && tmpK < segLen) { + tmpK++; + nextIdx += dir; + nextX = points[nextIdx * 2]; + nextY = points[nextIdx * 2 + 1]; + } + } + + var ratioNextSeg = 0.5; + var vx = 0; + var vy = 0; + var nextCpx0 = void 0; + var nextCpy0 = void 0; // Is last point + + if (tmpK >= segLen || isPointNull(nextX, nextY)) { + cpx1 = x; + cpy1 = y; + } else { + vx = nextX - prevX; + vy = nextY - prevY; + var dx0 = x - prevX; + var dx1 = nextX - x; + var dy0 = y - prevY; + var dy1 = nextY - y; + var lenPrevSeg = void 0; + var lenNextSeg = void 0; + + if (smoothMonotone === 'x') { + lenPrevSeg = Math.abs(dx0); + lenNextSeg = Math.abs(dx1); + var dir_1 = vx > 0 ? 1 : -1; + cpx1 = x - dir_1 * lenPrevSeg * smooth; + cpy1 = y; + nextCpx0 = x + dir_1 * lenNextSeg * smooth; + nextCpy0 = y; + } else if (smoothMonotone === 'y') { + lenPrevSeg = Math.abs(dy0); + lenNextSeg = Math.abs(dy1); + var dir_2 = vy > 0 ? 1 : -1; + cpx1 = x; + cpy1 = y - dir_2 * lenPrevSeg * smooth; + nextCpx0 = x; + nextCpy0 = y + dir_2 * lenNextSeg * smooth; + } else { + lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0); + lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1); // Use ratio of seg length + + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + cpx1 = x - vx * smooth * (1 - ratioNextSeg); + cpy1 = y - vy * smooth * (1 - ratioNextSeg); // cp0 of next segment + + nextCpx0 = x + vx * smooth * ratioNextSeg; + nextCpy0 = y + vy * smooth * ratioNextSeg; // Smooth constraint between point and next point. + // Avoid exceeding extreme after smoothing. + + nextCpx0 = mathMin$5(nextCpx0, mathMax$5(nextX, x)); + nextCpy0 = mathMin$5(nextCpy0, mathMax$5(nextY, y)); + nextCpx0 = mathMax$5(nextCpx0, mathMin$5(nextX, x)); + nextCpy0 = mathMax$5(nextCpy0, mathMin$5(nextY, y)); // Reclaculate cp1 based on the adjusted cp0 of next seg. + + vx = nextCpx0 - x; + vy = nextCpy0 - y; + cpx1 = x - vx * lenPrevSeg / lenNextSeg; + cpy1 = y - vy * lenPrevSeg / lenNextSeg; // Smooth constraint between point and prev point. + // Avoid exceeding extreme after smoothing. + + cpx1 = mathMin$5(cpx1, mathMax$5(prevX, x)); + cpy1 = mathMin$5(cpy1, mathMax$5(prevY, y)); + cpx1 = mathMax$5(cpx1, mathMin$5(prevX, x)); + cpy1 = mathMax$5(cpy1, mathMin$5(prevY, y)); // Adjust next cp0 again. + + vx = x - cpx1; + vy = y - cpy1; + nextCpx0 = x + vx * lenNextSeg / lenPrevSeg; + nextCpy0 = y + vy * lenNextSeg / lenPrevSeg; + } + } + + ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y); + cpx0 = nextCpx0; + cpy0 = nextCpy0; + } else { + ctx.lineTo(x, y); + } + } + + prevX = x; + prevY = y; + idx += dir; + } + + return k; + } + + var ECPolylineShape = + /** @class */ + function () { + function ECPolylineShape() { + this.smooth = 0; + this.smoothConstraint = true; + } + + return ECPolylineShape; + }(); + + var ECPolyline = + /** @class */ + function (_super) { + __extends(ECPolyline, _super); + + function ECPolyline(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-polyline'; + return _this; + } + + ECPolyline.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + ECPolyline.prototype.getDefaultShape = function () { + return new ECPolylineShape(); + }; + + ECPolyline.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var i = 0; + var len = points.length / 2; // const result = getBoundingBox(points, shape.smoothConstraint); + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + for (; i < len; i++) { + if (!isPointNull(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + + while (i < len) { + i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1; + } + }; + + ECPolyline.prototype.getPointOn = function (xOrY, dim) { + if (!this.path) { + this.createPathProxy(); + this.buildPath(this.path, this.shape); + } + + var path = this.path; + var data = path.data; + var CMD = PathProxy.CMD; + var x0; + var y0; + var isDimX = dim === 'x'; + var roots = []; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + var x = void 0; + var y = void 0; + var x2 = void 0; + var y2 = void 0; + var x3 = void 0; + var y3 = void 0; + var t = void 0; + + switch (cmd) { + case CMD.M: + x0 = data[i++]; + y0 = data[i++]; + break; + + case CMD.L: + x = data[i++]; + y = data[i++]; + t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0); + + if (t <= 1 && t >= 0) { + var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0; + return isDimX ? [xOrY, val] : [val, xOrY]; + } + + x0 = x; + y0 = y; + break; + + case CMD.C: + x = data[i++]; + y = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + x3 = data[i++]; + y3 = data[i++]; + var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots); + + if (nRoot > 0) { + for (var i_1 = 0; i_1 < nRoot; i_1++) { + var t_1 = roots[i_1]; + + if (t_1 <= 1 && t_1 >= 0) { + var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1); + return isDimX ? [xOrY, val] : [val, xOrY]; + } + } + } + + x0 = x3; + y0 = y3; + break; + } + } + }; + + return ECPolyline; + }(Path); + + var ECPolygonShape = + /** @class */ + function (_super) { + __extends(ECPolygonShape, _super); + + function ECPolygonShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return ECPolygonShape; + }(ECPolylineShape); + + var ECPolygon = + /** @class */ + function (_super) { + __extends(ECPolygon, _super); + + function ECPolygon(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-polygon'; + return _this; + } + + ECPolygon.prototype.getDefaultShape = function () { + return new ECPolygonShape(); + }; + + ECPolygon.prototype.buildPath = function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + var i = 0; + var len = points.length / 2; + var smoothMonotone = shape.smoothMonotone; + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len > 0; len--) { + if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + for (; i < len; i++) { + if (!isPointNull(points[i * 2], points[i * 2 + 1])) { + break; + } + } + } + + while (i < len) { + var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls); + drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls); + i += k + 1; + ctx.closePath(); + } + }; + + return ECPolygon; + }(Path); + + function createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) { + var rect = cartesian.getArea(); + var x = rect.x; + var y = rect.y; + var width = rect.width; + var height = rect.height; + var lineWidth = seriesModel.get(['lineStyle', 'width']) || 2; // Expand the clip path a bit to avoid the border is clipped and looks thinner + + x -= lineWidth / 2; + y -= lineWidth / 2; + width += lineWidth; + height += lineWidth; // fix: https://github.com/apache/incubator-echarts/issues/11369 + + x = Math.floor(x); + width = Math.round(width); + var clipPath = new Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + + if (hasAnimation) { + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isAxisInversed = baseAxis.inverse; + + if (isHorizontal) { + if (isAxisInversed) { + clipPath.shape.x += width; + } + + clipPath.shape.width = 0; + } else { + if (!isAxisInversed) { + clipPath.shape.y += height; + } + + clipPath.shape.height = 0; + } + + var duringCb = isFunction(during) ? function (percent) { + during(percent, clipPath); + } : null; + initProps(clipPath, { + shape: { + width: width, + height: height, + x: x, + y: y + } + }, seriesModel, null, done, duringCb); + } + + return clipPath; + } + + function createPolarClipPath(polar, hasAnimation, seriesModel) { + var sectorArea = polar.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent. + + var r0 = round(sectorArea.r0, 1); + var r = round(sectorArea.r, 1); + var clipPath = new Sector({ + shape: { + cx: round(polar.cx, 1), + cy: round(polar.cy, 1), + r0: r0, + r: r, + startAngle: sectorArea.startAngle, + endAngle: sectorArea.endAngle, + clockwise: sectorArea.clockwise + } + }); + + if (hasAnimation) { + var isRadial = polar.getBaseAxis().dim === 'angle'; + + if (isRadial) { + clipPath.shape.endAngle = sectorArea.startAngle; + } else { + clipPath.shape.r = r0; + } + + initProps(clipPath, { + shape: { + endAngle: sectorArea.endAngle, + r: r + } + }, seriesModel); + } + + return clipPath; + } + + function createClipPath(coordSys, hasAnimation, seriesModel, done, during) { + if (!coordSys) { + return null; + } else if (coordSys.type === 'polar') { + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } else if (coordSys.type === 'cartesian2d') { + return createGridClipPath(coordSys, hasAnimation, seriesModel, done, during); + } + + return null; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function isCoordinateSystemType(coordSys, type) { + return coordSys.type === type; + } + + function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + + for (var i = 0; i < points1.length; i++) { + if (points1[i] !== points2[i]) { + return; + } + } + + return true; + } + + function bboxFromPoints(points) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (!isNaN(x)) { + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + } + + if (!isNaN(y)) { + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + } + + return [[minX, minY], [maxX, maxY]]; + } + + function getBoundingDiff(points1, points2) { + var _a = bboxFromPoints(points1), + min1 = _a[0], + max1 = _a[1]; + + var _b = bboxFromPoints(points2), + min2 = _b[0], + max2 = _b[1]; // Get a max value from each corner of two boundings. + + + return Math.max(Math.abs(min1[0] - min2[0]), Math.abs(min1[1] - min2[1]), Math.abs(max1[0] - max2[0]), Math.abs(max1[1] - max2[1])); + } + + function getSmooth(smooth) { + return isNumber(smooth) ? smooth : smooth ? 0.5 : 0; + } + + function getStackedOnPoints(coordSys, data, dataCoordInfo) { + if (!dataCoordInfo.valueDim) { + return []; + } + + var len = data.count(); + var points = createFloat32Array(len * 2); + + for (var idx = 0; idx < len; idx++) { + var pt = getStackedOnPoint(dataCoordInfo, coordSys, data, idx); + points[idx * 2] = pt[0]; + points[idx * 2 + 1] = pt[1]; + } + + return points; + } + + function turnPointsIntoStep(points, coordSys, stepTurnAt, connectNulls) { + var baseAxis = coordSys.getBaseAxis(); + var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1; + var stepPoints = []; + var i = 0; + var stepPt = []; + var pt = []; + var nextPt = []; + var filteredPoints = []; + + if (connectNulls) { + for (i = 0; i < points.length; i += 2) { + if (!isNaN(points[i]) && !isNaN(points[i + 1])) { + filteredPoints.push(points[i], points[i + 1]); + } + } + + points = filteredPoints; + } + + for (i = 0; i < points.length - 2; i += 2) { + nextPt[0] = points[i + 2]; + nextPt[1] = points[i + 3]; + pt[0] = points[i]; + pt[1] = points[i + 1]; + stepPoints.push(pt[0], pt[1]); + + switch (stepTurnAt) { + case 'end': + stepPt[baseIndex] = nextPt[baseIndex]; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + break; + + case 'middle': + var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2; + var stepPt2 = []; + stepPt[baseIndex] = stepPt2[baseIndex] = middle; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPt2[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + stepPoints.push(stepPt2[0], stepPt2[1]); + break; + + default: + // default is start + stepPt[baseIndex] = pt[baseIndex]; + stepPt[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt[0], stepPt[1]); + } + } // Last points + + + stepPoints.push(points[i++], points[i++]); + return stepPoints; + } + + /** + * Clip color stops to edge. Avoid creating too large gradients. + * Which may lead to blurry when GPU acceleration is enabled. See #15680 + * + * The stops has been sorted from small to large. + */ + + + function clipColorStops(colorStops, maxSize) { + var newColorStops = []; + var len = colorStops.length; // coord will always < 0 in prevOutOfRangeColorStop. + + var prevOutOfRangeColorStop; + var prevInRangeColorStop; + + function lerpStop(stop0, stop1, clippedCoord) { + var coord0 = stop0.coord; + var p = (clippedCoord - coord0) / (stop1.coord - coord0); + var color = lerp$1(p, [stop0.color, stop1.color]); + return { + coord: clippedCoord, + color: color + }; + } + + for (var i = 0; i < len; i++) { + var stop_1 = colorStops[i]; + var coord = stop_1.coord; + + if (coord < 0) { + prevOutOfRangeColorStop = stop_1; + } else if (coord > maxSize) { + if (prevInRangeColorStop) { + newColorStops.push(lerpStop(prevInRangeColorStop, stop_1, maxSize)); + } else if (prevOutOfRangeColorStop) { + // If there are two stops and coord range is between these two stops + newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0), lerpStop(prevOutOfRangeColorStop, stop_1, maxSize)); + } // All following stop will be out of range. So just ignore them. + + + break; + } else { + if (prevOutOfRangeColorStop) { + newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0)); // Reset + + prevOutOfRangeColorStop = null; + } + + newColorStops.push(stop_1); + prevInRangeColorStop = stop_1; + } + } + + return newColorStops; + } + + function getVisualGradient(data, coordSys, api) { + var visualMetaList = data.getVisual('visualMeta'); + + if (!visualMetaList || !visualMetaList.length || !data.count()) { + // When data.count() is 0, gradient range can not be calculated. + return; + } + + if (coordSys.type !== 'cartesian2d') { + if ("development" !== 'production') { + console.warn('Visual map on line style is only supported on cartesian2d.'); + } + + return; + } + + var coordDim; + var visualMeta; + + for (var i = visualMetaList.length - 1; i >= 0; i--) { + var dimInfo = data.getDimensionInfo(visualMetaList[i].dimension); + coordDim = dimInfo && dimInfo.coordDim; // Can only be x or y + + if (coordDim === 'x' || coordDim === 'y') { + visualMeta = visualMetaList[i]; + break; + } + } + + if (!visualMeta) { + if ("development" !== 'production') { + console.warn('Visual map on line style only support x or y dimension.'); + } + + return; + } // If the area to be rendered is bigger than area defined by LinearGradient, + // the canvas spec prescribes that the color of the first stop and the last + // stop should be used. But if two stops are added at offset 0, in effect + // browsers use the color of the second stop to render area outside + // LinearGradient. So we can only infinitesimally extend area defined in + // LinearGradient to render `outerColors`. + + + var axis = coordSys.getAxis(coordDim); // dataToCoord mapping may not be linear, but must be monotonic. + + var colorStops = map(visualMeta.stops, function (stop) { + // offset will be calculated later. + return { + coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)), + color: stop.color + }; + }); + var stopLen = colorStops.length; + var outerColors = visualMeta.outerColors.slice(); + + if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) { + colorStops.reverse(); + outerColors.reverse(); + } + + var colorStopsInRange = clipColorStops(colorStops, coordDim === 'x' ? api.getWidth() : api.getHeight()); + var inRangeStopLen = colorStopsInRange.length; + + if (!inRangeStopLen && stopLen) { + // All stops are out of range. All will be the same color. + return colorStops[0].coord < 0 ? outerColors[1] ? outerColors[1] : colorStops[stopLen - 1].color : outerColors[0] ? outerColors[0] : colorStops[0].color; + } + + var tinyExtent = 10; // Arbitrary value: 10px + + var minCoord = colorStopsInRange[0].coord - tinyExtent; + var maxCoord = colorStopsInRange[inRangeStopLen - 1].coord + tinyExtent; + var coordSpan = maxCoord - minCoord; + + if (coordSpan < 1e-3) { + return 'transparent'; + } + + each(colorStopsInRange, function (stop) { + stop.offset = (stop.coord - minCoord) / coordSpan; + }); + colorStopsInRange.push({ + // NOTE: inRangeStopLen may still be 0 if stoplen is zero. + offset: inRangeStopLen ? colorStopsInRange[inRangeStopLen - 1].offset : 0.5, + color: outerColors[1] || 'transparent' + }); + colorStopsInRange.unshift({ + offset: inRangeStopLen ? colorStopsInRange[0].offset : 0.5, + color: outerColors[0] || 'transparent' + }); + var gradient = new LinearGradient(0, 0, 0, 0, colorStopsInRange, true); + gradient[coordDim] = minCoord; + gradient[coordDim + '2'] = maxCoord; + return gradient; + } + + function getIsIgnoreFunc(seriesModel, data, coordSys) { + var showAllSymbol = seriesModel.get('showAllSymbol'); + var isAuto = showAllSymbol === 'auto'; + + if (showAllSymbol && !isAuto) { + return; + } + + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + + if (!categoryAxis) { + return; + } // Note that category label interval strategy might bring some weird effect + // in some scenario: users may wonder why some of the symbols are not + // displayed. So we show all symbols as possible as we can. + + + if (isAuto // Simplify the logic, do not determine label overlap here. + && canShowAllSymbolForCategory(categoryAxis, data)) { + return; + } // Otherwise follow the label interval strategy on category axis. + + + var categoryDataDim = data.mapDimension(categoryAxis.dim); + var labelMap = {}; + each(categoryAxis.getViewLabels(), function (labelItem) { + var ordinalNumber = categoryAxis.scale.getRawOrdinalNumber(labelItem.tickValue); + labelMap[ordinalNumber] = 1; + }); + return function (dataIndex) { + return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex)); + }; + } + + function canShowAllSymbolForCategory(categoryAxis, data) { + // In mose cases, line is monotonous on category axis, and the label size + // is close with each other. So we check the symbol size and some of the + // label size alone with the category axis to estimate whether all symbol + // can be shown without overlap. + var axisExtent = categoryAxis.getExtent(); + var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count(); + isNaN(availSize) && (availSize = 0); // 0/0 is NaN. + // Sampling some points, max 5. + + var dataLen = data.count(); + var step = Math.max(1, Math.round(dataLen / 5)); + + for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) { + if (Symbol.getSymbolSize(data, dataIndex // Only for cartesian, where `isHorizontal` exists. + )[categoryAxis.isHorizontal() ? 1 : 0] // Empirical number + * 1.5 > availSize) { + return false; + } + } + + return true; + } + + function isPointNull$1(x, y) { + return isNaN(x) || isNaN(y); + } + + function getLastIndexNotNull(points) { + var len = points.length / 2; + + for (; len > 0; len--) { + if (!isPointNull$1(points[len * 2 - 2], points[len * 2 - 1])) { + break; + } + } + + return len - 1; + } + + function getPointAtIndex(points, idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + + function getIndexRange(points, xOrY, dim) { + var len = points.length / 2; + var dimIdx = dim === 'x' ? 0 : 1; + var a; + var b; + var prevIndex = 0; + var nextIndex = -1; + + for (var i = 0; i < len; i++) { + b = points[i * 2 + dimIdx]; + + if (isNaN(b) || isNaN(points[i * 2 + 1 - dimIdx])) { + continue; + } + + if (i === 0) { + a = b; + continue; + } + + if (a <= xOrY && b >= xOrY || a >= xOrY && b <= xOrY) { + nextIndex = i; + break; + } + + prevIndex = i; + a = b; + } + + return { + range: [prevIndex, nextIndex], + t: (xOrY - a) / (b - a) + }; + } + + function anyStateShowEndLabel(seriesModel) { + if (seriesModel.get(['endLabel', 'show'])) { + return true; + } + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + if (seriesModel.get([SPECIAL_STATES[i], 'endLabel', 'show'])) { + return true; + } + } + + return false; + } + + function createLineClipPath(lineView, coordSys, hasAnimation, seriesModel) { + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + var endLabelModel_1 = seriesModel.getModel('endLabel'); + var valueAnimation_1 = endLabelModel_1.get('valueAnimation'); + var data_1 = seriesModel.getData(); + var labelAnimationRecord_1 = { + lastFrameIndex: 0 + }; + var during = anyStateShowEndLabel(seriesModel) ? function (percent, clipRect) { + lineView._endLabelOnDuring(percent, clipRect, data_1, labelAnimationRecord_1, valueAnimation_1, endLabelModel_1, coordSys); + } : null; + var isHorizontal = coordSys.getBaseAxis().isHorizontal(); + var clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel, function () { + var endLabel = lineView._endLabel; + + if (endLabel && hasAnimation) { + if (labelAnimationRecord_1.originalX != null) { + endLabel.attr({ + x: labelAnimationRecord_1.originalX, + y: labelAnimationRecord_1.originalY + }); + } + } + }, during); // Expand clip shape to avoid clipping when line value exceeds axis + + if (!seriesModel.get('clip', true)) { + var rectShape = clipPath.shape; + var expandSize = Math.max(rectShape.width, rectShape.height); + + if (isHorizontal) { + rectShape.y -= expandSize; + rectShape.height += expandSize * 2; + } else { + rectShape.x -= expandSize; + rectShape.width += expandSize * 2; + } + } // Set to the final frame. To make sure label layout is right. + + + if (during) { + during(1, clipPath); + } + + return clipPath; + } else { + if ("development" !== 'production') { + if (seriesModel.get(['endLabel', 'show'])) { + console.warn('endLabel is not supported for lines in polar systems.'); + } + } + + return createPolarClipPath(coordSys, hasAnimation, seriesModel); + } + } + + function getEndLabelStateSpecified(endLabelModel, coordSys) { + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var align = isHorizontal ? isBaseInversed ? 'right' : 'left' : 'center'; + var verticalAlign = isHorizontal ? 'middle' : isBaseInversed ? 'top' : 'bottom'; + return { + normal: { + align: endLabelModel.get('align') || align, + verticalAlign: endLabelModel.get('verticalAlign') || verticalAlign + } + }; + } + + var LineView = + /** @class */ + function (_super) { + __extends(LineView, _super); + + function LineView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + LineView.prototype.init = function () { + var lineGroup = new Group(); + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + }; + + LineView.prototype.render = function (seriesModel, ecModel, api) { + var _this = this; + + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel('lineStyle'); + var areaStyleModel = seriesModel.getModel('areaStyle'); + var points = data.getLayout('points') || []; + var isCoordSysPolar = coordSys.type === 'polar'; + var prevCoordSys = this._coordSys; + var symbolDraw = this._symbolDraw; + var polyline = this._polyline; + var polygon = this._polygon; + var lineGroup = this._lineGroup; + var hasAnimation = seriesModel.get('animation'); + var isAreaChart = !areaStyleModel.isEmpty(); + var valueOrigin = areaStyleModel.get('origin'); + var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin); + var stackedOnPoints = isAreaChart && getStackedOnPoints(coordSys, data, dataCoordInfo); + var showSymbol = seriesModel.get('showSymbol'); + var connectNulls = seriesModel.get('connectNulls'); + var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, data, coordSys); // Remove temporary symbols + + var oldData = this._data; + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); // Remove previous created symbols if showSymbol changed to false + + if (!showSymbol) { + symbolDraw.remove(); + } + + group.add(lineGroup); // FIXME step not support polar + + var step = !isCoordSysPolar ? seriesModel.get('step') : false; + var clipShapeForSymbol; + + if (coordSys && coordSys.getArea && seriesModel.get('clip', true)) { + clipShapeForSymbol = coordSys.getArea(); // Avoid float number rounding error for symbol on the edge of axis extent. + // See #7913 and `test/dataZoom-clip.html`. + + if (clipShapeForSymbol.width != null) { + clipShapeForSymbol.x -= 0.1; + clipShapeForSymbol.y -= 0.1; + clipShapeForSymbol.width += 0.2; + clipShapeForSymbol.height += 0.2; + } else if (clipShapeForSymbol.r0) { + clipShapeForSymbol.r0 -= 0.5; + clipShapeForSymbol.r += 0.5; + } + } + + this._clipShapeForSymbol = clipShapeForSymbol; + var visualColor = getVisualGradient(data, coordSys, api) || data.getVisual('style')[data.getVisual('drawType')]; // Initialization animation or coordinate system changed + + if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) { + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function (idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); + hasAnimation && this._initSymbolLabelAnimation(data, coordSys, clipShapeForSymbol); + + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step, connectNulls); + + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step, connectNulls); + } + } + + polyline = this._newPolyline(points); + + if (isAreaChart) { + polygon = this._newPolygon(points, stackedOnPoints); + } // NOTE: Must update _endLabel before setClipPath. + + + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } + + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } else { + if (isAreaChart && !polygon) { + // If areaStyle is added + polygon = this._newPolygon(points, stackedOnPoints); + } else if (polygon && !isAreaChart) { + // If areaStyle is removed + lineGroup.remove(polygon); + polygon = this._polygon = null; + } // NOTE: Must update _endLabel before setClipPath. + + + if (!isCoordSysPolar) { + this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor)); + } // Update clipPath + + + var oldClipPath = lineGroup.getClipPath(); + + if (oldClipPath) { + var newClipPath = createLineClipPath(this, coordSys, false, seriesModel); + initProps(oldClipPath, { + shape: newClipPath.shape + }, seriesModel); + } else { + lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel)); + } // Always update, or it is wrong in the case turning on legend + // because points are not changed + + + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: clipShapeForSymbol, + disableAnimation: true, + getSymbolPoint: function (idx) { + return [points[idx * 2], points[idx * 2 + 1]]; + } + }); // In the case data zoom triggerred refreshing frequently + // Data may not change if line has a category axis. So it should animate nothing + + if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points)) { + if (hasAnimation) { + this._doUpdateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls); + } else { + // Not do it in update with animation + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step, connectNulls); + + if (stackedOnPoints) { + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step, connectNulls); + } + } + + polyline.setShape({ + points: points + }); + polygon && polygon.setShape({ + points: points, + stackedOnPoints: stackedOnPoints + }); + } + } + } + + var emphasisModel = seriesModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + polyline.useStyle(defaults( // Use color in lineStyle first + lineStyleModel.getLineStyle(), { + fill: 'none', + stroke: visualColor, + lineJoin: 'bevel' + })); + setStatesStylesFromModel(polyline, seriesModel, 'lineStyle'); + + if (polyline.style.lineWidth > 0 && seriesModel.get(['emphasis', 'lineStyle', 'width']) === 'bolder') { + var emphasisLineStyle = polyline.getState('emphasis').style; + emphasisLineStyle.lineWidth = +polyline.style.lineWidth + 1; + } // Needs seriesIndex for focus + + + getECData(polyline).seriesIndex = seriesModel.seriesIndex; + toggleHoverEmphasis(polyline, focus, blurScope, emphasisDisabled); + var smooth = getSmooth(seriesModel.get('smooth')); + var smoothMonotone = seriesModel.get('smoothMonotone'); + polyline.setShape({ + smooth: smooth, + smoothMonotone: smoothMonotone, + connectNulls: connectNulls + }); + + if (polygon) { + var stackedOnSeries = data.getCalculationInfo('stackedOnSeries'); + var stackedOnSmooth = 0; + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: visualColor, + opacity: 0.7, + lineJoin: 'bevel', + decal: data.getVisual('style').decal + })); + + if (stackedOnSeries) { + stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth')); + } + + polygon.setShape({ + smooth: smooth, + stackedOnSmooth: stackedOnSmooth, + smoothMonotone: smoothMonotone, + connectNulls: connectNulls + }); + setStatesStylesFromModel(polygon, seriesModel, 'areaStyle'); // Needs seriesIndex for focus + + getECData(polygon).seriesIndex = seriesModel.seriesIndex; + toggleHoverEmphasis(polygon, focus, blurScope, emphasisDisabled); + } + + var changePolyState = function (toState) { + _this._changePolyState(toState); + }; + + data.eachItemGraphicEl(function (el) { + // Switch polyline / polygon state if element changed its state. + el && (el.onHoverStateChange = changePolyState); + }); + this._polyline.onHoverStateChange = changePolyState; + this._data = data; // Save the coordinate system for transition animation when data changed + + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + this._step = step; + this._valueOrigin = valueOrigin; + + if (seriesModel.get('triggerLineEvent')) { + this.packEventData(seriesModel, polyline); + polygon && this.packEventData(seriesModel, polygon); + } + }; + + LineView.prototype.packEventData = function (seriesModel, el) { + getECData(el).eventData = { + componentType: 'series', + componentSubType: 'line', + componentIndex: seriesModel.componentIndex, + seriesIndex: seriesModel.seriesIndex, + seriesName: seriesModel.name, + seriesType: 'line' + }; + }; + + LineView.prototype.highlight = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + this._changePolyState('emphasis'); + + if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) { + var points = data.getLayout('points'); + var symbol = data.getItemGraphicEl(dataIndex); + + if (!symbol) { + // Create a temporary symbol if it is not exists + var x = points[dataIndex * 2]; + var y = points[dataIndex * 2 + 1]; + + if (isNaN(x) || isNaN(y)) { + // Null data + return; + } // fix #11360: should't draw symbol outside clipShapeForSymbol + + + if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) { + return; + } + + var zlevel = seriesModel.get('zlevel'); + var z = seriesModel.get('z'); + symbol = new Symbol(data, dataIndex); + symbol.x = x; + symbol.y = y; + symbol.setZ(zlevel, z); // ensure label text of the temporary symbol is in front of line and area polygon + + var symbolLabel = symbol.getSymbolPath().getTextContent(); + + if (symbolLabel) { + symbolLabel.zlevel = zlevel; + symbolLabel.z = z; + symbolLabel.z2 = this._polyline.z2 + 1; + } + + symbol.__temp = true; + data.setItemGraphicEl(dataIndex, symbol); // Stop scale animation + + symbol.stopSymbolAnimation(true); + this.group.add(symbol); + } + + symbol.highlight(); + } else { + // Highlight whole series + ChartView.prototype.highlight.call(this, seriesModel, ecModel, api, payload); + } + }; + + LineView.prototype.downplay = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + this._changePolyState('normal'); + + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + + if (symbol) { + if (symbol.__temp) { + data.setItemGraphicEl(dataIndex, null); + this.group.remove(symbol); + } else { + symbol.downplay(); + } + } + } else { + // FIXME + // can not downplay completely. + // Downplay whole series + ChartView.prototype.downplay.call(this, seriesModel, ecModel, api, payload); + } + }; + + LineView.prototype._changePolyState = function (toState) { + var polygon = this._polygon; + setStatesFlag(this._polyline, toState); + polygon && setStatesFlag(polygon, toState); + }; + + LineView.prototype._newPolyline = function (points) { + var polyline = this._polyline; // Remove previous created polyline + + if (polyline) { + this._lineGroup.remove(polyline); + } + + polyline = new ECPolyline({ + shape: { + points: points + }, + segmentIgnoreThreshold: 2, + z2: 10 + }); + + this._lineGroup.add(polyline); + + this._polyline = polyline; + return polyline; + }; + + LineView.prototype._newPolygon = function (points, stackedOnPoints) { + var polygon = this._polygon; // Remove previous created polygon + + if (polygon) { + this._lineGroup.remove(polygon); + } + + polygon = new ECPolygon({ + shape: { + points: points, + stackedOnPoints: stackedOnPoints + }, + segmentIgnoreThreshold: 2 + }); + + this._lineGroup.add(polygon); + + this._polygon = polygon; + return polygon; + }; + + LineView.prototype._initSymbolLabelAnimation = function (data, coordSys, clipShape) { + var isHorizontalOrRadial; + var isCoordSysPolar; + var baseAxis = coordSys.getBaseAxis(); + var isAxisInverse = baseAxis.inverse; + + if (coordSys.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + isCoordSysPolar = false; + } else if (coordSys.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + isCoordSysPolar = true; + } + + var seriesModel = data.hostModel; + var seriesDuration = seriesModel.get('animationDuration'); + + if (isFunction(seriesDuration)) { + seriesDuration = seriesDuration(null); + } + + var seriesDalay = seriesModel.get('animationDelay') || 0; + var seriesDalayValue = isFunction(seriesDalay) ? seriesDalay(null) : seriesDalay; + data.eachItemGraphicEl(function (symbol, idx) { + var el = symbol; + + if (el) { + var point = [symbol.x, symbol.y]; + var start = void 0; + var end = void 0; + var current = void 0; + + if (clipShape) { + if (isCoordSysPolar) { + var polarClip = clipShape; + var coord = coordSys.pointToCoord(point); + + if (isHorizontalOrRadial) { + start = polarClip.startAngle; + end = polarClip.endAngle; + current = -coord[1] / 180 * Math.PI; + } else { + start = polarClip.r0; + end = polarClip.r; + current = coord[0]; + } + } else { + var gridClip = clipShape; + + if (isHorizontalOrRadial) { + start = gridClip.x; + end = gridClip.x + gridClip.width; + current = symbol.x; + } else { + start = gridClip.y + gridClip.height; + end = gridClip.y; + current = symbol.y; + } + } + } + + var ratio = end === start ? 0 : (current - start) / (end - start); + + if (isAxisInverse) { + ratio = 1 - ratio; + } + + var delay = isFunction(seriesDalay) ? seriesDalay(idx) : seriesDuration * ratio + seriesDalayValue; + var symbolPath = el.getSymbolPath(); + var text = symbolPath.getTextContent(); + el.attr({ + scaleX: 0, + scaleY: 0 + }); + el.animateTo({ + scaleX: 1, + scaleY: 1 + }, { + duration: 200, + setToFinal: true, + delay: delay + }); + + if (text) { + text.animateFrom({ + style: { + opacity: 0 + } + }, { + duration: 300, + delay: delay + }); + } + + symbolPath.disableLabelAnimation = true; + } + }); + }; + + LineView.prototype._initOrUpdateEndLabel = function (seriesModel, coordSys, inheritColor) { + var endLabelModel = seriesModel.getModel('endLabel'); + + if (anyStateShowEndLabel(seriesModel)) { + var data_2 = seriesModel.getData(); + var polyline = this._polyline; // series may be filtered. + + var points = data_2.getLayout('points'); + + if (!points) { + polyline.removeTextContent(); + this._endLabel = null; + return; + } + + var endLabel = this._endLabel; + + if (!endLabel) { + endLabel = this._endLabel = new ZRText({ + z2: 200 // should be higher than item symbol + + }); + endLabel.ignoreClip = true; + polyline.setTextContent(this._endLabel); + polyline.disableLabelAnimation = true; + } // Find last non-NaN data to display data + + + var dataIndex = getLastIndexNotNull(points); + + if (dataIndex >= 0) { + setLabelStyle(polyline, getLabelStatesModels(seriesModel, 'endLabel'), { + inheritColor: inheritColor, + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: function (dataIndex, opt, interpolatedValue) { + return interpolatedValue != null ? getDefaultInterpolatedLabel(data_2, interpolatedValue) : getDefaultLabel(data_2, dataIndex); + }, + enableTextSetter: true + }, getEndLabelStateSpecified(endLabelModel, coordSys)); + polyline.textConfig.position = null; + } + } else if (this._endLabel) { + this._polyline.removeTextContent(); + + this._endLabel = null; + } + }; + + LineView.prototype._endLabelOnDuring = function (percent, clipRect, data, animationRecord, valueAnimation, endLabelModel, coordSys) { + var endLabel = this._endLabel; + var polyline = this._polyline; + + if (endLabel) { + // NOTE: Don't remove percent < 1. percent === 1 means the first frame during render. + // The label is not prepared at this time. + if (percent < 1 && animationRecord.originalX == null) { + animationRecord.originalX = endLabel.x; + animationRecord.originalY = endLabel.y; + } + + var points = data.getLayout('points'); + var seriesModel = data.hostModel; + var connectNulls = seriesModel.get('connectNulls'); + var precision = endLabelModel.get('precision'); + var distance = endLabelModel.get('distance') || 0; + var baseAxis = coordSys.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var isBaseInversed = baseAxis.inverse; + var clipShape = clipRect.shape; + var xOrY = isBaseInversed ? isHorizontal ? clipShape.x : clipShape.y + clipShape.height : isHorizontal ? clipShape.x + clipShape.width : clipShape.y; + var distanceX = (isHorizontal ? distance : 0) * (isBaseInversed ? -1 : 1); + var distanceY = (isHorizontal ? 0 : -distance) * (isBaseInversed ? -1 : 1); + var dim = isHorizontal ? 'x' : 'y'; + var dataIndexRange = getIndexRange(points, xOrY, dim); + var indices = dataIndexRange.range; + var diff = indices[1] - indices[0]; + var value = void 0; + + if (diff >= 1) { + // diff > 1 && connectNulls, which is on the null data. + if (diff > 1 && !connectNulls) { + var pt = getPointAtIndex(points, indices[0]); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + valueAnimation && (value = seriesModel.getRawValue(indices[0])); + } else { + var pt = polyline.getPointOn(xOrY, dim); + pt && endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + var startValue = seriesModel.getRawValue(indices[0]); + var endValue = seriesModel.getRawValue(indices[1]); + valueAnimation && (value = interpolateRawValues(data, precision, startValue, endValue, dataIndexRange.t)); + } + + animationRecord.lastFrameIndex = indices[0]; + } else { + // If diff <= 0, which is the range is not found(Include NaN) + // Choose the first point or last point. + var idx = percent === 1 || animationRecord.lastFrameIndex > 0 ? indices[0] : 0; + var pt = getPointAtIndex(points, idx); + valueAnimation && (value = seriesModel.getRawValue(idx)); + endLabel.attr({ + x: pt[0] + distanceX, + y: pt[1] + distanceY + }); + } + + if (valueAnimation) { + labelInner(endLabel).setLabelText(value); + } + } + }; + /** + * @private + */ + // FIXME Two value axis + + + LineView.prototype._doUpdateAnimation = function (data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin); + var current = diff.current; + var stackedOnCurrent = diff.stackedOnCurrent; + var next = diff.next; + var stackedOnNext = diff.stackedOnNext; + + if (step) { + // TODO If stacked series is not step + current = turnPointsIntoStep(diff.current, coordSys, step, connectNulls); + stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step, connectNulls); + next = turnPointsIntoStep(diff.next, coordSys, step, connectNulls); + stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step, connectNulls); + } // Don't apply animation if diff is large. + // For better result and avoid memory explosion problems like + // https://github.com/apache/incubator-echarts/issues/12229 + + + if (getBoundingDiff(current, next) > 3000 || polygon && getBoundingDiff(stackedOnCurrent, stackedOnNext) > 3000) { + polyline.stopAnimation(); + polyline.setShape({ + points: next + }); + + if (polygon) { + polygon.stopAnimation(); + polygon.setShape({ + points: next, + stackedOnPoints: stackedOnNext + }); + } + + return; + } + + polyline.shape.__points = diff.current; + polyline.shape.points = current; + var target = { + shape: { + points: next + } + }; // Also animate the original points. + // If points reference is changed when turning into step line. + + if (diff.current !== current) { + target.shape.__points = diff.next; + } // Stop previous animation. + + + polyline.stopAnimation(); + updateProps(polyline, target, seriesModel); + + if (polygon) { + polygon.setShape({ + // Reuse the points with polyline. + points: current, + stackedOnPoints: stackedOnCurrent + }); + polygon.stopAnimation(); + updateProps(polygon, { + shape: { + stackedOnPoints: stackedOnNext + } + }, seriesModel); // If use attr directly in updateProps. + + if (polyline.shape.points !== polygon.shape.points) { + polygon.shape.points = polyline.shape.points; + } + } + + var updatedDataInfo = []; + var diffStatus = diff.status; + + for (var i = 0; i < diffStatus.length; i++) { + var cmd = diffStatus[i].cmd; + + if (cmd === '=') { + var el = data.getItemGraphicEl(diffStatus[i].idx1); + + if (el) { + updatedDataInfo.push({ + el: el, + ptIdx: i // Index of points + + }); + } + } + } + + if (polyline.animators && polyline.animators.length) { + polyline.animators[0].during(function () { + polygon && polygon.dirtyShape(); + var points = polyline.shape.__points; + + for (var i = 0; i < updatedDataInfo.length; i++) { + var el = updatedDataInfo[i].el; + var offset = updatedDataInfo[i].ptIdx * 2; + el.x = points[offset]; + el.y = points[offset + 1]; + el.markRedraw(); + } + }); + } + }; + + LineView.prototype.remove = function (ecModel) { + var group = this.group; + var oldData = this._data; + + this._lineGroup.removeAll(); + + this._symbolDraw.remove(true); // Remove temporary created elements when highlighting + + + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null; + }; + + LineView.type = 'line'; + return LineView; + }(ChartView); + + function pointsLayout(seriesType, forceStoreInTypedArray) { + return { + seriesType: seriesType, + plan: createRenderPlanner(), + reset: function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var pipelineContext = seriesModel.pipelineContext; + var useTypedArray = forceStoreInTypedArray || pipelineContext.large; + + if (!coordSys) { + return; + } + + var dims = map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }).slice(0, 2); + var dimLen = dims.length; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + + if (isDimensionStacked(data, dims[0])) { + dims[0] = stackResultDim; + } + + if (isDimensionStacked(data, dims[1])) { + dims[1] = stackResultDim; + } + + var store = data.getStore(); + var dimIdx0 = data.getDimensionIndex(dims[0]); + var dimIdx1 = data.getDimensionIndex(dims[1]); + return dimLen && { + progress: function (params, data) { + var segCount = params.end - params.start; + var points = useTypedArray && createFloat32Array(segCount * dimLen); + var tmpIn = []; + var tmpOut = []; + + for (var i = params.start, offset = 0; i < params.end; i++) { + var point = void 0; + + if (dimLen === 1) { + var x = store.get(dimIdx0, i); // NOTE: Make sure the second parameter is null to use default strategy. + + point = coordSys.dataToPoint(x, null, tmpOut); + } else { + tmpIn[0] = store.get(dimIdx0, i); + tmpIn[1] = store.get(dimIdx1, i); // Let coordinate system to handle the NaN data. + + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + } + + if (useTypedArray) { + points[offset++] = point[0]; + points[offset++] = point[1]; + } else { + data.setItemLayout(i, point.slice()); + } + } + + useTypedArray && data.setLayout('points', points); + } + }; + } + }; + } + + var samplers = { + average: function (frame) { + var sum = 0; + var count = 0; + + for (var i = 0; i < frame.length; i++) { + if (!isNaN(frame[i])) { + sum += frame[i]; + count++; + } + } // Return NaN if count is 0 + + + return count === 0 ? NaN : sum / count; + }, + sum: function (frame) { + var sum = 0; + + for (var i = 0; i < frame.length; i++) { + // Ignore NaN + sum += frame[i] || 0; + } + + return sum; + }, + max: function (frame) { + var max = -Infinity; + + for (var i = 0; i < frame.length; i++) { + frame[i] > max && (max = frame[i]); + } // NaN will cause illegal axis extent. + + + return isFinite(max) ? max : NaN; + }, + min: function (frame) { + var min = Infinity; + + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } // NaN will cause illegal axis extent. + + + return isFinite(min) ? min : NaN; + }, + // TODO + // Median + nearest: function (frame) { + return frame[0]; + } + }; + + var indexSampler = function (frame) { + return Math.round(frame.length / 2); + }; + + function dataSample(seriesType) { + return { + seriesType: seriesType, + // FIXME:TS never used, so comment it + // modifyOutputEnd: true, + reset: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + var count = data.count(); // Only cartesian2d support down sampling. Disable it when there is few data. + + if (count > 10 && coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + var dpr = api.getDevicePixelRatio(); // Coordinste system has been resized + + var size = Math.abs(extent[1] - extent[0]) * (dpr || 1); + var rate = Math.round(count / size); + + if (isFinite(rate) && rate > 1) { + if (sampling === 'lttb') { + seriesModel.setData(data.lttbDownSample(data.mapDimension(valueAxis.dim), 1 / rate)); + } + + var sampler = void 0; + + if (isString(sampling)) { + sampler = samplers[sampling]; + } else if (isFunction(sampling)) { + sampler = sampling; + } + + if (sampler) { + // Only support sample the first dim mapped from value axis. + seriesModel.setData(data.downSample(data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler)); + } + } + } + } + }; + } + + function install$2(registers) { + registers.registerChartView(LineView); + registers.registerSeriesModel(LineSeriesModel); + registers.registerLayout(pointsLayout('line', true)); + registers.registerVisual({ + seriesType: 'line', + reset: function (seriesModel) { + var data = seriesModel.getData(); // Visual coding for legend + + var lineStyle = seriesModel.getModel('lineStyle').getLineStyle(); + + if (lineStyle && !lineStyle.stroke) { + // Fill in visual should be palette color if + // has color callback + lineStyle.stroke = data.getVisual('style').fill; + } + + data.setVisual('legendLineStyle', lineStyle); + } + }); // Down sample after filter + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('line')); + } + + var BaseBarSeriesModel = + /** @class */ + function (_super) { + __extends(BaseBarSeriesModel, _super); + + function BaseBarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BaseBarSeriesModel.type; + return _this; + } + + BaseBarSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + BaseBarSeriesModel.prototype.getMarkerPosition = function (value) { + var coordSys = this.coordinateSystem; + + if (coordSys && coordSys.clampData) { + // PENDING if clamp ? + var pt = coordSys.dataToPoint(coordSys.clampData(value)); + var data = this.getData(); + var offset = data.getLayout('offset'); + var size = data.getLayout('size'); + var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1; + pt[offsetIndex] += offset + size / 2; + return pt; + } + + return [NaN, NaN]; + }; + + BaseBarSeriesModel.type = 'series.__base_bar__'; + BaseBarSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // stack: null + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + barMinHeight: 0, + barMinAngle: 0, + // cursor: null, + large: false, + largeThreshold: 400, + progressive: 3e3, + progressiveChunkMode: 'mod' + }; + return BaseBarSeriesModel; + }(SeriesModel); + + SeriesModel.registerClass(BaseBarSeriesModel); + + var BarSeriesModel = + /** @class */ + function (_super) { + __extends(BarSeriesModel, _super); + + function BarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BarSeriesModel.type; + return _this; + } + + BarSeriesModel.prototype.getInitialData = function () { + return createSeriesData(null, this, { + useEncodeDefaulter: true, + createInvertedIndices: !!this.get('realtimeSort', true) || null + }); + }; + /** + * @override + */ + + + BarSeriesModel.prototype.getProgressive = function () { + // Do not support progressive in normal mode. + return this.get('large') ? this.get('progressive') : false; + }; + /** + * @override + */ + + + BarSeriesModel.prototype.getProgressiveThreshold = function () { + // Do not support progressive in normal mode. + var progressiveThreshold = this.get('progressiveThreshold'); + var largeThreshold = this.get('largeThreshold'); + + if (largeThreshold > progressiveThreshold) { + progressiveThreshold = largeThreshold; + } + + return progressiveThreshold; + }; + + BarSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.rect(data.getItemLayout(dataIndex)); + }; + + BarSeriesModel.type = 'series.bar'; + BarSeriesModel.dependencies = ['grid', 'polar']; + BarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { + // If clipped + // Only available on cartesian2d + clip: true, + roundCap: false, + showBackground: false, + backgroundStyle: { + color: 'rgba(180, 180, 180, 0.2)', + borderColor: null, + borderWidth: 0, + borderType: 'solid', + borderRadius: 0, + shadowBlur: 0, + shadowColor: null, + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + realtimeSort: false + }); + return BarSeriesModel; + }(BaseBarSeriesModel); + + /** + * Sausage: similar to sector, but have half circle on both sides + */ + + var SausageShape = + /** @class */ + function () { + function SausageShape() { + this.cx = 0; + this.cy = 0; + this.r0 = 0; + this.r = 0; + this.startAngle = 0; + this.endAngle = Math.PI * 2; + this.clockwise = true; + } + + return SausageShape; + }(); + + var SausagePath = + /** @class */ + function (_super) { + __extends(SausagePath, _super); + + function SausagePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'sausage'; + return _this; + } + + SausagePath.prototype.getDefaultShape = function () { + return new SausageShape(); + }; + + SausagePath.prototype.buildPath = function (ctx, shape) { + var cx = shape.cx; + var cy = shape.cy; + var r0 = Math.max(shape.r0 || 0, 0); + var r = Math.max(shape.r, 0); + var dr = (r - r0) * 0.5; + var rCenter = r0 + dr; + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + var PI2 = Math.PI * 2; + var lessThanCircle = clockwise ? endAngle - startAngle < PI2 : startAngle - endAngle < PI2; + + if (!lessThanCircle) { + // Normalize angles + startAngle = endAngle - (clockwise ? PI2 : -PI2); + } + + var unitStartX = Math.cos(startAngle); + var unitStartY = Math.sin(startAngle); + var unitEndX = Math.cos(endAngle); + var unitEndY = Math.sin(endAngle); + + if (lessThanCircle) { + ctx.moveTo(unitStartX * r0 + cx, unitStartY * r0 + cy); + ctx.arc(unitStartX * rCenter + cx, unitStartY * rCenter + cy, dr, -Math.PI + startAngle, startAngle, !clockwise); + } else { + ctx.moveTo(unitStartX * r + cx, unitStartY * r + cy); + } + + ctx.arc(cx, cy, r, startAngle, endAngle, !clockwise); + ctx.arc(unitEndX * rCenter + cx, unitEndY * rCenter + cy, dr, endAngle - Math.PI * 2, endAngle - Math.PI, !clockwise); + + if (r0 !== 0) { + ctx.arc(cx, cy, r0, endAngle, startAngle, clockwise); + } // ctx.closePath(); + + }; + + return SausagePath; + }(Path); + + function createSectorCalculateTextPosition(positionMapping, opts) { + opts = opts || {}; + var isRoundCap = opts.isRoundCap; + return function (out, opts, boundingRect) { + var textPosition = opts.position; + + if (!textPosition || textPosition instanceof Array) { + return calculateTextPosition(out, opts, boundingRect); + } + + var mappedSectorPosition = positionMapping(textPosition); + var distance = opts.distance != null ? opts.distance : 5; + var sector = this.shape; + var cx = sector.cx; + var cy = sector.cy; + var r = sector.r; + var r0 = sector.r0; + var middleR = (r + r0) / 2; + var startAngle = sector.startAngle; + var endAngle = sector.endAngle; + var middleAngle = (startAngle + endAngle) / 2; + var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0; + var mathCos = Math.cos; + var mathSin = Math.sin; // base position: top-left + + var x = cx + r * mathCos(startAngle); + var y = cy + r * mathSin(startAngle); + var textAlign = 'left'; + var textVerticalAlign = 'top'; + + switch (mappedSectorPosition) { + case 'startArc': + x = cx + (r0 - distance) * mathCos(middleAngle); + y = cy + (r0 - distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'top'; + break; + + case 'insideStartArc': + x = cx + (r0 + distance) * mathCos(middleAngle); + y = cy + (r0 + distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + + case 'startAngle': + x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false); + y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false); + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + + case 'insideStartAngle': + x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false); + y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false); + textAlign = 'left'; + textVerticalAlign = 'middle'; + break; + + case 'middle': + x = cx + middleR * mathCos(middleAngle); + y = cy + middleR * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + + case 'endArc': + x = cx + (r + distance) * mathCos(middleAngle); + y = cy + (r + distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + + case 'insideEndArc': + x = cx + (r - distance) * mathCos(middleAngle); + y = cy + (r - distance) * mathSin(middleAngle); + textAlign = 'center'; + textVerticalAlign = 'top'; + break; + + case 'endAngle': + x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true); + y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true); + textAlign = 'left'; + textVerticalAlign = 'middle'; + break; + + case 'insideEndAngle': + x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true); + y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true); + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + + default: + return calculateTextPosition(out, opts, boundingRect); + } + + out = out || {}; + out.x = x; + out.y = y; + out.align = textAlign; + out.verticalAlign = textVerticalAlign; + return out; + }; + } + + function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) { + if (isNumber(rotateType)) { + // user-set rotation + sector.setTextConfig({ + rotation: rotateType + }); + return; + } else if (isArray(textPosition)) { + // user-set position, use 0 as auto rotation + sector.setTextConfig({ + rotation: 0 + }); + return; + } + + var shape = sector.shape; + var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle; + var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle; + var middleAngle = (startAngle + endAngle) / 2; + var anchorAngle; + var mappedSectorPosition = positionMapping(textPosition); + + switch (mappedSectorPosition) { + case 'startArc': + case 'insideStartArc': + case 'middle': + case 'insideEndArc': + case 'endArc': + anchorAngle = middleAngle; + break; + + case 'startAngle': + case 'insideStartAngle': + anchorAngle = startAngle; + break; + + case 'endAngle': + case 'insideEndAngle': + anchorAngle = endAngle; + break; + + default: + sector.setTextConfig({ + rotation: 0 + }); + return; + } + + var rotate = Math.PI * 1.5 - anchorAngle; + /** + * TODO: labels with rotate > Math.PI / 2 should be rotate another + * half round flipped to increase readability. However, only middle + * position supports this for now, because in other positions, the + * anchor point is not at the center of the text, so the positions + * after rotating is not as expected. + */ + + if (mappedSectorPosition === 'middle' && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) { + rotate -= Math.PI; + } + + sector.setTextConfig({ + rotation: rotate + }); + } + + function adjustAngleDistanceX(angle, distance, isEnd) { + return distance * Math.sin(angle) * (isEnd ? -1 : 1); + } + + function adjustAngleDistanceY(angle, distance, isEnd) { + return distance * Math.cos(angle) * (isEnd ? 1 : -1); + } + + var mathMax$6 = Math.max; + var mathMin$6 = Math.min; + + function getClipArea(coord, data) { + var coordSysClipArea = coord.getArea && coord.getArea(); + + if (isCoordinateSystemType(coord, 'cartesian2d')) { + var baseAxis = coord.getBaseAxis(); // When boundaryGap is false or using time axis. bar may exceed the grid. + // We should not clip this part. + // See test/bar2.html + + if (baseAxis.type !== 'category' || !baseAxis.onBand) { + var expandWidth = data.getLayout('bandWidth'); + + if (baseAxis.isHorizontal()) { + coordSysClipArea.x -= expandWidth; + coordSysClipArea.width += expandWidth * 2; + } else { + coordSysClipArea.y -= expandWidth; + coordSysClipArea.height += expandWidth * 2; + } + } + } + + return coordSysClipArea; + } + + var BarView = + /** @class */ + function (_super) { + __extends(BarView, _super); + + function BarView() { + var _this = _super.call(this) || this; + + _this.type = BarView.type; + _this._isFirstFrame = true; + return _this; + } + + BarView.prototype.render = function (seriesModel, ecModel, api, payload) { + this._model = seriesModel; + + this._removeOnRenderedListener(api); + + this._updateDrawMode(seriesModel); + + var coordinateSystemType = seriesModel.get('coordinateSystem'); + + if (coordinateSystemType === 'cartesian2d' || coordinateSystemType === 'polar') { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + this._isLargeDraw ? this._renderLarge(seriesModel, ecModel, api) : this._renderNormal(seriesModel, ecModel, api, payload); + } else if ("development" !== 'production') { + warn('Only cartesian2d and polar supported for bar.'); + } + }; + + BarView.prototype.incrementalPrepareRender = function (seriesModel) { + this._clear(); + + this._updateDrawMode(seriesModel); // incremental also need to clip, otherwise might be overlow. + // But must not set clip in each frame, otherwise all of the children will be marked redraw. + + + this._updateLargeClip(seriesModel); + }; + + BarView.prototype.incrementalRender = function (params, seriesModel) { + // Reset + this._progressiveEls = []; // Do not support progressive in normal mode. + + this._incrementalRenderLarge(params, seriesModel); + }; + + BarView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + BarView.prototype._updateDrawMode = function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + + if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + + this._clear(); + } + }; + + BarView.prototype._renderNormal = function (seriesModel, ecModel, api, payload) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + var coord = seriesModel.coordinateSystem; + var baseAxis = coord.getBaseAxis(); + var isHorizontalOrRadial; + + if (coord.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + } else if (coord.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + } + + var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null; + var realtimeSortCfg = shouldRealtimeSort(seriesModel, coord); + + if (realtimeSortCfg) { + this._enableRealtimeSort(realtimeSortCfg, data, api); + } + + var needsClip = seriesModel.get('clip', true) || realtimeSortCfg; + var coordSysClipArea = getClipArea(coord, data); // If there is clipPath created in large mode. Remove it. + + group.removeClipPath(); // We don't use clipPath in normal mode because we needs a perfect animation + // And don't want the label are clipped. + + var roundCap = seriesModel.get('roundCap', true); + var drawBackground = seriesModel.get('showBackground', true); + var backgroundModel = seriesModel.getModel('backgroundStyle'); + var barBorderRadius = backgroundModel.get('borderRadius') || 0; + var bgEls = []; + var oldBgEls = this._backgroundEls; + var isInitSort = payload && payload.isInitSort; + var isChangeOrder = payload && payload.type === 'changeAxisOrder'; + + function createBackground(dataIndex) { + var bgLayout = getLayout[coord.type](data, dataIndex); + var bgEl = createBackgroundEl(coord, isHorizontalOrRadial, bgLayout); + bgEl.useStyle(backgroundModel.getItemStyle()); // Only cartesian2d support borderRadius. + + if (coord.type === 'cartesian2d') { + bgEl.setShape('r', barBorderRadius); + } + + bgEls[dataIndex] = bgEl; + return bgEl; + } + + data.diff(oldData).add(function (dataIndex) { + var itemModel = data.getItemModel(dataIndex); + var layout = getLayout[coord.type](data, dataIndex, itemModel); + + if (drawBackground) { + createBackground(dataIndex); + } // If dataZoom in filteMode: 'empty', the baseValue can be set as NaN in "axisProxy". + + + if (!data.hasValue(dataIndex) || !isValidLayout[coord.type](layout)) { + return; + } + + var isClipped = false; + + if (needsClip) { + // Clip will modify the layout params. + // And return a boolean to determine if the shape are fully clipped. + isClipped = clip[coord.type](coordSysClipArea, layout); + } + + var el = elementCreator[coord.type](seriesModel, data, dataIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, false, roundCap); + + if (realtimeSortCfg) { + /** + * Force label animation because even if the element is + * ignored because it's clipped, it may not be clipped after + * changing order. Then, if not using forceLabelAnimation, + * the label animation was never started, in which case, + * the label will be the final value and doesn't have label + * animation. + */ + el.forceLabelAnimation = true; + } + + updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar'); + + if (isInitSort) { + el.attr({ + shape: layout + }); + } else if (realtimeSortCfg) { + updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, dataIndex, isHorizontalOrRadial, false, false); + } else { + initProps(el, { + shape: layout + }, seriesModel, dataIndex); + } + + data.setItemGraphicEl(dataIndex, el); + group.add(el); + el.ignore = isClipped; + }).update(function (newIndex, oldIndex) { + var itemModel = data.getItemModel(newIndex); + var layout = getLayout[coord.type](data, newIndex, itemModel); + + if (drawBackground) { + var bgEl = void 0; + + if (oldBgEls.length === 0) { + bgEl = createBackground(oldIndex); + } else { + bgEl = oldBgEls[oldIndex]; + bgEl.useStyle(backgroundModel.getItemStyle()); // Only cartesian2d support borderRadius. + + if (coord.type === 'cartesian2d') { + bgEl.setShape('r', barBorderRadius); + } + + bgEls[newIndex] = bgEl; + } + + var bgLayout = getLayout[coord.type](data, newIndex); + var shape = createBackgroundShape(isHorizontalOrRadial, bgLayout, coord); + updateProps(bgEl, { + shape: shape + }, animationModel, newIndex); + } + + var el = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex) || !isValidLayout[coord.type](layout)) { + group.remove(el); + return; + } + + var isClipped = false; + + if (needsClip) { + isClipped = clip[coord.type](coordSysClipArea, layout); + + if (isClipped) { + group.remove(el); + } + } + + if (!el) { + el = elementCreator[coord.type](seriesModel, data, newIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, !!el, roundCap); + } else { + saveOldStyle(el); + } + + if (realtimeSortCfg) { + el.forceLabelAnimation = true; + } + + if (isChangeOrder) { + var textEl = el.getTextContent(); + + if (textEl) { + var labelInnerStore = labelInner(textEl); + + if (labelInnerStore.prevValue != null) { + /** + * Set preValue to be value so that no new label + * should be started, otherwise, it will take a full + * `animationDurationUpdate` time to finish the + * animation, which is not expected. + */ + labelInnerStore.prevValue = labelInnerStore.value; + } + } + } // Not change anything if only order changed. + // Especially not change label. + else { + updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar'); + } + + if (isInitSort) { + el.attr({ + shape: layout + }); + } else if (realtimeSortCfg) { + updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, newIndex, isHorizontalOrRadial, true, isChangeOrder); + } else { + updateProps(el, { + shape: layout + }, seriesModel, newIndex, null); + } + + data.setItemGraphicEl(newIndex, el); + el.ignore = isClipped; + group.add(el); + }).remove(function (dataIndex) { + var el = oldData.getItemGraphicEl(dataIndex); + el && removeElementWithFadeOut(el, seriesModel, dataIndex); + }).execute(); + var bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group()); + bgGroup.removeAll(); + + for (var i = 0; i < bgEls.length; ++i) { + bgGroup.add(bgEls[i]); + } + + group.add(bgGroup); + this._backgroundEls = bgEls; + this._data = data; + }; + + BarView.prototype._renderLarge = function (seriesModel, ecModel, api) { + this._clear(); + + createLarge(seriesModel, this.group); + + this._updateLargeClip(seriesModel); + }; + + BarView.prototype._incrementalRenderLarge = function (params, seriesModel) { + this._removeBackground(); + + createLarge(seriesModel, this.group, this._progressiveEls, true); + }; + + BarView.prototype._updateLargeClip = function (seriesModel) { + // Use clipPath in large mode. + var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); + var group = this.group; + + if (clipPath) { + group.setClipPath(clipPath); + } else { + group.removeClipPath(); + } + }; + + BarView.prototype._enableRealtimeSort = function (realtimeSortCfg, data, api) { + var _this = this; // If no data in the first frame, wait for data to initSort + + + if (!data.count()) { + return; + } + + var baseAxis = realtimeSortCfg.baseAxis; + + if (this._isFirstFrame) { + this._dispatchInitSort(data, realtimeSortCfg, api); + + this._isFirstFrame = false; + } else { + var orderMapping_1 = function (idx) { + var el = data.getItemGraphicEl(idx); + var shape = el && el.shape; + return shape && // The result should be consistent with the initial sort by data value. + // Do not support the case that both positive and negative exist. + Math.abs(baseAxis.isHorizontal() ? shape.height : shape.width) // If data is NaN, shape.xxx may be NaN, so use || 0 here in case + || 0; + }; + + this._onRendered = function () { + _this._updateSortWithinSameData(data, orderMapping_1, baseAxis, api); + }; + + api.getZr().on('rendered', this._onRendered); + } + }; + + BarView.prototype._dataSort = function (data, baseAxis, orderMapping) { + var info = []; + data.each(data.mapDimension(baseAxis.dim), function (ordinalNumber, dataIdx) { + var mappedValue = orderMapping(dataIdx); + mappedValue = mappedValue == null ? NaN : mappedValue; + info.push({ + dataIndex: dataIdx, + mappedValue: mappedValue, + ordinalNumber: ordinalNumber + }); + }); + info.sort(function (a, b) { + // If NaN, it will be treated as min val. + return b.mappedValue - a.mappedValue; + }); + return { + ordinalNumbers: map(info, function (item) { + return item.ordinalNumber; + }) + }; + }; + + BarView.prototype._isOrderChangedWithinSameData = function (data, orderMapping, baseAxis) { + var scale = baseAxis.scale; + var ordinalDataDim = data.mapDimension(baseAxis.dim); + var lastValue = Number.MAX_VALUE; + + for (var tickNum = 0, len = scale.getOrdinalMeta().categories.length; tickNum < len; ++tickNum) { + var rawIdx = data.rawIndexOf(ordinalDataDim, scale.getRawOrdinalNumber(tickNum)); + var value = rawIdx < 0 // If some tick have no bar, the tick will be treated as min. + ? Number.MIN_VALUE // PENDING: if dataZoom on baseAxis exits, is it a performance issue? + : orderMapping(data.indexOfRawIndex(rawIdx)); + + if (value > lastValue) { + return true; + } + + lastValue = value; + } + + return false; + }; + /* + * Consider the case when A and B changed order, whose representing + * bars are both out of sight, we don't wish to trigger reorder action + * as long as the order in the view doesn't change. + */ + + + BarView.prototype._isOrderDifferentInView = function (orderInfo, baseAxis) { + var scale = baseAxis.scale; + var extent = scale.getExtent(); + var tickNum = Math.max(0, extent[0]); + var tickMax = Math.min(extent[1], scale.getOrdinalMeta().categories.length - 1); + + for (; tickNum <= tickMax; ++tickNum) { + if (orderInfo.ordinalNumbers[tickNum] !== scale.getRawOrdinalNumber(tickNum)) { + return true; + } + } + }; + + BarView.prototype._updateSortWithinSameData = function (data, orderMapping, baseAxis, api) { + if (!this._isOrderChangedWithinSameData(data, orderMapping, baseAxis)) { + return; + } + + var sortInfo = this._dataSort(data, baseAxis, orderMapping); + + if (this._isOrderDifferentInView(sortInfo, baseAxis)) { + this._removeOnRenderedListener(api); + + api.dispatchAction({ + type: 'changeAxisOrder', + componentType: baseAxis.dim + 'Axis', + axisId: baseAxis.index, + sortInfo: sortInfo + }); + } + }; + + BarView.prototype._dispatchInitSort = function (data, realtimeSortCfg, api) { + var baseAxis = realtimeSortCfg.baseAxis; + + var sortResult = this._dataSort(data, baseAxis, function (dataIdx) { + return data.get(data.mapDimension(realtimeSortCfg.otherAxis.dim), dataIdx); + }); + + api.dispatchAction({ + type: 'changeAxisOrder', + componentType: baseAxis.dim + 'Axis', + isInitSort: true, + axisId: baseAxis.index, + sortInfo: sortResult + }); + }; + + BarView.prototype.remove = function (ecModel, api) { + this._clear(this._model); + + this._removeOnRenderedListener(api); + }; + + BarView.prototype.dispose = function (ecModel, api) { + this._removeOnRenderedListener(api); + }; + + BarView.prototype._removeOnRenderedListener = function (api) { + if (this._onRendered) { + api.getZr().off('rendered', this._onRendered); + this._onRendered = null; + } + }; + + BarView.prototype._clear = function (model) { + var group = this.group; + var data = this._data; + + if (model && model.isAnimationEnabled() && data && !this._isLargeDraw) { + this._removeBackground(); + + this._backgroundEls = []; + data.eachItemGraphicEl(function (el) { + removeElementWithFadeOut(el, model, getECData(el).dataIndex); + }); + } else { + group.removeAll(); + } + + this._data = null; + this._isFirstFrame = true; + }; + + BarView.prototype._removeBackground = function () { + this.group.remove(this._backgroundGroup); + this._backgroundGroup = null; + }; + + BarView.type = 'bar'; + return BarView; + }(ChartView); + + var clip = { + cartesian2d: function (coordSysBoundingRect, layout) { + var signWidth = layout.width < 0 ? -1 : 1; + var signHeight = layout.height < 0 ? -1 : 1; // Needs positive width and height + + if (signWidth < 0) { + layout.x += layout.width; + layout.width = -layout.width; + } + + if (signHeight < 0) { + layout.y += layout.height; + layout.height = -layout.height; + } + + var coordSysX2 = coordSysBoundingRect.x + coordSysBoundingRect.width; + var coordSysY2 = coordSysBoundingRect.y + coordSysBoundingRect.height; + var x = mathMax$6(layout.x, coordSysBoundingRect.x); + var x2 = mathMin$6(layout.x + layout.width, coordSysX2); + var y = mathMax$6(layout.y, coordSysBoundingRect.y); + var y2 = mathMin$6(layout.y + layout.height, coordSysY2); + var xClipped = x2 < x; + var yClipped = y2 < y; // When xClipped or yClipped, the element will be marked as `ignore`. + // But we should also place the element at the edge of the coord sys bounding rect. + // Beause if data changed and the bar show again, its transition animaiton + // will begin at this place. + + layout.x = xClipped && x > coordSysX2 ? x2 : x; + layout.y = yClipped && y > coordSysY2 ? y2 : y; + layout.width = xClipped ? 0 : x2 - x; + layout.height = yClipped ? 0 : y2 - y; // Reverse back + + if (signWidth < 0) { + layout.x += layout.width; + layout.width = -layout.width; + } + + if (signHeight < 0) { + layout.y += layout.height; + layout.height = -layout.height; + } + + return xClipped || yClipped; + }, + polar: function (coordSysClipArea, layout) { + var signR = layout.r0 <= layout.r ? 1 : -1; // Make sure r is larger than r0 + + if (signR < 0) { + var tmp = layout.r; + layout.r = layout.r0; + layout.r0 = tmp; + } + + var r = mathMin$6(layout.r, coordSysClipArea.r); + var r0 = mathMax$6(layout.r0, coordSysClipArea.r0); + layout.r = r; + layout.r0 = r0; + var clipped = r - r0 < 0; // Reverse back + + if (signR < 0) { + var tmp = layout.r; + layout.r = layout.r0; + layout.r0 = tmp; + } + + return clipped; + } + }; + var elementCreator = { + cartesian2d: function (seriesModel, data, newIndex, layout, isHorizontal, animationModel, axisModel, isUpdate, roundCap) { + var rect = new Rect({ + shape: extend({}, layout), + z2: 1 + }); + rect.__dataIndex = newIndex; + rect.name = 'item'; + + if (animationModel) { + var rectShape = rect.shape; + var animateProperty = isHorizontal ? 'height' : 'width'; + rectShape[animateProperty] = 0; + } + + return rect; + }, + polar: function (seriesModel, data, newIndex, layout, isRadial, animationModel, axisModel, isUpdate, roundCap) { + var ShapeClass = !isRadial && roundCap ? SausagePath : Sector; + var sector = new ShapeClass({ + shape: layout, + z2: 1 + }); + sector.name = 'item'; + var positionMap = createPolarPositionMapping(isRadial); + sector.calculateTextPosition = createSectorCalculateTextPosition(positionMap, { + isRoundCap: ShapeClass === SausagePath + }); // Animation + + if (animationModel) { + var sectorShape = sector.shape; + var animateProperty = isRadial ? 'r' : 'endAngle'; + var animateTarget = {}; + sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle; + animateTarget[animateProperty] = layout[animateProperty]; + (isUpdate ? updateProps : initProps)(sector, { + shape: animateTarget // __value: typeof dataValue === 'string' ? parseInt(dataValue, 10) : dataValue + + }, animationModel); + } + + return sector; + } + }; + + function shouldRealtimeSort(seriesModel, coordSys) { + var realtimeSortOption = seriesModel.get('realtimeSort', true); + var baseAxis = coordSys.getBaseAxis(); + + if ("development" !== 'production') { + if (realtimeSortOption) { + if (baseAxis.type !== 'category') { + warn('`realtimeSort` will not work because this bar series is not based on a category axis.'); + } + + if (coordSys.type !== 'cartesian2d') { + warn('`realtimeSort` will not work because this bar series is not on cartesian2d.'); + } + } + } + + if (realtimeSortOption && baseAxis.type === 'category' && coordSys.type === 'cartesian2d') { + return { + baseAxis: baseAxis, + otherAxis: coordSys.getOtherAxis(baseAxis) + }; + } + } + + function updateRealtimeAnimation(realtimeSortCfg, seriesAnimationModel, el, layout, newIndex, isHorizontal, isUpdate, isChangeOrder) { + var seriesTarget; + var axisTarget; + + if (isHorizontal) { + axisTarget = { + x: layout.x, + width: layout.width + }; + seriesTarget = { + y: layout.y, + height: layout.height + }; + } else { + axisTarget = { + y: layout.y, + height: layout.height + }; + seriesTarget = { + x: layout.x, + width: layout.width + }; + } + + if (!isChangeOrder) { + // Keep the original growth animation if only axis order changed. + // Not start a new animation. + (isUpdate ? updateProps : initProps)(el, { + shape: seriesTarget + }, seriesAnimationModel, newIndex, null); + } + + var axisAnimationModel = seriesAnimationModel ? realtimeSortCfg.baseAxis.model : null; + (isUpdate ? updateProps : initProps)(el, { + shape: axisTarget + }, axisAnimationModel, newIndex); + } + + function checkPropertiesNotValid(obj, props) { + for (var i = 0; i < props.length; i++) { + if (!isFinite(obj[props[i]])) { + return true; + } + } + + return false; + } + + var rectPropties = ['x', 'y', 'width', 'height']; + var polarPropties = ['cx', 'cy', 'r', 'startAngle', 'endAngle']; + var isValidLayout = { + cartesian2d: function (layout) { + return !checkPropertiesNotValid(layout, rectPropties); + }, + polar: function (layout) { + return !checkPropertiesNotValid(layout, polarPropties); + } + }; + var getLayout = { + // itemModel is only used to get borderWidth, which is not needed + // when calculating bar background layout. + cartesian2d: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + var fixedLineWidth = itemModel ? getLineWidth(itemModel, layout) : 0; // fix layout with lineWidth + + var signX = layout.width > 0 ? 1 : -1; + var signY = layout.height > 0 ? 1 : -1; + return { + x: layout.x + signX * fixedLineWidth / 2, + y: layout.y + signY * fixedLineWidth / 2, + width: layout.width - signX * fixedLineWidth, + height: layout.height - signY * fixedLineWidth + }; + }, + polar: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + return { + cx: layout.cx, + cy: layout.cy, + r0: layout.r0, + r: layout.r, + startAngle: layout.startAngle, + endAngle: layout.endAngle, + clockwise: layout.clockwise + }; + } + }; + + function isZeroOnPolar(layout) { + return layout.startAngle != null && layout.endAngle != null && layout.startAngle === layout.endAngle; + } + + function createPolarPositionMapping(isRadial) { + return function (isRadial) { + var arcOrAngle = isRadial ? 'Arc' : 'Angle'; + return function (position) { + switch (position) { + case 'start': + case 'insideStart': + case 'end': + case 'insideEnd': + return position + arcOrAngle; + + default: + return position; + } + }; + }(isRadial); + } + + function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, isPolar) { + var style = data.getItemVisual(dataIndex, 'style'); + + if (!isPolar) { + el.setShape('r', itemModel.get(['itemStyle', 'borderRadius']) || 0); + } + + el.useStyle(style); + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && el.attr('cursor', cursorStyle); + var labelPositionOutside = isPolar ? isHorizontalOrRadial ? layout.r >= layout.r0 ? 'endArc' : 'startArc' : layout.endAngle >= layout.startAngle ? 'endAngle' : 'startAngle' : isHorizontalOrRadial ? layout.height >= 0 ? 'bottom' : 'top' : layout.width >= 0 ? 'right' : 'left'; + var labelStatesModels = getLabelStatesModels(itemModel); + setLabelStyle(el, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(seriesModel.getData(), dataIndex), + inheritColor: style.fill, + defaultOpacity: style.opacity, + defaultOutsidePosition: labelPositionOutside + }); + var label = el.getTextContent(); + + if (isPolar && label) { + var position = itemModel.get(['label', 'position']); + el.textConfig.inside = position === 'middle' ? true : null; + setSectorTextRotation(el, position === 'outside' ? labelPositionOutside : position, createPolarPositionMapping(isHorizontalOrRadial), itemModel.get(['label', 'rotate'])); + } + + setLabelValueAnimation(label, labelStatesModels, seriesModel.getRawValue(dataIndex), function (value) { + return getDefaultInterpolatedLabel(data, value); + }); + var emphasisModel = itemModel.getModel(['emphasis']); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + setStatesStylesFromModel(el, itemModel); + + if (isZeroOnPolar(layout)) { + el.style.fill = 'none'; + el.style.stroke = 'none'; + each(el.states, function (state) { + if (state.style) { + state.style.fill = state.style.stroke = 'none'; + } + }); + } + } // In case width or height are too small. + + + function getLineWidth(itemModel, rawLayout) { + // Has no border. + var borderColor = itemModel.get(['itemStyle', 'borderColor']); + + if (!borderColor || borderColor === 'none') { + return 0; + } + + var lineWidth = itemModel.get(['itemStyle', 'borderWidth']) || 0; // width or height may be NaN for empty data + + var width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width); + var height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height); + return Math.min(lineWidth, width, height); + } + + var LagePathShape = + /** @class */ + function () { + function LagePathShape() { + } + + return LagePathShape; + }(); + + var LargePath = + /** @class */ + function (_super) { + __extends(LargePath, _super); + + function LargePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'largeBar'; + return _this; + } + + LargePath.prototype.getDefaultShape = function () { + return new LagePathShape(); + }; + + LargePath.prototype.buildPath = function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + var baseDimIdx = this.baseDimIdx; + var valueDimIdx = 1 - this.baseDimIdx; + var startPoint = []; + var size = []; + var barWidth = this.barWidth; + + for (var i = 0; i < points.length; i += 3) { + size[baseDimIdx] = barWidth; + size[valueDimIdx] = points[i + 2]; + startPoint[baseDimIdx] = points[i + baseDimIdx]; + startPoint[valueDimIdx] = points[i + valueDimIdx]; + ctx.rect(startPoint[0], startPoint[1], size[0], size[1]); + } + }; + + return LargePath; + }(Path); + + function createLarge(seriesModel, group, progressiveEls, incremental) { + // TODO support polar + var data = seriesModel.getData(); + var baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0; + var largeDataIndices = data.getLayout('largeDataIndices'); + var barWidth = data.getLayout('size'); + var backgroundModel = seriesModel.getModel('backgroundStyle'); + var bgPoints = data.getLayout('largeBackgroundPoints'); + + if (bgPoints) { + var bgEl = new LargePath({ + shape: { + points: bgPoints + }, + incremental: !!incremental, + silent: true, + z2: 0 + }); + bgEl.baseDimIdx = baseDimIdx; + bgEl.largeDataIndices = largeDataIndices; + bgEl.barWidth = barWidth; + bgEl.useStyle(backgroundModel.getItemStyle()); + group.add(bgEl); + progressiveEls && progressiveEls.push(bgEl); + } + + var el = new LargePath({ + shape: { + points: data.getLayout('largePoints') + }, + incremental: !!incremental, + z2: 1 + }); + el.baseDimIdx = baseDimIdx; + el.largeDataIndices = largeDataIndices; + el.barWidth = barWidth; + group.add(el); + el.useStyle(data.getVisual('style')); // Enable tooltip and user mouse/touch event handlers. + + getECData(el).seriesIndex = seriesModel.seriesIndex; + + if (!seriesModel.get('silent')) { + el.on('mousedown', largePathUpdateDataIndex); + el.on('mousemove', largePathUpdateDataIndex); + } + + progressiveEls && progressiveEls.push(el); + } // Use throttle to avoid frequently traverse to find dataIndex. + + + var largePathUpdateDataIndex = throttle(function (event) { + var largePath = this; + var dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY); + getECData(largePath).dataIndex = dataIndex >= 0 ? dataIndex : null; + }, 30, false); + + function largePathFindDataIndex(largePath, x, y) { + var baseDimIdx = largePath.baseDimIdx; + var valueDimIdx = 1 - baseDimIdx; + var points = largePath.shape.points; + var largeDataIndices = largePath.largeDataIndices; + var startPoint = []; + var size = []; + var barWidth = largePath.barWidth; + + for (var i = 0, len = points.length / 3; i < len; i++) { + var ii = i * 3; + size[baseDimIdx] = barWidth; + size[valueDimIdx] = points[ii + 2]; + startPoint[baseDimIdx] = points[ii + baseDimIdx]; + startPoint[valueDimIdx] = points[ii + valueDimIdx]; + + if (size[valueDimIdx] < 0) { + startPoint[valueDimIdx] += size[valueDimIdx]; + size[valueDimIdx] = -size[valueDimIdx]; + } + + if (x >= startPoint[0] && x <= startPoint[0] + size[0] && y >= startPoint[1] && y <= startPoint[1] + size[1]) { + return largeDataIndices[i]; + } + } + + return -1; + } + + function createBackgroundShape(isHorizontalOrRadial, layout, coord) { + if (isCoordinateSystemType(coord, 'cartesian2d')) { + var rectShape = layout; + var coordLayout = coord.getArea(); + return { + x: isHorizontalOrRadial ? rectShape.x : coordLayout.x, + y: isHorizontalOrRadial ? coordLayout.y : rectShape.y, + width: isHorizontalOrRadial ? rectShape.width : coordLayout.width, + height: isHorizontalOrRadial ? coordLayout.height : rectShape.height + }; + } else { + var coordLayout = coord.getArea(); + var sectorShape = layout; + return { + cx: coordLayout.cx, + cy: coordLayout.cy, + r0: isHorizontalOrRadial ? coordLayout.r0 : sectorShape.r0, + r: isHorizontalOrRadial ? coordLayout.r : sectorShape.r, + startAngle: isHorizontalOrRadial ? sectorShape.startAngle : 0, + endAngle: isHorizontalOrRadial ? sectorShape.endAngle : Math.PI * 2 + }; + } + } + + function createBackgroundEl(coord, isHorizontalOrRadial, layout) { + var ElementClz = coord.type === 'polar' ? Sector : Rect; + return new ElementClz({ + shape: createBackgroundShape(isHorizontalOrRadial, layout, coord), + silent: true, + z2: 0 + }); + } + + function install$3(registers) { + registers.registerChartView(BarView); + registers.registerSeriesModel(BarSeriesModel); + registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'bar')); // Do layout after other overall layout, which can preapre some informations. + + registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('bar')); // Down sample after filter + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('bar')); + /** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + registers.registerAction({ + type: 'changeAxisOrder', + event: 'changeAxisOrder', + update: 'update' + }, function (payload, ecModel) { + var componentType = payload.componentType || 'series'; + ecModel.eachComponent({ + mainType: componentType, + query: payload + }, function (componentModel) { + if (payload.sortInfo) { + componentModel.axis.setCategorySortInfo(payload.sortInfo); + } + }); + }); + } + + var PI2$8 = Math.PI * 2; + var RADIAN = Math.PI / 180; + + function getViewRect(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function getBasicPieLayout(seriesModel, api) { + var viewRect = getViewRect(seriesModel, api); + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + + if (!isArray(center)) { + center = [center, center]; + } + + var width = parsePercent$1(viewRect.width, api.getWidth()); + var height = parsePercent$1(viewRect.height, api.getHeight()); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width) + viewRect.x; + var cy = parsePercent$1(center[1], height) + viewRect.y; + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + return { + cx: cx, + cy: cy, + r0: r0, + r: r + }; + } + + function pieLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var viewRect = getViewRect(seriesModel, api); + + var _a = getBasicPieLayout(seriesModel, api), + cx = _a.cx, + cy = _a.cy, + r = _a.r, + r0 = _a.r0; + + var startAngle = -seriesModel.get('startAngle') * RADIAN; + var minAngle = seriesModel.get('minAngle') * RADIAN; + var validDataCount = 0; + data.each(valueDim, function (value) { + !isNaN(value) && validDataCount++; + }); + var sum = data.getSum(valueDim); // Sum may be 0 + + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var clockwise = seriesModel.get('clockwise'); + var roseType = seriesModel.get('roseType'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // [0...max] + + var extent = data.getDataExtent(valueDim); + extent[0] = 0; // In the case some sector angle is smaller than minAngle + + var restAngle = PI2$8; + var valueSumLargerThanMinAngle = 0; + var currentAngle = startAngle; + var dir = clockwise ? 1 : -1; + data.setLayout({ + viewRect: viewRect, + r: r + }); + data.each(valueDim, function (value, idx) { + var angle; + + if (isNaN(value)) { + data.setItemLayout(idx, { + angle: NaN, + startAngle: NaN, + endAngle: NaN, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? NaN : r + }); + return; + } // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + + + if (roseType !== 'area') { + angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + } else { + angle = PI2$8 / validDataCount; + } + + if (angle < minAngle) { + angle = minAngle; + restAngle -= minAngle; + } else { + valueSumLargerThanMinAngle += value; + } + + var endAngle = currentAngle + dir * angle; + data.setItemLayout(idx, { + angle: angle, + startAngle: currentAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType ? linearMap(value, extent, [r0, r]) : r + }); + currentAngle = endAngle; + }); // Some sector is constrained by minAngle + // Rest sectors needs recalculate angle + + if (restAngle < PI2$8 && validDataCount) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle + if (restAngle <= 1e-3) { + var angle_1 = PI2$8 / validDataCount; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_1 = data.getItemLayout(idx); + layout_1.angle = angle_1; + layout_1.startAngle = startAngle + dir * idx * angle_1; + layout_1.endAngle = startAngle + dir * (idx + 1) * angle_1; + } + }); + } else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout_2 = data.getItemLayout(idx); + var angle = layout_2.angle === minAngle ? minAngle : value * unitRadian; + layout_2.startAngle = currentAngle; + layout_2.endAngle = currentAngle + dir * angle; + currentAngle += dir * angle; + } + }); + } + } + }); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function dataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (!legendModels || !legendModels.length) { + return; + } + + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + var name = data.getName(idx); // If in any legend component the status is not selected. + + for (var i = 0; i < legendModels.length; i++) { + // @ts-ignore FIXME: LegendModel + if (!legendModels[i].isSelected(name)) { + return false; + } + } + + return true; + }); + } + }; + } + + var RADIAN$1 = Math.PI / 180; + + function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) { + if (list.length < 2) { + return; + } + + function recalculateXOnSemiToAlignOnEllipseCurve(semi) { + var rB = semi.rB; + var rB2 = rB * rB; + + for (var i = 0; i < semi.list.length; i++) { + var item = semi.list[i]; + var dy = Math.abs(item.label.y - cy); // horizontal r is always same with original r because x is not changed. + + var rA = r + item.len; + var rA2 = rA * rA; // Use ellipse implicit function to calculate x + + var dx = Math.sqrt((1 - Math.abs(dy * dy / rB2)) * rA2); + var newX = cx + (dx + item.len2) * dir; + var deltaX = newX - item.label.x; + var newTargetWidth = item.targetTextWidth - deltaX * dir; // text x is changed, so need to recalculate width. + + constrainTextWidth(item, newTargetWidth, true); + item.label.x = newX; + } + } // Adjust X based on the shifted y. Make tight labels aligned on an ellipse curve. + + + function recalculateX(items) { + // Extremes of + var topSemi = { + list: [], + maxY: 0 + }; + var bottomSemi = { + list: [], + maxY: 0 + }; + + for (var i = 0; i < items.length; i++) { + if (items[i].labelAlignTo !== 'none') { + continue; + } + + var item = items[i]; + var semi = item.label.y > cy ? bottomSemi : topSemi; + var dy = Math.abs(item.label.y - cy); + + if (dy >= semi.maxY) { + var dx = item.label.x - cx - item.len2 * dir; // horizontal r is always same with original r because x is not changed. + + var rA = r + item.len; // Canculate rB based on the topest / bottemest label. + + var rB = Math.abs(dx) < rA ? Math.sqrt(dy * dy / (1 - dx * dx / rA / rA)) : rA; + semi.rB = rB; + semi.maxY = dy; + } + + semi.list.push(item); + } + + recalculateXOnSemiToAlignOnEllipseCurve(topSemi); + recalculateXOnSemiToAlignOnEllipseCurve(bottomSemi); + } + + var len = list.length; + + for (var i = 0; i < len; i++) { + if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') { + var dx = list[i].label.x - farthestX; + list[i].linePoints[1][0] += dx; + list[i].label.x = farthestX; + } + } + + if (shiftLayoutOnY(list, viewTop, viewTop + viewHeight)) { + recalculateX(list); + } + } + + function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) { + var leftList = []; + var rightList = []; + var leftmostX = Number.MAX_VALUE; + var rightmostX = -Number.MAX_VALUE; + + for (var i = 0; i < labelLayoutList.length; i++) { + var label = labelLayoutList[i].label; + + if (isPositionCenter(labelLayoutList[i])) { + continue; + } + + if (label.x < cx) { + leftmostX = Math.min(leftmostX, label.x); + leftList.push(labelLayoutList[i]); + } else { + rightmostX = Math.max(rightmostX, label.x); + rightList.push(labelLayoutList[i]); + } + } + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + + if (!isPositionCenter(layout) && layout.linePoints) { + if (layout.labelStyleWidth != null) { + continue; + } + + var label = layout.label; + var linePoints = layout.linePoints; + var targetTextWidth = void 0; + + if (layout.labelAlignTo === 'edge') { + if (label.x < cx) { + targetTextWidth = linePoints[2][0] - layout.labelDistance - viewLeft - layout.edgeDistance; + } else { + targetTextWidth = viewLeft + viewWidth - layout.edgeDistance - linePoints[2][0] - layout.labelDistance; + } + } else if (layout.labelAlignTo === 'labelLine') { + if (label.x < cx) { + targetTextWidth = leftmostX - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - rightmostX - layout.bleedMargin; + } + } else { + if (label.x < cx) { + targetTextWidth = label.x - viewLeft - layout.bleedMargin; + } else { + targetTextWidth = viewLeft + viewWidth - label.x - layout.bleedMargin; + } + } + + layout.targetTextWidth = targetTextWidth; + constrainTextWidth(layout, targetTextWidth); + } + } + + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX); + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + + if (!isPositionCenter(layout) && layout.linePoints) { + var label = layout.label; + var linePoints = layout.linePoints; + var isAlignToEdge = layout.labelAlignTo === 'edge'; + var padding = label.style.padding; + var paddingH = padding ? padding[1] + padding[3] : 0; // textRect.width already contains paddingH if bgColor is set + + var extraPaddingH = label.style.backgroundColor ? 0 : paddingH; + var realTextWidth = layout.rect.width + extraPaddingH; + var dist = linePoints[1][0] - linePoints[2][0]; + + if (isAlignToEdge) { + if (label.x < cx) { + linePoints[2][0] = viewLeft + layout.edgeDistance + realTextWidth + layout.labelDistance; + } else { + linePoints[2][0] = viewLeft + viewWidth - layout.edgeDistance - realTextWidth - layout.labelDistance; + } + } else { + if (label.x < cx) { + linePoints[2][0] = label.x + layout.labelDistance; + } else { + linePoints[2][0] = label.x - layout.labelDistance; + } + + linePoints[1][0] = linePoints[2][0] + dist; + } + + linePoints[1][1] = linePoints[2][1] = label.y; + } + } + } + + /** + * Set max width of each label, and then wrap each label to the max width. + * + * @param layout label layout + * @param availableWidth max width for the label to display + * @param forceRecalculate recaculate the text layout even if the current width + * is smaller than `availableWidth`. This is useful when the text was previously + * wrapped by calling `constrainTextWidth` but now `availableWidth` changed, in + * which case, previous wrapping should be redo. + */ + + + function constrainTextWidth(layout, availableWidth, forceRecalculate) { + if (forceRecalculate === void 0) { + forceRecalculate = false; + } + + if (layout.labelStyleWidth != null) { + // User-defined style.width has the highest priority. + return; + } + + var label = layout.label; + var style = label.style; + var textRect = layout.rect; + var bgColor = style.backgroundColor; + var padding = style.padding; + var paddingH = padding ? padding[1] + padding[3] : 0; + var overflow = style.overflow; // textRect.width already contains paddingH if bgColor is set + + var oldOuterWidth = textRect.width + (bgColor ? 0 : paddingH); + + if (availableWidth < oldOuterWidth || forceRecalculate) { + var oldHeight = textRect.height; + + if (overflow && overflow.match('break')) { + // Temporarily set background to be null to calculate + // the bounding box without backgroud. + label.setStyle('backgroundColor', null); // Set constraining width + + label.setStyle('width', availableWidth - paddingH); // This is the real bounding box of the text without padding + + var innerRect = label.getBoundingRect(); + label.setStyle('width', Math.ceil(innerRect.width)); + label.setStyle('backgroundColor', bgColor); + } else { + var availableInnerWidth = availableWidth - paddingH; + var newWidth = availableWidth < oldOuterWidth // Current text is too wide, use `availableWidth` as max width. + ? availableInnerWidth : // Current available width is enough, but the text may have + // already been wrapped with a smaller available width. + forceRecalculate ? availableInnerWidth > layout.unconstrainedWidth // Current available is larger than text width, + // so don't constrain width (otherwise it may have + // empty space in the background). + ? null // Current available is smaller than text width, so + // use the current available width as constraining + // width. + : availableInnerWidth : // Current available width is enough, so no need to + // constrain. + null; + label.setStyle('width', newWidth); + } + + var newRect = label.getBoundingRect(); + textRect.width = newRect.width; + var margin = (label.style.margin || 0) + 2.1; + textRect.height = newRect.height + margin; + textRect.y -= (textRect.height - oldHeight) / 2; + } + } + + function isPositionCenter(sectorShape) { + // Not change x for center label + return sectorShape.position === 'center'; + } + + function pieLabelLayout(seriesModel) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + var minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN$1; + var viewRect = data.getLayout('viewRect'); + var r = data.getLayout('r'); + var viewWidth = viewRect.width; + var viewLeft = viewRect.x; + var viewTop = viewRect.y; + var viewHeight = viewRect.height; + + function setNotShow(el) { + el.ignore = true; + } + + function isLabelShown(label) { + if (!label.ignore) { + return true; + } + + for (var key in label.states) { + if (label.states[key].ignore === false) { + return true; + } + } + + return false; + } + + data.each(function (idx) { + var sector = data.getItemGraphicEl(idx); + var sectorShape = sector.shape; + var label = sector.getTextContent(); + var labelLine = sector.getTextGuideLine(); + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); // Use position in normal or emphasis + + var labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']); + var labelDistance = labelModel.get('distanceToLabelLine'); + var labelAlignTo = labelModel.get('alignTo'); + var edgeDistance = parsePercent$1(labelModel.get('edgeDistance'), viewWidth); + var bleedMargin = labelModel.get('bleedMargin'); + var labelLineModel = itemModel.getModel('labelLine'); + var labelLineLen = labelLineModel.get('length'); + labelLineLen = parsePercent$1(labelLineLen, viewWidth); + var labelLineLen2 = labelLineModel.get('length2'); + labelLineLen2 = parsePercent$1(labelLineLen2, viewWidth); + + if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) { + each(label.states, setNotShow); + label.ignore = true; + return; + } + + if (!isLabelShown(label)) { + return; + } + + var midAngle = (sectorShape.startAngle + sectorShape.endAngle) / 2; + var nx = Math.cos(midAngle); + var ny = Math.sin(midAngle); + var textX; + var textY; + var linePoints; + var textAlign; + cx = sectorShape.cx; + cy = sectorShape.cy; + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + + if (labelPosition === 'center') { + textX = sectorShape.cx; + textY = sectorShape.cy; + textAlign = 'center'; + } else { + var x1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * nx : sectorShape.r * nx) + cx; + var y1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * ny : sectorShape.r * ny) + cy; + textX = x1 + nx * 3; + textY = y1 + ny * 3; + + if (!isLabelInside) { + // For roseType + var x2 = x1 + nx * (labelLineLen + r - sectorShape.r); + var y2 = y1 + ny * (labelLineLen + r - sectorShape.r); + var x3 = x2 + (nx < 0 ? -1 : 1) * labelLineLen2; + var y3 = y2; + + if (labelAlignTo === 'edge') { + // Adjust textX because text align of edge is opposite + textX = nx < 0 ? viewLeft + edgeDistance : viewLeft + viewWidth - edgeDistance; + } else { + textX = x3 + (nx < 0 ? -labelDistance : labelDistance); + } + + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + + textAlign = isLabelInside ? 'center' : labelAlignTo === 'edge' ? nx > 0 ? 'right' : 'left' : nx > 0 ? 'left' : 'right'; + } + + var PI = Math.PI; + var labelRotate = 0; + var rotate = labelModel.get('rotate'); + + if (isNumber(rotate)) { + labelRotate = rotate * (PI / 180); + } else if (labelPosition === 'center') { + labelRotate = 0; + } else if (rotate === 'radial' || rotate === true) { + var radialAngle = nx < 0 ? -midAngle + PI : -midAngle; + labelRotate = radialAngle; + } else if (rotate === 'tangential' && labelPosition !== 'outside' && labelPosition !== 'outer') { + var rad = Math.atan2(nx, ny); + + if (rad < 0) { + rad = PI * 2 + rad; + } + + var isDown = ny > 0; + + if (isDown) { + rad = PI + rad; + } + + labelRotate = rad - PI; + } + + hasLabelRotate = !!labelRotate; + label.x = textX; + label.y = textY; + label.rotation = labelRotate; + label.setStyle({ + verticalAlign: 'middle' + }); // Not sectorShape the inside label + + if (!isLabelInside) { + var textRect = label.getBoundingRect().clone(); + textRect.applyTransform(label.getComputedTransform()); // Text has a default 1px stroke. Exclude this. + + var margin = (label.style.margin || 0) + 2.1; + textRect.y -= margin / 2; + textRect.height += margin; + labelLayoutList.push({ + label: label, + labelLine: labelLine, + position: labelPosition, + len: labelLineLen, + len2: labelLineLen2, + minTurnAngle: labelLineModel.get('minTurnAngle'), + maxSurfaceAngle: labelLineModel.get('maxSurfaceAngle'), + surfaceNormal: new Point(nx, ny), + linePoints: linePoints, + textAlign: textAlign, + labelDistance: labelDistance, + labelAlignTo: labelAlignTo, + edgeDistance: edgeDistance, + bleedMargin: bleedMargin, + rect: textRect, + unconstrainedWidth: textRect.width, + labelStyleWidth: label.style.width + }); + } else { + label.setStyle({ + align: textAlign + }); + var selectState = label.states.select; + + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + + sector.setTextConfig({ + inside: isLabelInside + }); + }); + + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop); + } + + for (var i = 0; i < labelLayoutList.length; i++) { + var layout = labelLayoutList[i]; + var label = layout.label; + var labelLine = layout.labelLine; + var notShowLabel = isNaN(label.x) || isNaN(label.y); + + if (label) { + label.setStyle({ + align: layout.textAlign + }); + + if (notShowLabel) { + each(label.states, setNotShow); + label.ignore = true; + } + + var selectState = label.states.select; + + if (selectState) { + selectState.x += label.x; + selectState.y += label.y; + } + } + + if (labelLine) { + var linePoints = layout.linePoints; + + if (notShowLabel || !linePoints) { + each(labelLine.states, setNotShow); + labelLine.ignore = true; + } else { + limitTurnAngle(linePoints, layout.minTurnAngle); + limitSurfaceAngle(linePoints, layout.surfaceNormal, layout.maxSurfaceAngle); + labelLine.setShape({ + points: linePoints + }); // Set the anchor to the midpoint of sector + + label.__hostTarget.textGuideLineConfig = { + anchor: new Point(linePoints[0][0], linePoints[0][1]) + }; + } + } + } + } + + function getSectorCornerRadius(model, shape, zeroIfNull) { + var cornerRadius = model.get('borderRadius'); + + if (cornerRadius == null) { + return zeroIfNull ? { + cornerRadius: 0 + } : null; + } + + if (!isArray(cornerRadius)) { + cornerRadius = [cornerRadius, cornerRadius, cornerRadius, cornerRadius]; + } + + var dr = Math.abs(shape.r || 0 - shape.r0 || 0); + return { + cornerRadius: map(cornerRadius, function (cr) { + return parsePercent(cr, dr); + }) + }; + } + + /** + * Piece of pie including Sector, Label, LabelLine + */ + + var PiePiece = + /** @class */ + function (_super) { + __extends(PiePiece, _super); + + function PiePiece(data, idx, startAngle) { + var _this = _super.call(this) || this; + + _this.z2 = 2; + var text = new ZRText(); + + _this.setTextContent(text); + + _this.updateData(data, idx, startAngle, true); + + return _this; + } + + PiePiece.prototype.updateData = function (data, idx, startAngle, firstCreate) { + var sector = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = data.getItemLayout(idx); // cornerRadius & innerCornerRadius doesn't exist in the item layout. Use `0` if null value is specified. + // see `setItemLayout` in `pieLayout.ts`. + + var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout); // Ignore NaN data. + + if (isNaN(sectorShape.startAngle)) { + // Use NaN shape to avoid drawing shape. + sector.setShape(sectorShape); + return; + } + + if (firstCreate) { + sector.setShape(sectorShape); + var animationType = seriesModel.getShallow('animationType'); + + if (seriesModel.ecModel.ssr) { + // Use scale animation in SSR mode(opacity?) + // Because CSS SVG animation doesn't support very customized shape animation. + initProps(sector, { + scaleX: 0, + scaleY: 0 + }, seriesModel, { + dataIndex: idx, + isFrom: true + }); + sector.originX = sectorShape.cx; + sector.originY = sectorShape.cy; + } else if (animationType === 'scale') { + sector.shape.r = layout.r0; + initProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, idx); + } // Expansion + else { + if (startAngle != null) { + sector.setShape({ + startAngle: startAngle, + endAngle: startAngle + }); + initProps(sector, { + shape: { + startAngle: layout.startAngle, + endAngle: layout.endAngle + } + }, seriesModel, idx); + } else { + sector.shape.endAngle = layout.startAngle; + updateProps(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel, idx); + } + } + } else { + saveOldStyle(sector); // Transition animation from the old shape + + updateProps(sector, { + shape: sectorShape + }, seriesModel, idx); + } + + sector.useStyle(data.getItemVisual(idx, 'style')); + setStatesStylesFromModel(sector, itemModel); + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var offset = seriesModel.get('selectedOffset'); + var dx = Math.cos(midAngle) * offset; + var dy = Math.sin(midAngle) * offset; + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + + this._updateLabel(seriesModel, data, idx); + + sector.ensureState('emphasis').shape = extend({ + r: layout.r + (emphasisModel.get('scale') ? emphasisModel.get('scaleSize') || 0 : 0) + }, getSectorCornerRadius(emphasisModel.getModel('itemStyle'), layout)); + extend(sector.ensureState('select'), { + x: dx, + y: dy, + shape: getSectorCornerRadius(itemModel.getModel(['select', 'itemStyle']), layout) + }); + extend(sector.ensureState('blur'), { + shape: getSectorCornerRadius(itemModel.getModel(['blur', 'itemStyle']), layout) + }); + var labelLine = sector.getTextGuideLine(); + var labelText = sector.getTextContent(); + labelLine && extend(labelLine.ensureState('select'), { + x: dx, + y: dy + }); // TODO: needs dx, dy in zrender? + + extend(labelText.ensureState('select'), { + x: dx, + y: dy + }); + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + PiePiece.prototype._updateLabel = function (seriesModel, data, idx) { + var sector = this; + var itemModel = data.getItemModel(idx); + var labelLineModel = itemModel.getModel('labelLine'); + var style = data.getItemVisual(idx, 'style'); + var visualColor = style && style.fill; + var visualOpacity = style && style.opacity; + setLabelStyle(sector, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + defaultText: seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx) + }); + var labelText = sector.getTextContent(); // Set textConfig on sector. + + sector.setTextConfig({ + // reset position, rotation + position: null, + rotation: null + }); // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + + labelText.attr({ + z2: 10 + }); + var labelPosition = seriesModel.get(['label', 'position']); + + if (labelPosition !== 'outside' && labelPosition !== 'outer') { + sector.removeTextGuideLine(); + } else { + var polyline = this.getTextGuideLine(); + + if (!polyline) { + polyline = new Polyline(); + this.setTextGuideLine(polyline); + } // Default use item visual color + + + setLabelLineStyle(this, getLabelLineStatesModels(itemModel), { + stroke: visualColor, + opacity: retrieve3(labelLineModel.get(['lineStyle', 'opacity']), visualOpacity, 1) + }); + } + }; + + return PiePiece; + }(Sector); // Pie view + + + var PieView = + /** @class */ + function (_super) { + __extends(PieView, _super); + + function PieView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.ignoreLabelLineUpdate = true; + return _this; + } + + PieView.prototype.render = function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var startAngle; // First render + + if (!oldData && data.count() > 0) { + var shape = data.getItemLayout(0); + + for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) { + shape = data.getItemLayout(s); + } + + if (shape) { + startAngle = shape.startAngle; + } + } // remove empty-circle if it exists + + + if (this._emptyCircleSector) { + group.remove(this._emptyCircleSector); + } // when all data are filtered, show lightgray empty circle + + + if (data.count() === 0 && seriesModel.get('showEmptyCircle')) { + var sector = new Sector({ + shape: getBasicPieLayout(seriesModel, api) + }); + sector.useStyle(seriesModel.getModel('emptyCircleStyle').getItemStyle()); + this._emptyCircleSector = sector; + group.add(sector); + } + + data.diff(oldData).add(function (idx) { + var piePiece = new PiePiece(data, idx, startAngle); + data.setItemGraphicEl(idx, piePiece); + group.add(piePiece); + }).update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + piePiece.updateData(data, newIdx, startAngle); + piePiece.off('click'); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }).remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piePiece, seriesModel, idx); + }).execute(); + pieLabelLayout(seriesModel); // Always use initial animation. + + if (seriesModel.get('animationTypeUpdate') !== 'expansion') { + this._data = data; + } + }; + + PieView.prototype.dispose = function () { + }; + + PieView.prototype.containPoint = function (point, seriesModel) { + var data = seriesModel.getData(); + var itemLayout = data.getItemLayout(0); + + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + + PieView.type = 'pie'; + return PieView; + }(ChartView); + + /** + * [Usage]: + * (1) + * createListSimply(seriesModel, ['value']); + * (2) + * createListSimply(seriesModel, { + * coordDimensions: ['value'], + * dimensionsCount: 5 + * }); + */ + + function createSeriesDataSimply(seriesModel, opt, nameList) { + opt = isArray(opt) && { + coordDimensions: opt + } || extend({ + encodeDefine: seriesModel.getEncode() + }, opt); + var source = seriesModel.getSource(); + var dimensions = prepareSeriesDataSchema(source, opt).dimensions; + var list = new SeriesData(dimensions, seriesModel); + list.initData(source, nameList); + return list; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * LegendVisualProvider is an bridge that pick encoded color from data and + * provide to the legend component. + */ + var LegendVisualProvider = + /** @class */ + function () { + function LegendVisualProvider( // Function to get data after filtered. It stores all the encoding info + getDataWithEncodedVisual, // Function to get raw data before filtered. + getRawData) { + this._getDataWithEncodedVisual = getDataWithEncodedVisual; + this._getRawData = getRawData; + } + + LegendVisualProvider.prototype.getAllNames = function () { + var rawData = this._getRawData(); // We find the name from the raw data. In case it's filtered by the legend component. + // Normally, the name can be found in rawData, but can't be found in filtered data will display as gray. + + + return rawData.mapArray(rawData.getName); + }; + + LegendVisualProvider.prototype.containName = function (name) { + var rawData = this._getRawData(); + + return rawData.indexOfName(name) >= 0; + }; + + LegendVisualProvider.prototype.indexOfName = function (name) { + // Only get data when necessary. + // Because LegendVisualProvider constructor may be new in the stage that data is not prepared yet. + // Invoking Series#getData immediately will throw an error. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + + return dataWithEncodedVisual.indexOfName(name); + }; + + LegendVisualProvider.prototype.getItemVisual = function (dataIndex, key) { + // Get encoded visual properties from final filtered data. + var dataWithEncodedVisual = this._getDataWithEncodedVisual(); + + return dataWithEncodedVisual.getItemVisual(dataIndex, key); + }; + + return LegendVisualProvider; + }(); + + var PieSeriesModel = + /** @class */ + function (_super) { + __extends(PieSeriesModel, _super); + + function PieSeriesModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + /** + * @overwrite + */ + + + PieSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + + this._defaultLabelLine(option); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.mergeOption = function () { + _super.prototype.mergeOption.apply(this, arguments); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.getInitialData = function () { + return createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + }; + /** + * @overwrite + */ + + + PieSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); + + var params = _super.prototype.getDataParams.call(this, dataIndex); // FIXME toFixed? + + + var valueList = []; + data.each(data.mapDimension('value'), function (value) { + valueList.push(value); + }); + params.percent = getPercentWithPrecision(valueList, dataIndex, data.hostModel.get('percentPrecision')); + params.$vars.push('percent'); + return params; + }; + + PieSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false` + + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; + + PieSeriesModel.type = 'series.pie'; + PieSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + legendHoverLink: true, + colorBy: 'data', + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // If the angle of a sector less than `minShowLabelAngle`, + // the label will not be displayed. + minShowLabelAngle: 0, + // 选中时扇区偏移量 + selectedOffset: 10, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + percentPrecision: 2, + // If still show when all data zero. + stillShowZeroSum: true, + // cursor: null, + left: 0, + top: 0, + right: 0, + bottom: 0, + width: null, + height: null, + label: { + // color: 'inherit', + // If rotate around circle + rotate: 0, + show: true, + overflow: 'truncate', + // 'outer', 'inside', 'center' + position: 'outer', + // 'none', 'labelLine', 'edge'. Works only when position is 'outer' + alignTo: 'none', + // Closest distance between label and chart edge. + // Works only position is 'outer' and alignTo is 'edge'. + edgeDistance: '25%', + // Works only position is 'outer' and alignTo is not 'edge'. + bleedMargin: 10, + // Distance between text and label line. + distanceToLabelLine: 5 // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // 默认使用全局文本样式,详见TEXTSTYLE + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + minTurnAngle: 90, + maxSurfaceAngle: 90, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + }, + itemStyle: { + borderWidth: 1, + borderJoin: 'round' + }, + showEmptyCircle: true, + emptyCircleStyle: { + color: 'lightgray', + opacity: 1 + }, + labelLayout: { + // Hide the overlapped label. + hideOverlap: true + }, + emphasis: { + scale: true, + scaleSize: 5 + }, + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // Animation type. Valid values: expansion, scale + animationType: 'expansion', + animationDuration: 1000, + // Animation type when update. Valid values: transition, expansion + animationTypeUpdate: 'transition', + animationEasingUpdate: 'cubicInOut', + animationDurationUpdate: 500, + animationEasing: 'cubicInOut' + }; + return PieSeriesModel; + }(SeriesModel); + + function negativeDataFilter(seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + // handle negative value condition + var valueDim = data.mapDimension('value'); + var curValue = data.get(valueDim, idx); + + if (isNumber(curValue) && !isNaN(curValue) && curValue < 0) { + return false; + } + + return true; + }); + } + }; + } + + function install$4(registers) { + registers.registerChartView(PieView); + registers.registerSeriesModel(PieSeriesModel); + createLegacyDataSelectAction('pie', registers.registerAction); + registers.registerLayout(curry(pieLayout, 'pie')); + registers.registerProcessor(dataFilter('pie')); + registers.registerProcessor(negativeDataFilter('pie')); + } + + var ScatterSeriesModel = + /** @class */ + function (_super) { + __extends(ScatterSeriesModel, _super); + + function ScatterSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScatterSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + ScatterSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + ScatterSeriesModel.prototype.getProgressive = function () { + var progressive = this.option.progressive; + + if (progressive == null) { + // PENDING + return this.option.large ? 5e3 : this.get('progressive'); + } + + return progressive; + }; + + ScatterSeriesModel.prototype.getProgressiveThreshold = function () { + var progressiveThreshold = this.option.progressiveThreshold; + + if (progressiveThreshold == null) { + // PENDING + return this.option.large ? 1e4 : this.get('progressiveThreshold'); + } + + return progressiveThreshold; + }; + + ScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.point(data.getItemLayout(dataIndex)); + }; + + ScatterSeriesModel.prototype.getZLevelKey = function () { + // Each progressive series has individual key. + return this.getData().count() > this.getProgressiveThreshold() ? this.id : ''; + }; + + ScatterSeriesModel.type = 'series.scatter'; + ScatterSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + ScatterSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + symbolSize: 10, + // symbolRotate: null, // 图形旋转控制 + large: false, + // Available when large is true + largeThreshold: 2000, + // cursor: null, + itemStyle: { + opacity: 0.8 // color: 各异 + + }, + emphasis: { + scale: true + }, + // If clip the overflow graphics + // Works on cartesian / polar series + clip: true, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + universalTransition: { + divideShape: 'clone' + } // progressive: null + + }; + return ScatterSeriesModel; + }(SeriesModel); + + var BOOST_SIZE_THRESHOLD = 4; + + var LargeSymbolPathShape = + /** @class */ + function () { + function LargeSymbolPathShape() { + } + + return LargeSymbolPathShape; + }(); + + var LargeSymbolPath = + /** @class */ + function (_super) { + __extends(LargeSymbolPath, _super); + + function LargeSymbolPath(opts) { + var _this = _super.call(this, opts) || this; + + _this._off = 0; + _this.hoverDataIdx = -1; + return _this; + } + + LargeSymbolPath.prototype.getDefaultShape = function () { + return new LargeSymbolPathShape(); + }; + + LargeSymbolPath.prototype.reset = function () { + this.notClear = false; + this._off = 0; + }; + + LargeSymbolPath.prototype.buildPath = function (path, shape) { + var points = shape.points; + var size = shape.size; + var symbolProxy = this.symbolProxy; + var symbolProxyShape = symbolProxy.shape; + var ctx = path.getContext ? path.getContext() : path; + var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD; + var softClipShape = this.softClipShape; + var i; // Do draw in afterBrush. + + if (canBoost) { + this._ctx = ctx; + return; + } + + this._ctx = null; + + for (i = this._off; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + if (softClipShape && !softClipShape.contain(x, y)) { + continue; + } + + symbolProxyShape.x = x - size[0] / 2; + symbolProxyShape.y = y - size[1] / 2; + symbolProxyShape.width = size[0]; + symbolProxyShape.height = size[1]; + symbolProxy.buildPath(path, symbolProxyShape, true); + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeSymbolPath.prototype.afterBrush = function () { + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var ctx = this._ctx; + var softClipShape = this.softClipShape; + var i; + + if (!ctx) { + return; + } // PENDING If style or other canvas status changed? + + + for (i = this._off; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + if (softClipShape && !softClipShape.contain(x, y)) { + continue; + } // fillRect is faster than building a rect path and draw. + // And it support light globalCompositeOperation. + + + ctx.fillRect(x - size[0] / 2, y - size[1] / 2, size[0], size[1]); + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeSymbolPath.prototype.findDataIndex = function (x, y) { + // TODO ??? + // Consider transform + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var w = Math.max(size[0], 4); + var h = Math.max(size[1], 4); // Not consider transform + // Treat each element as a rect + // top down traverse + + for (var idx = points.length / 2 - 1; idx >= 0; idx--) { + var i = idx * 2; + var x0 = points[i] - w / 2; + var y0 = points[i + 1] - h / 2; + + if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) { + return idx; + } + } + + return -1; + }; + + LargeSymbolPath.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + // Cache found data index. + var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); + return dataIdx >= 0; + } + + this.hoverDataIdx = -1; + return false; + }; + + LargeSymbolPath.prototype.getBoundingRect = function () { + // Ignore stroke for large symbol draw. + var rect = this._rect; + + if (!rect) { + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var w = size[0]; + var h = size[1]; + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + + rect = this._rect = new BoundingRect(minX - w / 2, minY - h / 2, maxX - minX + w, maxY - minY + h); + } + + return rect; + }; + + return LargeSymbolPath; + }(Path); + + var LargeSymbolDraw = + /** @class */ + function () { + function LargeSymbolDraw() { + this.group = new Group(); + } + + /** + * Update symbols draw by new data + */ + + + LargeSymbolDraw.prototype.updateData = function (data, opt) { + this._clear(); + + var symbolEl = this._create(); + + symbolEl.setShape({ + points: data.getLayout('points') + }); + + this._setCommon(symbolEl, data, opt); + }; + + LargeSymbolDraw.prototype.updateLayout = function (data) { + var points = data.getLayout('points'); + this.group.eachChild(function (child) { + if (child.startIndex != null) { + var len = (child.endIndex - child.startIndex) * 2; + var byteOffset = child.startIndex * 4 * 2; + points = new Float32Array(points.buffer, byteOffset, len); + } + + child.setShape('points', points); // Reset draw cursor. + + child.reset(); + }); + }; + + LargeSymbolDraw.prototype.incrementalPrepareUpdate = function (data) { + this._clear(); + }; + + LargeSymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) { + var lastAdded = this._newAdded[0]; + var points = data.getLayout('points'); + var oldPoints = lastAdded && lastAdded.shape.points; // Merging the exists. Each element has 1e4 points. + // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization) + + if (oldPoints && oldPoints.length < 2e4) { + var oldLen = oldPoints.length; + var newPoints = new Float32Array(oldLen + points.length); // Concat two array + + newPoints.set(oldPoints); + newPoints.set(points, oldLen); // Update endIndex + + lastAdded.endIndex = taskParams.end; + lastAdded.setShape({ + points: newPoints + }); + } else { + // Clear + this._newAdded = []; + + var symbolEl = this._create(); + + symbolEl.startIndex = taskParams.start; + symbolEl.endIndex = taskParams.end; + symbolEl.incremental = true; + symbolEl.setShape({ + points: points + }); + + this._setCommon(symbolEl, data, opt); + } + }; + + LargeSymbolDraw.prototype.eachRendered = function (cb) { + this._newAdded[0] && cb(this._newAdded[0]); + }; + + LargeSymbolDraw.prototype._create = function () { + var symbolEl = new LargeSymbolPath({ + cursor: 'default' + }); + this.group.add(symbolEl); + + this._newAdded.push(symbolEl); + + return symbolEl; + }; + + LargeSymbolDraw.prototype._setCommon = function (symbolEl, data, opt) { + var hostModel = data.hostModel; + opt = opt || {}; + var size = data.getVisual('symbolSize'); + symbolEl.setShape('size', size instanceof Array ? size : [size, size]); + symbolEl.softClipShape = opt.clipShape || null; // Create symbolProxy to build path for each data + + symbolEl.symbolProxy = createSymbol(data.getVisual('symbol'), 0, 0, 0, 0); // Use symbolProxy setColor method + + symbolEl.setColor = symbolEl.symbolProxy.setColor; + var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD; + symbolEl.useStyle( // Draw shadow when doing fillRect is extremely slow. + hostModel.getModel('itemStyle').getItemStyle(extrudeShadow ? ['color', 'shadowBlur', 'shadowColor'] : ['color'])); + var globalStyle = data.getVisual('style'); + var visualColor = globalStyle && globalStyle.fill; + + if (visualColor) { + symbolEl.setColor(visualColor); + } + + var ecData = getECData(symbolEl); // Enable tooltip + // PENDING May have performance issue when path is extremely large + + ecData.seriesIndex = hostModel.seriesIndex; + symbolEl.on('mousemove', function (e) { + ecData.dataIndex = null; + var dataIndex = symbolEl.hoverDataIdx; + + if (dataIndex >= 0) { + // Provide dataIndex for tooltip + ecData.dataIndex = dataIndex + (symbolEl.startIndex || 0); + } + }); + }; + + LargeSymbolDraw.prototype.remove = function () { + this._clear(); + }; + + LargeSymbolDraw.prototype._clear = function () { + this._newAdded = []; + this.group.removeAll(); + }; + + return LargeSymbolDraw; + }(); + + var ScatterView = + /** @class */ + function (_super) { + __extends(ScatterView, _super); + + function ScatterView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScatterView.type; + return _this; + } + + ScatterView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.updateData(data, { + // TODO + // If this parameter should be a shape or a bounding volume + // shape will be more general. + // But bounding volume like bounding rect will be much faster in the contain calculation + clipShape: this._getClipShape(seriesModel) + }); + this._finished = true; + }; + + ScatterView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.incrementalPrepareUpdate(data); + this._finished = false; + }; + + ScatterView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData(), { + clipShape: this._getClipShape(seriesModel) + }); + + this._finished = taskParams.end === seriesModel.getData().count(); + }; + + ScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); // Must mark group dirty and make sure the incremental layer will be cleared + // PENDING + + this.group.dirty(); + + if (!this._finished || data.count() > 1e4) { + return { + update: true + }; + } else { + var res = pointsLayout('').reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } + + this._symbolDraw.updateLayout(data); + } + }; + + ScatterView.prototype.eachRendered = function (cb) { + this._symbolDraw && this._symbolDraw.eachRendered(cb); + }; + + ScatterView.prototype._getClipShape = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var clipArea = coordSys && coordSys.getArea && coordSys.getArea(); + return seriesModel.get('clip', true) ? clipArea : null; + }; + + ScatterView.prototype._updateSymbolDraw = function (data, seriesModel) { + var symbolDraw = this._symbolDraw; + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if (!symbolDraw || isLargeDraw !== this._isLargeDraw) { + symbolDraw && symbolDraw.remove(); + symbolDraw = this._symbolDraw = isLargeDraw ? new LargeSymbolDraw() : new SymbolDraw(); + this._isLargeDraw = isLargeDraw; + this.group.removeAll(); + } + + this.group.add(symbolDraw.group); + return symbolDraw; + }; + + ScatterView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + this._symbolDraw = null; + }; + + ScatterView.prototype.dispose = function () { + }; + + ScatterView.type = 'scatter'; + return ScatterView; + }(ChartView); + + var GridModel = + /** @class */ + function (_super) { + __extends(GridModel, _super); + + function GridModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + GridModel.type = 'grid'; + GridModel.dependencies = ['xAxis', 'yAxis']; + GridModel.layoutMode = 'box'; + GridModel.defaultOption = { + show: false, + // zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 70, + // If grid size contain label + containLabel: false, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 1, + borderColor: '#ccc' + }; + return GridModel; + }(ComponentModel); + + var CartesianAxisModel = + /** @class */ + function (_super) { + __extends(CartesianAxisModel, _super); + + function CartesianAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + CartesianAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + }; + + CartesianAxisModel.type = 'cartesian2dAxis'; + return CartesianAxisModel; + }(ComponentModel); + mixin(CartesianAxisModel, AxisModelCommonMixin); + + var defaultOption = { + show: true, + // zlevel: 0, + z: 0, + // Inverse the axis. + inverse: false, + // Axis name displayed. + name: '', + // 'start' | 'middle' | 'end' + nameLocation: 'end', + // By degree. By default auto rotate by nameLocation. + nameRotate: null, + nameTruncate: { + maxWidth: null, + ellipsis: '...', + placeholder: '.' + }, + // Use global text style by default. + nameTextStyle: {}, + // The gap between axisName and axisLine. + nameGap: 15, + // Default `false` to support tooltip. + silent: false, + // Default `false` to avoid legacy user event listener fail. + triggerEvent: false, + tooltip: { + show: false + }, + axisPointer: {}, + axisLine: { + show: true, + onZero: true, + onZeroAxisIndex: null, + lineStyle: { + color: '#6E7079', + width: 1, + type: 'solid' + }, + // The arrow at both ends the the axis. + symbol: ['none', 'none'], + symbolSize: [10, 15] + }, + axisTick: { + show: true, + // Whether axisTick is inside the grid or outside the grid. + inside: false, + // The length of axisTick. + length: 5, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + // Whether axisLabel is inside the grid or outside the grid. + inside: false, + rotate: 0, + // true | false | null/undefined (auto) + showMinLabel: null, + // true | false | null/undefined (auto) + showMaxLabel: null, + margin: 8, + // formatter: null, + fontSize: 12 + }, + splitLine: { + show: true, + lineStyle: { + color: ['#E0E6F1'], + width: 1, + type: 'solid' + } + }, + splitArea: { + show: false, + areaStyle: { + color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)'] + } + } + }; + var categoryAxis = merge({ + // The gap at both ends of the axis. For categoryAxis, boolean. + boundaryGap: true, + // Set false to faster category collection. + deduplication: null, + // splitArea: { + // show: false + // }, + splitLine: { + show: false + }, + axisTick: { + // If tick is align with label when boundaryGap is true + alignWithLabel: false, + interval: 'auto' + }, + axisLabel: { + interval: 'auto' + } + }, defaultOption); + var valueAxis = merge({ + boundaryGap: [0, 0], + axisLine: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + axisTick: { + // Not shown when other axis is categoryAxis in cartesian + show: 'auto' + }, + // TODO + // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60] + splitNumber: 5, + minorTick: { + // Minor tick, not available for cateogry axis. + show: false, + // Split number of minor ticks. The value should be in range of (0, 100) + splitNumber: 5, + // Lenght of minor tick + length: 3, + // Line style + lineStyle: {// Default to be same with axisTick + } + }, + minorSplitLine: { + show: false, + lineStyle: { + color: '#F4F7FD', + width: 1 + } + } + }, defaultOption); + var timeAxis = merge({ + splitNumber: 6, + axisLabel: { + // To eliminate labels that are not nice + showMinLabel: false, + showMaxLabel: false, + rich: { + primary: { + fontWeight: 'bold' + } + } + }, + splitLine: { + show: false + } + }, valueAxis); + var logAxis = defaults({ + logBase: 10 + }, valueAxis); + var axisDefault = { + category: categoryAxis, + value: valueAxis, + time: timeAxis, + log: logAxis + }; + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var AXIS_TYPES = { + value: 1, + category: 1, + time: 1, + log: 1 + }; + + /** + * Generate sub axis model class + * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ... + */ + + function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) { + each(AXIS_TYPES, function (v, axisType) { + var defaultOption = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true); + + var AxisModel = + /** @class */ + function (_super) { + __extends(AxisModel, _super); + + function AxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = axisName + 'Axis.' + axisType; + return _this; + } + + AxisModel.prototype.mergeDefaultAndTheme = function (option, ecModel) { + var layoutMode = fetchLayoutMode(this); + var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(axisType + 'Axis')); + merge(option, this.getDefaultOption()); + option.type = getAxisType(option); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }; + + AxisModel.prototype.optionUpdated = function () { + var thisOption = this.option; + + if (thisOption.type === 'category') { + this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); + } + }; + /** + * Should not be called before all of 'getInitailData' finished. + * Because categories are collected during initializing data. + */ + + + AxisModel.prototype.getCategories = function (rawData) { + var option = this.option; // FIXME + // warning if called before all of 'getInitailData' finished. + + if (option.type === 'category') { + if (rawData) { + return option.data; + } + + return this.__ordinalMeta.categories; + } + }; + + AxisModel.prototype.getOrdinalMeta = function () { + return this.__ordinalMeta; + }; + + AxisModel.type = axisName + 'Axis.' + axisType; + AxisModel.defaultOption = defaultOption; + return AxisModel; + }(BaseAxisModelClass); + + registers.registerComponentModel(AxisModel); + }); + registers.registerSubTypeDefaulter(axisName + 'Axis', getAxisType); + } + + function getAxisType(option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); + } + + var Cartesian = + /** @class */ + function () { + function Cartesian(name) { + this.type = 'cartesian'; + this._dimList = []; + this._axes = {}; + this.name = name || ''; + } + + Cartesian.prototype.getAxis = function (dim) { + return this._axes[dim]; + }; + + Cartesian.prototype.getAxes = function () { + return map(this._dimList, function (dim) { + return this._axes[dim]; + }, this); + }; + + Cartesian.prototype.getAxesByScale = function (scaleType) { + scaleType = scaleType.toLowerCase(); + return filter(this.getAxes(), function (axis) { + return axis.scale.type === scaleType; + }); + }; + + Cartesian.prototype.addAxis = function (axis) { + var dim = axis.dim; + this._axes[dim] = axis; + + this._dimList.push(dim); + }; + + return Cartesian; + }(); + + var cartesian2DDimensions = ['x', 'y']; + + function canCalculateAffineTransform(scale) { + return scale.type === 'interval' || scale.type === 'time'; + } + + var Cartesian2D = + /** @class */ + function (_super) { + __extends(Cartesian2D, _super); + + function Cartesian2D() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'cartesian2d'; + _this.dimensions = cartesian2DDimensions; + return _this; + } + + /** + * Calculate an affine transform matrix if two axes are time or value. + * It's mainly for accelartion on the large time series data. + */ + + + Cartesian2D.prototype.calcAffineTransform = function () { + this._transform = this._invTransform = null; + var xAxisScale = this.getAxis('x').scale; + var yAxisScale = this.getAxis('y').scale; + + if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) { + return; + } + + var xScaleExtent = xAxisScale.getExtent(); + var yScaleExtent = yAxisScale.getExtent(); + var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]); + var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]); + var xScaleSpan = xScaleExtent[1] - xScaleExtent[0]; + var yScaleSpan = yScaleExtent[1] - yScaleExtent[0]; + + if (!xScaleSpan || !yScaleSpan) { + return; + } // Accelerate data to point calculation on the special large time series data. + + + var scaleX = (end[0] - start[0]) / xScaleSpan; + var scaleY = (end[1] - start[1]) / yScaleSpan; + var translateX = start[0] - xScaleExtent[0] * scaleX; + var translateY = start[1] - yScaleExtent[0] * scaleY; + var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY]; + this._invTransform = invert([], m); + }; + /** + * Base axis will be used on stacking. + */ + + + Cartesian2D.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x'); + }; + + Cartesian2D.prototype.containPoint = function (point) { + var axisX = this.getAxis('x'); + var axisY = this.getAxis('y'); + return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1])); + }; + + Cartesian2D.prototype.containData = function (data) { + return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]); + }; + + Cartesian2D.prototype.dataToPoint = function (data, clamp, out) { + out = out || []; + var xVal = data[0]; + var yVal = data[1]; // Fast path + + if (this._transform // It's supported that if data is like `[Inifity, 123]`, where only Y pixel calculated. + && xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) { + return applyTransform(out, data, this._transform); + } + + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal, clamp)); + out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal, clamp)); + return out; + }; + + Cartesian2D.prototype.clampData = function (data, out) { + var xScale = this.getAxis('x').scale; + var yScale = this.getAxis('y').scale; + var xAxisExtent = xScale.getExtent(); + var yAxisExtent = yScale.getExtent(); + var x = xScale.parse(data[0]); + var y = yScale.parse(data[1]); + out = out || []; + out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1])); + out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1])); + return out; + }; + + Cartesian2D.prototype.pointToData = function (point, clamp) { + var out = []; + + if (this._invTransform) { + return applyTransform(out, point, this._invTransform); + } + + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp); + out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp); + return out; + }; + + Cartesian2D.prototype.getOtherAxis = function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + }; + /** + * Get rect area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + + + Cartesian2D.prototype.getArea = function () { + var xExtent = this.getAxis('x').getGlobalExtent(); + var yExtent = this.getAxis('y').getGlobalExtent(); + var x = Math.min(xExtent[0], xExtent[1]); + var y = Math.min(yExtent[0], yExtent[1]); + var width = Math.max(xExtent[0], xExtent[1]) - x; + var height = Math.max(yExtent[0], yExtent[1]) - y; + return new BoundingRect(x, y, width, height); + }; + + return Cartesian2D; + }(Cartesian); + + var Axis2D = + /** @class */ + function (_super) { + __extends(Axis2D, _super); + + function Axis2D(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + /** + * Index of axis, can be used as key + * Injected outside. + */ + + + _this.index = 0; + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + + Axis2D.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + /** + * Each item cooresponds to this.getExtent(), which + * means globalExtent[0] may greater than globalExtent[1], + * unless `asc` is input. + * + * @param {boolean} [asc] + * @return {Array.} + */ + + + Axis2D.prototype.getGlobalExtent = function (asc) { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + asc && ret[0] > ret[1] && ret.reverse(); + return ret; + }; + + Axis2D.prototype.pointToData = function (point, clamp) { + return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp); + }; + /** + * Set ordinalSortInfo + * @param info new OrdinalSortInfo + */ + + + Axis2D.prototype.setCategorySortInfo = function (info) { + if (this.type !== 'category') { + return false; + } + + this.model.option.categorySortInfo = info; + this.scale.setSortInfo(info); + }; + + return Axis2D; + }(Axis); + + /** + * Can only be called after coordinate system creation stage. + * (Can be called before coordinate system update stage). + */ + + function layout$1(gridModel, axisModel, opt) { + opt = opt || {}; + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0]; + var rawAxisPosition = axis.position; + var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition; + var axisDim = axis.dim; + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var idx = { + left: 0, + right: 1, + top: 0, + bottom: 1, + onZero: 2 + }; + var axisOffset = axisModel.get('offset') || 0; + var posBound = axisDim === 'x' ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset]; + + if (otherAxisOnZeroOf) { + var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0)); + posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]); + } // Axis position + + + layout.position = [axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3]]; // Axis rotation + + layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1); // Tick and label direction, x y is axisDim + + var dirMap = { + top: -1, + bottom: 1, + left: -1, + right: 1 + }; + layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition]; + layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0; + + if (axisModel.get(['axisTick', 'inside'])) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { + layout.labelDirection = -layout.labelDirection; + } // Special label rotation + + + var labelRotate = axisModel.get(['axisLabel', 'rotate']); + layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate; // Over splitLine and splitArea + + layout.z2 = 1; + return layout; + } + + function isCartesian2DSeries(seriesModel) { + return seriesModel.get('coordinateSystem') === 'cartesian2d'; + } + + function findAxisModels(seriesModel) { + var axisModelMap = { + xAxisModel: null, + yAxisModel: null + }; + each(axisModelMap, function (v, key) { + var axisType = key.replace(/Model$/, ''); + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!axisModel) { + throw new Error(axisType + ' "' + retrieve3(seriesModel.get(axisType + 'Index'), seriesModel.get(axisType + 'Id'), 0) + '" not found'); + } + } + + axisModelMap[key] = axisModel; + }); + return axisModelMap; + } + + var mathLog$1 = Math.log; + + function alignScaleTicks(scale, axisModel, alignToScale) { + var intervalScaleProto = IntervalScale.prototype; // NOTE: There is a precondition for log scale here: + // In log scale we store _interval and _extent of exponent value. + // So if we use the method of InternalScale to set/get these data. + // It process the exponent value, which is linear and what we want here. + + var alignToTicks = intervalScaleProto.getTicks.call(alignToScale); + var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true); + var alignToSplitNumber = alignToTicks.length - 1; + var alignToInterval = intervalScaleProto.getInterval.call(alignToScale); + var scaleExtent = getScaleExtent(scale, axisModel); + var rawExtent = scaleExtent.extent; + var isMinFixed = scaleExtent.fixMin; + var isMaxFixed = scaleExtent.fixMax; + + if (scale.type === 'log') { + var logBase = mathLog$1(scale.base); + rawExtent = [mathLog$1(rawExtent[0]) / logBase, mathLog$1(rawExtent[1]) / logBase]; + } + + scale.setExtent(rawExtent[0], rawExtent[1]); + scale.calcNiceExtent({ + splitNumber: alignToSplitNumber, + fixMin: isMinFixed, + fixMax: isMaxFixed + }); + var extent = intervalScaleProto.getExtent.call(scale); // Need to update the rawExtent. + // Because value in rawExtent may be not parsed. e.g. 'dataMin', 'dataMax' + + if (isMinFixed) { + rawExtent[0] = extent[0]; + } + + if (isMaxFixed) { + rawExtent[1] = extent[1]; + } + + var interval = intervalScaleProto.getInterval.call(scale); + var min = rawExtent[0]; + var max = rawExtent[1]; + + if (isMinFixed && isMaxFixed) { + // User set min, max, divide to get new interval + interval = (max - min) / alignToSplitNumber; + } else if (isMinFixed) { + max = rawExtent[0] + interval * alignToSplitNumber; // User set min, expand extent on the other side + + while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) { + interval = increaseInterval(interval); + max = rawExtent[0] + interval * alignToSplitNumber; + } + } else if (isMaxFixed) { + // User set max, expand extent on the other side + min = rawExtent[1] - interval * alignToSplitNumber; + + while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) { + interval = increaseInterval(interval); + min = rawExtent[1] - interval * alignToSplitNumber; + } + } else { + var nicedSplitNumber = scale.getTicks().length - 1; + + if (nicedSplitNumber > alignToSplitNumber) { + interval = increaseInterval(interval); + } + + var range = interval * alignToSplitNumber; + max = Math.ceil(rawExtent[1] / interval) * interval; + min = round(max - range); // Not change the result that crossing zero. + + if (min < 0 && rawExtent[0] >= 0) { + min = 0; + max = round(range); + } else if (max > 0 && rawExtent[1] <= 0) { + max = 0; + min = -round(range); + } + } // Adjust min, max based on the extent of alignTo. When min or max is set in alignTo scale + + + var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval; + var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval; // NOTE: Must in setExtent -> setInterval -> setNiceExtent order. + + intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1); + intervalScaleProto.setInterval.call(scale, interval); + + if (t0 || t1) { + intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval); + } + + if ("development" !== 'production') { + var ticks = intervalScaleProto.getTicks.call(scale); + + if (ticks[1] && (!isValueNice(interval) || getPrecisionSafe(ticks[1].value) > getPrecisionSafe(interval))) { + warn( // eslint-disable-next-line + "The ticks may be not readable when set min: " + axisModel.get('min') + ", max: " + axisModel.get('max') + " and alignTicks: true"); + } + } + } + + var Grid = + /** @class */ + function () { + function Grid(gridModel, ecModel, api) { + // FIXME:TS where used (different from registered type 'cartesian2d')? + this.type = 'grid'; + this._coordsMap = {}; + this._coordsList = []; + this._axesMap = {}; + this._axesList = []; + this.axisPointerEnabled = true; + this.dimensions = cartesian2DDimensions; + + this._initCartesian(gridModel, ecModel, api); + + this.model = gridModel; + } + + Grid.prototype.getRect = function () { + return this._rect; + }; + + Grid.prototype.update = function (ecModel, api) { + var axesMap = this._axesMap; + + this._updateScale(ecModel, this.model); + + function updateAxisTicks(axes) { + var alignTo; // Axis is added in order of axisIndex. + + var axesIndices = keys(axes); + var len = axesIndices.length; + + if (!len) { + return; + } + + var axisNeedsAlign = []; // Process once and calculate the ticks for those don't use alignTicks. + + for (var i = len - 1; i >= 0; i--) { + var idx = +axesIndices[i]; // Convert to number. + + var axis = axes[idx]; + var model = axis.model; + var scale = axis.scale; + + if ( // Only value and log axis without interval support alignTicks. + isIntervalOrLogScale(scale) && model.get('alignTicks') && model.get('interval') == null) { + axisNeedsAlign.push(axis); + } else { + niceScaleExtent(scale, model); + + if (isIntervalOrLogScale(scale)) { + // Can only align to interval or log axis. + alignTo = axis; + } + } + } + // PENDING. Should we find the axis that both set interval, min, max and align to this one? + + if (axisNeedsAlign.length) { + if (!alignTo) { + alignTo = axisNeedsAlign.pop(); + niceScaleExtent(alignTo.scale, alignTo.model); + } + + each(axisNeedsAlign, function (axis) { + alignScaleTicks(axis.scale, axis.model, alignTo.scale); + }); + } + } + + updateAxisTicks(axesMap.x); + updateAxisTicks(axesMap.y); // Key: axisDim_axisIndex, value: boolean, whether onZero target. + + var onZeroRecords = {}; + each(axesMap.x, function (xAxis) { + fixAxisOnZero(axesMap, 'y', xAxis, onZeroRecords); + }); + each(axesMap.y, function (yAxis) { + fixAxisOnZero(axesMap, 'x', yAxis, onZeroRecords); + }); // Resize again if containLabel is enabled + // FIXME It may cause getting wrong grid size in data processing stage + + this.resize(this.model, api); + }; + /** + * Resize the grid + */ + + + Grid.prototype.resize = function (gridModel, api, ignoreContainLabel) { + var boxLayoutParams = gridModel.getBoxLayoutParams(); + var isContainLabel = !ignoreContainLabel && gridModel.get('containLabel'); + var gridRect = getLayoutRect(boxLayoutParams, { + width: api.getWidth(), + height: api.getHeight() + }); + this._rect = gridRect; + var axesList = this._axesList; + adjustAxes(); // Minus label size + + if (isContainLabel) { + each(axesList, function (axis) { + if (!axis.model.get(['axisLabel', 'inside'])) { + var labelUnionRect = estimateLabelUnionRect(axis); + + if (labelUnionRect) { + var dim = axis.isHorizontal() ? 'height' : 'width'; + var margin = axis.model.get(['axisLabel', 'margin']); + gridRect[dim] -= labelUnionRect[dim] + margin; + + if (axis.position === 'top') { + gridRect.y += labelUnionRect.height + margin; + } else if (axis.position === 'left') { + gridRect.x += labelUnionRect.width + margin; + } + } + } + }); + adjustAxes(); + } + + each(this._coordsList, function (coord) { + // Calculate affine matrix to accelerate the data to point transform. + // If all the axes scales are time or value. + coord.calcAffineTransform(); + }); + + function adjustAxes() { + each(axesList, function (axis) { + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } + }; + + Grid.prototype.getAxis = function (dim, axisIndex) { + var axesMapOnDim = this._axesMap[dim]; + + if (axesMapOnDim != null) { + return axesMapOnDim[axisIndex || 0]; + } + }; + + Grid.prototype.getAxes = function () { + return this._axesList.slice(); + }; + + Grid.prototype.getCartesian = function (xAxisIndex, yAxisIndex) { + if (xAxisIndex != null && yAxisIndex != null) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + return this._coordsMap[key]; + } + + if (isObject(xAxisIndex)) { + yAxisIndex = xAxisIndex.yAxisIndex; + xAxisIndex = xAxisIndex.xAxisIndex; + } + + for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) { + if (coordList[i].getAxis('x').index === xAxisIndex || coordList[i].getAxis('y').index === yAxisIndex) { + return coordList[i]; + } + } + }; + + Grid.prototype.getCartesians = function () { + return this._coordsList.slice(); + }; + /** + * @implements + */ + + + Grid.prototype.convertToPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(finder); + + return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null; + }; + /** + * @implements + */ + + + Grid.prototype.convertFromPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(finder); + + return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null; + }; + + Grid.prototype._findConvertTarget = function (finder) { + var seriesModel = finder.seriesModel; + var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0]; + var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0]; + var gridModel = finder.gridModel; + var coordsList = this._coordsList; + var cartesian; + var axis; + + if (seriesModel) { + cartesian = seriesModel.coordinateSystem; + indexOf(coordsList, cartesian) < 0 && (cartesian = null); + } else if (xAxisModel && yAxisModel) { + cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + } else if (xAxisModel) { + axis = this.getAxis('x', xAxisModel.componentIndex); + } else if (yAxisModel) { + axis = this.getAxis('y', yAxisModel.componentIndex); + } // Lowest priority. + else if (gridModel) { + var grid = gridModel.coordinateSystem; + + if (grid === this) { + cartesian = this._coordsList[0]; + } + } + + return { + cartesian: cartesian, + axis: axis + }; + }; + /** + * @implements + */ + + + Grid.prototype.containPoint = function (point) { + var coord = this._coordsList[0]; + + if (coord) { + return coord.containPoint(point); + } + }; + /** + * Initialize cartesian coordinate systems + */ + + + Grid.prototype._initCartesian = function (gridModel, ecModel, api) { + var _this = this; + + var grid = this; + var axisPositionUsed = { + left: false, + right: false, + top: false, + bottom: false + }; + var axesMap = { + x: {}, + y: {} + }; + var axesCount = { + x: 0, + y: 0 + }; /// Create axis + + ecModel.eachComponent('xAxis', createAxisCreator('x'), this); + ecModel.eachComponent('yAxis', createAxisCreator('y'), this); + + if (!axesCount.x || !axesCount.y) { + // Roll back when there no either x or y axis + this._axesMap = {}; + this._axesList = []; + return; + } + + this._axesMap = axesMap; /// Create cartesian2d + + each(axesMap.x, function (xAxis, xAxisIndex) { + each(axesMap.y, function (yAxis, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + var cartesian = new Cartesian2D(key); + cartesian.master = _this; + cartesian.model = gridModel; + _this._coordsMap[key] = cartesian; + + _this._coordsList.push(cartesian); + + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }); + }); + + function createAxisCreator(dimName) { + return function (axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel)) { + return; + } + + var axisPosition = axisModel.get('position'); + + if (dimName === 'x') { + // Fix position + if (axisPosition !== 'top' && axisPosition !== 'bottom') { + // Default bottom of X + axisPosition = axisPositionUsed.bottom ? 'top' : 'bottom'; + } + } else { + // Fix position + if (axisPosition !== 'left' && axisPosition !== 'right') { + // Default left of Y + axisPosition = axisPositionUsed.left ? 'right' : 'left'; + } + } + + axisPositionUsed[axisPosition] = true; + var axis = new Axis2D(dimName, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisPosition); + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); // Inject axis into axisModel + + axisModel.axis = axis; // Inject axisModel into axis + + axis.model = axisModel; // Inject grid info axis + + axis.grid = grid; // Index of axis, can be used as key + + axis.index = idx; + + grid._axesList.push(axis); + + axesMap[dimName][idx] = axis; + axesCount[dimName]++; + }; + } + }; + /** + * Update cartesian properties from series. + */ + + + Grid.prototype._updateScale = function (ecModel, gridModel) { + // Reset scale + each(this._axesList, function (axis) { + axis.scale.setExtent(Infinity, -Infinity); + + if (axis.type === 'category') { + var categorySortInfo = axis.model.get('categorySortInfo'); + axis.scale.setSortInfo(categorySortInfo); + } + }); + ecModel.eachSeries(function (seriesModel) { + if (isCartesian2DSeries(seriesModel)) { + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + + if (!isAxisUsedInTheGrid(xAxisModel, gridModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel)) { + return; + } + + var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + unionExtent(data, xAxis); + unionExtent(data, yAxis); + } + }, this); + + function unionExtent(data, axis) { + each(getDataDimensionsOnAxis(data, axis.dim), function (dim) { + axis.scale.unionExtentFromData(data, dim); + }); + } + }; + /** + * @param dim 'x' or 'y' or 'auto' or null/undefined + */ + + + Grid.prototype.getTooltipAxes = function (dim) { + var baseAxes = []; + var otherAxes = []; + each(this.getCartesians(), function (cartesian) { + var baseAxis = dim != null && dim !== 'auto' ? cartesian.getAxis(dim) : cartesian.getBaseAxis(); + var otherAxis = cartesian.getOtherAxis(baseAxis); + indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis); + indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis); + }); + return { + baseAxes: baseAxes, + otherAxes: otherAxes + }; + }; + + Grid.create = function (ecModel, api) { + var grids = []; + ecModel.eachComponent('grid', function (gridModel, idx) { + var grid = new Grid(gridModel, ecModel, api); + grid.name = 'grid_' + idx; // dataSampling requires axis extent, so resize + // should be performed in create stage. + + grid.resize(gridModel, api, true); + gridModel.coordinateSystem = grid; + grids.push(grid); + }); // Inject the coordinateSystems into seriesModel + + ecModel.eachSeries(function (seriesModel) { + if (!isCartesian2DSeries(seriesModel)) { + return; + } + + var axesModelMap = findAxisModels(seriesModel); + var xAxisModel = axesModelMap.xAxisModel; + var yAxisModel = axesModelMap.yAxisModel; + var gridModel = xAxisModel.getCoordSysModel(); + + if ("development" !== 'production') { + if (!gridModel) { + throw new Error('Grid "' + retrieve3(xAxisModel.get('gridIndex'), xAxisModel.get('gridId'), 0) + '" not found'); + } + + if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) { + throw new Error('xAxis and yAxis must use the same grid'); + } + } + + var grid = gridModel.coordinateSystem; + seriesModel.coordinateSystem = grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + }); + return grids; + }; // For deciding which dimensions to use when creating list data + + + Grid.dimensions = cartesian2DDimensions; + return Grid; + }(); + + /** + * Check if the axis is used in the specified grid. + */ + + + function isAxisUsedInTheGrid(axisModel, gridModel) { + return axisModel.getCoordSysModel() === gridModel; + } + + function fixAxisOnZero(axesMap, otherAxisDim, axis, // Key: see `getOnZeroRecordKey` + onZeroRecords) { + axis.getAxesOnZeroOf = function () { + // TODO: onZero of multiple axes. + return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : []; + }; // onZero can not be enabled in these two situations: + // 1. When any other axis is a category axis. + // 2. When no axis is cross 0 point. + + + var otherAxes = axesMap[otherAxisDim]; + var otherAxisOnZeroOf; + var axisModel = axis.model; + var onZero = axisModel.get(['axisLine', 'onZero']); + var onZeroAxisIndex = axisModel.get(['axisLine', 'onZeroAxisIndex']); + + if (!onZero) { + return; + } // If target axis is specified. + + + if (onZeroAxisIndex != null) { + if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) { + otherAxisOnZeroOf = otherAxes[onZeroAxisIndex]; + } + } else { + // Find the first available other axis. + for (var idx in otherAxes) { + if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx]) // Consider that two Y axes on one value axis, + // if both onZero, the two Y axes overlap. + && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) { + otherAxisOnZeroOf = otherAxes[idx]; + break; + } + } + } + + if (otherAxisOnZeroOf) { + onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true; + } + + function getOnZeroRecordKey(axis) { + return axis.dim + '_' + axis.index; + } + } + + function canOnZeroToAxis(axis) { + return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis); + } + + function updateAxisTransform(axis, coordBase) { + var axisExtent = axis.getExtent(); + var axisExtentSum = axisExtent[0] + axisExtent[1]; // Fast transform + + axis.toGlobalCoord = axis.dim === 'x' ? function (coord) { + return coord + coordBase; + } : function (coord) { + return axisExtentSum - coord + coordBase; + }; + axis.toLocalCoord = axis.dim === 'x' ? function (coord) { + return coord - coordBase; + } : function (coord) { + return axisExtentSum - coord + coordBase; + }; + } + + var PI$5 = Math.PI; + /** + * A final axis is translated and rotated from a "standard axis". + * So opt.position and opt.rotation is required. + * + * A standard axis is and axis from [0, 0] to [0, axisExtent[1]], + * for example: (0, 0) ------------> (0, 50) + * + * nameDirection or tickDirection or labelDirection is 1 means tick + * or label is below the standard axis, whereas is -1 means above + * the standard axis. labelOffset means offset between label and axis, + * which is useful when 'onZero', where axisLabel is in the grid and + * label in outside grid. + * + * Tips: like always, + * positive rotation represents anticlockwise, and negative rotation + * represents clockwise. + * The direction of position coordinate is the same as the direction + * of screen coordinate. + * + * Do not need to consider axis 'inverse', which is auto processed by + * axis extent. + */ + + var AxisBuilder = + /** @class */ + function () { + function AxisBuilder(axisModel, opt) { + this.group = new Group(); + this.opt = opt; + this.axisModel = axisModel; // Default value + + defaults(opt, { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true, + handleAutoShown: function () { + return true; + } + }); // FIXME Not use a seperate text group? + + var transformGroup = new Group({ + x: opt.position[0], + y: opt.position[1], + rotation: opt.rotation + }); // this.group.add(transformGroup); + // this._transformGroup = transformGroup; + + transformGroup.updateTransform(); + this._transformGroup = transformGroup; + } + + AxisBuilder.prototype.hasBuilder = function (name) { + return !!builders[name]; + }; + + AxisBuilder.prototype.add = function (name) { + builders[name](this.opt, this.axisModel, this.group, this._transformGroup); + }; + + AxisBuilder.prototype.getGroup = function () { + return this.group; + }; + + AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) { + var rotationDiff = remRadian(textRotation - axisRotation); + var textAlign; + var textVerticalAlign; + + if (isRadianAroundZero(rotationDiff)) { + // Label is parallel with axis line. + textVerticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI$5)) { + // Label is inverse parallel with axis line. + textVerticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + + if (rotationDiff > 0 && rotationDiff < PI$5) { + textAlign = direction > 0 ? 'right' : 'left'; + } else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + }; + + AxisBuilder.makeAxisEventDataBase = function (axisModel) { + var eventData = { + componentType: axisModel.mainType, + componentIndex: axisModel.componentIndex + }; + eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex; + return eventData; + }; + + AxisBuilder.isLabelSilent = function (axisModel) { + var tooltipOpt = axisModel.get('tooltip'); + return axisModel.get('silent') // Consider mouse cursor, add these restrictions. + || !(axisModel.get('triggerEvent') || tooltipOpt && tooltipOpt.show); + }; + + return AxisBuilder; + }(); + var builders = { + axisLine: function (opt, axisModel, group, transformGroup) { + var shown = axisModel.get(['axisLine', 'show']); + + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisLine'); + } + + if (!shown) { + return; + } + + var extent = axisModel.axis.getExtent(); + var matrix = transformGroup.transform; + var pt1 = [extent[0], 0]; + var pt2 = [extent[1], 0]; + + if (matrix) { + applyTransform(pt1, pt1, matrix); + applyTransform(pt2, pt2, matrix); + } + + var lineStyle = extend({ + lineCap: 'round' + }, axisModel.getModel(['axisLine', 'lineStyle']).getLineStyle()); + var line = new Line({ + // Id for animation + subPixelOptimize: true, + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: lineStyle, + strokeContainThreshold: opt.strokeContainThreshold || 5, + silent: true, + z2: 1 + }); + line.anid = 'line'; + group.add(line); + var arrows = axisModel.get(['axisLine', 'symbol']); + + if (arrows != null) { + var arrowSize = axisModel.get(['axisLine', 'symbolSize']); + + if (isString(arrows)) { + // Use the same arrow for start and end point + arrows = [arrows, arrows]; + } + + if (isString(arrowSize) || isNumber(arrowSize)) { + // Use the same size for width and height + arrowSize = [arrowSize, arrowSize]; + } + + var arrowOffset = normalizeSymbolOffset(axisModel.get(['axisLine', 'symbolOffset']) || 0, arrowSize); + var symbolWidth_1 = arrowSize[0]; + var symbolHeight_1 = arrowSize[1]; + each([{ + rotate: opt.rotation + Math.PI / 2, + offset: arrowOffset[0], + r: 0 + }, { + rotate: opt.rotation - Math.PI / 2, + offset: arrowOffset[1], + r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1])) + }], function (point, index) { + if (arrows[index] !== 'none' && arrows[index] != null) { + var symbol = createSymbol(arrows[index], -symbolWidth_1 / 2, -symbolHeight_1 / 2, symbolWidth_1, symbolHeight_1, lineStyle.stroke, true); // Calculate arrow position with offset + + var r = point.r + point.offset; + symbol.attr({ + rotation: point.rotate, + x: pt1[0] + r * Math.cos(opt.rotation), + y: pt1[1] - r * Math.sin(opt.rotation), + silent: true, + z2: 11 + }); + group.add(symbol); + } + }); + } + }, + axisTickLabel: function (opt, axisModel, group, transformGroup) { + var ticksEls = buildAxisMajorTicks(group, transformGroup, axisModel, opt); + var labelEls = buildAxisLabel(group, transformGroup, axisModel, opt); + fixMinMaxLabelShow(axisModel, labelEls, ticksEls); + buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); // This bit fixes the label overlap issue for the time chart. + // See https://github.com/apache/echarts/issues/14266 for more. + + if (axisModel.get(['axisLabel', 'hideOverlap'])) { + var labelList = prepareLayoutList(map(labelEls, function (label) { + return { + label: label, + priority: label.z2, + defaultAttr: { + ignore: label.ignore + } + }; + })); + hideOverlap(labelList); + } + }, + axisName: function (opt, axisModel, group, transformGroup) { + var name = retrieve(opt.axisName, axisModel.get('name')); + + if (!name) { + return; + } + + var nameLocation = axisModel.get('nameLocation'); + var nameDirection = opt.nameDirection; + var textStyleModel = axisModel.getModel('nameTextStyle'); + var gap = axisModel.get('nameGap') || 0; + var extent = axisModel.axis.getExtent(); + var gapSignal = extent[0] > extent[1] ? -1 : 1; + var pos = [nameLocation === 'start' ? extent[0] - gapSignal * gap : nameLocation === 'end' ? extent[1] + gapSignal * gap : (extent[0] + extent[1]) / 2, // Reuse labelOffset. + isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0]; + var labelLayout; + var nameRotation = axisModel.get('nameRotate'); + + if (nameRotation != null) { + nameRotation = nameRotation * PI$5 / 180; // To radian. + } + + var axisNameAvailableWidth; + + if (isNameLocationCenter(nameLocation)) { + labelLayout = AxisBuilder.innerTextLayout(opt.rotation, nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis. + nameDirection); + } else { + labelLayout = endTextLayout(opt.rotation, nameLocation, nameRotation || 0, extent); + axisNameAvailableWidth = opt.axisNameAvailableWidth; + + if (axisNameAvailableWidth != null) { + axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout.rotation)); + !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null); + } + } + + var textFont = textStyleModel.getFont(); + var truncateOpt = axisModel.get('nameTruncate', true) || {}; + var ellipsis = truncateOpt.ellipsis; + var maxWidth = retrieve(opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth); + var textEl = new ZRText({ + x: pos[0], + y: pos[1], + rotation: labelLayout.rotation, + silent: AxisBuilder.isLabelSilent(axisModel), + style: createTextStyle(textStyleModel, { + text: name, + font: textFont, + overflow: 'truncate', + width: maxWidth, + ellipsis: ellipsis, + fill: textStyleModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']), + align: textStyleModel.get('align') || labelLayout.textAlign, + verticalAlign: textStyleModel.get('verticalAlign') || labelLayout.textVerticalAlign + }), + z2: 1 + }); + setTooltipConfig({ + el: textEl, + componentModel: axisModel, + itemName: name + }); + textEl.__fullText = name; // Id for animation + + textEl.anid = 'name'; + + if (axisModel.get('triggerEvent')) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisName'; + eventData.name = name; + getECData(textEl).eventData = eventData; + } // FIXME + + + transformGroup.add(textEl); + textEl.updateTransform(); + group.add(textEl); + textEl.decomposeTransform(); + } + }; + + function endTextLayout(rotation, textPosition, textRotate, extent) { + var rotationDiff = remRadian(textRotate - rotation); + var textAlign; + var textVerticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = textPosition === 'start' && !inverse || textPosition !== 'start' && inverse; + + if (isRadianAroundZero(rotationDiff - PI$5 / 2)) { + textVerticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } else if (isRadianAroundZero(rotationDiff - PI$5 * 1.5)) { + textVerticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } else { + textVerticalAlign = 'middle'; + + if (rotationDiff < PI$5 * 1.5 && rotationDiff > PI$5 / 2) { + textAlign = onLeft ? 'left' : 'right'; + } else { + textAlign = onLeft ? 'right' : 'left'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; + } + + function fixMinMaxLabelShow(axisModel, labelEls, tickEls) { + if (shouldShowAllLabels(axisModel.axis)) { + return; + } // If min or max are user set, we need to check + // If the tick on min(max) are overlap on their neighbour tick + // If they are overlapped, we need to hide the min(max) tick label + + + var showMinLabel = axisModel.get(['axisLabel', 'showMinLabel']); + var showMaxLabel = axisModel.get(['axisLabel', 'showMaxLabel']); // FIXME + // Have not consider onBand yet, where tick els is more than label els. + + labelEls = labelEls || []; + tickEls = tickEls || []; + var firstLabel = labelEls[0]; + var nextLabel = labelEls[1]; + var lastLabel = labelEls[labelEls.length - 1]; + var prevLabel = labelEls[labelEls.length - 2]; + var firstTick = tickEls[0]; + var nextTick = tickEls[1]; + var lastTick = tickEls[tickEls.length - 1]; + var prevTick = tickEls[tickEls.length - 2]; + + if (showMinLabel === false) { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } else if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + if (showMinLabel) { + ignoreEl(nextLabel); + ignoreEl(nextTick); + } else { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } + } + + if (showMaxLabel === false) { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } else if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + if (showMaxLabel) { + ignoreEl(prevLabel); + ignoreEl(prevTick); + } else { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } + } + } + + function ignoreEl(el) { + el && (el.ignore = true); + } + + function isTwoLabelOverlapped(current, next) { + // current and next has the same rotation. + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + + if (!firstRect || !nextRect) { + return; + } // When checking intersect of two rotated labels, we use mRotationBack + // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`. + + + var mRotationBack = identity([]); + rotate(mRotationBack, mRotationBack, -current.rotation); + firstRect.applyTransform(mul$1([], mRotationBack, current.getLocalTransform())); + nextRect.applyTransform(mul$1([], mRotationBack, next.getLocalTransform())); + return firstRect.intersect(nextRect); + } + + function isNameLocationCenter(nameLocation) { + return nameLocation === 'middle' || nameLocation === 'center'; + } + + function createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, anidPrefix) { + var tickEls = []; + var pt1 = []; + var pt2 = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = ticksCoords[i].coord; + pt1[0] = tickCoord; + pt1[1] = 0; + pt2[0] = tickCoord; + pt2[1] = tickEndCoord; + + if (tickTransform) { + applyTransform(pt1, pt1, tickTransform); + applyTransform(pt2, pt2, tickTransform); + } // Tick line, Not use group transform to have better line draw + + + var tickEl = new Line({ + subPixelOptimize: true, + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: tickLineStyle, + z2: 2, + autoBatch: true, + silent: true + }); + tickEl.anid = anidPrefix + '_' + ticksCoords[i].tickValue; + tickEls.push(tickEl); + } + + return tickEls; + } + + function buildAxisMajorTicks(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var tickModel = axisModel.getModel('axisTick'); + var shown = tickModel.get('show'); + + if (shown === 'auto' && opt.handleAutoShown) { + shown = opt.handleAutoShown('axisTick'); + } + + if (!shown || axis.scale.isBlank()) { + return; + } + + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickEndCoord = opt.tickDirection * tickModel.get('length'); + var ticksCoords = axis.getTicksCoords(); + var ticksEls = createTicks(ticksCoords, transformGroup.transform, tickEndCoord, defaults(lineStyleModel.getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + }), 'ticks'); + + for (var i = 0; i < ticksEls.length; i++) { + group.add(ticksEls[i]); + } + + return ticksEls; + } + + function buildAxisMinorTicks(group, transformGroup, axisModel, tickDirection) { + var axis = axisModel.axis; + var minorTickModel = axisModel.getModel('minorTick'); + + if (!minorTickModel.get('show') || axis.scale.isBlank()) { + return; + } + + var minorTicksCoords = axis.getMinorTicksCoords(); + + if (!minorTicksCoords.length) { + return; + } + + var lineStyleModel = minorTickModel.getModel('lineStyle'); + var tickEndCoord = tickDirection * minorTickModel.get('length'); + var minorTickLineStyle = defaults(lineStyleModel.getLineStyle(), defaults(axisModel.getModel('axisTick').getLineStyle(), { + stroke: axisModel.get(['axisLine', 'lineStyle', 'color']) + })); + + for (var i = 0; i < minorTicksCoords.length; i++) { + var minorTicksEls = createTicks(minorTicksCoords[i], transformGroup.transform, tickEndCoord, minorTickLineStyle, 'minorticks_' + i); + + for (var k = 0; k < minorTicksEls.length; k++) { + group.add(minorTicksEls[k]); + } + } + } + + function buildAxisLabel(group, transformGroup, axisModel, opt) { + var axis = axisModel.axis; + var show = retrieve(opt.axisLabelShow, axisModel.get(['axisLabel', 'show'])); + + if (!show || axis.scale.isBlank()) { + return; + } + + var labelModel = axisModel.getModel('axisLabel'); + var labelMargin = labelModel.get('margin'); + var labels = axis.getViewLabels(); // Special label rotate. + + var labelRotation = (retrieve(opt.labelRotate, labelModel.get('rotate')) || 0) * PI$5 / 180; + var labelLayout = AxisBuilder.innerTextLayout(opt.rotation, labelRotation, opt.labelDirection); + var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true); + var labelEls = []; + var silent = AxisBuilder.isLabelSilent(axisModel); + var triggerEvent = axisModel.get('triggerEvent'); + each(labels, function (labelItem, index) { + var tickValue = axis.scale.type === 'ordinal' ? axis.scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + var formattedLabel = labelItem.formattedLabel; + var rawLabel = labelItem.rawLabel; + var itemLabelModel = labelModel; + + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + + if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) { + itemLabelModel = new Model(rawCategoryItem.textStyle, labelModel, axisModel.ecModel); + } + } + + var textColor = itemLabelModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']); + var tickCoord = axis.dataToCoord(tickValue); + var textEl = new ZRText({ + x: tickCoord, + y: opt.labelOffset + opt.labelDirection * labelMargin, + rotation: labelLayout.rotation, + silent: silent, + z2: 10 + (labelItem.level || 0), + style: createTextStyle(itemLabelModel, { + text: formattedLabel, + align: itemLabelModel.getShallow('align', true) || labelLayout.textAlign, + verticalAlign: itemLabelModel.getShallow('verticalAlign', true) || itemLabelModel.getShallow('baseline', true) || labelLayout.textVerticalAlign, + fill: isFunction(textColor) ? textColor( // (1) In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + // (2) Compatible with previous version, which always use formatted label as + // input. But in interval scale the formatted label is like '223,445', which + // maked user repalce ','. So we modify it to return original val but remain + // it as 'string' to avoid error in replacing. + axis.type === 'category' ? rawLabel : axis.type === 'value' ? tickValue + '' : tickValue, index) : textColor + }) + }); + textEl.anid = 'label_' + tickValue; // Pack data for mouse event + + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(axisModel); + eventData.targetType = 'axisLabel'; + eventData.value = rawLabel; + eventData.tickIndex = index; + + if (axis.type === 'category') { + eventData.dataIndex = tickValue; + } + + getECData(textEl).eventData = eventData; + } // FIXME + + + transformGroup.add(textEl); + textEl.updateTransform(); + labelEls.push(textEl); + group.add(textEl); + textEl.decomposeTransform(); + }); + return labelEls; + } + + // allAxesInfo should be updated when setOption performed. + + function collect(ecModel, api) { + var result = { + /** + * key: makeKey(axis.model) + * value: { + * axis, + * coordSys, + * axisPointerModel, + * triggerTooltip, + * involveSeries, + * snap, + * seriesModels, + * seriesDataCount + * } + */ + axesInfo: {}, + seriesInvolved: false, + + /** + * key: makeKey(coordSys.model) + * value: Object: key makeKey(axis.model), value: axisInfo + */ + coordSysAxesInfo: {}, + coordSysMap: {} + }; + collectAxesInfo(result, ecModel, api); // Check seriesInvolved for performance, in case too many series in some chart. + + result.seriesInvolved && collectSeriesInfo(result, ecModel); + return result; + } + + function collectAxesInfo(result, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var globalAxisPointerModel = ecModel.getComponent('axisPointer'); // links can only be set on global. + + var linksOption = globalAxisPointerModel.get('link', true) || []; + var linkGroups = []; // Collect axes info. + + each(api.getCoordinateSystems(), function (coordSys) { + // Some coordinate system do not support axes, like geo. + if (!coordSys.axisPointerEnabled) { + return; + } + + var coordSysKey = makeKey(coordSys.model); + var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; + result.coordSysMap[coordSysKey] = coordSys; // Set tooltip (like 'cross') is a convienent way to show axisPointer + // for user. So we enable seting tooltip on coordSys model. + + var coordSysModel = coordSys.model; + var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel); + each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null)); // If axis tooltip used, choose tooltip axis for each coordSys. + // Notice this case: coordSys is `grid` but not `cartesian2D` here. + + if (coordSys.getTooltipAxes && globalTooltipModel // If tooltip.showContent is set as false, tooltip will not + // show but axisPointer will show as normal. + && baseTooltipModel.get('show')) { + // Compatible with previous logic. But series.tooltip.trigger: 'axis' + // or series.data[n].tooltip.trigger: 'axis' are not support any more. + var triggerAxis = baseTooltipModel.get('trigger') === 'axis'; + var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross'; + var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis'])); + + if (triggerAxis || cross) { + each(tooltipAxes.baseAxes, curry(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis)); + } + + if (cross) { + each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false)); + } + } // fromTooltip: true | false | 'cross' + // triggerTooltip: true | false | null + + + function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { + var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel); + var axisPointerShow = axisPointerModel.get('show'); + + if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) { + return; + } + + if (triggerTooltip == null) { + triggerTooltip = axisPointerModel.get('triggerTooltip'); + } + + axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel; + var snap = axisPointerModel.get('snap'); + var axisKey = makeKey(axis.model); + var involveSeries = triggerTooltip || snap || axis.type === 'category'; // If result.axesInfo[key] exist, override it (tooltip has higher priority). + + var axisInfo = result.axesInfo[axisKey] = { + key: axisKey, + axis: axis, + coordSys: coordSys, + axisPointerModel: axisPointerModel, + triggerTooltip: triggerTooltip, + involveSeries: involveSeries, + snap: snap, + useHandle: isHandleTrigger(axisPointerModel), + seriesModels: [], + linkGroup: null + }; + axesInfoInCoordSys[axisKey] = axisInfo; + result.seriesInvolved = result.seriesInvolved || involveSeries; + var groupIndex = getLinkGroupIndex(linksOption, axis); + + if (groupIndex != null) { + var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = { + axesInfo: {} + }); + linkGroup.axesInfo[axisKey] = axisInfo; + linkGroup.mapper = linksOption[groupIndex].mapper; + axisInfo.linkGroup = linkGroup; + } + } + }); + } + + function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) { + var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer'); + var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z']; + var volatileOption = {}; + each(fields, function (field) { + volatileOption[field] = clone(tooltipAxisPointerModel.get(field)); + }); // category axis do not auto snap, otherwise some tick that do not + // has value can not be hovered. value/time/log axis default snap if + // triggered from tooltip and trigger tooltip. + + volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; // Compatibel with previous behavior, tooltip axis do not show label by default. + // Only these properties can be overrided from tooltip to axisPointer. + + if (tooltipAxisPointerModel.get('type') === 'cross') { + volatileOption.type = 'line'; + } + + var labelOption = volatileOption.label || (volatileOption.label = {}); // Follow the convention, do not show label when triggered by tooltip by default. + + labelOption.show == null && (labelOption.show = false); + + if (fromTooltip === 'cross') { + // When 'cross', both axes show labels. + var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']); + labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; // If triggerTooltip, this is a base axis, which should better not use cross style + // (cross style is dashed by default) + + if (!triggerTooltip) { + var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle'); + crossStyle && defaults(labelOption, crossStyle.textStyle); + } + } + + return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel)); + } + + function collectSeriesInfo(result, ecModel) { + // Prepare data for axis trigger + ecModel.eachSeries(function (seriesModel) { + // Notice this case: this coordSys is `cartesian2D` but not `grid`. + var coordSys = seriesModel.coordinateSystem; + var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true); + var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true); + + if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) { + return; + } + + each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) { + var axis = axisInfo.axis; + + if (coordSys.getAxis(axis.dim) === axis) { + axisInfo.seriesModels.push(seriesModel); + axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); + axisInfo.seriesDataCount += seriesModel.getData().count(); + } + }); + }); + } + + /** + * For example: + * { + * axisPointer: { + * links: [{ + * xAxisIndex: [2, 4], + * yAxisIndex: 'all' + * }, { + * xAxisId: ['a5', 'a7'], + * xAxisName: 'xxx' + * }] + * } + * } + */ + + + function getLinkGroupIndex(linksOption, axis) { + var axisModel = axis.model; + var dim = axis.dim; + + for (var i = 0; i < linksOption.length; i++) { + var linkOption = linksOption[i] || {}; + + if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) { + return i; + } + } + } + + function checkPropInLink(linkPropValue, axisPropValue) { + return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue; + } + + function fixValue(axisModel) { + var axisInfo = getAxisInfo(axisModel); + + if (!axisInfo) { + return; + } + + var axisPointerModel = axisInfo.axisPointerModel; + var scale = axisInfo.axis.scale; + var option = axisPointerModel.option; + var status = axisPointerModel.get('status'); + var value = axisPointerModel.get('value'); // Parse init value for category and time axis. + + if (value != null) { + value = scale.parse(value); + } + + var useHandle = isHandleTrigger(axisPointerModel); // If `handle` used, `axisPointer` will always be displayed, so value + // and status should be initialized. + + if (status == null) { + option.status = useHandle ? 'show' : 'hide'; + } + + var extent = scale.getExtent().slice(); + extent[0] > extent[1] && extent.reverse(); + + if ( // Pick a value on axis when initializing. + value == null // If both `handle` and `dataZoom` are used, value may be out of axis extent, + // where we should re-pick a value to keep `handle` displaying normally. + || value > extent[1]) { + // Make handle displayed on the end of the axis when init, which looks better. + value = extent[1]; + } + + if (value < extent[0]) { + value = extent[0]; + } + + option.value = value; + + if (useHandle) { + option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show'; + } + } + + function getAxisInfo(axisModel) { + var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo; + return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; + } + + function getAxisPointerModel(axisModel) { + var axisInfo = getAxisInfo(axisModel); + return axisInfo && axisInfo.axisPointerModel; + } + + function isHandleTrigger(axisPointerModel) { + return !!axisPointerModel.get(['handle', 'show']); + } + + /** + * @param {module:echarts/model/Model} model + * @return {string} unique key + */ + + + function makeKey(model) { + return model.type + '||' + model.id; + } + + var axisPointerClazz = {}; + /** + * Base class of AxisView. + */ + + var AxisView = + /** @class */ + function (_super) { + __extends(AxisView, _super); + + function AxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisView.type; + return _this; + } + + /** + * @override + */ + + + AxisView.prototype.render = function (axisModel, ecModel, api, payload) { + // FIXME + // This process should proformed after coordinate systems updated + // (axis scale updated), and should be performed each time update. + // So put it here temporarily, although it is not appropriate to + // put a model-writing procedure in `view`. + this.axisPointerClass && fixValue(axisModel); + + _super.prototype.render.apply(this, arguments); + + this._doUpdateAxisPointerClass(axisModel, api, true); + }; + /** + * Action handler. + */ + + + AxisView.prototype.updateAxisPointer = function (axisModel, ecModel, api, payload) { + this._doUpdateAxisPointerClass(axisModel, api, false); + }; + /** + * @override + */ + + + AxisView.prototype.remove = function (ecModel, api) { + var axisPointer = this._axisPointer; + axisPointer && axisPointer.remove(api); + }; + /** + * @override + */ + + + AxisView.prototype.dispose = function (ecModel, api) { + this._disposeAxisPointer(api); + + _super.prototype.dispose.apply(this, arguments); + }; + + AxisView.prototype._doUpdateAxisPointerClass = function (axisModel, api, forceRender) { + var Clazz = AxisView.getAxisPointerClass(this.axisPointerClass); + + if (!Clazz) { + return; + } + + var axisPointerModel = getAxisPointerModel(axisModel); + axisPointerModel ? (this._axisPointer || (this._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : this._disposeAxisPointer(api); + }; + + AxisView.prototype._disposeAxisPointer = function (api) { + this._axisPointer && this._axisPointer.dispose(api); + this._axisPointer = null; + }; + + AxisView.registerAxisPointerClass = function (type, clazz) { + if ("development" !== 'production') { + if (axisPointerClazz[type]) { + throw new Error('axisPointer ' + type + ' exists'); + } + } + + axisPointerClazz[type] = clazz; + }; + + AxisView.getAxisPointerClass = function (type) { + return type && axisPointerClazz[type]; + }; + AxisView.type = 'axis'; + return AxisView; + }(ComponentView); + + var inner$6 = makeInner(); + + function rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } // TODO: TYPE + + + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var gridRect = gridModel.coordinateSystem.getRect(); + var ticksCoords = axis.getTicksCoords({ + tickModel: splitAreaModel, + clamp: true + }); + + if (!ticksCoords.length) { + return; + } // For Making appropriate splitArea animation, the color and anid + // should be corresponding to previous one if possible. + + + var areaColorsLen = areaColors.length; + var lastSplitAreaColors = inner$6(axisView).splitAreaColors; + var newSplitAreaColors = createHashMap(); + var colorIndex = 0; + + if (lastSplitAreaColors) { + for (var i = 0; i < ticksCoords.length; i++) { + var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue); + + if (cIndex != null) { + colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen; + break; + } + } + } + + var prev = axis.toGlobalCoord(ticksCoords[0].coord); + var areaStyle = areaStyleModel.getAreaStyle(); + areaColors = isArray(areaColors) ? areaColors : [areaColors]; + + for (var i = 1; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + var x = void 0; + var y = void 0; + var width = void 0; + var height = void 0; + + if (axis.isHorizontal()) { + x = prev; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + prev = x + width; + } else { + x = gridRect.x; + y = prev; + width = gridRect.width; + height = tickCoord - y; + prev = y + height; + } + + var tickValue = ticksCoords[i - 1].tickValue; + tickValue != null && newSplitAreaColors.set(tickValue, colorIndex); + axisGroup.add(new Rect({ + anid: tickValue != null ? 'area_' + tickValue : null, + shape: { + x: x, + y: y, + width: width, + height: height + }, + style: defaults({ + fill: areaColors[colorIndex] + }, areaStyle), + autoBatch: true, + silent: true + })); + colorIndex = (colorIndex + 1) % areaColorsLen; + } + + inner$6(axisView).splitAreaColors = newSplitAreaColors; + } + + function rectCoordAxisHandleRemove(axisView) { + inner$6(axisView).splitAreaColors = null; + } + + var axisBuilderAttrs = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs = ['splitArea', 'splitLine', 'minorSplitLine']; + + var CartesianAxisView = + /** @class */ + function (_super) { + __extends(CartesianAxisView, _super); + + function CartesianAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianAxisView.type; + _this.axisPointerClass = 'CartesianAxisPointer'; + return _this; + } + + /** + * @override + */ + + + CartesianAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var gridModel = axisModel.getCoordSysModel(); + var layout = layout$1(gridModel, axisModel); + var axisBuilder = new AxisBuilder(axisModel, extend({ + handleAutoShown: function (elementType) { + var cartesians = gridModel.coordinateSystem.getCartesians(); + + for (var i = 0; i < cartesians.length; i++) { + if (isIntervalOrLogScale(cartesians[i].getOtherAxis(axisModel.axis).scale)) { + // Still show axis tick or axisLine if other axis is value / log + return true; + } + } // Not show axisTick or axisLine if other axis is category / time + + + return false; + } + }, layout)); + each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + each(selfBuilderAttrs, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders[name](this, this._axisGroup, axisModel, gridModel); + } + }, this); // THIS is a special case for bar racing chart. + // Update the axis label from the natural initial layout to + // sorted layout should has no animation. + + var isInitialSortFromBarRacing = payload && payload.type === 'changeAxisOrder' && payload.isInitSort; + + if (!isInitialSortFromBarRacing) { + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + } + + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + + CartesianAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + + CartesianAxisView.type = 'cartesianAxis'; + return CartesianAxisView; + }(AxisView); + + var axisElementBuilders = { + splitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + lineColors = isArray(lineColors) ? lineColors : [lineColors]; + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = lineCount++ % lineColors.length; + var tickValue = ticksCoords[i].tickValue; + axisGroup.add(new Line({ + anid: tickValue != null ? 'line_' + ticksCoords[i].tickValue : null, + subPixelOptimize: true, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: defaults({ + stroke: lineColors[colorIndex] + }, lineStyle), + silent: true + })); + } + }, + minorSplitLine: function (axisView, axisGroup, axisModel, gridModel) { + var axis = axisModel.axis; + var minorSplitLineModel = axisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var minorTicksCoords = axis.getMinorTicksCoords(); + + if (!minorTicksCoords.length) { + return; + } + + var p1 = []; + var p2 = []; + var lineStyle = lineStyleModel.getLineStyle(); + + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + axisGroup.add(new Line({ + anid: 'minor_line_' + minorTicksCoords[i][k].tickValue, + subPixelOptimize: true, + autoBatch: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: lineStyle, + silent: true + })); + } + } + }, + splitArea: function (axisView, axisGroup, axisModel, gridModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel); + } + }; + + var CartesianXAxisView = + /** @class */ + function (_super) { + __extends(CartesianXAxisView, _super); + + function CartesianXAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianXAxisView.type; + return _this; + } + + CartesianXAxisView.type = 'xAxis'; + return CartesianXAxisView; + }(CartesianAxisView); + + var CartesianYAxisView = + /** @class */ + function (_super) { + __extends(CartesianYAxisView, _super); + + function CartesianYAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CartesianXAxisView.type; + return _this; + } + + CartesianYAxisView.type = 'yAxis'; + return CartesianYAxisView; + }(CartesianAxisView); + + var GridView = + /** @class */ + function (_super) { + __extends(GridView, _super); + + function GridView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'grid'; + return _this; + } + + GridView.prototype.render = function (gridModel, ecModel) { + this.group.removeAll(); + + if (gridModel.get('show')) { + this.group.add(new Rect({ + shape: gridModel.coordinateSystem.getRect(), + style: defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true, + z2: -1 + })); + } + }; + + GridView.type = 'grid'; + return GridView; + }(ComponentView); + + var extraOption = { + // gridIndex: 0, + // gridId: '', + offset: 0 + }; + + function install$5(registers) { + registers.registerComponentView(GridView); + registers.registerComponentModel(GridModel); + registers.registerCoordinateSystem('cartesian2d', Grid); + axisModelCreator(registers, 'x', CartesianAxisModel, extraOption); + axisModelCreator(registers, 'y', CartesianAxisModel, extraOption); + registers.registerComponentView(CartesianXAxisView); + registers.registerComponentView(CartesianYAxisView); + registers.registerPreprocessor(function (option) { + // Only create grid when need + if (option.xAxis && option.yAxis && !option.grid) { + option.grid = {}; + } + }); + } + + function install$6(registers) { + // In case developer forget to include grid component + use(install$5); + registers.registerSeriesModel(ScatterSeriesModel); + registers.registerChartView(ScatterView); + registers.registerLayout(pointsLayout('scatter')); + } + + function radarLayout(ecModel) { + ecModel.eachSeriesByType('radar', function (seriesModel) { + var data = seriesModel.getData(); + var points = []; + var coordSys = seriesModel.coordinateSystem; + + if (!coordSys) { + return; + } + + var axes = coordSys.getIndicatorAxes(); + each(axes, function (axis, axisIndex) { + data.each(data.mapDimension(axes[axisIndex].dim), function (val, dataIndex) { + points[dataIndex] = points[dataIndex] || []; + var point = coordSys.dataToPoint(val, axisIndex); + points[dataIndex][axisIndex] = isValidPoint(point) ? point : getValueMissingPoint(coordSys); + }); + }); // Close polygon + + data.each(function (idx) { + // TODO + // Is it appropriate to connect to the next data when some data is missing? + // Or, should trade it like `connectNull` in line chart? + var firstPoint = find(points[idx], function (point) { + return isValidPoint(point); + }) || getValueMissingPoint(coordSys); // Copy the first actual point to the end of the array + + points[idx].push(firstPoint.slice()); + data.setItemLayout(idx, points[idx]); + }); + }); + } + + function isValidPoint(point) { + return !isNaN(point[0]) && !isNaN(point[1]); + } + + function getValueMissingPoint(coordSys) { + // It is error-prone to input [NaN, NaN] into polygon, polygon. + // (probably cause problem when refreshing or animating) + return [coordSys.cx, coordSys.cy]; + } + + function radarBackwardCompat(option) { + var polarOptArr = option.polar; + + if (polarOptArr) { + if (!isArray(polarOptArr)) { + polarOptArr = [polarOptArr]; + } + + var polarNotRadar_1 = []; + each(polarOptArr, function (polarOpt, idx) { + if (polarOpt.indicator) { + if (polarOpt.type && !polarOpt.shape) { + polarOpt.shape = polarOpt.type; + } + + option.radar = option.radar || []; + + if (!isArray(option.radar)) { + option.radar = [option.radar]; + } + + option.radar.push(polarOpt); + } else { + polarNotRadar_1.push(polarOpt); + } + }); + option.polar = polarNotRadar_1; + } + + each(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'radar' && seriesOpt.polarIndex) { + seriesOpt.radarIndex = seriesOpt.polarIndex; + } + }); + } + + var RadarView = + /** @class */ + function (_super) { + __extends(RadarView, _super); + + function RadarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarView.type; + return _this; + } + + RadarView.prototype.render = function (seriesModel, ecModel, api) { + var polar = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + function createSymbol$1(data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + + if (symbolType === 'none') { + return; + } + + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + var symbolPath = createSymbol(symbolType, -1, -1, 2, 2); + var symbolRotate = data.getItemVisual(idx, 'symbolRotate') || 0; + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + scaleX: symbolSize[0] / 2, + scaleY: symbolSize[1] / 2, + rotation: symbolRotate * Math.PI / 180 || 0 + }); + return symbolPath; + } + + function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) { + // Simply rerender all + symbolGroup.removeAll(); + + for (var i = 0; i < newPoints.length - 1; i++) { + var symbolPath = createSymbol$1(data, idx); + + if (symbolPath) { + symbolPath.__dimIdx = i; + + if (oldPoints[i]) { + symbolPath.setPosition(oldPoints[i]); + graphic[isInit ? 'initProps' : 'updateProps'](symbolPath, { + x: newPoints[i][0], + y: newPoints[i][1] + }, seriesModel, idx); + } else { + symbolPath.setPosition(newPoints[i]); + } + + symbolGroup.add(symbolPath); + } + } + } + + function getInitialPoints(points) { + return map(points, function (pt) { + return [polar.cx, polar.cy]; + }); + } + + data.diff(oldData).add(function (idx) { + var points = data.getItemLayout(idx); + + if (!points) { + return; + } + + var polygon = new Polygon(); + var polyline = new Polyline(); + var target = { + shape: { + points: points + } + }; + polygon.shape.points = getInitialPoints(points); + polyline.shape.points = getInitialPoints(points); + initProps(polygon, target, seriesModel, idx); + initProps(polyline, target, seriesModel, idx); + var itemGroup = new Group(); + var symbolGroup = new Group(); + itemGroup.add(polyline); + itemGroup.add(polygon); + itemGroup.add(symbolGroup); + updateSymbols(polyline.shape.points, points, symbolGroup, data, idx, true); + data.setItemGraphicEl(idx, itemGroup); + }).update(function (newIdx, oldIdx) { + var itemGroup = oldData.getItemGraphicEl(oldIdx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); + var target = { + shape: { + points: data.getItemLayout(newIdx) + } + }; + + if (!target.shape.points) { + return; + } + + updateSymbols(polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false); + saveOldStyle(polygon); + saveOldStyle(polyline); + updateProps(polyline, target, seriesModel); + updateProps(polygon, target, seriesModel); + data.setItemGraphicEl(newIdx, itemGroup); + }).remove(function (idx) { + group.remove(oldData.getItemGraphicEl(idx)); + }).execute(); + data.eachItemGraphicEl(function (itemGroup, idx) { + var itemModel = data.getItemModel(idx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); // Radar uses the visual encoded from itemStyle. + + var itemStyle = data.getItemVisual(idx, 'style'); + var color = itemStyle.fill; + group.add(itemGroup); + polyline.useStyle(defaults(itemModel.getModel('lineStyle').getLineStyle(), { + fill: 'none', + stroke: color + })); + setStatesStylesFromModel(polyline, itemModel, 'lineStyle'); + setStatesStylesFromModel(polygon, itemModel, 'areaStyle'); + var areaStyleModel = itemModel.getModel('areaStyle'); + var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty(); + polygon.ignore = polygonIgnore; + each(['emphasis', 'select', 'blur'], function (stateName) { + var stateModel = itemModel.getModel([stateName, 'areaStyle']); + var stateIgnore = stateModel.isEmpty() && stateModel.parentModel.isEmpty(); // Won't be ignore if normal state is not ignore. + + polygon.ensureState(stateName).ignore = stateIgnore && polygonIgnore; + }); + polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), { + fill: color, + opacity: 0.7, + decal: itemStyle.decal + })); + var emphasisModel = itemModel.getModel('emphasis'); + var itemHoverStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + symbolGroup.eachChild(function (symbolPath) { + if (symbolPath instanceof ZRImage) { + var pathStyle = symbolPath.style; + symbolPath.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, itemStyle)); + } else { + symbolPath.useStyle(itemStyle); + symbolPath.setColor(color); + symbolPath.style.strokeNoScale = true; + } + + var pathEmphasisState = symbolPath.ensureState('emphasis'); + pathEmphasisState.style = clone(itemHoverStyle); + var defaultText = data.getStore().get(data.getDimensionIndex(symbolPath.__dimIdx), idx); + (defaultText == null || isNaN(defaultText)) && (defaultText = ''); + setLabelStyle(symbolPath, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + labelDimIndex: symbolPath.__dimIdx, + defaultText: defaultText, + inheritColor: color, + defaultOpacity: itemStyle.opacity + }); + }); + toggleHoverEmphasis(itemGroup, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }); + this._data = data; + }; + + RadarView.prototype.remove = function () { + this.group.removeAll(); + this._data = null; + }; + + RadarView.type = 'radar'; + return RadarView; + }(ChartView); + + var RadarSeriesModel = + /** @class */ + function (_super) { + __extends(RadarSeriesModel, _super); + + function RadarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } // Overwrite + + + RadarSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + }; + + RadarSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, { + generateCoord: 'indicator_', + generateCoordCount: Infinity + }); + }; + + RadarSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var coordSys = this.coordinateSystem; + var indicatorAxes = coordSys.getIndicatorAxes(); + var name = this.getData().getName(dataIndex); + var nameToDisplay = name === '' ? this.name : name; + var markerColor = retrieveVisualColorForTooltipMarker(this, dataIndex); + return createTooltipMarkup('section', { + header: nameToDisplay, + sortBlocks: true, + blocks: map(indicatorAxes, function (axis) { + var val = data.get(data.mapDimension(axis.dim), dataIndex); + return createTooltipMarkup('nameValue', { + markerType: 'subItem', + markerColor: markerColor, + name: axis.name, + value: val, + sortParam: val + }); + }) + }); + }; + + RadarSeriesModel.prototype.getTooltipPosition = function (dataIndex) { + if (dataIndex != null) { + var data_1 = this.getData(); + var coordSys = this.coordinateSystem; + var values = data_1.getValues(map(coordSys.dimensions, function (dim) { + return data_1.mapDimension(dim); + }), dataIndex); + + for (var i = 0, len = values.length; i < len; i++) { + if (!isNaN(values[i])) { + var indicatorAxes = coordSys.getIndicatorAxes(); + return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i); + } + } + } + }; + + RadarSeriesModel.type = 'series.radar'; + RadarSeriesModel.dependencies = ['radar']; + RadarSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + coordinateSystem: 'radar', + legendHoverLink: true, + radarIndex: 0, + lineStyle: { + width: 2, + type: 'solid', + join: 'round' + }, + label: { + position: 'top' + }, + // areaStyle: { + // }, + // itemStyle: {} + symbolSize: 8 // symbolRotate: null + + }; + return RadarSeriesModel; + }(SeriesModel); + + var valueAxisDefault = axisDefault.value; + + function defaultsShow(opt, show) { + return defaults({ + show: show + }, opt); + } + + var RadarModel = + /** @class */ + function (_super) { + __extends(RadarModel, _super); + + function RadarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarModel.type; + return _this; + } + + RadarModel.prototype.optionUpdated = function () { + var boundaryGap = this.get('boundaryGap'); + var splitNumber = this.get('splitNumber'); + var scale = this.get('scale'); + var axisLine = this.get('axisLine'); + var axisTick = this.get('axisTick'); // let axisType = this.get('axisType'); + + var axisLabel = this.get('axisLabel'); + var nameTextStyle = this.get('axisName'); + var showName = this.get(['axisName', 'show']); + var nameFormatter = this.get(['axisName', 'formatter']); + var nameGap = this.get('axisNameGap'); + var triggerEvent = this.get('triggerEvent'); + var indicatorModels = map(this.get('indicator') || [], function (indicatorOpt) { + // PENDING + if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) { + indicatorOpt.min = 0; + } else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) { + indicatorOpt.max = 0; + } + + var iNameTextStyle = nameTextStyle; + + if (indicatorOpt.color != null) { + iNameTextStyle = defaults({ + color: indicatorOpt.color + }, nameTextStyle); + } // Use same configuration + + + var innerIndicatorOpt = merge(clone(indicatorOpt), { + boundaryGap: boundaryGap, + splitNumber: splitNumber, + scale: scale, + axisLine: axisLine, + axisTick: axisTick, + // axisType: axisType, + axisLabel: axisLabel, + // Compatible with 2 and use text + name: indicatorOpt.text, + showName: showName, + nameLocation: 'end', + nameGap: nameGap, + // min: 0, + nameTextStyle: iNameTextStyle, + triggerEvent: triggerEvent + }, false); + + if (!showName) { + innerIndicatorOpt.name = ''; + } + + if (isString(nameFormatter)) { + var indName = innerIndicatorOpt.name; + innerIndicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : ''); + } else if (isFunction(nameFormatter)) { + innerIndicatorOpt.name = nameFormatter(innerIndicatorOpt.name, innerIndicatorOpt); + } + + var model = new Model(innerIndicatorOpt, null, this.ecModel); + mixin(model, AxisModelCommonMixin.prototype); // For triggerEvent. + + model.mainType = 'radar'; + model.componentIndex = this.componentIndex; + return model; + }, this); + this._indicatorModels = indicatorModels; + }; + + RadarModel.prototype.getIndicatorModels = function () { + return this._indicatorModels; + }; + + RadarModel.type = 'radar'; + RadarModel.defaultOption = { + // zlevel: 0, + z: 0, + center: ['50%', '50%'], + radius: '75%', + startAngle: 90, + axisName: { + show: true // formatter: null + // textStyle: {} + + }, + boundaryGap: [0, 0], + splitNumber: 5, + axisNameGap: 15, + scale: false, + // Polygon or circle + shape: 'polygon', + axisLine: merge({ + lineStyle: { + color: '#bbb' + } + }, valueAxisDefault.axisLine), + axisLabel: defaultsShow(valueAxisDefault.axisLabel, false), + axisTick: defaultsShow(valueAxisDefault.axisTick, false), + // axisType: 'value', + splitLine: defaultsShow(valueAxisDefault.splitLine, true), + splitArea: defaultsShow(valueAxisDefault.splitArea, true), + // {text, min, max} + indicator: [] + }; + return RadarModel; + }(ComponentModel); + + var axisBuilderAttrs$1 = ['axisLine', 'axisTickLabel', 'axisName']; + + var RadarView$1 = + /** @class */ + function (_super) { + __extends(RadarView, _super); + + function RadarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadarView.type; + return _this; + } + + RadarView.prototype.render = function (radarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + this._buildAxes(radarModel); + + this._buildSplitLineAndArea(radarModel); + }; + + RadarView.prototype._buildAxes = function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + var axisBuilders = map(indicatorAxes, function (indicatorAxis) { + var axisName = indicatorAxis.model.get('showName') ? indicatorAxis.name : ''; // hide name + + var axisBuilder = new AxisBuilder(indicatorAxis.model, { + axisName: axisName, + position: [radar.cx, radar.cy], + rotation: indicatorAxis.angle, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1 + }); + return axisBuilder; + }); + each(axisBuilders, function (axisBuilder) { + each(axisBuilderAttrs$1, axisBuilder.add, axisBuilder); + this.group.add(axisBuilder.getGroup()); + }, this); + }; + + RadarView.prototype._buildSplitLineAndArea = function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + + if (!indicatorAxes.length) { + return; + } + + var shape = radarModel.get('shape'); + var splitLineModel = radarModel.getModel('splitLine'); + var splitAreaModel = radarModel.getModel('splitArea'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var showSplitLine = splitLineModel.get('show'); + var showSplitArea = splitAreaModel.get('show'); + var splitLineColors = lineStyleModel.get('color'); + var splitAreaColors = areaStyleModel.get('color'); + var splitLineColorsArr = isArray(splitLineColors) ? splitLineColors : [splitLineColors]; + var splitAreaColorsArr = isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors]; + var splitLines = []; + var splitAreas = []; + + function getColorIndex(areaOrLine, areaOrLineColorList, idx) { + var colorIndex = idx % areaOrLineColorList.length; + areaOrLine[colorIndex] = areaOrLine[colorIndex] || []; + return colorIndex; + } + + if (shape === 'circle') { + var ticksRadius = indicatorAxes[0].getTicksCoords(); + var cx = radar.cx; + var cy = radar.cy; + + for (var i = 0; i < ticksRadius.length; i++) { + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); + splitLines[colorIndex].push(new Circle({ + shape: { + cx: cx, + cy: cy, + r: ticksRadius[i].coord + } + })); + } + + if (showSplitArea && i < ticksRadius.length - 1) { + var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i); + splitAreas[colorIndex].push(new Ring({ + shape: { + cx: cx, + cy: cy, + r0: ticksRadius[i].coord, + r: ticksRadius[i + 1].coord + } + })); + } + } + } // Polyyon + else { + var realSplitNumber_1; + var axesTicksPoints = map(indicatorAxes, function (indicatorAxis, idx) { + var ticksCoords = indicatorAxis.getTicksCoords(); + realSplitNumber_1 = realSplitNumber_1 == null ? ticksCoords.length - 1 : Math.min(ticksCoords.length - 1, realSplitNumber_1); + return map(ticksCoords, function (tickCoord) { + return radar.coordToPoint(tickCoord.coord, idx); + }); + }); + var prevPoints = []; + + for (var i = 0; i <= realSplitNumber_1; i++) { + var points = []; + + for (var j = 0; j < indicatorAxes.length; j++) { + points.push(axesTicksPoints[j][i]); + } // Close + + + if (points[0]) { + points.push(points[0].slice()); + } else { + if ("development" !== 'production') { + console.error('Can\'t draw value axis ' + i); + } + } + + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i); + splitLines[colorIndex].push(new Polyline({ + shape: { + points: points + } + })); + } + + if (showSplitArea && prevPoints) { + var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i - 1); + splitAreas[colorIndex].push(new Polygon({ + shape: { + points: points.concat(prevPoints) + } + })); + } + + prevPoints = points.slice().reverse(); + } + } + + var lineStyle = lineStyleModel.getLineStyle(); + var areaStyle = areaStyleModel.getAreaStyle(); // Add splitArea before splitLine + + each(splitAreas, function (splitAreas, idx) { + this.group.add(mergePath$1(splitAreas, { + style: defaults({ + stroke: 'none', + fill: splitAreaColorsArr[idx % splitAreaColorsArr.length] + }, areaStyle), + silent: true + })); + }, this); + each(splitLines, function (splitLines, idx) { + this.group.add(mergePath$1(splitLines, { + style: defaults({ + fill: 'none', + stroke: splitLineColorsArr[idx % splitLineColorsArr.length] + }, lineStyle), + silent: true + })); + }, this); + }; + + RadarView.type = 'radar'; + return RadarView; + }(ComponentView); + + var IndicatorAxis = + /** @class */ + function (_super) { + __extends(IndicatorAxis, _super); + + function IndicatorAxis(dim, scale, radiusExtent) { + var _this = _super.call(this, dim, scale, radiusExtent) || this; + + _this.type = 'value'; + _this.angle = 0; + _this.name = ''; + return _this; + } + + return IndicatorAxis; + }(Axis); + + var Radar = + /** @class */ + function () { + function Radar(radarModel, ecModel, api) { + /** + * + * Radar dimensions + */ + this.dimensions = []; + this._model = radarModel; + this._indicatorAxes = map(radarModel.getIndicatorModels(), function (indicatorModel, idx) { + var dim = 'indicator_' + idx; + var indicatorAxis = new IndicatorAxis(dim, new IntervalScale() // (indicatorModel.get('axisType') === 'log') ? new LogScale() : new IntervalScale() + ); + indicatorAxis.name = indicatorModel.get('name'); // Inject model and axis + + indicatorAxis.model = indicatorModel; + indicatorModel.axis = indicatorAxis; + this.dimensions.push(dim); + return indicatorAxis; + }, this); + this.resize(radarModel, api); + } + + Radar.prototype.getIndicatorAxes = function () { + return this._indicatorAxes; + }; + + Radar.prototype.dataToPoint = function (value, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex); + }; // TODO: API should be coordToPoint([coord, indicatorIndex]) + + + Radar.prototype.coordToPoint = function (coord, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + var angle = indicatorAxis.angle; + var x = this.cx + coord * Math.cos(angle); + var y = this.cy - coord * Math.sin(angle); + return [x, y]; + }; + + Radar.prototype.pointToData = function (pt) { + var dx = pt[0] - this.cx; + var dy = pt[1] - this.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + var radian = Math.atan2(-dy, dx); // Find the closest angle + // FIXME index can calculated directly + + var minRadianDiff = Infinity; + var closestAxis; + var closestAxisIdx = -1; + + for (var i = 0; i < this._indicatorAxes.length; i++) { + var indicatorAxis = this._indicatorAxes[i]; + var diff = Math.abs(radian - indicatorAxis.angle); + + if (diff < minRadianDiff) { + closestAxis = indicatorAxis; + closestAxisIdx = i; + minRadianDiff = diff; + } + } + + return [closestAxisIdx, +(closestAxis && closestAxis.coordToData(radius))]; + }; + + Radar.prototype.resize = function (radarModel, api) { + var center = radarModel.get('center'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var viewSize = Math.min(viewWidth, viewHeight) / 2; + this.cx = parsePercent$1(center[0], viewWidth); + this.cy = parsePercent$1(center[1], viewHeight); + this.startAngle = radarModel.get('startAngle') * Math.PI / 180; // radius may be single value like `20`, `'80%'`, or array like `[10, '80%']` + + var radius = radarModel.get('radius'); + + if (isString(radius) || isNumber(radius)) { + radius = [0, radius]; + } + + this.r0 = parsePercent$1(radius[0], viewSize); + this.r = parsePercent$1(radius[1], viewSize); + each(this._indicatorAxes, function (indicatorAxis, idx) { + indicatorAxis.setExtent(this.r0, this.r); + var angle = this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length; // Normalize to [-PI, PI] + + angle = Math.atan2(Math.sin(angle), Math.cos(angle)); + indicatorAxis.angle = angle; + }, this); + }; + + Radar.prototype.update = function (ecModel, api) { + var indicatorAxes = this._indicatorAxes; + var radarModel = this._model; + each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeriesByType('radar', function (radarSeries, idx) { + if (radarSeries.get('coordinateSystem') !== 'radar' // @ts-ignore + || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel) { + return; + } + + var data = radarSeries.getData(); + each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim)); + }); + }, this); + var splitNumber = radarModel.get('splitNumber'); + var dummyScale = new IntervalScale(); + dummyScale.setExtent(0, splitNumber); + dummyScale.setInterval(1); // Force all the axis fixing the maxSplitNumber. + + each(indicatorAxes, function (indicatorAxis, idx) { + alignScaleTicks(indicatorAxis.scale, indicatorAxis.model, dummyScale); + }); + }; + + Radar.prototype.convertToPixel = function (ecModel, finder, value) { + console.warn('Not implemented.'); + return null; + }; + + Radar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + console.warn('Not implemented.'); + return null; + }; + + Radar.prototype.containPoint = function (point) { + console.warn('Not implemented.'); + return false; + }; + + Radar.create = function (ecModel, api) { + var radarList = []; + ecModel.eachComponent('radar', function (radarModel) { + var radar = new Radar(radarModel, ecModel, api); + radarList.push(radar); + radarModel.coordinateSystem = radar; + }); + ecModel.eachSeriesByType('radar', function (radarSeries) { + if (radarSeries.get('coordinateSystem') === 'radar') { + // Inject coordinate system + // @ts-ignore + radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0]; + } + }); + return radarList; + }; + /** + * Radar dimensions is based on the data + */ + + + Radar.dimensions = []; + return Radar; + }(); + + function install$7(registers) { + registers.registerCoordinateSystem('radar', Radar); + registers.registerComponentModel(RadarModel); + registers.registerComponentView(RadarView$1); + registers.registerVisual({ + seriesType: 'radar', + reset: function (seriesModel) { + var data = seriesModel.getData(); // itemVisual symbol is for selected data + + data.each(function (idx) { + data.setItemVisual(idx, 'legendIcon', 'roundRect'); + }); // visual is for unselected data + + data.setVisual('legendIcon', 'roundRect'); + } + }); + } + + function install$8(registers) { + use(install$7); + registers.registerChartView(RadarView); + registers.registerSeriesModel(RadarSeriesModel); + registers.registerLayout(radarLayout); + registers.registerProcessor(dataFilter('radar')); + registers.registerPreprocessor(radarBackwardCompat); + } + + var ATTR = '\0_ec_interaction_mutex'; + + function take(zr, resourceKey, userKey) { + var store = getStore(zr); + store[resourceKey] = userKey; + } + + function release(zr, resourceKey, userKey) { + var store = getStore(zr); + var uKey = store[resourceKey]; + + if (uKey === userKey) { + store[resourceKey] = null; + } + } + + function isTaken(zr, resourceKey) { + return !!getStore(zr)[resourceKey]; + } + + function getStore(zr) { + return zr[ATTR] || (zr[ATTR] = {}); + } + + /** + * payload: { + * type: 'takeGlobalCursor', + * key: 'dataZoomSelect', or 'brush', or ..., + * If no userKey, release global cursor. + * } + */ + // TODO: SELF REGISTERED. + + + registerAction({ + type: 'takeGlobalCursor', + event: 'globalCursorTaken', + update: 'update' + }, noop); + + var RoamController = + /** @class */ + function (_super) { + __extends(RoamController, _super); + + function RoamController(zr) { + var _this = _super.call(this) || this; + + _this._zr = zr; // Avoid two roamController bind the same handler + + var mousedownHandler = bind(_this._mousedownHandler, _this); + var mousemoveHandler = bind(_this._mousemoveHandler, _this); + var mouseupHandler = bind(_this._mouseupHandler, _this); + var mousewheelHandler = bind(_this._mousewheelHandler, _this); + var pinchHandler = bind(_this._pinchHandler, _this); + /** + * Notice: only enable needed types. For example, if 'zoom' + * is not needed, 'zoom' should not be enabled, otherwise + * default mousewheel behaviour (scroll page) will be disabled. + */ + + _this.enable = function (controlType, opt) { + // Disable previous first + this.disable(); + this._opt = defaults(clone(opt) || {}, { + zoomOnMouseWheel: true, + moveOnMouseMove: true, + // By default, wheel do not trigger move. + moveOnMouseWheel: false, + preventDefaultMouseMove: true + }); + + if (controlType == null) { + controlType = true; + } + + if (controlType === true || controlType === 'move' || controlType === 'pan') { + zr.on('mousedown', mousedownHandler); + zr.on('mousemove', mousemoveHandler); + zr.on('mouseup', mouseupHandler); + } + + if (controlType === true || controlType === 'scale' || controlType === 'zoom') { + zr.on('mousewheel', mousewheelHandler); + zr.on('pinch', pinchHandler); + } + }; + + _this.disable = function () { + zr.off('mousedown', mousedownHandler); + zr.off('mousemove', mousemoveHandler); + zr.off('mouseup', mouseupHandler); + zr.off('mousewheel', mousewheelHandler); + zr.off('pinch', pinchHandler); + }; + + return _this; + } + + RoamController.prototype.isDragging = function () { + return this._dragging; + }; + + RoamController.prototype.isPinching = function () { + return this._pinching; + }; + + RoamController.prototype.setPointerChecker = function (pointerChecker) { + this.pointerChecker = pointerChecker; + }; + + RoamController.prototype.dispose = function () { + this.disable(); + }; + + RoamController.prototype._mousedownHandler = function (e) { + if (isMiddleOrRightButtonOnMouseUpDown(e) || e.target && e.target.draggable) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; // Only check on mosedown, but not mousemove. + // Mouse can be out of target when mouse moving. + + if (this.pointerChecker && this.pointerChecker(e, x, y)) { + this._x = x; + this._y = y; + this._dragging = true; + } + }; + + RoamController.prototype._mousemoveHandler = function (e) { + if (!this._dragging || !isAvailableBehavior('moveOnMouseMove', e, this._opt) || e.gestureEvent === 'pinch' || isTaken(this._zr, 'globalPan')) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + var oldX = this._x; + var oldY = this._y; + var dx = x - oldX; + var dy = y - oldY; + this._x = x; + this._y = y; + this._opt.preventDefaultMouseMove && stop(e.event); + trigger(this, 'pan', 'moveOnMouseMove', e, { + dx: dx, + dy: dy, + oldX: oldX, + oldY: oldY, + newX: x, + newY: y, + isAvailableBehavior: null + }); + }; + + RoamController.prototype._mouseupHandler = function (e) { + if (!isMiddleOrRightButtonOnMouseUpDown(e)) { + this._dragging = false; + } + }; + + RoamController.prototype._mousewheelHandler = function (e) { + var shouldZoom = isAvailableBehavior('zoomOnMouseWheel', e, this._opt); + var shouldMove = isAvailableBehavior('moveOnMouseWheel', e, this._opt); + var wheelDelta = e.wheelDelta; + var absWheelDeltaDelta = Math.abs(wheelDelta); + var originX = e.offsetX; + var originY = e.offsetY; // wheelDelta maybe -0 in chrome mac. + + if (wheelDelta === 0 || !shouldZoom && !shouldMove) { + return; + } // If both `shouldZoom` and `shouldMove` is true, trigger + // their event both, and the final behavior is determined + // by event listener themselves. + + + if (shouldZoom) { + // Convenience: + // Mac and VM Windows on Mac: scroll up: zoom out. + // Windows: scroll up: zoom in. + // FIXME: Should do more test in different environment. + // wheelDelta is too complicated in difference nvironment + // (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel), + // although it has been normallized by zrender. + // wheelDelta of mouse wheel is bigger than touch pad. + var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1; + var scale = wheelDelta > 0 ? factor : 1 / factor; + checkPointerAndTrigger(this, 'zoom', 'zoomOnMouseWheel', e, { + scale: scale, + originX: originX, + originY: originY, + isAvailableBehavior: null + }); + } + + if (shouldMove) { + // FIXME: Should do more test in different environment. + var absDelta = Math.abs(wheelDelta); // wheelDelta of mouse wheel is bigger than touch pad. + + var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05); + checkPointerAndTrigger(this, 'scrollMove', 'moveOnMouseWheel', e, { + scrollDelta: scrollDelta, + originX: originX, + originY: originY, + isAvailableBehavior: null + }); + } + }; + + RoamController.prototype._pinchHandler = function (e) { + if (isTaken(this._zr, 'globalPan')) { + return; + } + + var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1; + checkPointerAndTrigger(this, 'zoom', null, e, { + scale: scale, + originX: e.pinchX, + originY: e.pinchY, + isAvailableBehavior: null + }); + }; + + return RoamController; + }(Eventful); + + function checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) { + if (controller.pointerChecker && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)) { + // When mouse is out of roamController rect, + // default befavoius should not be be disabled, otherwise + // page sliding is disabled, contrary to expectation. + stop(e.event); + trigger(controller, eventName, behaviorToCheck, e, contollerEvent); + } + } + + function trigger(controller, eventName, behaviorToCheck, e, contollerEvent) { + // Also provide behavior checker for event listener, for some case that + // multiple components share one listener. + contollerEvent.isAvailableBehavior = bind(isAvailableBehavior, null, behaviorToCheck, e); // TODO should not have type issue. + + controller.trigger(eventName, contollerEvent); + } // settings: { + // zoomOnMouseWheel + // moveOnMouseMove + // moveOnMouseWheel + // } + // The value can be: true / false / 'shift' / 'ctrl' / 'alt'. + + + function isAvailableBehavior(behaviorToCheck, e, settings) { + var setting = settings[behaviorToCheck]; + return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + 'Key']); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * For geo and graph. + */ + function updateViewOnPan(controllerHost, dx, dy) { + var target = controllerHost.target; + target.x += dx; + target.y += dy; + target.dirty(); + } + + /** + * For geo and graph. + */ + + function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) { + var target = controllerHost.target; + var zoomLimit = controllerHost.zoomLimit; + var newZoom = controllerHost.zoom = controllerHost.zoom || 1; + newZoom *= zoomDelta; + + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin); + } + + var zoomScale = newZoom / controllerHost.zoom; + controllerHost.zoom = newZoom; // Keep the mouse center when scaling + + target.x -= (zoomX - target.x) * (zoomScale - 1); + target.y -= (zoomY - target.y) * (zoomScale - 1); + target.scaleX *= zoomScale; + target.scaleY *= zoomScale; + target.dirty(); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var IRRELEVANT_EXCLUDES = { + 'axisPointer': 1, + 'tooltip': 1, + 'brush': 1 + }; + + /** + * Avoid that: mouse click on a elements that is over geo or graph, + * but roam is triggered. + */ + + function onIrrelevantElement(e, api, targetCoordSysModel) { + var model = api.getComponentByElement(e.topTarget); // If model is axisModel, it works only if it is injected with coordinateSystem. + + var coordSys = model && model.coordinateSystem; + return model && model !== targetCoordSysModel && !IRRELEVANT_EXCLUDES.hasOwnProperty(model.mainType) && coordSys && coordSys.model !== targetCoordSysModel; + } + + function parseXML(svg) { + if (isString(svg)) { + var parser = new DOMParser(); + svg = parser.parseFromString(svg, 'text/xml'); + } + var svgNode = svg; + if (svgNode.nodeType === 9) { + svgNode = svgNode.firstChild; + } + while (svgNode.nodeName.toLowerCase() !== 'svg' || svgNode.nodeType !== 1) { + svgNode = svgNode.nextSibling; + } + return svgNode; + } + + var nodeParsers; + var INHERITABLE_STYLE_ATTRIBUTES_MAP = { + 'fill': 'fill', + 'stroke': 'stroke', + 'stroke-width': 'lineWidth', + 'opacity': 'opacity', + 'fill-opacity': 'fillOpacity', + 'stroke-opacity': 'strokeOpacity', + 'stroke-dasharray': 'lineDash', + 'stroke-dashoffset': 'lineDashOffset', + 'stroke-linecap': 'lineCap', + 'stroke-linejoin': 'lineJoin', + 'stroke-miterlimit': 'miterLimit', + 'font-family': 'fontFamily', + 'font-size': 'fontSize', + 'font-style': 'fontStyle', + 'font-weight': 'fontWeight', + 'text-anchor': 'textAlign', + 'visibility': 'visibility', + 'display': 'display' + }; + var INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS = keys(INHERITABLE_STYLE_ATTRIBUTES_MAP); + var SELF_STYLE_ATTRIBUTES_MAP = { + 'alignment-baseline': 'textBaseline', + 'stop-color': 'stopColor' + }; + var SELF_STYLE_ATTRIBUTES_MAP_KEYS = keys(SELF_STYLE_ATTRIBUTES_MAP); + var SVGParser = (function () { + function SVGParser() { + this._defs = {}; + this._root = null; + } + + SVGParser.prototype.parse = function (xml, opt) { + opt = opt || {}; + var svg = parseXML(xml); + if ("development" !== 'production') { + if (!svg) { + throw new Error('Illegal svg'); + } + } + this._defsUsePending = []; + var root = new Group(); + this._root = root; + var named = []; + var viewBox = svg.getAttribute('viewBox') || ''; + var width = parseFloat((svg.getAttribute('width') || opt.width)); + var height = parseFloat((svg.getAttribute('height') || opt.height)); + isNaN(width) && (width = null); + isNaN(height) && (height = null); + parseAttributes(svg, root, null, true, false); + var child = svg.firstChild; + while (child) { + this._parseNode(child, root, named, null, false, false); + child = child.nextSibling; + } + applyDefs(this._defs, this._defsUsePending); + this._defsUsePending = []; + var viewBoxRect; + var viewBoxTransform; + if (viewBox) { + var viewBoxArr = splitNumberSequence(viewBox); + if (viewBoxArr.length >= 4) { + viewBoxRect = { + x: parseFloat((viewBoxArr[0] || 0)), + y: parseFloat((viewBoxArr[1] || 0)), + width: parseFloat(viewBoxArr[2]), + height: parseFloat(viewBoxArr[3]) + }; + } + } + if (viewBoxRect && width != null && height != null) { + viewBoxTransform = makeViewBoxTransform(viewBoxRect, {x: 0, y: 0, width: width, height: height}); + if (!opt.ignoreViewBox) { + var elRoot = root; + root = new Group(); + root.add(elRoot); + elRoot.scaleX = elRoot.scaleY = viewBoxTransform.scale; + elRoot.x = viewBoxTransform.x; + elRoot.y = viewBoxTransform.y; + } + } + if (!opt.ignoreRootClip && width != null && height != null) { + root.setClipPath(new Rect({ + shape: {x: 0, y: 0, width: width, height: height} + })); + } + return { + root: root, + width: width, + height: height, + viewBoxRect: viewBoxRect, + viewBoxTransform: viewBoxTransform, + named: named + }; + }; + SVGParser.prototype._parseNode = function (xmlNode, parentGroup, named, namedFrom, isInDefs, isInText) { + var nodeName = xmlNode.nodeName.toLowerCase(); + var el; + var namedFromForSub = namedFrom; + if (nodeName === 'defs') { + isInDefs = true; + } + if (nodeName === 'text') { + isInText = true; + } + if (nodeName === 'defs' || nodeName === 'switch') { + el = parentGroup; + } else { + if (!isInDefs) { + var parser_1 = nodeParsers[nodeName]; + if (parser_1 && hasOwn(nodeParsers, nodeName)) { + el = parser_1.call(this, xmlNode, parentGroup); + var nameAttr = xmlNode.getAttribute('name'); + if (nameAttr) { + var newNamed = { + name: nameAttr, + namedFrom: null, + svgNodeTagLower: nodeName, + el: el + }; + named.push(newNamed); + if (nodeName === 'g') { + namedFromForSub = newNamed; + } + } else if (namedFrom) { + named.push({ + name: namedFrom.name, + namedFrom: namedFrom, + svgNodeTagLower: nodeName, + el: el + }); + } + parentGroup.add(el); + } + } + var parser = paintServerParsers[nodeName]; + if (parser && hasOwn(paintServerParsers, nodeName)) { + var def = parser.call(this, xmlNode); + var id = xmlNode.getAttribute('id'); + if (id) { + this._defs[id] = def; + } + } + } + if (el && el.isGroup) { + var child = xmlNode.firstChild; + while (child) { + if (child.nodeType === 1) { + this._parseNode(child, el, named, namedFromForSub, isInDefs, isInText); + } else if (child.nodeType === 3 && isInText) { + this._parseText(child, el); + } + child = child.nextSibling; + } + } + }; + SVGParser.prototype._parseText = function (xmlNode, parentGroup) { + var text = new TSpan({ + style: { + text: xmlNode.textContent + }, + silent: true, + x: this._textX || 0, + y: this._textY || 0 + }); + inheritStyle(parentGroup, text); + parseAttributes(xmlNode, text, this._defsUsePending, false, false); + applyTextAlignment(text, parentGroup); + var textStyle = text.style; + var fontSize = textStyle.fontSize; + if (fontSize && fontSize < 9) { + textStyle.fontSize = 9; + text.scaleX *= fontSize / 9; + text.scaleY *= fontSize / 9; + } + var font = (textStyle.fontSize || textStyle.fontFamily) && [ + textStyle.fontStyle, + textStyle.fontWeight, + (textStyle.fontSize || 12) + 'px', + textStyle.fontFamily || 'sans-serif' + ].join(' '); + textStyle.font = font; + var rect = text.getBoundingRect(); + this._textX += rect.width; + parentGroup.add(text); + return text; + }; + SVGParser.internalField = (function () { + nodeParsers = { + 'g': function (xmlNode, parentGroup) { + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, false); + return g; + }, + 'rect': function (xmlNode, parentGroup) { + var rect = new Rect(); + inheritStyle(parentGroup, rect); + parseAttributes(xmlNode, rect, this._defsUsePending, false, false); + rect.setShape({ + x: parseFloat(xmlNode.getAttribute('x') || '0'), + y: parseFloat(xmlNode.getAttribute('y') || '0'), + width: parseFloat(xmlNode.getAttribute('width') || '0'), + height: parseFloat(xmlNode.getAttribute('height') || '0') + }); + rect.silent = true; + return rect; + }, + 'circle': function (xmlNode, parentGroup) { + var circle = new Circle(); + inheritStyle(parentGroup, circle); + parseAttributes(xmlNode, circle, this._defsUsePending, false, false); + circle.setShape({ + cx: parseFloat(xmlNode.getAttribute('cx') || '0'), + cy: parseFloat(xmlNode.getAttribute('cy') || '0'), + r: parseFloat(xmlNode.getAttribute('r') || '0') + }); + circle.silent = true; + return circle; + }, + 'line': function (xmlNode, parentGroup) { + var line = new Line(); + inheritStyle(parentGroup, line); + parseAttributes(xmlNode, line, this._defsUsePending, false, false); + line.setShape({ + x1: parseFloat(xmlNode.getAttribute('x1') || '0'), + y1: parseFloat(xmlNode.getAttribute('y1') || '0'), + x2: parseFloat(xmlNode.getAttribute('x2') || '0'), + y2: parseFloat(xmlNode.getAttribute('y2') || '0') + }); + line.silent = true; + return line; + }, + 'ellipse': function (xmlNode, parentGroup) { + var ellipse = new Ellipse(); + inheritStyle(parentGroup, ellipse); + parseAttributes(xmlNode, ellipse, this._defsUsePending, false, false); + ellipse.setShape({ + cx: parseFloat(xmlNode.getAttribute('cx') || '0'), + cy: parseFloat(xmlNode.getAttribute('cy') || '0'), + rx: parseFloat(xmlNode.getAttribute('rx') || '0'), + ry: parseFloat(xmlNode.getAttribute('ry') || '0') + }); + ellipse.silent = true; + return ellipse; + }, + 'polygon': function (xmlNode, parentGroup) { + var pointsStr = xmlNode.getAttribute('points'); + var pointsArr; + if (pointsStr) { + pointsArr = parsePoints(pointsStr); + } + var polygon = new Polygon({ + shape: { + points: pointsArr || [] + }, + silent: true + }); + inheritStyle(parentGroup, polygon); + parseAttributes(xmlNode, polygon, this._defsUsePending, false, false); + return polygon; + }, + 'polyline': function (xmlNode, parentGroup) { + var pointsStr = xmlNode.getAttribute('points'); + var pointsArr; + if (pointsStr) { + pointsArr = parsePoints(pointsStr); + } + var polyline = new Polyline({ + shape: { + points: pointsArr || [] + }, + silent: true + }); + inheritStyle(parentGroup, polyline); + parseAttributes(xmlNode, polyline, this._defsUsePending, false, false); + return polyline; + }, + 'image': function (xmlNode, parentGroup) { + var img = new ZRImage(); + inheritStyle(parentGroup, img); + parseAttributes(xmlNode, img, this._defsUsePending, false, false); + img.setStyle({ + image: xmlNode.getAttribute('xlink:href') || xmlNode.getAttribute('href'), + x: +xmlNode.getAttribute('x'), + y: +xmlNode.getAttribute('y'), + width: +xmlNode.getAttribute('width'), + height: +xmlNode.getAttribute('height') + }); + img.silent = true; + return img; + }, + 'text': function (xmlNode, parentGroup) { + var x = xmlNode.getAttribute('x') || '0'; + var y = xmlNode.getAttribute('y') || '0'; + var dx = xmlNode.getAttribute('dx') || '0'; + var dy = xmlNode.getAttribute('dy') || '0'; + this._textX = parseFloat(x) + parseFloat(dx); + this._textY = parseFloat(y) + parseFloat(dy); + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, true); + return g; + }, + 'tspan': function (xmlNode, parentGroup) { + var x = xmlNode.getAttribute('x'); + var y = xmlNode.getAttribute('y'); + if (x != null) { + this._textX = parseFloat(x); + } + if (y != null) { + this._textY = parseFloat(y); + } + var dx = xmlNode.getAttribute('dx') || '0'; + var dy = xmlNode.getAttribute('dy') || '0'; + var g = new Group(); + inheritStyle(parentGroup, g); + parseAttributes(xmlNode, g, this._defsUsePending, false, true); + this._textX += parseFloat(dx); + this._textY += parseFloat(dy); + return g; + }, + 'path': function (xmlNode, parentGroup) { + var d = xmlNode.getAttribute('d') || ''; + var path = createFromString(d); + inheritStyle(parentGroup, path); + parseAttributes(xmlNode, path, this._defsUsePending, false, false); + path.silent = true; + return path; + } + }; + })(); + return SVGParser; + }()); + var paintServerParsers = { + 'lineargradient': function (xmlNode) { + var x1 = parseInt(xmlNode.getAttribute('x1') || '0', 10); + var y1 = parseInt(xmlNode.getAttribute('y1') || '0', 10); + var x2 = parseInt(xmlNode.getAttribute('x2') || '10', 10); + var y2 = parseInt(xmlNode.getAttribute('y2') || '0', 10); + var gradient = new LinearGradient(x1, y1, x2, y2); + parsePaintServerUnit(xmlNode, gradient); + parseGradientColorStops(xmlNode, gradient); + return gradient; + }, + 'radialgradient': function (xmlNode) { + var cx = parseInt(xmlNode.getAttribute('cx') || '0', 10); + var cy = parseInt(xmlNode.getAttribute('cy') || '0', 10); + var r = parseInt(xmlNode.getAttribute('r') || '0', 10); + var gradient = new RadialGradient(cx, cy, r); + parsePaintServerUnit(xmlNode, gradient); + parseGradientColorStops(xmlNode, gradient); + return gradient; + } + }; + + function parsePaintServerUnit(xmlNode, gradient) { + var gradientUnits = xmlNode.getAttribute('gradientUnits'); + if (gradientUnits === 'userSpaceOnUse') { + gradient.global = true; + } + } + + function parseGradientColorStops(xmlNode, gradient) { + var stop = xmlNode.firstChild; + while (stop) { + if (stop.nodeType === 1 + && stop.nodeName.toLocaleLowerCase() === 'stop') { + var offsetStr = stop.getAttribute('offset'); + var offset = void 0; + if (offsetStr && offsetStr.indexOf('%') > 0) { + offset = parseInt(offsetStr, 10) / 100; + } else if (offsetStr) { + offset = parseFloat(offsetStr); + } else { + offset = 0; + } + var styleVals = {}; + parseInlineStyle(stop, styleVals, styleVals); + var stopColor = styleVals.stopColor + || stop.getAttribute('stop-color') + || '#000000'; + gradient.colorStops.push({ + offset: offset, + color: stopColor + }); + } + stop = stop.nextSibling; + } + } + + function inheritStyle(parent, child) { + if (parent && parent.__inheritedStyle) { + if (!child.__inheritedStyle) { + child.__inheritedStyle = {}; + } + defaults(child.__inheritedStyle, parent.__inheritedStyle); + } + } + + function parsePoints(pointsString) { + var list = splitNumberSequence(pointsString); + var points = []; + for (var i = 0; i < list.length; i += 2) { + var x = parseFloat(list[i]); + var y = parseFloat(list[i + 1]); + points.push([x, y]); + } + return points; + } + + function parseAttributes(xmlNode, el, defsUsePending, onlyInlineStyle, isTextGroup) { + var disp = el; + var inheritedStyle = disp.__inheritedStyle = disp.__inheritedStyle || {}; + var selfStyle = {}; + if (xmlNode.nodeType === 1) { + parseTransformAttribute(xmlNode, el); + parseInlineStyle(xmlNode, inheritedStyle, selfStyle); + if (!onlyInlineStyle) { + parseAttributeStyle(xmlNode, inheritedStyle, selfStyle); + } + } + disp.style = disp.style || {}; + if (inheritedStyle.fill != null) { + disp.style.fill = getFillStrokeStyle(disp, 'fill', inheritedStyle.fill, defsUsePending); + } + if (inheritedStyle.stroke != null) { + disp.style.stroke = getFillStrokeStyle(disp, 'stroke', inheritedStyle.stroke, defsUsePending); + } + each([ + 'lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize' + ], function (propName) { + if (inheritedStyle[propName] != null) { + disp.style[propName] = parseFloat(inheritedStyle[propName]); + } + }); + each([ + 'lineDashOffset', 'lineCap', 'lineJoin', 'fontWeight', 'fontFamily', 'fontStyle', 'textAlign' + ], function (propName) { + if (inheritedStyle[propName] != null) { + disp.style[propName] = inheritedStyle[propName]; + } + }); + if (isTextGroup) { + disp.__selfStyle = selfStyle; + } + if (inheritedStyle.lineDash) { + disp.style.lineDash = map(splitNumberSequence(inheritedStyle.lineDash), function (str) { + return parseFloat(str); + }); + } + if (inheritedStyle.visibility === 'hidden' || inheritedStyle.visibility === 'collapse') { + disp.invisible = true; + } + if (inheritedStyle.display === 'none') { + disp.ignore = true; + } + } + + function applyTextAlignment(text, parentGroup) { + var parentSelfStyle = parentGroup.__selfStyle; + if (parentSelfStyle) { + var textBaseline = parentSelfStyle.textBaseline; + var zrTextBaseline = textBaseline; + if (!textBaseline || textBaseline === 'auto') { + zrTextBaseline = 'alphabetic'; + } else if (textBaseline === 'baseline') { + zrTextBaseline = 'alphabetic'; + } else if (textBaseline === 'before-edge' || textBaseline === 'text-before-edge') { + zrTextBaseline = 'top'; + } else if (textBaseline === 'after-edge' || textBaseline === 'text-after-edge') { + zrTextBaseline = 'bottom'; + } else if (textBaseline === 'central' || textBaseline === 'mathematical') { + zrTextBaseline = 'middle'; + } + text.style.textBaseline = zrTextBaseline; + } + var parentInheritedStyle = parentGroup.__inheritedStyle; + if (parentInheritedStyle) { + var textAlign = parentInheritedStyle.textAlign; + var zrTextAlign = textAlign; + if (textAlign) { + if (textAlign === 'middle') { + zrTextAlign = 'center'; + } + text.style.textAlign = zrTextAlign; + } + } + } + + var urlRegex = /^url\(\s*#(.*?)\)/; + + function getFillStrokeStyle(el, method, str, defsUsePending) { + var urlMatch = str && str.match(urlRegex); + if (urlMatch) { + var url = trim(urlMatch[1]); + defsUsePending.push([el, method, url]); + return; + } + if (str === 'none') { + str = null; + } + return str; + } + + function applyDefs(defs, defsUsePending) { + for (var i = 0; i < defsUsePending.length; i++) { + var item = defsUsePending[i]; + item[0].style[item[1]] = defs[item[2]]; + } + } + + var numberReg$1 = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; + + function splitNumberSequence(rawStr) { + return rawStr.match(numberReg$1) || []; + } + + var transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.eE,]*)\)/g; + var DEGREE_TO_ANGLE = Math.PI / 180; + + function parseTransformAttribute(xmlNode, node) { + var transform = xmlNode.getAttribute('transform'); + if (transform) { + transform = transform.replace(/,/g, ' '); + var transformOps_1 = []; + var mt = null; + transform.replace(transformRegex, function (str, type, value) { + transformOps_1.push(type, value); + return ''; + }); + for (var i = transformOps_1.length - 1; i > 0; i -= 2) { + var value = transformOps_1[i]; + var type = transformOps_1[i - 1]; + var valueArr = splitNumberSequence(value); + mt = mt || create$1(); + switch (type) { + case 'translate': + translate(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || '0')]); + break; + case 'scale': + scale$1(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || valueArr[0])]); + break; + case 'rotate': + rotate(mt, mt, -parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + break; + case 'skewX': + var sx = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + mul$1(mt, [1, 0, sx, 1, 0, 0], mt); + break; + case 'skewY': + var sy = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE); + mul$1(mt, [1, sy, 0, 1, 0, 0], mt); + break; + case 'matrix': + mt[0] = parseFloat(valueArr[0]); + mt[1] = parseFloat(valueArr[1]); + mt[2] = parseFloat(valueArr[2]); + mt[3] = parseFloat(valueArr[3]); + mt[4] = parseFloat(valueArr[4]); + mt[5] = parseFloat(valueArr[5]); + break; + } + } + node.setLocalTransform(mt); + } + } + + var styleRegex = /([^\s:;]+)\s*:\s*([^:;]+)/g; + + function parseInlineStyle(xmlNode, inheritableStyleResult, selfStyleResult) { + var style = xmlNode.getAttribute('style'); + if (!style) { + return; + } + styleRegex.lastIndex = 0; + var styleRegResult; + while ((styleRegResult = styleRegex.exec(style)) != null) { + var svgStlAttr = styleRegResult[1]; + var zrInheritableStlAttr = hasOwn(INHERITABLE_STYLE_ATTRIBUTES_MAP, svgStlAttr) + ? INHERITABLE_STYLE_ATTRIBUTES_MAP[svgStlAttr] + : null; + if (zrInheritableStlAttr) { + inheritableStyleResult[zrInheritableStlAttr] = styleRegResult[2]; + } + var zrSelfStlAttr = hasOwn(SELF_STYLE_ATTRIBUTES_MAP, svgStlAttr) + ? SELF_STYLE_ATTRIBUTES_MAP[svgStlAttr] + : null; + if (zrSelfStlAttr) { + selfStyleResult[zrSelfStlAttr] = styleRegResult[2]; + } + } + } + + function parseAttributeStyle(xmlNode, inheritableStyleResult, selfStyleResult) { + for (var i = 0; i < INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) { + var svgAttrName = INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS[i]; + var attrValue = xmlNode.getAttribute(svgAttrName); + if (attrValue != null) { + inheritableStyleResult[INHERITABLE_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue; + } + } + for (var i = 0; i < SELF_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) { + var svgAttrName = SELF_STYLE_ATTRIBUTES_MAP_KEYS[i]; + var attrValue = xmlNode.getAttribute(svgAttrName); + if (attrValue != null) { + selfStyleResult[SELF_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue; + } + } + } + + function makeViewBoxTransform(viewBoxRect, boundingRect) { + var scaleX = boundingRect.width / viewBoxRect.width; + var scaleY = boundingRect.height / viewBoxRect.height; + var scale = Math.min(scaleX, scaleY); + return { + scale: scale, + x: -(viewBoxRect.x + viewBoxRect.width / 2) * scale + (boundingRect.x + boundingRect.width / 2), + y: -(viewBoxRect.y + viewBoxRect.height / 2) * scale + (boundingRect.y + boundingRect.height / 2) + }; + } + + function parseSVG(xml, opt) { + var parser = new SVGParser(); + return parser.parse(xml, opt); + } + + /** + * "region available" means that: enable users to set attribute `name="xxx"` on those tags + * to make it be a region. + * 1. region styles and its label styles can be defined in echarts opton: + * ```js + * geo: { + * regions: [{ + * name: 'xxx', + * itemStyle: { ... }, + * label: { ... } + * }, { + * ... + * }, + * ...] + * }; + * ``` + * 2. name can be duplicated in different SVG tag. All of the tags with the same name share + * a region option. For exampel if there are two representing two lung lobes. They have + * no common parents but both of them need to display label "lung" inside. + */ + + var REGION_AVAILABLE_SVG_TAG_MAP = createHashMap(['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path', // are also enabled becuase some SVG might paint text itself, + // but still need to trigger events or tooltip. + 'text', 'tspan', // is also enabled because this case: if multiple tags share one name + // and need label displayed, every tags will display the name, which is not + // expected. So we can put them into a . Thereby only one label + // displayed and located based on the bounding rect of the . + 'g']); + + var GeoSVGResource = + /** @class */ + function () { + function GeoSVGResource(mapName, svg) { + this.type = 'geoSVG'; // All used graphics. key: hostKey, value: root + + this._usedGraphicMap = createHashMap(); // All unused graphics. + + this._freedGraphics = []; + this._mapName = mapName; // Only perform parse to XML object here, which might be time + // consiming for large SVG. + // Although convert XML to zrender element is also time consiming, + // if we do it here, the clone of zrender elements has to be + // required. So we do it once for each geo instance, util real + // performance issues call for optimizing it. + + this._parsedXML = parseXML(svg); + } + + GeoSVGResource.prototype.load = function () + /* nameMap: NameMap */ { + // In the "load" stage, graphic need to be built to + // get boundingRect for geo coordinate system. + var firstGraphic = this._firstGraphic; // Create the return data structure only when first graphic created. + // Because they will be used in geo coordinate system update stage, + // and `regions` will be mounted at `geo` coordinate system, + // in which there is no "view" info, so that it should better not to + // make references to graphic elements. + + if (!firstGraphic) { + firstGraphic = this._firstGraphic = this._buildGraphic(this._parsedXML); + + this._freedGraphics.push(firstGraphic); + + this._boundingRect = this._firstGraphic.boundingRect.clone(); // PENDING: `nameMap` will not be supported until some real requirement come. + // if (nameMap) { + // named = applyNameMap(named, nameMap); + // } + + var _a = createRegions(firstGraphic.named), + regions = _a.regions, + regionsMap = _a.regionsMap; + + this._regions = regions; + this._regionsMap = regionsMap; + } + + return { + boundingRect: this._boundingRect, + regions: this._regions, + regionsMap: this._regionsMap + }; + }; + + GeoSVGResource.prototype._buildGraphic = function (svgXML) { + var result; + var rootFromParse; + + try { + result = svgXML && parseSVG(svgXML, { + ignoreViewBox: true, + ignoreRootClip: true + }) || {}; + rootFromParse = result.root; + assert(rootFromParse != null); + } catch (e) { + throw new Error('Invalid svg format\n' + e.message); + } // Note: we keep the covenant that the root has no transform. So always add an extra root. + + + var root = new Group(); + root.add(rootFromParse); + root.isGeoSVGGraphicRoot = true; // [THE_RULE_OF_VIEWPORT_AND_VIEWBOX] + // + // Consider: `` + // - the `width/height` we call it `svgWidth/svgHeight` for short. + // - `(0, 0, svgWidth, svgHeight)` defines the viewport of the SVG, or say, + // "viewport boundingRect", or `boundingRect` for short. + // - `viewBox` defines the transform from the real content ot the viewport. + // `viewBox` has the same unit as the content of SVG. + // If `viewBox` exists, a transform is defined, so the unit of `svgWidth/svgHeight` become + // different from the content of SVG. Otherwise, they are the same. + // + // If both `svgWidth/svgHeight/viewBox` are specified in a SVG file, the transform rule will be: + // 0. `boundingRect` is `(0, 0, svgWidth, svgHeight)`. Set it to Geo['_rect'] (View['_rect']). + // 1. Make a transform from `viewBox` to `boundingRect`. + // Note: only suport `preserveAspectRatio 'xMidYMid'` here. That is, this transform will preserve + // the aspect ratio. + // 2. Make a transform from boundingRect to Geo['_viewRect'] (View['_viewRect']) + // (`Geo`/`View` will do this job). + // Note: this transform might not preserve aspect radio, which depending on how users specify + // viewRect in echarts option (e.g., `geo.left/top/width/height` will not preserve aspect ratio, + // but `geo.layoutCenter/layoutSize` will preserve aspect ratio). + // + // If `svgWidth/svgHeight` not specified, we use `viewBox` as the `boundingRect` to make the SVG + // layout look good. + // + // If neither `svgWidth/svgHeight` nor `viewBox` are not specified, we calculate the boundingRect + // of the SVG content and use them to make SVG layout look good. + + var svgWidth = result.width; + var svgHeight = result.height; + var viewBoxRect = result.viewBoxRect; + var boundingRect = this._boundingRect; + + if (!boundingRect) { + var bRectX = void 0; + var bRectY = void 0; + var bRectWidth = void 0; + var bRectHeight = void 0; + + if (svgWidth != null) { + bRectX = 0; + bRectWidth = svgWidth; + } else if (viewBoxRect) { + bRectX = viewBoxRect.x; + bRectWidth = viewBoxRect.width; + } + + if (svgHeight != null) { + bRectY = 0; + bRectHeight = svgHeight; + } else if (viewBoxRect) { + bRectY = viewBoxRect.y; + bRectHeight = viewBoxRect.height; + } // If both viewBox and svgWidth/svgHeight not specified, + // we have to determine how to layout those element to make them look good. + + + if (bRectX == null || bRectY == null) { + var calculatedBoundingRect = rootFromParse.getBoundingRect(); + + if (bRectX == null) { + bRectX = calculatedBoundingRect.x; + bRectWidth = calculatedBoundingRect.width; + } + + if (bRectY == null) { + bRectY = calculatedBoundingRect.y; + bRectHeight = calculatedBoundingRect.height; + } + } + + boundingRect = this._boundingRect = new BoundingRect(bRectX, bRectY, bRectWidth, bRectHeight); + } + + if (viewBoxRect) { + var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect); // Only support `preserveAspectRatio 'xMidYMid'` + + rootFromParse.scaleX = rootFromParse.scaleY = viewBoxTransform.scale; + rootFromParse.x = viewBoxTransform.x; + rootFromParse.y = viewBoxTransform.y; + } // SVG needs to clip based on `viewBox`. And some SVG files really rely on this feature. + // They do not strictly confine all of the content inside a display rect, but deliberately + // use a `viewBox` to define a displayable rect. + // PENDING: + // The drawback of the `setClipPath` here is: the region label (genereted by echarts) near the + // edge might also be clipped, because region labels are put as `textContent` of the SVG path. + + + root.setClipPath(new Rect({ + shape: boundingRect.plain() + })); + var named = []; + each(result.named, function (namedItem) { + if (REGION_AVAILABLE_SVG_TAG_MAP.get(namedItem.svgNodeTagLower) != null) { + named.push(namedItem); + setSilent(namedItem.el); + } + }); + return { + root: root, + boundingRect: boundingRect, + named: named + }; + }; + /** + * Consider: + * (1) One graphic element can not be shared by different `geoView` running simultaneously. + * Notice, also need to consider multiple echarts instances share a `mapRecord`. + * (2) Converting SVG to graphic elements is time consuming. + * (3) In the current architecture, `load` should be called frequently to get boundingRect, + * and it is called without view info. + * So we maintain graphic elements in this module, and enables `view` to use/return these + * graphics from/to the pool with it's uid. + */ + + + GeoSVGResource.prototype.useGraphic = function (hostKey + /*, nameMap: NameMap */ + ) { + var usedRootMap = this._usedGraphicMap; + var svgGraphic = usedRootMap.get(hostKey); + + if (svgGraphic) { + return svgGraphic; + } + + svgGraphic = this._freedGraphics.pop() // use the first boundingRect to avoid duplicated boundingRect calculation. + || this._buildGraphic(this._parsedXML); + usedRootMap.set(hostKey, svgGraphic); // PENDING: `nameMap` will not be supported until some real requirement come. + // `nameMap` can only be obtained from echarts option. + // The original `named` must not be modified. + // if (nameMap) { + // svgGraphic = extend({}, svgGraphic); + // svgGraphic.named = applyNameMap(svgGraphic.named, nameMap); + // } + + return svgGraphic; + }; + + GeoSVGResource.prototype.freeGraphic = function (hostKey) { + var usedRootMap = this._usedGraphicMap; + var svgGraphic = usedRootMap.get(hostKey); + + if (svgGraphic) { + usedRootMap.removeKey(hostKey); + + this._freedGraphics.push(svgGraphic); + } + }; + + return GeoSVGResource; + }(); + + function setSilent(el) { + // Only named element has silent: false, other elements should + // act as background and has no user interaction. + el.silent = false; // text|tspan will be converted to group. + + if (el.isGroup) { + el.traverse(function (child) { + child.silent = false; + }); + } + } + + function createRegions(named) { + var regions = []; + var regionsMap = createHashMap(); // Create resions only for the first graphic. + + each(named, function (namedItem) { + // Region has feature to calculate center for tooltip or other features. + // If there is a , the center should be the center of the + // bounding rect of the g. + if (namedItem.namedFrom != null) { + return; + } + + var region = new GeoSVGRegion(namedItem.name, namedItem.el); // PENDING: if `nameMap` supported, this region can not be mounted on + // `this`, but can only be created each time `load()` called. + + regions.push(region); // PENDING: if multiple tag named with the same name, only one will be + // found by `_regionsMap`. `_regionsMap` is used to find a coordinate + // by name. We use `region.getCenter()` as the coordinate. + + regionsMap.set(namedItem.name, region); + }); + return { + regions: regions, + regionsMap: regionsMap + }; + } // PENDING: `nameMap` will not be supported until some real requirement come. + // /** + // * Use the alias in geoNameMap. + // * The input `named` must not be modified. + // */ + // function applyNameMap( + // named: GeoSVGGraphicRecord['named'], + // nameMap: NameMap + // ): GeoSVGGraphicRecord['named'] { + // const result = [] as GeoSVGGraphicRecord['named']; + // for (let i = 0; i < named.length; i++) { + // let regionGraphic = named[i]; + // const name = regionGraphic.name; + // if (nameMap && nameMap.hasOwnProperty(name)) { + // regionGraphic = extend({}, regionGraphic); + // regionGraphic.name = name; + // } + // result.push(regionGraphic); + // } + // return result; + // } + + var geoCoord = [126, 25]; + var nanhaiName = '南海诸岛'; + var points$1 = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, 0.7], [52, 0.7], [56, 7.7], [59, 0.7], [64, 0.7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]]; + + for (var i = 0; i < points$1.length; i++) { + for (var k = 0; k < points$1[i].length; k++) { + points$1[i][k][0] /= 10.5; + points$1[i][k][1] /= -10.5 / 0.75; + points$1[i][k][0] += geoCoord[0]; + points$1[i][k][1] += geoCoord[1]; + } + } + + function fixNanhai(mapType, regions) { + if (mapType === 'china') { + for (var i = 0; i < regions.length; i++) { + // Already exists. + if (regions[i].name === nanhaiName) { + return; + } + } + + regions.push(new GeoJSONRegion(nanhaiName, map(points$1, function (exterior) { + return { + type: 'polygon', + exterior: exterior + }; + }), geoCoord)); + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var coordsOffsetMap = { + '南海诸岛': [32, 80], + // 全国 + '广东': [0, -10], + '香港': [10, 5], + '澳门': [-10, 10], + //'北京': [-10, 0], + '天津': [5, 5] + }; + + function fixTextCoords(mapType, region) { + if (mapType === 'china') { + var coordFix = coordsOffsetMap[region.name]; + + if (coordFix) { + var cp = region.getCenter(); + cp[0] += coordFix[0] / 10.5; + cp[1] += -coordFix[1] / (10.5 / 0.75); + region.setCenter(cp); + } + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + // Fix for 钓鱼岛 + // let Region = require('../Region'); + // let zrUtil = require('zrender/lib/core/util'); + // let geoCoord = [126, 25]; + var points$2 = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]]; + + function fixDiaoyuIsland(mapType, region) { + if (mapType === 'china' && region.name === '台湾') { + region.geometries.push({ + type: 'polygon', + exterior: points$2[0] + }); + } + } + + var DEFAULT_NAME_PROPERTY = 'name'; + + var GeoJSONResource = + /** @class */ + function () { + function GeoJSONResource(mapName, geoJSON, specialAreas) { + this.type = 'geoJSON'; + this._parsedMap = createHashMap(); + this._mapName = mapName; + this._specialAreas = specialAreas; // PENDING: delay the parse to the first usage to rapid up the FMP? + + this._geoJSON = parseInput(geoJSON); + } + + /** + * @param nameMap can be null/undefined + * @param nameProperty can be null/undefined + */ + + + GeoJSONResource.prototype.load = function (nameMap, nameProperty) { + nameProperty = nameProperty || DEFAULT_NAME_PROPERTY; + + var parsed = this._parsedMap.get(nameProperty); + + if (!parsed) { + var rawRegions = this._parseToRegions(nameProperty); + + parsed = this._parsedMap.set(nameProperty, { + regions: rawRegions, + boundingRect: calculateBoundingRect(rawRegions) + }); + } + + var regionsMap = createHashMap(); + var finalRegions = []; + each(parsed.regions, function (region) { + var regionName = region.name; // Try use the alias in geoNameMap + + if (nameMap && hasOwn(nameMap, regionName)) { + region = region.cloneShallow(regionName = nameMap[regionName]); + } + + finalRegions.push(region); + regionsMap.set(regionName, region); + }); + return { + regions: finalRegions, + boundingRect: parsed.boundingRect || new BoundingRect(0, 0, 0, 0), + regionsMap: regionsMap + }; + }; + + GeoJSONResource.prototype._parseToRegions = function (nameProperty) { + var mapName = this._mapName; + var geoJSON = this._geoJSON; + var rawRegions; // https://jsperf.com/try-catch-performance-overhead + + try { + rawRegions = geoJSON ? parseGeoJSON(geoJSON, nameProperty) : []; + } catch (e) { + throw new Error('Invalid geoJson format\n' + e.message); + } + + fixNanhai(mapName, rawRegions); + each(rawRegions, function (region) { + var regionName = region.name; + fixTextCoords(mapName, region); + fixDiaoyuIsland(mapName, region); // Some area like Alaska in USA map needs to be tansformed + // to look better + + var specialArea = this._specialAreas && this._specialAreas[regionName]; + + if (specialArea) { + region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height); + } + }, this); + return rawRegions; + }; + /** + * Only for exporting to users. + * **MUST NOT** used internally. + */ + + + GeoJSONResource.prototype.getMapForUser = function () { + return { + // For backward compatibility, use geoJson + // PENDING: it has been returning them without clone. + // do we need to avoid outsite modification? + geoJson: this._geoJSON, + geoJSON: this._geoJSON, + specialAreas: this._specialAreas + }; + }; + + return GeoJSONResource; + }(); + + function calculateBoundingRect(regions) { + var rect; + + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(); + rect = rect || regionRect.clone(); + rect.union(regionRect); + } + + return rect; + } + + function parseInput(source) { + return !isString(source) ? source : typeof JSON !== 'undefined' && JSON.parse ? JSON.parse(source) : new Function('return (' + source + ');')(); + } + + var storage = createHashMap(); + var geoSourceManager = { + /** + * Compatible with previous `echarts.registerMap`. + * + * @usage + * ```js + * + * echarts.registerMap('USA', geoJson, specialAreas); + * + * echarts.registerMap('USA', { + * geoJson: geoJson, + * specialAreas: {...} + * }); + * echarts.registerMap('USA', { + * geoJSON: geoJson, + * specialAreas: {...} + * }); + * + * echarts.registerMap('airport', { + * svg: svg + * } + * ``` + * + * Note: + * Do not support that register multiple geoJSON or SVG + * one map name. Because different geoJSON and SVG have + * different unit. It's not easy to make sure how those + * units are mapping/normalize. + * If intending to use multiple geoJSON or SVG, we can + * use multiple geo coordinate system. + */ + registerMap: function (mapName, rawDef, rawSpecialAreas) { + if (rawDef.svg) { + var resource = new GeoSVGResource(mapName, rawDef.svg); + storage.set(mapName, resource); + } else { + // Recommend: + // echarts.registerMap('eu', { geoJSON: xxx, specialAreas: xxx }); + // Backward compatibility: + // echarts.registerMap('eu', geoJSON, specialAreas); + // echarts.registerMap('eu', { geoJson: xxx, specialAreas: xxx }); + var geoJSON = rawDef.geoJson || rawDef.geoJSON; + + if (geoJSON && !rawDef.features) { + rawSpecialAreas = rawDef.specialAreas; + } else { + geoJSON = rawDef; + } + + var resource = new GeoJSONResource(mapName, geoJSON, rawSpecialAreas); + storage.set(mapName, resource); + } + }, + getGeoResource: function (mapName) { + return storage.get(mapName); + }, + + /** + * Only for exporting to users. + * **MUST NOT** used internally. + */ + getMapForUser: function (mapName) { + var resource = storage.get(mapName); // Do not support return SVG until some real requirement come. + + return resource && resource.type === 'geoJSON' && resource.getMapForUser(); + }, + load: function (mapName, nameMap, nameProperty) { + var resource = storage.get(mapName); + + if (!resource) { + if ("development" !== 'production') { + console.error('Map ' + mapName + ' not exists. The GeoJSON of the map must be provided.'); + } + + return; + } + + return resource.load(nameMap, nameProperty); + } + }; + + /** + * Only these tags enable use `itemStyle` if they are named in SVG. + * Other tags like might not suitable for `itemStyle`. + * They will not be considered to be styled until some requirements come. + */ + + var OPTION_STYLE_ENABLED_TAGS = ['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path']; + var OPTION_STYLE_ENABLED_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS); + var STATE_TRIGGER_TAG_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g'])); + var LABEL_HOST_MAP = createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g'])); + var mapLabelRaw = makeInner(); + + function getFixedItemStyle(model) { + var itemStyle = model.getItemStyle(); + var areaColor = model.get('areaColor'); // If user want the color not to be changed when hover, + // they should both set areaColor and color to be null. + + if (areaColor != null) { + itemStyle.fill = areaColor; + } + + return itemStyle; + } // Only stroke can be used for line. + // Using fill in style if stroke not exits. + // TODO Not sure yet. Perhaps a separate `lineStyle`? + + + function fixLineStyle(styleHost) { + var style = styleHost.style; + + if (style) { + style.stroke = style.stroke || style.fill; + style.fill = null; + } + } + + var MapDraw = + /** @class */ + function () { + function MapDraw(api) { + var group = new Group(); + this.uid = getUID('ec_map_draw'); + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: group + }; + this.group = group; + group.add(this._regionsGroup = new Group()); + group.add(this._svgGroup = new Group()); + } + + MapDraw.prototype.draw = function (mapOrGeoModel, ecModel, api, fromView, payload) { + var isGeo = mapOrGeoModel.mainType === 'geo'; // Map series has data. GEO model that controlled by map series + // will be assigned with map data. Other GEO model has no data. + + var data = mapOrGeoModel.getData && mapOrGeoModel.getData(); + isGeo && ecModel.eachComponent({ + mainType: 'series', + subType: 'map' + }, function (mapSeries) { + if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) { + data = mapSeries.getData(); + } + }); + var geo = mapOrGeoModel.coordinateSystem; + var regionsGroup = this._regionsGroup; + var group = this.group; + var transformInfo = geo.getTransformInfo(); + var transformInfoRaw = transformInfo.raw; + var transformInfoRoam = transformInfo.roam; // No animation when first draw or in action + + var isFirstDraw = !regionsGroup.childAt(0) || payload; + + if (isFirstDraw) { + group.x = transformInfoRoam.x; + group.y = transformInfoRoam.y; + group.scaleX = transformInfoRoam.scaleX; + group.scaleY = transformInfoRoam.scaleY; + group.dirty(); + } else { + updateProps(group, transformInfoRoam, mapOrGeoModel); + } + + var isVisualEncodedByVisualMap = data && data.getVisual('visualMeta') && data.getVisual('visualMeta').length > 0; + var viewBuildCtx = { + api: api, + geo: geo, + mapOrGeoModel: mapOrGeoModel, + data: data, + isVisualEncodedByVisualMap: isVisualEncodedByVisualMap, + isGeo: isGeo, + transformInfoRaw: transformInfoRaw + }; + + if (geo.resourceType === 'geoJSON') { + this._buildGeoJSON(viewBuildCtx); + } else if (geo.resourceType === 'geoSVG') { + this._buildSVG(viewBuildCtx); + } + + this._updateController(mapOrGeoModel, ecModel, api); + + this._updateMapSelectHandler(mapOrGeoModel, regionsGroup, api, fromView); + }; + + MapDraw.prototype._buildGeoJSON = function (viewBuildCtx) { + var regionsGroupByName = this._regionsGroupByName = createHashMap(); + var regionsInfoByName = createHashMap(); + var regionsGroup = this._regionsGroup; + var transformInfoRaw = viewBuildCtx.transformInfoRaw; + var mapOrGeoModel = viewBuildCtx.mapOrGeoModel; + var data = viewBuildCtx.data; + var projection = viewBuildCtx.geo.projection; + var projectionStream = projection && projection.stream; + + function transformPoint(point, project) { + if (project) { + // projection may return null point. + point = project(point); + } + + return point && [point[0] * transformInfoRaw.scaleX + transformInfoRaw.x, point[1] * transformInfoRaw.scaleY + transformInfoRaw.y]; + } + + function transformPolygonPoints(inPoints) { + var outPoints = []; // If projectionStream is provided. Use it instead of single point project. + + var project = !projectionStream && projection && projection.project; + + for (var i = 0; i < inPoints.length; ++i) { + var newPt = transformPoint(inPoints[i], project); + newPt && outPoints.push(newPt); + } + + return outPoints; + } + + function getPolyShape(points) { + return { + shape: { + points: transformPolygonPoints(points) + } + }; + } + + regionsGroup.removeAll(); // Only when the resource is GeoJSON, there is `geo.regions`. + + each(viewBuildCtx.geo.regions, function (region) { + var regionName = region.name; // Consider in GeoJson properties.name may be duplicated, for example, + // there is multiple region named "United Kindom" or "France" (so many + // colonies). And it is not appropriate to merge them in geo, which + // will make them share the same label and bring trouble in label + // location calculation. + + var regionGroup = regionsGroupByName.get(regionName); + + var _a = regionsInfoByName.get(regionName) || {}, + dataIdx = _a.dataIdx, + regionModel = _a.regionModel; + + if (!regionGroup) { + regionGroup = regionsGroupByName.set(regionName, new Group()); + regionsGroup.add(regionGroup); + dataIdx = data ? data.indexOfName(regionName) : null; + regionModel = viewBuildCtx.isGeo ? mapOrGeoModel.getRegionModel(regionName) : data ? data.getItemModel(dataIdx) : null; + regionsInfoByName.set(regionName, { + dataIdx: dataIdx, + regionModel: regionModel + }); + } + + var polygonSubpaths = []; + var polylineSubpaths = []; + each(region.geometries, function (geometry) { + // Polygon and MultiPolygon + if (geometry.type === 'polygon') { + var polys = [geometry.exterior].concat(geometry.interiors || []); + + if (projectionStream) { + polys = projectPolys(polys, projectionStream); + } + + each(polys, function (poly) { + polygonSubpaths.push(new Polygon(getPolyShape(poly))); + }); + } // LineString and MultiLineString + else { + var points = geometry.points; + + if (projectionStream) { + points = projectPolys(points, projectionStream, true); + } + + each(points, function (points) { + polylineSubpaths.push(new Polyline(getPolyShape(points))); + }); + } + }); + var centerPt = transformPoint(region.getCenter(), projection && projection.project); + + function createCompoundPath(subpaths, isLine) { + if (!subpaths.length) { + return; + } + + var compoundPath = new CompoundPath({ + culling: true, + segmentIgnoreThreshold: 1, + shape: { + paths: subpaths + } + }); + regionGroup.add(compoundPath); + applyOptionStyleForRegion(viewBuildCtx, compoundPath, dataIdx, regionModel); + resetLabelForRegion(viewBuildCtx, compoundPath, regionName, regionModel, mapOrGeoModel, dataIdx, centerPt); + + if (isLine) { + fixLineStyle(compoundPath); + each(compoundPath.states, fixLineStyle); + } + } + + createCompoundPath(polygonSubpaths); + createCompoundPath(polylineSubpaths, true); + }); // Ensure children have been added to `regionGroup` before calling them. + + regionsGroupByName.each(function (regionGroup, regionName) { + var _a = regionsInfoByName.get(regionName), + dataIdx = _a.dataIdx, + regionModel = _a.regionModel; + + resetEventTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel, dataIdx); + resetTooltipForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel); + resetStateTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel); + }, this); + }; + + MapDraw.prototype._buildSVG = function (viewBuildCtx) { + var mapName = viewBuildCtx.geo.map; + var transformInfoRaw = viewBuildCtx.transformInfoRaw; + this._svgGroup.x = transformInfoRaw.x; + this._svgGroup.y = transformInfoRaw.y; + this._svgGroup.scaleX = transformInfoRaw.scaleX; + this._svgGroup.scaleY = transformInfoRaw.scaleY; + + if (this._svgResourceChanged(mapName)) { + this._freeSVG(); + + this._useSVG(mapName); + } + + var svgDispatcherMap = this._svgDispatcherMap = createHashMap(); + var focusSelf = false; + each(this._svgGraphicRecord.named, function (namedItem) { + // Note that we also allow different elements have the same name. + // For example, a glyph of a city and the label of the city have + // the same name and their tooltip info can be defined in a single + // region option. + var regionName = namedItem.name; + var mapOrGeoModel = viewBuildCtx.mapOrGeoModel; + var data = viewBuildCtx.data; + var svgNodeTagLower = namedItem.svgNodeTagLower; + var el = namedItem.el; + var dataIdx = data ? data.indexOfName(regionName) : null; + var regionModel = mapOrGeoModel.getRegionModel(regionName); + + if (OPTION_STYLE_ENABLED_TAG_MAP.get(svgNodeTagLower) != null && el instanceof Displayable) { + applyOptionStyleForRegion(viewBuildCtx, el, dataIdx, regionModel); + } + + if (el instanceof Displayable) { + el.culling = true; + } // We do not know how the SVG like so we'd better not to change z2. + // Otherwise it might bring some unexpected result. For example, + // an area hovered that make some inner city can not be clicked. + + + el.z2EmphasisLift = 0; // If self named: + + if (!namedItem.namedFrom) { + // label should batter to be displayed based on the center of + // if it is named rather than displayed on each child. + if (LABEL_HOST_MAP.get(svgNodeTagLower) != null) { + resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx, null); + } + + resetEventTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx); + resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel); + + if (STATE_TRIGGER_TAG_MAP.get(svgNodeTagLower) != null) { + var focus_1 = resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel); + + if (focus_1 === 'self') { + focusSelf = true; + } + + var els = svgDispatcherMap.get(regionName) || svgDispatcherMap.set(regionName, []); + els.push(el); + } + } + }, this); + + this._enableBlurEntireSVG(focusSelf, viewBuildCtx); + }; + + MapDraw.prototype._enableBlurEntireSVG = function (focusSelf, viewBuildCtx) { + // It's a little complicated to support blurring the entire geoSVG in series-map. + // So do not suport it until some requirements come. + // At present, in series-map, only regions can be blurred. + if (focusSelf && viewBuildCtx.isGeo) { + var blurStyle = viewBuildCtx.mapOrGeoModel.getModel(['blur', 'itemStyle']).getItemStyle(); // Only suport `opacity` here. Because not sure that other props are suitable for + // all of the elements generated by SVG (especially for Text/TSpan/Image/... ). + + var opacity_1 = blurStyle.opacity; + + this._svgGraphicRecord.root.traverse(function (el) { + if (!el.isGroup) { + // PENDING: clear those settings to SVG elements when `_freeSVG`. + // (Currently it happen not to be needed.) + setDefaultStateProxy(el); + var style = el.ensureState('blur').style || {}; // Do not overwrite the region style that already set from region option. + + if (style.opacity == null && opacity_1 != null) { + style.opacity = opacity_1; + } // If `ensureState('blur').style = {}`, there will be default opacity. + // Enable `stateTransition` (animation). + + + el.ensureState('emphasis'); + } + }); + } + }; + + MapDraw.prototype.remove = function () { + this._regionsGroup.removeAll(); + + this._regionsGroupByName = null; + + this._svgGroup.removeAll(); + + this._freeSVG(); + + this._controller.dispose(); + + this._controllerHost = null; + }; + + MapDraw.prototype.findHighDownDispatchers = function (name, geoModel) { + if (name == null) { + return []; + } + + var geo = geoModel.coordinateSystem; + + if (geo.resourceType === 'geoJSON') { + var regionsGroupByName = this._regionsGroupByName; + + if (regionsGroupByName) { + var regionGroup = regionsGroupByName.get(name); + return regionGroup ? [regionGroup] : []; + } + } else if (geo.resourceType === 'geoSVG') { + return this._svgDispatcherMap && this._svgDispatcherMap.get(name) || []; + } + }; + + MapDraw.prototype._svgResourceChanged = function (mapName) { + return this._svgMapName !== mapName; + }; + + MapDraw.prototype._useSVG = function (mapName) { + var resource = geoSourceManager.getGeoResource(mapName); + + if (resource && resource.type === 'geoSVG') { + var svgGraphic = resource.useGraphic(this.uid); + + this._svgGroup.add(svgGraphic.root); + + this._svgGraphicRecord = svgGraphic; + this._svgMapName = mapName; + } + }; + + MapDraw.prototype._freeSVG = function () { + var mapName = this._svgMapName; + + if (mapName == null) { + return; + } + + var resource = geoSourceManager.getGeoResource(mapName); + + if (resource && resource.type === 'geoSVG') { + resource.freeGraphic(this.uid); + } + + this._svgGraphicRecord = null; + this._svgDispatcherMap = null; + + this._svgGroup.removeAll(); + + this._svgMapName = null; + }; + + MapDraw.prototype._updateController = function (mapOrGeoModel, ecModel, api) { + var geo = mapOrGeoModel.coordinateSystem; + var controller = this._controller; + var controllerHost = this._controllerHost; // @ts-ignore FIXME:TS + + controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit'); + controllerHost.zoom = geo.getZoom(); // roamType is will be set default true if it is null + // @ts-ignore FIXME:TS + + controller.enable(mapOrGeoModel.get('roam') || false); + var mainType = mapOrGeoModel.mainType; + + function makeActionBase() { + var action = { + type: 'geoRoam', + componentType: mainType + }; + action[mainType + 'Id'] = mapOrGeoModel.id; + return action; + } + + controller.off('pan').on('pan', function (e) { + this._mouseDownFlag = false; + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction(extend(makeActionBase(), { + dx: e.dx, + dy: e.dy, + animation: { + duration: 0 + } + })); + }, this); + controller.off('zoom').on('zoom', function (e) { + this._mouseDownFlag = false; + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction(extend(makeActionBase(), { + zoom: e.scale, + originX: e.originX, + originY: e.originY, + animation: { + duration: 0 + } + })); + }, this); + controller.setPointerChecker(function (e, x, y) { + return geo.containPoint([x, y]) && !onIrrelevantElement(e, api, mapOrGeoModel); + }); + }; + /** + * FIXME: this is a temporarily workaround. + * When `geoRoam` the elements need to be reset in `MapView['render']`, because the props like + * `ignore` might have been modified by `LabelManager`, and `LabelManager#addLabelsOfSeries` + * will subsequently cache `defaultAttr` like `ignore`. If do not do this reset, the modified + * props will have no chance to be restored. + * Note: this reset should be after `clearStates` in `renderSeries` becuase `useStates` in + * `renderSeries` will cache the modified `ignore` to `el._normalState`. + * TODO: + * Use clone/immutable in `LabelManager`? + */ + + + MapDraw.prototype.resetForLabelLayout = function () { + this.group.traverse(function (el) { + var label = el.getTextContent(); + + if (label) { + label.ignore = mapLabelRaw(label).ignore; + } + }); + }; + + MapDraw.prototype._updateMapSelectHandler = function (mapOrGeoModel, regionsGroup, api, fromView) { + var mapDraw = this; + regionsGroup.off('mousedown'); + regionsGroup.off('click'); // @ts-ignore FIXME:TS resolve type conflict + + if (mapOrGeoModel.get('selectedMode')) { + regionsGroup.on('mousedown', function () { + mapDraw._mouseDownFlag = true; + }); + regionsGroup.on('click', function (e) { + if (!mapDraw._mouseDownFlag) { + return; + } + + mapDraw._mouseDownFlag = false; + }); + } + }; + + return MapDraw; + }(); + + function applyOptionStyleForRegion(viewBuildCtx, el, dataIndex, regionModel) { + // All of the path are using `itemStyle`, becuase + // (1) Some SVG also use fill on polyline (The different between + // polyline and polygon is "open" or "close" but not fill or not). + // (2) For the common props like opacity, if some use itemStyle + // and some use `lineStyle`, it might confuse users. + // (3) Most SVG use , where can not detect wether draw a "line" + // or a filled shape, so use `itemStyle` for . + var normalStyleModel = regionModel.getModel('itemStyle'); + var emphasisStyleModel = regionModel.getModel(['emphasis', 'itemStyle']); + var blurStyleModel = regionModel.getModel(['blur', 'itemStyle']); + var selectStyleModel = regionModel.getModel(['select', 'itemStyle']); // NOTE: DONT use 'style' in visual when drawing map. + // This component is used for drawing underlying map for both geo component and map series. + + var normalStyle = getFixedItemStyle(normalStyleModel); + var emphasisStyle = getFixedItemStyle(emphasisStyleModel); + var selectStyle = getFixedItemStyle(selectStyleModel); + var blurStyle = getFixedItemStyle(blurStyleModel); // Update the itemStyle if has data visual + + var data = viewBuildCtx.data; + + if (data) { + // Only visual color of each item will be used. It can be encoded by visualMap + // But visual color of series is used in symbol drawing + // Visual color for each series is for the symbol draw + var style = data.getItemVisual(dataIndex, 'style'); + var decal = data.getItemVisual(dataIndex, 'decal'); + + if (viewBuildCtx.isVisualEncodedByVisualMap && style.fill) { + normalStyle.fill = style.fill; + } + + if (decal) { + normalStyle.decal = createOrUpdatePatternFromDecal(decal, viewBuildCtx.api); + } + } // SVG text, tspan and image can be named but not supporeted + // to be styled by region option yet. + + + el.setStyle(normalStyle); + el.style.strokeNoScale = true; + el.ensureState('emphasis').style = emphasisStyle; + el.ensureState('select').style = selectStyle; + el.ensureState('blur').style = blurStyle; // Enable blur + + setDefaultStateProxy(el); + } + + function resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, // Exist only if `viewBuildCtx.data` exists. + dataIdx, // If labelXY not provided, use `textConfig.position: 'inside'` + labelXY) { + var data = viewBuildCtx.data; + var isGeo = viewBuildCtx.isGeo; + var isDataNaN = data && isNaN(data.get(data.mapDimension('value'), dataIdx)); + var itemLayout = data && data.getItemLayout(dataIdx); // In the following cases label will be drawn + // 1. In map series and data value is NaN + // 2. In geo component + // 3. Region has no series legendIcon, which will be add a showLabel flag in mapSymbolLayout + + if (isGeo || isDataNaN || itemLayout && itemLayout.showLabel) { + var query = !isGeo ? dataIdx : regionName; + var labelFetcher = void 0; // Consider dataIdx not found. + + if (!data || dataIdx >= 0) { + labelFetcher = mapOrGeoModel; + } + + var specifiedTextOpt = labelXY ? { + normal: { + align: 'center', + verticalAlign: 'middle' + } + } : null; // Caveat: must be called after `setDefaultStateProxy(el);` called. + // because textContent will be assign with `el.stateProxy` inside. + + setLabelStyle(el, getLabelStatesModels(regionModel), { + labelFetcher: labelFetcher, + labelDataIndex: query, + defaultText: regionName + }, specifiedTextOpt); + var textEl = el.getTextContent(); + + if (textEl) { + mapLabelRaw(textEl).ignore = textEl.ignore; + + if (el.textConfig && labelXY) { + // Compute a relative offset based on the el bounding rect. + var rect = el.getBoundingRect().clone(); // Need to make sure the percent position base on the same rect in normal and + // emphasis state. Otherwise if using boundingRect of el, but the emphasis state + // has borderWidth (even 0.5px), the text position will be changed obviously + // if the position is very big like ['1234%', '1345%']. + + el.textConfig.layoutRect = rect; + el.textConfig.position = [(labelXY[0] - rect.x) / rect.width * 100 + '%', (labelXY[1] - rect.y) / rect.height * 100 + '%']; + } + } // PENDING: + // If labelLayout is enabled (test/label-layout.html), el.dataIndex should be specified. + // But el.dataIndex is also used to determine whether user event should be triggered, + // where el.seriesIndex or el.dataModel must be specified. At present for a single el + // there is not case that "only label layout enabled but user event disabled", so here + // we depends `resetEventTriggerForRegion` to do the job of setting `el.dataIndex`. + + + el.disableLabelAnimation = true; + } else { + el.removeTextContent(); + el.removeTextConfig(); + el.disableLabelAnimation = null; + } + } + + function resetEventTriggerForRegion(viewBuildCtx, eventTrigger, regionName, regionModel, mapOrGeoModel, // Exist only if `viewBuildCtx.data` exists. + dataIdx) { + // setItemGraphicEl, setHoverStyle after all polygons and labels + // are added to the rigionGroup + if (viewBuildCtx.data) { + // FIXME: when series-map use a SVG map, and there are duplicated name specified + // on different SVG elements, after `data.setItemGraphicEl(...)`: + // (1) all of them will be mounted with `dataIndex`, `seriesIndex`, so that tooltip + // can be triggered only mouse hover. That's correct. + // (2) only the last element will be kept in `data`, so that if trigger tooltip + // by `dispatchAction`, only the last one can be found and triggered. That might be + // not correct. We will fix it in future if anyone demanding that. + viewBuildCtx.data.setItemGraphicEl(dataIdx, eventTrigger); + } // series-map will not trigger "geoselectchange" no matter it is + // based on a declared geo component. Becuause series-map will + // trigger "selectchange". If it trigger both the two events, + // If users call `chart.dispatchAction({type: 'toggleSelect'})`, + // it not easy to also fire event "geoselectchanged". + else { + // Package custom mouse event for geo component + getECData(eventTrigger).eventData = { + componentType: 'geo', + componentIndex: mapOrGeoModel.componentIndex, + geoIndex: mapOrGeoModel.componentIndex, + name: regionName, + region: regionModel && regionModel.option || {} + }; + } + } + + function resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) { + if (!viewBuildCtx.data) { + setTooltipConfig({ + el: el, + componentModel: mapOrGeoModel, + itemName: regionName, + // @ts-ignore FIXME:TS fix the "compatible with each other"? + itemTooltipOption: regionModel.get('tooltip') + }); + } + } + + function resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) { + // @ts-ignore FIXME:TS fix the "compatible with each other"? + el.highDownSilentOnTouch = !!mapOrGeoModel.get('selectedMode'); // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var emphasisModel = regionModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(el, focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + + if (viewBuildCtx.isGeo) { + enableComponentHighDownFeatures(el, mapOrGeoModel, regionName); + } + + return focus; + } + + function projectPolys(rings, // Polygons include exterior and interiors. Or polylines. + createStream, isLine) { + var polygons = []; + var curPoly; + + function startPolygon() { + curPoly = []; + } + + function endPolygon() { + if (curPoly.length) { + polygons.push(curPoly); + curPoly = []; + } + } + + var stream = createStream({ + polygonStart: startPolygon, + polygonEnd: endPolygon, + lineStart: startPolygon, + lineEnd: endPolygon, + point: function (x, y) { + // May have NaN values from stream. + if (isFinite(x) && isFinite(y)) { + curPoly.push([x, y]); + } + }, + sphere: function () { + } + }); + !isLine && stream.polygonStart(); + each(rings, function (ring) { + stream.lineStart(); + + for (var i = 0; i < ring.length; i++) { + stream.point(ring[i][0], ring[i][1]); + } + + stream.lineEnd(); + }); + !isLine && stream.polygonEnd(); + return polygons; + } + + // @ts-ignore FIXME:TS fix the "compatible with each other"? + + var MapView = + /** @class */ + function (_super) { + __extends(MapView, _super); + + function MapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MapView.type; + return _this; + } + + MapView.prototype.render = function (mapModel, ecModel, api, payload) { + // Not render if it is an toggleSelect action from self + if (payload && payload.type === 'mapToggleSelect' && payload.from === this.uid) { + return; + } + + var group = this.group; + group.removeAll(); + + if (mapModel.getHostGeoModel()) { + return; + } + + if (this._mapDraw && payload && payload.type === 'geoRoam') { + this._mapDraw.resetForLabelLayout(); + } // Not update map if it is an roam action from self + + + if (!(payload && payload.type === 'geoRoam' && payload.componentType === 'series' && payload.seriesId === mapModel.id)) { + if (mapModel.needsDrawMap) { + var mapDraw = this._mapDraw || new MapDraw(api); + group.add(mapDraw.group); + mapDraw.draw(mapModel, ecModel, api, this, payload); + this._mapDraw = mapDraw; + } else { + // Remove drawed map + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + } + } else { + var mapDraw = this._mapDraw; + mapDraw && group.add(mapDraw.group); + } + + mapModel.get('showLegendSymbol') && ecModel.getComponent('legend') && this._renderSymbols(mapModel, ecModel, api); + }; + + MapView.prototype.remove = function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + this.group.removeAll(); + }; + + MapView.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + }; + + MapView.prototype._renderSymbols = function (mapModel, ecModel, api) { + var originalData = mapModel.originalData; + var group = this.group; + originalData.each(originalData.mapDimension('value'), function (value, originalDataIndex) { + if (isNaN(value)) { + return; + } + + var layout = originalData.getItemLayout(originalDataIndex); + + if (!layout || !layout.point) { + // Not exists in map + return; + } + + var point = layout.point; + var offset = layout.offset; + var circle = new Circle({ + style: { + // Because the special of map draw. + // Which needs statistic of multiple series and draw on one map. + // And each series also need a symbol with legend color + // + // Layout and visual are put one the different data + // TODO + fill: mapModel.getData().getVisual('style').fill + }, + shape: { + cx: point[0] + offset * 9, + cy: point[1], + r: 3 + }, + silent: true, + // Do not overlap the first series, on which labels are displayed. + z2: 8 + (!offset ? Z2_EMPHASIS_LIFT + 1 : 0) + }); // Only the series that has the first value on the same region is in charge of rendering the label. + // But consider the case: + // series: [ + // {id: 'X', type: 'map', map: 'm', {data: [{name: 'A', value: 11}, {name: 'B', {value: 22}]}, + // {id: 'Y', type: 'map', map: 'm', {data: [{name: 'A', value: 21}, {name: 'C', {value: 33}]} + // ] + // The offset `0` of item `A` is at series `X`, but of item `C` is at series `Y`. + // For backward compatibility, we follow the rule that render label `A` by the + // settings on series `X` but render label `C` by the settings on series `Y`. + + if (!offset) { + var fullData = mapModel.mainSeries.getData(); + var name_1 = originalData.getName(originalDataIndex); + var fullIndex_1 = fullData.indexOfName(name_1); + var itemModel = originalData.getItemModel(originalDataIndex); + var labelModel = itemModel.getModel('label'); + var regionGroup = fullData.getItemGraphicEl(fullIndex_1); // `getFormattedLabel` needs to use `getData` inside. Here + // `mapModel.getData()` is shallow cloned from `mainSeries.getData()`. + // FIXME + // If this is not the `mainSeries`, the item model (like label formatter) + // set on original data item will never get. But it has been working + // like that from the begining, and this scenario is rarely encountered. + // So it won't be fixed until have to. + + setLabelStyle(circle, getLabelStatesModels(itemModel), { + labelFetcher: { + getFormattedLabel: function (idx, state) { + return mapModel.getFormattedLabel(fullIndex_1, state); + } + }, + defaultText: name_1 + }); + circle.disableLabelAnimation = true; + + if (!labelModel.get('position')) { + circle.setTextConfig({ + position: 'bottom' + }); + } + + regionGroup.onHoverStateChange = function (toState) { + setStatesFlag(circle, toState); + }; + } + + group.add(circle); + }); + }; + + MapView.type = 'map'; + return MapView; + }(ChartView); + + var MapSeries = + /** @class */ + function (_super) { + __extends(MapSeries, _super); + + function MapSeries() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MapSeries.type; // Only first map series of same mapType will drawMap. + + _this.needsDrawMap = false; // Group of all map series with same mapType + + _this.seriesGroup = []; + + _this.getTooltipPosition = function (dataIndex) { + if (dataIndex != null) { + var name_1 = this.getData().getName(dataIndex); + var geo = this.coordinateSystem; + var region = geo.getRegion(name_1); + return region && geo.dataToPoint(region.getCenter()); + } + }; + + return _this; + } + + MapSeries.prototype.getInitialData = function (option) { + var data = createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + var dataNameMap = createHashMap(); + var toAppendNames = []; + + for (var i = 0, len = data.count(); i < len; i++) { + var name_2 = data.getName(i); + dataNameMap.set(name_2, true); + } + + var geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap, this.option.nameProperty); + each(geoSource.regions, function (region) { + var name = region.name; + + if (!dataNameMap.get(name)) { + toAppendNames.push(name); + } + }); // Complete data with missing regions. The consequent processes (like visual + // map and render) can not be performed without a "full data". For example, + // find `dataIndex` by name. + + data.appendValues([], toAppendNames); + return data; + }; + /** + * If no host geo model, return null, which means using a + * inner exclusive geo model. + */ + + + MapSeries.prototype.getHostGeoModel = function () { + var geoIndex = this.option.geoIndex; + return geoIndex != null ? this.ecModel.getComponent('geo', geoIndex) : null; + }; + + MapSeries.prototype.getMapType = function () { + return (this.getHostGeoModel() || this).option.map; + }; // _fillOption(option, mapName) { + // Shallow clone + // option = zrUtil.extend({}, option); + // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap); + // return option; + // } + + + MapSeries.prototype.getRawValue = function (dataIndex) { + // Use value stored in data instead because it is calculated from multiple series + // FIXME Provide all value of multiple series ? + var data = this.getData(); + return data.get(data.mapDimension('value'), dataIndex); + }; + /** + * Get model of region + */ + + + MapSeries.prototype.getRegionModel = function (regionName) { + var data = this.getData(); + return data.getItemModel(data.indexOfName(regionName)); + }; + /** + * Map tooltip formatter + */ + + + MapSeries.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + // FIXME orignalData and data is a bit confusing + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var name = data.getName(dataIndex); + var seriesGroup = this.seriesGroup; + var seriesNames = []; + + for (var i = 0; i < seriesGroup.length; i++) { + var otherIndex = seriesGroup[i].originalData.indexOfName(name); + var valueDim = data.mapDimension('value'); + + if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) { + seriesNames.push(seriesGroup[i].name); + } + } + + return createTooltipMarkup('section', { + header: seriesNames.join(', '), + noHeader: !seriesNames.length, + blocks: [createTooltipMarkup('nameValue', { + name: name, + value: value + })] + }); + }; + + MapSeries.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + MapSeries.prototype.setCenter = function (center) { + this.option.center = center; + }; + + MapSeries.prototype.getLegendIcon = function (opt) { + var iconType = opt.icon || 'roundRect'; + var icon = createSymbol(iconType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill); + icon.setStyle(opt.itemStyle); // Map do not use itemStyle.borderWidth as border width + + icon.style.stroke = 'none'; // No rotation because no series visual symbol for map + + if (iconType.indexOf('empty') > -1) { + icon.style.stroke = icon.style.fill; + icon.style.fill = '#fff'; + icon.style.lineWidth = 2; + } + + return icon; + }; + + MapSeries.type = 'series.map'; + MapSeries.dependencies = ['geo']; + MapSeries.layoutMode = 'box'; + MapSeries.defaultOption = { + // 一级层叠 + // zlevel: 0, + // 二级层叠 + z: 2, + coordinateSystem: 'geo', + // map should be explicitly specified since ec3. + map: '', + // If `geoIndex` is not specified, a exclusive geo will be + // created. Otherwise use the specified geo component, and + // `map` and `mapType` are ignored. + // geoIndex: 0, + // 'center' | 'left' | 'right' | 'x%' | {number} + left: 'center', + // 'center' | 'top' | 'bottom' | 'x%' | {number} + top: 'center', + // right + // bottom + // width: + // height + // Aspect is width / height. Inited to be geoJson bbox aspect + // This parameter is used for scale this aspect + // Default value: + // for geoSVG source: 1, + // for geoJSON source: 0.75. + aspectScale: null, + ///// Layout with center and size + // If you wan't to put map in a fixed size box with right aspect ratio + // This two properties may more conveninet + // layoutCenter: [50%, 50%] + // layoutSize: 100 + showLegendSymbol: true, + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ], + // higher priority than center and zoom + boundingCoords: null, + // Default on center of map + center: null, + zoom: 1, + scaleLimit: null, + selectedMode: true, + label: { + show: false, + color: '#000' + }, + // scaleLimit: null, + itemStyle: { + borderWidth: 0.5, + borderColor: '#444', + areaColor: '#eee' + }, + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + areaColor: 'rgba(255,215,0,0.8)' + } + }, + select: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + nameProperty: 'name' + }; + return MapSeries; + }(SeriesModel); + + function dataStatistics(datas, statisticType) { + var dataNameMap = {}; + each(datas, function (data) { + data.each(data.mapDimension('value'), function (value, idx) { + // Add prefix to avoid conflict with Object.prototype. + var mapKey = 'ec-' + data.getName(idx); + dataNameMap[mapKey] = dataNameMap[mapKey] || []; + + if (!isNaN(value)) { + dataNameMap[mapKey].push(value); + } + }); + }); + return datas[0].map(datas[0].mapDimension('value'), function (value, idx) { + var mapKey = 'ec-' + datas[0].getName(idx); + var sum = 0; + var min = Infinity; + var max = -Infinity; + var len = dataNameMap[mapKey].length; + + for (var i = 0; i < len; i++) { + min = Math.min(min, dataNameMap[mapKey][i]); + max = Math.max(max, dataNameMap[mapKey][i]); + sum += dataNameMap[mapKey][i]; + } + + var result; + + if (statisticType === 'min') { + result = min; + } else if (statisticType === 'max') { + result = max; + } else if (statisticType === 'average') { + result = sum / len; + } else { + result = sum; + } + + return len === 0 ? NaN : result; + }); + } + + function mapDataStatistic(ecModel) { + var seriesGroups = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + var hostGeoModel = seriesModel.getHostGeoModel(); + var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType(); + (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel); + }); + each(seriesGroups, function (seriesList, key) { + var data = dataStatistics(map(seriesList, function (seriesModel) { + return seriesModel.getData(); + }), seriesList[0].get('mapValueCalculation')); + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].originalData = seriesList[i].getData(); + } // FIXME Put where? + + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].seriesGroup = seriesList; + seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel(); + seriesList[i].setData(data.cloneShallow()); + seriesList[i].mainSeries = seriesList[0]; + } + }); + } + + function mapSymbolLayout(ecModel) { + var processedMapType = {}; + ecModel.eachSeriesByType('map', function (mapSeries) { + var mapType = mapSeries.getMapType(); + + if (mapSeries.getHostGeoModel() || processedMapType[mapType]) { + return; + } + + var mapSymbolOffsets = {}; + each(mapSeries.seriesGroup, function (subMapSeries) { + var geo = subMapSeries.coordinateSystem; + var data = subMapSeries.originalData; + + if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) { + data.each(data.mapDimension('value'), function (value, idx) { + var name = data.getName(idx); + var region = geo.getRegion(name); // If input series.data is [11, 22, '-'/null/undefined, 44], + // it will be filled with NaN: [11, 22, NaN, 44] and NaN will + // not be drawn. So here must validate if value is NaN. + + if (!region || isNaN(value)) { + return; + } + + var offset = mapSymbolOffsets[name] || 0; + var point = geo.dataToPoint(region.getCenter()); + mapSymbolOffsets[name] = offset + 1; + data.setItemLayout(idx, { + point: point, + offset: offset + }); + }); + } + }); // Show label of those region not has legendIcon (which is offset 0) + + var data = mapSeries.getData(); + data.each(function (idx) { + var name = data.getName(idx); + var layout = data.getItemLayout(idx) || {}; + layout.showLabel = !mapSymbolOffsets[name]; + data.setItemLayout(idx, layout); + }); + processedMapType[mapType] = true; + }); + } + + var v2ApplyTransform = applyTransform; + + var View = + /** @class */ + function (_super) { + __extends(View, _super); + + function View(name) { + var _this = _super.call(this) || this; + + _this.type = 'view'; + _this.dimensions = ['x', 'y']; + /** + * Represents the transform brought by roam/zoom. + * If `View['_viewRect']` applies roam transform, + * we can get the final displayed rect. + */ + + _this._roamTransformable = new Transformable(); + /** + * Represents the transform from `View['_rect']` to `View['_viewRect']`. + */ + + _this._rawTransformable = new Transformable(); + _this.name = name; + return _this; + } + + View.prototype.setBoundingRect = function (x, y, width, height) { + this._rect = new BoundingRect(x, y, width, height); + return this._rect; + }; + /** + * @return {module:zrender/core/BoundingRect} + */ + + + View.prototype.getBoundingRect = function () { + return this._rect; + }; + + View.prototype.setViewRect = function (x, y, width, height) { + this._transformTo(x, y, width, height); + + this._viewRect = new BoundingRect(x, y, width, height); + }; + /** + * Transformed to particular position and size + */ + + + View.prototype._transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var rawTransform = this._rawTransformable; + rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); + var rawParent = rawTransform.parent; + rawTransform.parent = null; + rawTransform.decomposeTransform(); + rawTransform.parent = rawParent; + + this._updateTransform(); + }; + /** + * Set center of view + */ + + + View.prototype.setCenter = function (centerCoord) { + if (!centerCoord) { + return; + } + + this._center = centerCoord; + + this._updateCenterAndZoom(); + }; + + View.prototype.setZoom = function (zoom) { + zoom = zoom || 1; + var zoomLimit = this.zoomLimit; + + if (zoomLimit) { + if (zoomLimit.max != null) { + zoom = Math.min(zoomLimit.max, zoom); + } + + if (zoomLimit.min != null) { + zoom = Math.max(zoomLimit.min, zoom); + } + } + + this._zoom = zoom; + + this._updateCenterAndZoom(); + }; + /** + * Get default center without roam + */ + + + View.prototype.getDefaultCenter = function () { + // Rect before any transform + var rawRect = this.getBoundingRect(); + var cx = rawRect.x + rawRect.width / 2; + var cy = rawRect.y + rawRect.height / 2; + return [cx, cy]; + }; + + View.prototype.getCenter = function () { + return this._center || this.getDefaultCenter(); + }; + + View.prototype.getZoom = function () { + return this._zoom || 1; + }; + + View.prototype.getRoamTransform = function () { + return this._roamTransformable.getLocalTransform(); + }; + /** + * Remove roam + */ + + + View.prototype._updateCenterAndZoom = function () { + // Must update after view transform updated + var rawTransformMatrix = this._rawTransformable.getLocalTransform(); + + var roamTransform = this._roamTransformable; + var defaultCenter = this.getDefaultCenter(); + var center = this.getCenter(); + var zoom = this.getZoom(); + center = applyTransform([], center, rawTransformMatrix); + defaultCenter = applyTransform([], defaultCenter, rawTransformMatrix); + roamTransform.originX = center[0]; + roamTransform.originY = center[1]; + roamTransform.x = defaultCenter[0] - center[0]; + roamTransform.y = defaultCenter[1] - center[1]; + roamTransform.scaleX = roamTransform.scaleY = zoom; + + this._updateTransform(); + }; + /** + * Update transform props on `this` based on the current + * `this._roamTransformable` and `this._rawTransformable`. + */ + + + View.prototype._updateTransform = function () { + var roamTransformable = this._roamTransformable; + var rawTransformable = this._rawTransformable; + rawTransformable.parent = roamTransformable; + roamTransformable.updateTransform(); + rawTransformable.updateTransform(); + copy$1(this.transform || (this.transform = []), rawTransformable.transform || create$1()); + this._rawTransform = rawTransformable.getLocalTransform(); + this.invTransform = this.invTransform || []; + invert(this.invTransform, this.transform); + this.decomposeTransform(); + }; + + View.prototype.getTransformInfo = function () { + var rawTransformable = this._rawTransformable; + var roamTransformable = this._roamTransformable; // Becuase roamTransformabel has `originX/originY` modified, + // but the caller of `getTransformInfo` can not handle `originX/originY`, + // so need to recalcualte them. + + var dummyTransformable = new Transformable(); + dummyTransformable.transform = roamTransformable.transform; + dummyTransformable.decomposeTransform(); + return { + roam: { + x: dummyTransformable.x, + y: dummyTransformable.y, + scaleX: dummyTransformable.scaleX, + scaleY: dummyTransformable.scaleY + }, + raw: { + x: rawTransformable.x, + y: rawTransformable.y, + scaleX: rawTransformable.scaleX, + scaleY: rawTransformable.scaleY + } + }; + }; + + View.prototype.getViewRect = function () { + return this._viewRect; + }; + /** + * Get view rect after roam transform + */ + + + View.prototype.getViewRectAfterRoam = function () { + var rect = this.getBoundingRect().clone(); + rect.applyTransform(this.transform); + return rect; + }; + /** + * Convert a single (lon, lat) data item to (x, y) point. + */ + + + View.prototype.dataToPoint = function (data, noRoam, out) { + var transform = noRoam ? this._rawTransform : this.transform; + out = out || []; + return transform ? v2ApplyTransform(out, data, transform) : copy(out, data); + }; + /** + * Convert a (x, y) point to (lon, lat) data + */ + + + View.prototype.pointToData = function (point) { + var invTransform = this.invTransform; + return invTransform ? v2ApplyTransform([], point, invTransform) : [point[0], point[1]]; + }; + + View.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + View.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + /** + * @implements + */ + + + View.prototype.containPoint = function (point) { + return this.getViewRectAfterRoam().contain(point[0], point[1]); + }; + + View.dimensions = ['x', 'y']; + return View; + }(Transformable); + + function getCoordSys(finder) { + var seriesModel = finder.seriesModel; + return seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph. + } + + var GEO_DEFAULT_PARAMS = { + 'geoJSON': { + aspectScale: 0.75, + invertLongitute: true + }, + 'geoSVG': { + aspectScale: 1, + invertLongitute: false + } + }; + var geo2DDimensions = ['lng', 'lat']; + + var Geo = + /** @class */ + function (_super) { + __extends(Geo, _super); + + function Geo(name, map, opt) { + var _this = _super.call(this, name) || this; + + _this.dimensions = geo2DDimensions; + _this.type = 'geo'; // Only store specified name coord via `addGeoCoord`. + + _this._nameCoordMap = createHashMap(); + _this.map = map; + var projection = opt.projection; + var source = geoSourceManager.load(map, opt.nameMap, opt.nameProperty); + var resource = geoSourceManager.getGeoResource(map); + var resourceType = _this.resourceType = resource ? resource.type : null; + var regions = _this.regions = source.regions; + var defaultParams = GEO_DEFAULT_PARAMS[resource.type]; + _this._regionsMap = source.regionsMap; + _this.regions = source.regions; + + if ("development" !== 'production' && projection) { + // Do some check + if (resourceType === 'geoSVG') { + if ("development" !== 'production') { + warn("Map " + map + " with SVG source can't use projection. Only GeoJSON source supports projection."); + } + + projection = null; + } + + if (!(projection.project && projection.unproject)) { + if ("development" !== 'production') { + warn('project and unproject must be both provided in the projeciton.'); + } + + projection = null; + } + } + + _this.projection = projection; + var boundingRect; + + if (projection) { + // Can't reuse the raw bounding rect + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(projection); + boundingRect = boundingRect || regionRect.clone(); + boundingRect.union(regionRect); + } + } else { + boundingRect = source.boundingRect; + } + + _this.setBoundingRect(boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height); // aspectScale and invertLongitute actually is the parameters default raw projection. + // So we ignore them if projection is given. + // Ignore default aspect scale if projection exits. + + + _this.aspectScale = projection ? 1 : retrieve2(opt.aspectScale, defaultParams.aspectScale); // Not invert longitute if projection exits. + + _this._invertLongitute = projection ? false : defaultParams.invertLongitute; + return _this; + } + + Geo.prototype._transformTo = function (x, y, width, height) { + var rect = this.getBoundingRect(); + var invertLongitute = this._invertLongitute; + rect = rect.clone(); + + if (invertLongitute) { + // Longitute is inverted + rect.y = -rect.y - rect.height; + } + + var rawTransformable = this._rawTransformable; + rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height)); + var rawParent = rawTransformable.parent; + rawTransformable.parent = null; + rawTransformable.decomposeTransform(); + rawTransformable.parent = rawParent; + + if (invertLongitute) { + rawTransformable.scaleY = -rawTransformable.scaleY; + } + + this._updateTransform(); + }; + + Geo.prototype.getRegion = function (name) { + return this._regionsMap.get(name); + }; + + Geo.prototype.getRegionByCoord = function (coord) { + var regions = this.regions; + + for (var i = 0; i < regions.length; i++) { + var region = regions[i]; + + if (region.type === 'geoJSON' && region.contain(coord)) { + return regions[i]; + } + } + }; + /** + * Add geoCoord for indexing by name + */ + + + Geo.prototype.addGeoCoord = function (name, geoCoord) { + this._nameCoordMap.set(name, geoCoord); + }; + /** + * Get geoCoord by name + */ + + + Geo.prototype.getGeoCoord = function (name) { + var region = this._regionsMap.get(name); // calcualte center only on demand. + + + return this._nameCoordMap.get(name) || region && region.getCenter(); + }; + + Geo.prototype.dataToPoint = function (data, noRoam, out) { + if (isString(data)) { + // Map area name to geoCoord + data = this.getGeoCoord(data); + } + + if (data) { + var projection = this.projection; + + if (projection) { + // projection may return null point. + data = projection.project(data); + } + + return data && this.projectedToPoint(data); + } + }; + + Geo.prototype.pointToData = function (point) { + var projection = this.projection; + + if (projection) { + // projection may return null point. + point = projection.unproject(point); + } + + return point && this.pointToProjected(point); + }; + /** + * Point to projected data. Same with pointToData when projection is used. + */ + + + Geo.prototype.pointToProjected = function (point) { + return _super.prototype.pointToData.call(this, point); + }; + + Geo.prototype.projectedToPoint = function (projected, noRoam, out) { + return _super.prototype.dataToPoint.call(this, projected, noRoam, out); + }; + + Geo.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$1(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + Geo.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$1(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + + return Geo; + }(View); + mixin(Geo, View); + + function getCoordSys$1(finder) { + var geoModel = finder.geoModel; + var seriesModel = finder.seriesModel; + return geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem // For map series. + || (seriesModel.getReferringComponents('geo', SINGLE_REFERRING).models[0] || {}).coordinateSystem : null; + } + + /** + * Resize method bound to the geo + */ + + function resizeGeo(geoModel, api) { + var boundingCoords = geoModel.get('boundingCoords'); + + if (boundingCoords != null) { + var leftTop_1 = boundingCoords[0]; + var rightBottom_1 = boundingCoords[1]; + + if (!(isFinite(leftTop_1[0]) && isFinite(leftTop_1[1]) && isFinite(rightBottom_1[0]) && isFinite(rightBottom_1[1]))) { + if ("development" !== 'production') { + console.error('Invalid boundingCoords'); + } + } else { + // Sample around the lng/lat rect and use projection to calculate actual bounding rect. + var projection_1 = this.projection; + + if (projection_1) { + var xMin = leftTop_1[0]; + var yMin = leftTop_1[1]; + var xMax = rightBottom_1[0]; + var yMax = rightBottom_1[1]; + leftTop_1 = [Infinity, Infinity]; + rightBottom_1 = [-Infinity, -Infinity]; // TODO better way? + + var sampleLine = function (x0, y0, x1, y1) { + var dx = x1 - x0; + var dy = y1 - y0; + + for (var i = 0; i <= 100; i++) { + var p = i / 100; + var pt = projection_1.project([x0 + dx * p, y0 + dy * p]); + min(leftTop_1, leftTop_1, pt); + max(rightBottom_1, rightBottom_1, pt); + } + }; // Top + + + sampleLine(xMin, yMin, xMax, yMin); // Right + + sampleLine(xMax, yMin, xMax, yMax); // Bottom + + sampleLine(xMax, yMax, xMin, yMax); // Left + + sampleLine(xMin, yMax, xMax, yMin); + } + + this.setBoundingRect(leftTop_1[0], leftTop_1[1], rightBottom_1[0] - leftTop_1[0], rightBottom_1[1] - leftTop_1[1]); + } + } + + var rect = this.getBoundingRect(); + var centerOption = geoModel.get('layoutCenter'); + var sizeOption = geoModel.get('layoutSize'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var aspect = rect.width / rect.height * this.aspectScale; + var useCenterAndSize = false; + var center; + var size; + + if (centerOption && sizeOption) { + center = [parsePercent$1(centerOption[0], viewWidth), parsePercent$1(centerOption[1], viewHeight)]; + size = parsePercent$1(sizeOption, Math.min(viewWidth, viewHeight)); + + if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) { + useCenterAndSize = true; + } else { + if ("development" !== 'production') { + console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.'); + } + } + } + + var viewRect; + + if (useCenterAndSize) { + viewRect = {}; + + if (aspect > 1) { + // Width is same with size + viewRect.width = size; + viewRect.height = size / aspect; + } else { + viewRect.height = size; + viewRect.width = size * aspect; + } + + viewRect.y = center[1] - viewRect.height / 2; + viewRect.x = center[0] - viewRect.width / 2; + } else { + // Use left/top/width/height + var boxLayoutOption = geoModel.getBoxLayoutParams(); + boxLayoutOption.aspect = aspect; + viewRect = getLayoutRect(boxLayoutOption, { + width: viewWidth, + height: viewHeight + }); + } + + this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); + this.setCenter(geoModel.get('center')); + this.setZoom(geoModel.get('zoom')); + } // Back compat for ECharts2, where the coord map is set on map series: + // {type: 'map', geoCoord: {'cityA': [116.46,39.92], 'cityA': [119.12,24.61]}}, + + + function setGeoCoords(geo, model) { + each(model.get('geoCoord'), function (geoCoord, name) { + geo.addGeoCoord(name, geoCoord); + }); + } + + var GeoCreator = + /** @class */ + function () { + function GeoCreator() { + // For deciding which dimensions to use when creating list data + this.dimensions = geo2DDimensions; + } + + GeoCreator.prototype.create = function (ecModel, api) { + var geoList = []; + + function getCommonGeoProperties(model) { + return { + nameProperty: model.get('nameProperty'), + aspectScale: model.get('aspectScale'), + projection: model.get('projection') + }; + } // FIXME Create each time may be slow + + + ecModel.eachComponent('geo', function (geoModel, idx) { + var mapName = geoModel.get('map'); + var geo = new Geo(mapName + idx, mapName, extend({ + nameMap: geoModel.get('nameMap') + }, getCommonGeoProperties(geoModel))); + geo.zoomLimit = geoModel.get('scaleLimit'); + geoList.push(geo); // setGeoCoords(geo, geoModel); + + geoModel.coordinateSystem = geo; + geo.model = geoModel; // Inject resize method + + geo.resize = resizeGeo; + geo.resize(geoModel, api); + }); + ecModel.eachSeries(function (seriesModel) { + var coordSys = seriesModel.get('coordinateSystem'); + + if (coordSys === 'geo') { + var geoIndex = seriesModel.get('geoIndex') || 0; + seriesModel.coordinateSystem = geoList[geoIndex]; + } + }); // If has map series + + var mapModelGroupBySeries = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + if (!seriesModel.getHostGeoModel()) { + var mapType = seriesModel.getMapType(); + mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; + mapModelGroupBySeries[mapType].push(seriesModel); + } + }); + each(mapModelGroupBySeries, function (mapSeries, mapType) { + var nameMapList = map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('nameMap'); + }); + var geo = new Geo(mapType, mapType, extend({ + nameMap: mergeAll(nameMapList) + }, getCommonGeoProperties(mapSeries[0]))); + geo.zoomLimit = retrieve.apply(null, map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('scaleLimit'); + })); + geoList.push(geo); // Inject resize method + + geo.resize = resizeGeo; + geo.resize(mapSeries[0], api); + each(mapSeries, function (singleMapSeries) { + singleMapSeries.coordinateSystem = geo; + setGeoCoords(geo, singleMapSeries); + }); + }); + return geoList; + }; + /** + * Fill given regions array + */ + + + GeoCreator.prototype.getFilledRegions = function (originRegionArr, mapName, nameMap, nameProperty) { + // Not use the original + var regionsArr = (originRegionArr || []).slice(); + var dataNameMap = createHashMap(); + + for (var i = 0; i < regionsArr.length; i++) { + dataNameMap.set(regionsArr[i].name, regionsArr[i]); + } + + var source = geoSourceManager.load(mapName, nameMap, nameProperty); + each(source.regions, function (region) { + var name = region.name; + !dataNameMap.get(name) && regionsArr.push({ + name: name + }); + }); + return regionsArr; + }; + + return GeoCreator; + }(); + + var geoCreator = new GeoCreator(); + + var GeoModel = + /** @class */ + function (_super) { + __extends(GeoModel, _super); + + function GeoModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GeoModel.type; + return _this; + } + + GeoModel.prototype.init = function (option, parentModel, ecModel) { + var source = geoSourceManager.getGeoResource(option.map); + + if (source && source.type === 'geoJSON') { + var itemStyle = option.itemStyle = option.itemStyle || {}; + + if (!('color' in itemStyle)) { + itemStyle.color = '#eee'; + } + } + + this.mergeDefaultAndTheme(option, ecModel); // Default label emphasis `show` + + defaultEmphasis(option, 'label', ['show']); + }; + + GeoModel.prototype.optionUpdated = function () { + var _this = this; + + var option = this.option; + option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap, option.nameProperty); + var selectedMap = {}; + this._optionModelMap = reduce(option.regions || [], function (optionModelMap, regionOpt) { + var regionName = regionOpt.name; + + if (regionName) { + optionModelMap.set(regionName, new Model(regionOpt, _this, _this.ecModel)); + + if (regionOpt.selected) { + selectedMap[regionName] = true; + } + } + + return optionModelMap; + }, createHashMap()); + + if (!option.selectedMap) { + option.selectedMap = selectedMap; + } + }; + /** + * Get model of region. + */ + + + GeoModel.prototype.getRegionModel = function (name) { + return this._optionModelMap.get(name) || new Model(null, this, this.ecModel); + }; + /** + * Format label + * @param name Region name + */ + + + GeoModel.prototype.getFormattedLabel = function (name, status) { + var regionModel = this.getRegionModel(name); + var formatter = status === 'normal' ? regionModel.get(['label', 'formatter']) : regionModel.get(['emphasis', 'label', 'formatter']); + var params = { + name: name + }; + + if (isFunction(formatter)) { + params.status = status; + return formatter(params); + } else if (isString(formatter)) { + return formatter.replace('{a}', name != null ? name : ''); + } + }; + + GeoModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + GeoModel.prototype.setCenter = function (center) { + this.option.center = center; + }; // PENGING If selectedMode is null ? + + + GeoModel.prototype.select = function (name) { + var option = this.option; + var selectedMode = option.selectedMode; + + if (!selectedMode) { + return; + } + + if (selectedMode !== 'multiple') { + option.selectedMap = null; + } + + var selectedMap = option.selectedMap || (option.selectedMap = {}); + selectedMap[name] = true; + }; + + GeoModel.prototype.unSelect = function (name) { + var selectedMap = this.option.selectedMap; + + if (selectedMap) { + selectedMap[name] = false; + } + }; + + GeoModel.prototype.toggleSelected = function (name) { + this[this.isSelected(name) ? 'unSelect' : 'select'](name); + }; + + GeoModel.prototype.isSelected = function (name) { + var selectedMap = this.option.selectedMap; + return !!(selectedMap && selectedMap[name]); + }; + + GeoModel.type = 'geo'; + GeoModel.layoutMode = 'box'; + GeoModel.defaultOption = { + // zlevel: 0, + z: 0, + show: true, + left: 'center', + top: 'center', + // Default value: + // for geoSVG source: 1, + // for geoJSON source: 0.75. + aspectScale: null, + ///// Layout with center and size + // If you wan't to put map in a fixed size box with right aspect ratio + // This two properties may more conveninet + // layoutCenter: [50%, 50%] + // layoutSize: 100 + silent: false, + // Map type + map: '', + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ] + boundingCoords: null, + // Default on center of map + center: null, + zoom: 1, + scaleLimit: null, + // selectedMode: false + label: { + show: false, + color: '#000' + }, + itemStyle: { + borderWidth: 0.5, + borderColor: '#444' // Default color: + // + geoJSON: #eee + // + geoSVG: null (use SVG original `fill`) + // color: '#eee' + + }, + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + select: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + regions: [] // tooltip: { + // show: false + // } + + }; + return GeoModel; + }(ComponentModel); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function getCenterCoord(view, point) { + // Use projected coord as center because it's linear. + return view.pointToProjected ? view.pointToProjected(point) : view.pointToData(point); + } + + function updateCenterAndZoom(view, payload, zoomLimit) { + var previousZoom = view.getZoom(); + var center = view.getCenter(); + var zoom = payload.zoom; + var point = view.projectedToPoint ? view.projectedToPoint(center) : view.dataToPoint(center); + + if (payload.dx != null && payload.dy != null) { + point[0] -= payload.dx; + point[1] -= payload.dy; + view.setCenter(getCenterCoord(view, point)); + } + + if (zoom != null) { + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + zoom = Math.max(Math.min(previousZoom * zoom, zoomMax), zoomMin) / previousZoom; + } // Zoom on given point(originX, originY) + + + view.scaleX *= zoom; + view.scaleY *= zoom; + var fixX = (payload.originX - view.x) * (zoom - 1); + var fixY = (payload.originY - view.y) * (zoom - 1); + view.x -= fixX; + view.y -= fixY; + view.updateTransform(); // Get the new center + + view.setCenter(getCenterCoord(view, point)); + view.setZoom(zoom * previousZoom); + } + + return { + center: view.getCenter(), + zoom: view.getZoom() + }; + } + + var GeoView = + /** @class */ + function (_super) { + __extends(GeoView, _super); + + function GeoView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GeoView.type; + _this.focusBlurEnabled = true; + return _this; + } + + GeoView.prototype.init = function (ecModel, api) { + this._api = api; + }; + + GeoView.prototype.render = function (geoModel, ecModel, api, payload) { + this._model = geoModel; + + if (!geoModel.get('show')) { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + return; + } + + if (!this._mapDraw) { + this._mapDraw = new MapDraw(api); + } + + var mapDraw = this._mapDraw; + mapDraw.draw(geoModel, ecModel, api, this, payload); + mapDraw.group.on('click', this._handleRegionClick, this); + mapDraw.group.silent = geoModel.get('silent'); + this.group.add(mapDraw.group); + this.updateSelectStatus(geoModel, ecModel, api); + }; + + GeoView.prototype._handleRegionClick = function (e) { + var eventData; + findEventDispatcher(e.target, function (current) { + return (eventData = getECData(current).eventData) != null; + }, true); + + if (eventData) { + this._api.dispatchAction({ + type: 'geoToggleSelect', + geoId: this._model.id, + name: eventData.name + }); + } + }; + + GeoView.prototype.updateSelectStatus = function (model, ecModel, api) { + var _this = this; + + this._mapDraw.group.traverse(function (node) { + var eventData = getECData(node).eventData; + + if (eventData) { + _this._model.isSelected(eventData.name) ? api.enterSelect(node) : api.leaveSelect(node); // No need to traverse children. + + return true; + } + }); + }; + + GeoView.prototype.findHighDownDispatchers = function (name) { + return this._mapDraw && this._mapDraw.findHighDownDispatchers(name, this._model); + }; + + GeoView.prototype.dispose = function () { + this._mapDraw && this._mapDraw.remove(); + }; + + GeoView.type = 'geo'; + return GeoView; + }(ComponentView); + + function registerMap$1(mapName, geoJson, specialAreas) { + geoSourceManager.registerMap(mapName, geoJson, specialAreas); + } + + function install$9(registers) { + registers.registerCoordinateSystem('geo', geoCreator); + registers.registerComponentModel(GeoModel); + registers.registerComponentView(GeoView); + registers.registerImpl('registerMap', registerMap$1); + registers.registerImpl('getMap', function (mapName) { + return geoSourceManager.getMapForUser(mapName); + }); + + function makeAction(method, actionInfo) { + actionInfo.update = 'geo:updateSelectStatus'; + registers.registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + var allSelected = []; + ecModel.eachComponent({ + mainType: 'geo', + query: payload + }, function (geoModel) { + geoModel[method](payload.name); + var geo = geoModel.coordinateSystem; + each(geo.regions, function (region) { + selected[region.name] = geoModel.isSelected(region.name) || false; + }); // Notice: there might be duplicated name in different regions. + + var names = []; + each(selected, function (v, name) { + selected[name] && names.push(name); + }); + allSelected.push({ + geoIndex: geoModel.componentIndex, + // Use singular, the same naming convention as the event `selectchanged`. + name: names + }); + }); + return { + selected: selected, + allSelected: allSelected, + name: payload.name + }; + }); + } + + makeAction('toggleSelected', { + type: 'geoToggleSelect', + event: 'geoselectchanged' + }); + makeAction('select', { + type: 'geoSelect', + event: 'geoselected' + }); + makeAction('unSelect', { + type: 'geoUnSelect', + event: 'geounselected' + }); + /** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + registers.registerAction({ + type: 'geoRoam', + event: 'geoRoam', + update: 'updateTransform' + }, function (payload, ecModel) { + var componentType = payload.componentType || 'series'; + ecModel.eachComponent({ + mainType: componentType, + query: payload + }, function (componentModel) { + var geo = componentModel.coordinateSystem; + + if (geo.type !== 'geo') { + return; + } + + var res = updateCenterAndZoom(geo, payload, componentModel.get('scaleLimit')); + componentModel.setCenter && componentModel.setCenter(res.center); + componentModel.setZoom && componentModel.setZoom(res.zoom); // All map series with same `map` use the same geo coordinate system + // So the center and zoom must be in sync. Include the series not selected by legend + + if (componentType === 'series') { + each(componentModel.seriesGroup, function (seriesModel) { + seriesModel.setCenter(res.center); + seriesModel.setZoom(res.zoom); + }); + } + }); + }); + } + + function install$a(registers) { + use(install$9); + registers.registerChartView(MapView); + registers.registerSeriesModel(MapSeries); + registers.registerLayout(mapSymbolLayout); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic); + createLegacyDataSelectAction('map', registers.registerAction); + } + + /** + * Initialize all computational message for following algorithm. + */ + + function init$2(inRoot) { + var root = inRoot; + root.hierNode = { + defaultAncestor: null, + ancestor: root, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: 0, + thread: null + }; + var nodes = [root]; + var node; + var children; + + while (node = nodes.pop()) { + // jshint ignore:line + children = node.children; + + if (node.isExpand && children.length) { + var n = children.length; + + for (var i = n - 1; i >= 0; i--) { + var child = children[i]; + child.hierNode = { + defaultAncestor: null, + ancestor: child, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: i, + thread: null + }; + nodes.push(child); + } + } + } + } + + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Computes a preliminary x coordinate for node. Before that, this function is + * applied recursively to the children of node, as well as the function + * apportion(). After spacing out the children by calling executeShifts(), the + * node is placed to the midpoint of its outermost children. + */ + + function firstWalk(node, separation) { + var children = node.isExpand ? node.children : []; + var siblings = node.parentNode.children; + var subtreeW = node.hierNode.i ? siblings[node.hierNode.i - 1] : null; + + if (children.length) { + executeShifts(node); + var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2; + + if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + node.hierNode.modifier = node.hierNode.prelim - midPoint; + } else { + node.hierNode.prelim = midPoint; + } + } else if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + } + + node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation); + } + + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Computes all real x-coordinates by summing up the modifiers recursively. + */ + + function secondWalk(node) { + var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier; + node.setLayout({ + x: nodeX + }, true); + node.hierNode.modifier += node.parentNode.hierNode.modifier; + } + + function separation(cb) { + return arguments.length ? cb : defaultSeparation; + } + + /** + * Transform the common coordinate to radial coordinate. + */ + + function radialCoordinate(rad, r) { + rad -= Math.PI / 2; + return { + x: r * Math.cos(rad), + y: r * Math.sin(rad) + }; + } + + /** + * Get the layout position of the whole view. + */ + + function getViewRect$1(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + /** + * All other shifts, applied to the smaller subtrees between w- and w+, are + * performed by this function. + * + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + function executeShifts(node) { + var children = node.children; + var n = children.length; + var shift = 0; + var change = 0; + + while (--n >= 0) { + var child = children[n]; + child.hierNode.prelim += shift; + child.hierNode.modifier += shift; + change += child.hierNode.change; + shift += child.hierNode.shift + change; + } + } + + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * The core of the algorithm. Here, a new subtree is combined with the + * previous subtrees. Threads are used to traverse the inside and outside + * contours of the left and right subtree up to the highest common level. + * Whenever two nodes of the inside contours conflict, we compute the left + * one of the greatest uncommon ancestors using the function nextAncestor() + * and call moveSubtree() to shift the subtree and prepare the shifts of + * smaller subtrees. Finally, we add a new thread (if necessary). + */ + + + function apportion(subtreeV, subtreeW, ancestor, separation) { + if (subtreeW) { + var nodeOutRight = subtreeV; + var nodeInRight = subtreeV; + var nodeOutLeft = nodeInRight.parentNode.children[0]; + var nodeInLeft = subtreeW; + var sumOutRight = nodeOutRight.hierNode.modifier; + var sumInRight = nodeInRight.hierNode.modifier; + var sumOutLeft = nodeOutLeft.hierNode.modifier; + var sumInLeft = nodeInLeft.hierNode.modifier; + + while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) { + nodeOutRight = nextRight(nodeOutRight); + nodeOutLeft = nextLeft(nodeOutLeft); + nodeOutRight.hierNode.ancestor = subtreeV; + var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim - sumInRight + separation(nodeInLeft, nodeInRight); + + if (shift > 0) { + moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift); + sumInRight += shift; + sumOutRight += shift; + } + + sumInLeft += nodeInLeft.hierNode.modifier; + sumInRight += nodeInRight.hierNode.modifier; + sumOutRight += nodeOutRight.hierNode.modifier; + sumOutLeft += nodeOutLeft.hierNode.modifier; + } + + if (nodeInLeft && !nextRight(nodeOutRight)) { + nodeOutRight.hierNode.thread = nodeInLeft; + nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight; + } + + if (nodeInRight && !nextLeft(nodeOutLeft)) { + nodeOutLeft.hierNode.thread = nodeInRight; + nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft; + ancestor = subtreeV; + } + } + + return ancestor; + } + + /** + * This function is used to traverse the right contour of a subtree. + * It returns the rightmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + */ + + + function nextRight(node) { + var children = node.children; + return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread; + } + + /** + * This function is used to traverse the left contour of a subtree (or a subforest). + * It returns the leftmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + */ + + + function nextLeft(node) { + var children = node.children; + return children.length && node.isExpand ? children[0] : node.hierNode.thread; + } + + /** + * If nodeInLeft’s ancestor is a sibling of node, returns nodeInLeft’s ancestor. + * Otherwise, returns the specified ancestor. + */ + + + function nextAncestor(nodeInLeft, node, ancestor) { + return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode ? nodeInLeft.hierNode.ancestor : ancestor; + } + + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * Shifts the current subtree rooted at wr. + * This is done by increasing prelim(w+) and modifier(w+) by shift. + */ + + + function moveSubtree(wl, wr, shift) { + var change = shift / (wr.hierNode.i - wl.hierNode.i); + wr.hierNode.change -= change; + wr.hierNode.shift += shift; + wr.hierNode.modifier += shift; + wr.hierNode.prelim += shift; + wl.hierNode.change += change; + } + + /** + * The implementation of this function was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + */ + + + function defaultSeparation(node1, node2) { + return node1.parentNode === node2.parentNode ? 1 : 2; + } + + var TreeEdgeShape = + /** @class */ + function () { + function TreeEdgeShape() { + this.parentPoint = []; + this.childPoints = []; + } + + return TreeEdgeShape; + }(); + + var TreePath = + /** @class */ + function (_super) { + __extends(TreePath, _super); + + function TreePath(opts) { + return _super.call(this, opts) || this; + } + + TreePath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + TreePath.prototype.getDefaultShape = function () { + return new TreeEdgeShape(); + }; + + TreePath.prototype.buildPath = function (ctx, shape) { + var childPoints = shape.childPoints; + var childLen = childPoints.length; + var parentPoint = shape.parentPoint; + var firstChildPos = childPoints[0]; + var lastChildPos = childPoints[childLen - 1]; + + if (childLen === 1) { + ctx.moveTo(parentPoint[0], parentPoint[1]); + ctx.lineTo(firstChildPos[0], firstChildPos[1]); + return; + } + + var orient = shape.orient; + var forkDim = orient === 'TB' || orient === 'BT' ? 0 : 1; + var otherDim = 1 - forkDim; + var forkPosition = parsePercent$1(shape.forkPosition, 1); + var tmpPoint = []; + tmpPoint[forkDim] = parentPoint[forkDim]; + tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition; + ctx.moveTo(parentPoint[0], parentPoint[1]); + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + ctx.moveTo(firstChildPos[0], firstChildPos[1]); + tmpPoint[forkDim] = firstChildPos[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + tmpPoint[forkDim] = lastChildPos[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + ctx.lineTo(lastChildPos[0], lastChildPos[1]); + + for (var i = 1; i < childLen - 1; i++) { + var point = childPoints[i]; + ctx.moveTo(point[0], point[1]); + tmpPoint[forkDim] = point[forkDim]; + ctx.lineTo(tmpPoint[0], tmpPoint[1]); + } + }; + + return TreePath; + }(Path); + + var TreeView = + /** @class */ + function (_super) { + __extends(TreeView, _super); + + function TreeView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreeView.type; + _this._mainGroup = new Group(); + return _this; + } + + TreeView.prototype.init = function (ecModel, api) { + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: this.group + }; + this.group.add(this._mainGroup); + }; + + TreeView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var layoutInfo = seriesModel.layoutInfo; + var group = this._mainGroup; + var layout = seriesModel.get('layout'); + + if (layout === 'radial') { + group.x = layoutInfo.x + layoutInfo.width / 2; + group.y = layoutInfo.y + layoutInfo.height / 2; + } else { + group.x = layoutInfo.x; + group.y = layoutInfo.y; + } + + this._updateViewCoordSys(seriesModel); + + this._updateController(seriesModel, ecModel, api); + + var oldData = this._data; + data.diff(oldData).add(function (newIdx) { + if (symbolNeedsDraw$1(data, newIdx)) { + // Create node and edge + updateNode(data, newIdx, null, group, seriesModel); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + + if (!symbolNeedsDraw$1(data, newIdx)) { + symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel); + return; + } // Update node and edge + + + updateNode(data, newIdx, symbolEl, group, seriesModel); + }).remove(function (oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); // When remove a collapsed node of subtree, since the collapsed + // node haven't been initialized with a symbol element, + // you can't found it's symbol element through index. + // so if we want to remove the symbol element we should insure + // that the symbol element is not null. + + if (symbolEl) { + removeNode(oldData, oldIdx, symbolEl, group, seriesModel); + } + }).execute(); + this._nodeScaleRatio = seriesModel.get('nodeScaleRatio'); + + this._updateNodeAndLinkScale(seriesModel); + + if (seriesModel.get('expandAndCollapse') === true) { + data.eachItemGraphicEl(function (el, dataIndex) { + el.off('click').on('click', function () { + api.dispatchAction({ + type: 'treeExpandAndCollapse', + seriesId: seriesModel.id, + dataIndex: dataIndex + }); + }); + }); + } + + this._data = data; + }; + + TreeView.prototype._updateViewCoordSys = function (seriesModel) { + var data = seriesModel.getData(); + var points = []; + data.each(function (idx) { + var layout = data.getItemLayout(idx); + + if (layout && !isNaN(layout.x) && !isNaN(layout.y)) { + points.push([+layout.x, +layout.y]); + } + }); + var min = []; + var max = []; + fromPoints(points, min, max); // If don't Store min max when collapse the root node after roam, + // the root node will disappear. + + var oldMin = this._min; + var oldMax = this._max; // If width or height is 0 + + if (max[0] - min[0] === 0) { + min[0] = oldMin ? oldMin[0] : min[0] - 1; + max[0] = oldMax ? oldMax[0] : max[0] + 1; + } + + if (max[1] - min[1] === 0) { + min[1] = oldMin ? oldMin[1] : min[1] - 1; + max[1] = oldMax ? oldMax[1] : max[1] + 1; + } + + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + viewCoordSys.setCenter(seriesModel.get('center')); + viewCoordSys.setZoom(seriesModel.get('zoom')); // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group + + this.group.attr({ + x: viewCoordSys.x, + y: viewCoordSys.y, + scaleX: viewCoordSys.scaleX, + scaleY: viewCoordSys.scaleY + }); + this._min = min; + this._max = max; + }; + + TreeView.prototype._updateController = function (seriesModel, ecModel, api) { + var _this = this; + + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); + }); + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + controller.off('pan').off('zoom').on('pan', function (e) { + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'treeRoam', + dx: e.dx, + dy: e.dy + }); + }).on('zoom', function (e) { + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'treeRoam', + zoom: e.scale, + originX: e.originX, + originY: e.originY + }); + + _this._updateNodeAndLinkScale(seriesModel); // Only update label layout on zoom + + + api.updateLabelLayout(); + }); + }; + + TreeView.prototype._updateNodeAndLinkScale = function (seriesModel) { + var data = seriesModel.getData(); + + var nodeScale = this._getNodeGlobalScale(seriesModel); + + data.eachItemGraphicEl(function (el, idx) { + el.setSymbolScale(nodeScale); + }); + }; + + TreeView.prototype._getNodeGlobalScale = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = this._nodeScaleRatio; + var groupZoom = coordSys.scaleX || 1; // Scale node when zoom changes + + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + return nodeScale / groupZoom; + }; + + TreeView.prototype.dispose = function () { + this._controller && this._controller.dispose(); + this._controllerHost = null; + }; + + TreeView.prototype.remove = function () { + this._mainGroup.removeAll(); + + this._data = null; + }; + + TreeView.type = 'tree'; + return TreeView; + }(ChartView); + + function symbolNeedsDraw$1(data, dataIndex) { + var layout = data.getItemLayout(dataIndex); + return layout && !isNaN(layout.x) && !isNaN(layout.y); + } + + function updateNode(data, dataIndex, symbolEl, group, seriesModel) { + var isInit = !symbolEl; + var node = data.tree.getNodeByDataIndex(dataIndex); + var itemModel = node.getModel(); + var visualColor = node.getVisual('style').fill; + var symbolInnerColor = node.isExpand === false && node.children.length !== 0 ? visualColor : '#fff'; + var virtualRoot = data.tree.root; + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceLayout = source.getLayout(); + var sourceOldLayout = sourceSymbolEl ? { + x: sourceSymbolEl.__oldX, + y: sourceSymbolEl.__oldY, + rawX: sourceSymbolEl.__radialOldRawX, + rawY: sourceSymbolEl.__radialOldRawY + } : sourceLayout; + var targetLayout = node.getLayout(); + + if (isInit) { + symbolEl = new Symbol(data, dataIndex, null, { + symbolInnerColor: symbolInnerColor, + useNameLabel: true + }); + symbolEl.x = sourceOldLayout.x; + symbolEl.y = sourceOldLayout.y; + } else { + symbolEl.updateData(data, dataIndex, null, { + symbolInnerColor: symbolInnerColor, + useNameLabel: true + }); + } + + symbolEl.__radialOldRawX = symbolEl.__radialRawX; + symbolEl.__radialOldRawY = symbolEl.__radialRawY; + symbolEl.__radialRawX = targetLayout.rawX; + symbolEl.__radialRawY = targetLayout.rawY; + group.add(symbolEl); + data.setItemGraphicEl(dataIndex, symbolEl); + symbolEl.__oldX = symbolEl.x; + symbolEl.__oldY = symbolEl.y; + updateProps(symbolEl, { + x: targetLayout.x, + y: targetLayout.y + }, seriesModel); + var symbolPath = symbolEl.getSymbolPath(); + + if (seriesModel.get('layout') === 'radial') { + var realRoot = virtualRoot.children[0]; + var rootLayout = realRoot.getLayout(); + var length_1 = realRoot.children.length; + var rad = void 0; + var isLeft = void 0; + + if (targetLayout.x === rootLayout.x && node.isExpand === true) { + var center = { + x: (realRoot.children[0].getLayout().x + realRoot.children[length_1 - 1].getLayout().x) / 2, + y: (realRoot.children[0].getLayout().y + realRoot.children[length_1 - 1].getLayout().y) / 2 + }; + rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + isLeft = center.x < rootLayout.x; + + if (isLeft) { + rad = rad - Math.PI; + } + } else { + rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) { + isLeft = targetLayout.x < rootLayout.x; + + if (isLeft) { + rad = rad - Math.PI; + } + } else { + isLeft = targetLayout.x > rootLayout.x; + + if (!isLeft) { + rad = rad - Math.PI; + } + } + } + + var textPosition = isLeft ? 'left' : 'right'; + var normalLabelModel = itemModel.getModel('label'); + var rotate = normalLabelModel.get('rotate'); + var labelRotateRadian = rotate * (Math.PI / 180); + var textContent = symbolPath.getTextContent(); + + if (textContent) { + symbolPath.setTextConfig({ + position: normalLabelModel.get('position') || textPosition, + rotation: rotate == null ? -rad : labelRotateRadian, + origin: 'center' + }); + textContent.setStyle('verticalAlign', 'middle'); + } + } // Handle status + + + var focus = itemModel.get(['emphasis', 'focus']); + var focusDataIndices = focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : null; + + if (focusDataIndices) { + // Modify the focus to data indices. + getECData(symbolEl).focus = focusDataIndices; + } + + drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group); + + if (symbolEl.__edge) { + symbolEl.onHoverStateChange = function (toState) { + if (toState !== 'blur') { + // NOTE: Ensure the parent elements will been blurred firstly. + // According to the return of getAncestorsIndices and getDescendantIndices + // TODO: A bit tricky. + var parentEl = node.parentNode && data.getItemGraphicEl(node.parentNode.dataIndex); + + if (!(parentEl && parentEl.hoverState === HOVER_STATE_BLUR)) { + setStatesFlag(symbolEl.__edge, toState); + } + } + }; + } + } + + function drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group) { + var itemModel = node.getModel(); + var edgeShape = seriesModel.get('edgeShape'); + var layout = seriesModel.get('layout'); + var orient = seriesModel.getOrient(); + var curvature = seriesModel.get(['lineStyle', 'curveness']); + var edgeForkPosition = seriesModel.get('edgeForkPosition'); + var lineStyle = itemModel.getModel('lineStyle').getLineStyle(); + var edge = symbolEl.__edge; + + if (edgeShape === 'curve') { + if (node.parentNode && node.parentNode !== virtualRoot) { + if (!edge) { + edge = symbolEl.__edge = new BezierCurve({ + shape: getEdgeShape(layout, orient, curvature, sourceOldLayout, sourceOldLayout) + }); + } + + updateProps(edge, { + shape: getEdgeShape(layout, orient, curvature, sourceLayout, targetLayout) + }, seriesModel); + } + } else if (edgeShape === 'polyline') { + if (layout === 'orthogonal') { + if (node !== virtualRoot && node.children && node.children.length !== 0 && node.isExpand === true) { + var children = node.children; + var childPoints = []; + + for (var i = 0; i < children.length; i++) { + var childLayout = children[i].getLayout(); + childPoints.push([childLayout.x, childLayout.y]); + } + + if (!edge) { + edge = symbolEl.__edge = new TreePath({ + shape: { + parentPoint: [targetLayout.x, targetLayout.y], + childPoints: [[targetLayout.x, targetLayout.y]], + orient: orient, + forkPosition: edgeForkPosition + } + }); + } + + updateProps(edge, { + shape: { + parentPoint: [targetLayout.x, targetLayout.y], + childPoints: childPoints + } + }, seriesModel); + } + } else { + if ("development" !== 'production') { + throw new Error('The polyline edgeShape can only be used in orthogonal layout'); + } + } + } + + if (edge) { + edge.useStyle(defaults({ + strokeNoScale: true, + fill: null + }, lineStyle)); + setStatesStylesFromModel(edge, itemModel, 'lineStyle'); + setDefaultStateProxy(edge); + group.add(edge); + } + } + + function removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt) { + var virtualRoot = data.tree.root; + + var _a = getSourceNode(virtualRoot, node), + source = _a.source, + sourceLayout = _a.sourceLayout; + + var symbolEl = data.getItemGraphicEl(node.dataIndex); + + if (!symbolEl) { + return; + } + + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceEdge = sourceSymbolEl.__edge; // 1. when expand the sub tree, delete the children node should delete the edge of + // the source at the same time. because the polyline edge shape is only owned by the source. + // 2.when the node is the only children of the source, delete the node should delete the edge of + // the source at the same time. the same reason as above. + + var edge = symbolEl.__edge || (source.isExpand === false || source.children.length === 1 ? sourceEdge : undefined); + var edgeShape = seriesModel.get('edgeShape'); + var layoutOpt = seriesModel.get('layout'); + var orient = seriesModel.get('orient'); + var curvature = seriesModel.get(['lineStyle', 'curveness']); + + if (edge) { + if (edgeShape === 'curve') { + removeElement(edge, { + shape: getEdgeShape(layoutOpt, orient, curvature, sourceLayout, sourceLayout), + style: { + opacity: 0 + } + }, seriesModel, { + cb: function () { + group.remove(edge); + }, + removeOpt: removeAnimationOpt + }); + } else if (edgeShape === 'polyline' && seriesModel.get('layout') === 'orthogonal') { + removeElement(edge, { + shape: { + parentPoint: [sourceLayout.x, sourceLayout.y], + childPoints: [[sourceLayout.x, sourceLayout.y]] + }, + style: { + opacity: 0 + } + }, seriesModel, { + cb: function () { + group.remove(edge); + }, + removeOpt: removeAnimationOpt + }); + } + } + } + + function getSourceNode(virtualRoot, node) { + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceLayout; + + while (sourceLayout = source.getLayout(), sourceLayout == null) { + source = source.parentNode === virtualRoot ? source : source.parentNode || source; + } + + return { + source: source, + sourceLayout: sourceLayout + }; + } + + function removeNode(data, dataIndex, symbolEl, group, seriesModel) { + var node = data.tree.getNodeByDataIndex(dataIndex); + var virtualRoot = data.tree.root; + var sourceLayout = getSourceNode(virtualRoot, node).sourceLayout; // Use same duration and easing with update to have more consistent animation. + + var removeAnimationOpt = { + duration: seriesModel.get('animationDurationUpdate'), + easing: seriesModel.get('animationEasingUpdate') + }; + removeElement(symbolEl, { + x: sourceLayout.x + 1, + y: sourceLayout.y + 1 + }, seriesModel, { + cb: function () { + group.remove(symbolEl); + data.setItemGraphicEl(dataIndex, null); + }, + removeOpt: removeAnimationOpt + }); + symbolEl.fadeOut(null, data.hostModel, { + fadeLabel: true, + animation: removeAnimationOpt + }); // remove edge as parent node + + node.children.forEach(function (childNode) { + removeNodeEdge(childNode, data, group, seriesModel, removeAnimationOpt); + }); // remove edge as child node + + removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt); + } + + function getEdgeShape(layoutOpt, orient, curvature, sourceLayout, targetLayout) { + var cpx1; + var cpy1; + var cpx2; + var cpy2; + var x1; + var x2; + var y1; + var y2; + + if (layoutOpt === 'radial') { + x1 = sourceLayout.rawX; + y1 = sourceLayout.rawY; + x2 = targetLayout.rawX; + y2 = targetLayout.rawY; + var radialCoor1 = radialCoordinate(x1, y1); + var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * curvature); + var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * curvature); + var radialCoor4 = radialCoordinate(x2, y2); + return { + x1: radialCoor1.x || 0, + y1: radialCoor1.y || 0, + x2: radialCoor4.x || 0, + y2: radialCoor4.y || 0, + cpx1: radialCoor2.x || 0, + cpy1: radialCoor2.y || 0, + cpx2: radialCoor3.x || 0, + cpy2: radialCoor3.y || 0 + }; + } else { + x1 = sourceLayout.x; + y1 = sourceLayout.y; + x2 = targetLayout.x; + y2 = targetLayout.y; + + if (orient === 'LR' || orient === 'RL') { + cpx1 = x1 + (x2 - x1) * curvature; + cpy1 = y1; + cpx2 = x2 + (x1 - x2) * curvature; + cpy2 = y2; + } + + if (orient === 'TB' || orient === 'BT') { + cpx1 = x1; + cpy1 = y1 + (y2 - y1) * curvature; + cpx2 = x2; + cpy2 = y2 + (y1 - y2) * curvature; + } + } + + return { + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }; + } + + var inner$7 = makeInner(); + + function linkSeriesData(opt) { + var mainData = opt.mainData; + var datas = opt.datas; + + if (!datas) { + datas = { + main: mainData + }; + opt.datasAttr = { + main: 'data' + }; + } + + opt.datas = opt.mainData = null; + linkAll(mainData, datas, opt); // Porxy data original methods. + + each(datas, function (data) { + each(mainData.TRANSFERABLE_METHODS, function (methodName) { + data.wrapMethod(methodName, curry(transferInjection, opt)); + }); + }); // Beyond transfer, additional features should be added to `cloneShallow`. + + mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt)); // Only mainData trigger change, because struct.update may trigger + // another changable methods, which may bring about dead lock. + + each(mainData.CHANGABLE_METHODS, function (methodName) { + mainData.wrapMethod(methodName, curry(changeInjection, opt)); + }); // Make sure datas contains mainData. + + assert(datas[mainData.dataType] === mainData); + } + + function transferInjection(opt, res) { + if (isMainData(this)) { + // Transfer datas to new main data. + var datas = extend({}, inner$7(this).datas); + datas[this.dataType] = res; + linkAll(res, datas, opt); + } else { + // Modify the reference in main data to point newData. + linkSingle(res, this.dataType, inner$7(this).mainData, opt); + } + + return res; + } + + function changeInjection(opt, res) { + opt.struct && opt.struct.update(); + return res; + } + + function cloneShallowInjection(opt, res) { + // cloneShallow, which brings about some fragilities, may be inappropriate + // to be exposed as an API. So for implementation simplicity we can make + // the restriction that cloneShallow of not-mainData should not be invoked + // outside, but only be invoked here. + each(inner$7(res).datas, function (data, dataType) { + data !== res && linkSingle(data.cloneShallow(), dataType, res, opt); + }); + return res; + } + + /** + * Supplement method to List. + * + * @public + * @param [dataType] If not specified, return mainData. + */ + + + function getLinkedData(dataType) { + var mainData = inner$7(this).mainData; + return dataType == null || mainData == null ? mainData : inner$7(mainData).datas[dataType]; + } + + /** + * Get list of all linked data + */ + + + function getLinkedDataAll() { + var mainData = inner$7(this).mainData; + return mainData == null ? [{ + data: mainData + }] : map(keys(inner$7(mainData).datas), function (type) { + return { + type: type, + data: inner$7(mainData).datas[type] + }; + }); + } + + function isMainData(data) { + return inner$7(data).mainData === data; + } + + function linkAll(mainData, datas, opt) { + inner$7(mainData).datas = {}; + each(datas, function (data, dataType) { + linkSingle(data, dataType, mainData, opt); + }); + } + + function linkSingle(data, dataType, mainData, opt) { + inner$7(mainData).datas[dataType] = data; + inner$7(data).mainData = mainData; + data.dataType = dataType; + + if (opt.struct) { + data[opt.structAttr] = opt.struct; + opt.struct[opt.datasAttr[dataType]] = data; + } // Supplement method. + + + data.getLinkedData = getLinkedData; + data.getLinkedDataAll = getLinkedDataAll; + } + + var TreeNode = + /** @class */ + function () { + function TreeNode(name, hostTree) { + this.depth = 0; + this.height = 0; + /** + * Reference to list item. + * Do not persistent dataIndex outside, + * besause it may be changed by list. + * If dataIndex -1, + * this node is logical deleted (filtered) in list. + */ + + this.dataIndex = -1; + this.children = []; + this.viewChildren = []; + this.isExpand = false; + this.name = name || ''; + this.hostTree = hostTree; + } + + /** + * The node is removed. + */ + + + TreeNode.prototype.isRemoved = function () { + return this.dataIndex < 0; + }; + + TreeNode.prototype.eachNode = function (options, cb, context) { + if (isFunction(options)) { + context = cb; + cb = options; + options = null; + } + + options = options || {}; + + if (isString(options)) { + options = { + order: options + }; + } + + var order = options.order || 'preorder'; + var children = this[options.attr || 'children']; + var suppressVisitSub; + order === 'preorder' && (suppressVisitSub = cb.call(context, this)); + + for (var i = 0; !suppressVisitSub && i < children.length; i++) { + children[i].eachNode(options, cb, context); + } + + order === 'postorder' && cb.call(context, this); + }; + /** + * Update depth and height of this subtree. + */ + + + TreeNode.prototype.updateDepthAndHeight = function (depth) { + var height = 0; + this.depth = depth; + + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + child.updateDepthAndHeight(depth + 1); + + if (child.height > height) { + height = child.height; + } + } + + this.height = height + 1; + }; + + TreeNode.prototype.getNodeById = function (id) { + if (this.getId() === id) { + return this; + } + + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].getNodeById(id); + + if (res) { + return res; + } + } + }; + + TreeNode.prototype.contains = function (node) { + if (node === this) { + return true; + } + + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].contains(node); + + if (res) { + return res; + } + } + }; + /** + * @param includeSelf Default false. + * @return order: [root, child, grandchild, ...] + */ + + + TreeNode.prototype.getAncestors = function (includeSelf) { + var ancestors = []; + var node = includeSelf ? this : this.parentNode; + + while (node) { + ancestors.push(node); + node = node.parentNode; + } + + ancestors.reverse(); + return ancestors; + }; + + TreeNode.prototype.getAncestorsIndices = function () { + var indices = []; + var currNode = this; + + while (currNode) { + indices.push(currNode.dataIndex); + currNode = currNode.parentNode; + } + + indices.reverse(); + return indices; + }; + + TreeNode.prototype.getDescendantIndices = function () { + var indices = []; + this.eachNode(function (childNode) { + indices.push(childNode.dataIndex); + }); + return indices; + }; + + TreeNode.prototype.getValue = function (dimension) { + var data = this.hostTree.data; + return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex); + }; + + TreeNode.prototype.setLayout = function (layout, merge) { + this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge); + }; + /** + * @return {Object} layout + */ + + + TreeNode.prototype.getLayout = function () { + return this.hostTree.data.getItemLayout(this.dataIndex); + }; // @depcrecated + // getModel(path: S): Model + // eslint-disable-next-line @typescript-eslint/no-unused-vars + + + TreeNode.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var hostTree = this.hostTree; + var itemModel = hostTree.data.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; // TODO: TYPE More specific model + + + TreeNode.prototype.getLevelModel = function () { + return (this.hostTree.levelModels || [])[this.depth]; + }; + + TreeNode.prototype.setVisual = function (key, value) { + this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value); + }; + /** + * Get item visual + * FIXME: make return type better + */ + + + TreeNode.prototype.getVisual = function (key) { + return this.hostTree.data.getItemVisual(this.dataIndex, key); + }; + + TreeNode.prototype.getRawIndex = function () { + return this.hostTree.data.getRawIndex(this.dataIndex); + }; + + TreeNode.prototype.getId = function () { + return this.hostTree.data.getId(this.dataIndex); + }; + /** + * index in parent's children + */ + + + TreeNode.prototype.getChildIndex = function () { + if (this.parentNode) { + var children = this.parentNode.children; + + for (var i = 0; i < children.length; ++i) { + if (children[i] === this) { + return i; + } + } + + return -1; + } + + return -1; + }; + /** + * if this is an ancestor of another node + * + * @param node another node + * @return if is ancestor + */ + + + TreeNode.prototype.isAncestorOf = function (node) { + var parent = node.parentNode; + + while (parent) { + if (parent === this) { + return true; + } + + parent = parent.parentNode; + } + + return false; + }; + /** + * if this is an descendant of another node + * + * @param node another node + * @return if is descendant + */ + + + TreeNode.prototype.isDescendantOf = function (node) { + return node !== this && node.isAncestorOf(this); + }; + + return TreeNode; + }(); + + var Tree = + /** @class */ + function () { + function Tree(hostModel) { + this.type = 'tree'; + this._nodes = []; + this.hostModel = hostModel; + } + + Tree.prototype.eachNode = function (options, cb, context) { + this.root.eachNode(options, cb, context); + }; + + Tree.prototype.getNodeByDataIndex = function (dataIndex) { + var rawIndex = this.data.getRawIndex(dataIndex); + return this._nodes[rawIndex]; + }; + + Tree.prototype.getNodeById = function (name) { + return this.root.getNodeById(name); + }; + /** + * Update item available by list, + * when list has been performed options like 'filterSelf' or 'map'. + */ + + + Tree.prototype.update = function () { + var data = this.data; + var nodes = this._nodes; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + }; + /** + * Clear all layouts + */ + + + Tree.prototype.clearLayouts = function () { + this.data.clearItemLayouts(); + }; + /** + * data node format: + * { + * name: ... + * value: ... + * children: [ + * { + * name: ... + * value: ... + * children: ... + * }, + * ... + * ] + * } + */ + + + Tree.createTree = function (dataRoot, hostModel, beforeLink) { + var tree = new Tree(hostModel); + var listData = []; + var dimMax = 1; + buildHierarchy(dataRoot); + + function buildHierarchy(dataNode, parentNode) { + var value = dataNode.value; + dimMax = Math.max(dimMax, isArray(value) ? value.length : 1); + listData.push(dataNode); + var node = new TreeNode(convertOptionIdName(dataNode.name, ''), tree); + parentNode ? addChild(node, parentNode) : tree.root = node; + + tree._nodes.push(node); + + var children = dataNode.children; + + if (children) { + for (var i = 0; i < children.length; i++) { + buildHierarchy(children[i], node); + } + } + } + + tree.root.updateDepthAndHeight(0); + var dimensions = prepareSeriesDataSchema(listData, { + coordDimensions: ['value'], + dimensionsCount: dimMax + }).dimensions; + var list = new SeriesData(dimensions, hostModel); + list.initData(listData); + beforeLink && beforeLink(list); + linkSeriesData({ + mainData: list, + struct: tree, + structAttr: 'tree' + }); + tree.update(); + return tree; + }; + + return Tree; + }(); + + /** + * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote, + * so this function is not ready and not necessary to be public. + */ + + + function addChild(child, node) { + var children = node.children; + + if (child.parentNode === node) { + return; + } + + children.push(child); + child.parentNode = node; + } + + function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) { + if (payload && indexOf(validPayloadTypes, payload.type) >= 0) { + var root = seriesModel.getData().tree.root; + var targetNode = payload.targetNode; + + if (isString(targetNode)) { + targetNode = root.getNodeById(targetNode); + } + + if (targetNode && root.contains(targetNode)) { + return { + node: targetNode + }; + } + + var targetNodeId = payload.targetNodeId; + + if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) { + return { + node: targetNode + }; + } + } + } // Not includes the given node at the last item. + + function getPathToRoot(node) { + var path = []; + + while (node) { + node = node.parentNode; + node && path.push(node); + } + + return path.reverse(); + } + + function aboveViewRoot(viewRoot, node) { + var viewPath = getPathToRoot(viewRoot); + return indexOf(viewPath, node) >= 0; + } // From root to the input node (the input node will be included). + + function wrapTreePathInfo(node, seriesModel) { + var treePathInfo = []; + + while (node) { + var nodeDataIndex = node.dataIndex; + treePathInfo.push({ + name: node.name, + dataIndex: nodeDataIndex, + value: seriesModel.getRawValue(nodeDataIndex) + }); + node = node.parentNode; + } + + treePathInfo.reverse(); + return treePathInfo; + } + + var TreeSeriesModel = + /** @class */ + function (_super) { + __extends(TreeSeriesModel, _super); + + function TreeSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.hasSymbolVisual = true; // Do it self. + + _this.ignoreStyleOnData = true; + return _this; + } + + /** + * Init a tree data structure from data in option series + */ + + + TreeSeriesModel.prototype.getInitialData = function (option) { + //create an virtual root + var root = { + name: option.name, + children: option.data + }; + var leaves = option.leaves || {}; + var leavesModel = new Model(leaves, this, this.ecModel); + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + + if (!(node && node.children.length && node.isExpand)) { + model.parentModel = leavesModel; + } + + return model; + }); + } + + var treeDepth = 0; + tree.eachNode('preorder', function (node) { + if (node.depth > treeDepth) { + treeDepth = node.depth; + } + }); + var expandAndCollapse = option.expandAndCollapse; + var expandTreeDepth = expandAndCollapse && option.initialTreeDepth >= 0 ? option.initialTreeDepth : treeDepth; + tree.root.eachNode('preorder', function (node) { + var item = node.hostTree.data.getRawDataItem(node.dataIndex); // Add item.collapsed != null, because users can collapse node original in the series.data. + + node.isExpand = item && item.collapsed != null ? !item.collapsed : node.depth <= expandTreeDepth; + }); + return tree.data; + }; + /** + * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'. + * @returns {string} orient + */ + + + TreeSeriesModel.prototype.getOrient = function () { + var orient = this.get('orient'); + + if (orient === 'horizontal') { + orient = 'LR'; + } else if (orient === 'vertical') { + orient = 'TB'; + } + + return orient; + }; + + TreeSeriesModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + TreeSeriesModel.prototype.setCenter = function (center) { + this.option.center = center; + }; + + TreeSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var tree = this.getData().tree; + var realRoot = tree.root.children[0]; + var node = tree.getNodeByDataIndex(dataIndex); + var value = node.getValue(); + var name = node.name; + + while (node && node !== realRoot) { + name = node.parentNode.name + '.' + name; + node = node.parentNode; + } + + return createTooltipMarkup('nameValue', { + name: name, + value: value, + noValue: isNaN(value) || value == null + }); + }; // Add tree path to tooltip param + + + TreeSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treeAncestors = wrapTreePathInfo(node, this); + params.collapsed = !node.isExpand; + return params; + }; + + TreeSeriesModel.type = 'series.tree'; // can support the position parameters 'left', 'top','right','bottom', 'width', + // 'height' in the setOption() with 'merge' mode normal. + + TreeSeriesModel.layoutMode = 'box'; + TreeSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + // the position of the whole view + left: '12%', + top: '12%', + right: '12%', + bottom: '12%', + // the layout of the tree, two value can be selected, 'orthogonal' or 'radial' + layout: 'orthogonal', + // value can be 'polyline' + edgeShape: 'curve', + edgeForkPosition: '50%', + // true | false | 'move' | 'scale', see module:component/helper/RoamController. + roam: false, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.4, + // Default on center of graph + center: null, + zoom: 1, + orient: 'LR', + symbol: 'emptyCircle', + symbolSize: 7, + expandAndCollapse: true, + initialTreeDepth: 2, + lineStyle: { + color: '#ccc', + width: 1.5, + curveness: 0.5 + }, + itemStyle: { + color: 'lightsteelblue', + // borderColor: '#c23531', + borderWidth: 1.5 + }, + label: { + show: true + }, + animationEasing: 'linear', + animationDuration: 700, + animationDurationUpdate: 500 + }; + return TreeSeriesModel; + }(SeriesModel); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * Traverse the tree from bottom to top and do something + */ + function eachAfter(root, callback, separation) { + var nodes = [root]; + var next = []; + var node; + + while (node = nodes.pop()) { + // jshint ignore:line + next.push(node); + + if (node.isExpand) { + var children = node.children; + + if (children.length) { + for (var i = 0; i < children.length; i++) { + nodes.push(children[i]); + } + } + } + } + + while (node = next.pop()) { + // jshint ignore:line + callback(node, separation); + } + } + + /** + * Traverse the tree from top to bottom and do something + */ + + + function eachBefore(root, callback) { + var nodes = [root]; + var node; + + while (node = nodes.pop()) { + // jshint ignore:line + callback(node); + + if (node.isExpand) { + var children = node.children; + + if (children.length) { + for (var i = children.length - 1; i >= 0; i--) { + nodes.push(children[i]); + } + } + } + } + } + + function treeLayout(ecModel, api) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + commonLayout(seriesModel, api); + }); + } + + function commonLayout(seriesModel, api) { + var layoutInfo = getViewRect$1(seriesModel, api); + seriesModel.layoutInfo = layoutInfo; + var layout = seriesModel.get('layout'); + var width = 0; + var height = 0; + var separation$1 = null; + + if (layout === 'radial') { + width = 2 * Math.PI; + height = Math.min(layoutInfo.height, layoutInfo.width) / 2; + separation$1 = separation(function (node1, node2) { + return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth; + }); + } else { + width = layoutInfo.width; + height = layoutInfo.height; + separation$1 = separation(); + } + + var virtualRoot = seriesModel.getData().tree.root; + var realRoot = virtualRoot.children[0]; + + if (realRoot) { + init$2(virtualRoot); + eachAfter(realRoot, firstWalk, separation$1); + virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim; + eachBefore(realRoot, secondWalk); + var left_1 = realRoot; + var right_1 = realRoot; + var bottom_1 = realRoot; + eachBefore(realRoot, function (node) { + var x = node.getLayout().x; + + if (x < left_1.getLayout().x) { + left_1 = node; + } + + if (x > right_1.getLayout().x) { + right_1 = node; + } + + if (node.depth > bottom_1.depth) { + bottom_1 = node; + } + }); + var delta = left_1 === right_1 ? 1 : separation$1(left_1, right_1) / 2; + var tx_1 = delta - left_1.getLayout().x; + var kx_1 = 0; + var ky_1 = 0; + var coorX_1 = 0; + var coorY_1 = 0; + + if (layout === 'radial') { + kx_1 = width / (right_1.getLayout().x + delta + tx_1); // here we use (node.depth - 1), bucause the real root's depth is 1 + + ky_1 = height / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorX_1 = (node.getLayout().x + tx_1) * kx_1; + coorY_1 = (node.depth - 1) * ky_1; + var finalCoor = radialCoordinate(coorX_1, coorY_1); + node.setLayout({ + x: finalCoor.x, + y: finalCoor.y, + rawX: coorX_1, + rawY: coorY_1 + }, true); + }); + } else { + var orient_1 = seriesModel.getOrient(); + + if (orient_1 === 'RL' || orient_1 === 'LR') { + ky_1 = height / (right_1.getLayout().x + delta + tx_1); + kx_1 = width / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorY_1 = (node.getLayout().x + tx_1) * ky_1; + coorX_1 = orient_1 === 'LR' ? (node.depth - 1) * kx_1 : width - (node.depth - 1) * kx_1; + node.setLayout({ + x: coorX_1, + y: coorY_1 + }, true); + }); + } else if (orient_1 === 'TB' || orient_1 === 'BT') { + kx_1 = width / (right_1.getLayout().x + delta + tx_1); + ky_1 = height / (bottom_1.depth - 1 || 1); + eachBefore(realRoot, function (node) { + coorX_1 = (node.getLayout().x + tx_1) * kx_1; + coorY_1 = orient_1 === 'TB' ? (node.depth - 1) * ky_1 : height - (node.depth - 1) * ky_1; + node.setLayout({ + x: coorX_1, + y: coorY_1 + }, true); + }); + } + } + } + } + + function treeVisual(ecModel) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + tree.eachNode(function (node) { + var model = node.getModel(); // TODO Optimize + + var style = model.getModel('itemStyle').getItemStyle(); + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); + extend(existsStyle, style); + }); + }); + } + + function installTreeAction(registers) { + registers.registerAction({ + type: 'treeExpandAndCollapse', + event: 'treeExpandAndCollapse', + update: 'update' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'tree', + query: payload + }, function (seriesModel) { + var dataIndex = payload.dataIndex; + var tree = seriesModel.getData().tree; + var node = tree.getNodeByDataIndex(dataIndex); + node.isExpand = !node.isExpand; + }); + }); + registers.registerAction({ + type: 'treeRoam', + event: 'treeRoam', + // Here we set 'none' instead of 'update', because roam action + // just need to update the transform matrix without having to recalculate + // the layout. So don't need to go through the whole update process, such + // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on. + update: 'none' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'tree', + query: payload + }, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var res = updateCenterAndZoom(coordSys, payload); + seriesModel.setCenter && seriesModel.setCenter(res.center); + seriesModel.setZoom && seriesModel.setZoom(res.zoom); + }); + }); + } + + function install$b(registers) { + registers.registerChartView(TreeView); + registers.registerSeriesModel(TreeSeriesModel); + registers.registerLayout(treeLayout); + registers.registerVisual(treeVisual); + installTreeAction(registers); + } + + var actionTypes = ['treemapZoomToNode', 'treemapRender', 'treemapMove']; + + function installTreemapAction(registers) { + for (var i = 0; i < actionTypes.length; i++) { + registers.registerAction({ + type: actionTypes[i], + update: 'updateView' + }, noop); + } + + registers.registerAction({ + type: 'treemapRootToNode', + update: 'updateView' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'treemap', + query: payload + }, handleRootToNode); + + function handleRootToNode(model, index) { + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown'; + } + + model.resetViewRoot(targetInfo.node); + } + } + }); + } + + function enableAriaDecalForTree(seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + var decalPaletteScope = {}; + tree.eachNode(function (node) { + // Use decal of level 1 node + var current = node; + + while (current && current.depth > 1) { + current = current.parentNode; + } + + var decal = getDecalFromPalette(seriesModel.ecModel, current.name || current.dataIndex + '', decalPaletteScope); + node.setVisual('decal', decal); + }); + } + + var TreemapSeriesModel = + /** @class */ + function (_super) { + __extends(TreemapSeriesModel, _super); + + function TreemapSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreemapSeriesModel.type; + _this.preventUsingHoverLayer = true; + return _this; + } + + /** + * @override + */ + + + TreemapSeriesModel.prototype.getInitialData = function (option, ecModel) { + // Create a virtual root. + var root = { + name: option.name, + children: option.data + }; + completeTreeValue(root); + var levels = option.levels || []; // Used in "visual priority" in `treemapVisual.js`. + // This way is a little tricky, must satisfy the precondition: + // 1. There is no `treeNode.getModel('itemStyle.xxx')` used. + // 2. The `Model.prototype.getModel()` will not use any clone-like way. + + var designatedVisualItemStyle = this.designatedVisualItemStyle = {}; + var designatedVisualModel = new Model({ + itemStyle: designatedVisualItemStyle + }, this, ecModel); + levels = option.levels = setDefault(levels, ecModel); + var levelModels = map(levels || [], function (levelDefine) { + return new Model(levelDefine, designatedVisualModel, ecModel); + }, this); // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + var levelModel = node ? levelModels[node.depth] : null; // If no levelModel, we also need `designatedVisualModel`. + + model.parentModel = levelModel || designatedVisualModel; + return model; + }); + } + + return tree.data; + }; + + TreemapSeriesModel.prototype.optionUpdated = function () { + this.resetViewRoot(); + }; + /** + * @override + * @param {number} dataIndex + * @param {boolean} [mutipleSeries=false] + */ + + + TreemapSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var name = data.getName(dataIndex); + return createTooltipMarkup('nameValue', { + name: name, + value: value + }); + }; + /** + * Add tree path to tooltip param + * + * @override + * @param {number} dataIndex + * @return {Object} + */ + + + TreemapSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treeAncestors = wrapTreePathInfo(node, this); // compatitable the previous code. + + params.treePathInfo = params.treeAncestors; + return params; + }; + /** + * @public + * @param {Object} layoutInfo { + * x: containerGroup x + * y: containerGroup y + * width: containerGroup width + * height: containerGroup height + * } + */ + + + TreemapSeriesModel.prototype.setLayoutInfo = function (layoutInfo) { + /** + * @readOnly + * @type {Object} + */ + this.layoutInfo = this.layoutInfo || {}; + extend(this.layoutInfo, layoutInfo); + }; + /** + * @param {string} id + * @return {number} index + */ + + + TreemapSeriesModel.prototype.mapIdToIndex = function (id) { + // A feature is implemented: + // index is monotone increasing with the sequence of + // input id at the first time. + // This feature can make sure that each data item and its + // mapped color have the same index between data list and + // color list at the beginning, which is useful for user + // to adjust data-color mapping. + + /** + * @private + * @type {Object} + */ + var idIndexMap = this._idIndexMap; + + if (!idIndexMap) { + idIndexMap = this._idIndexMap = createHashMap(); + /** + * @private + * @type {number} + */ + + this._idIndexMapCount = 0; + } + + var index = idIndexMap.get(id); + + if (index == null) { + idIndexMap.set(id, index = this._idIndexMapCount++); + } + + return index; + }; + + TreemapSeriesModel.prototype.getViewRoot = function () { + return this._viewRoot; + }; + + TreemapSeriesModel.prototype.resetViewRoot = function (viewRoot) { + viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; + var root = this.getRawData().tree.root; + + if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { + this._viewRoot = root; + } + }; + + TreemapSeriesModel.prototype.enableAriaDecal = function () { + enableAriaDecalForTree(this); + }; + + TreemapSeriesModel.type = 'series.treemap'; + TreemapSeriesModel.layoutMode = 'box'; + TreemapSeriesModel.defaultOption = { + // Disable progressive rendering + progressive: 0, + // size: ['80%', '80%'], // deprecated, compatible with ec2. + left: 'center', + top: 'middle', + width: '80%', + height: '80%', + sort: true, + clipWindow: 'origin', + squareRatio: 0.5 * (1 + Math.sqrt(5)), + leafDepth: null, + drillDownIcon: '▶', + // to align specialized icon. ▷▶❒❐▼✚ + zoomToNodeRatio: 0.32 * 0.32, + roam: true, + nodeClick: 'zoomToNode', + animation: true, + animationDurationUpdate: 900, + animationEasing: 'quinticInOut', + breadcrumb: { + show: true, + height: 22, + left: 'center', + top: 'bottom', + // right + // bottom + emptyItemWidth: 25, + itemStyle: { + color: 'rgba(0,0,0,0.7)', + textStyle: { + color: '#fff' + } + } + }, + label: { + show: true, + // Do not use textDistance, for ellipsis rect just the same as treemap node rect. + distance: 0, + padding: 5, + position: 'inside', + // formatter: null, + color: '#fff', + overflow: 'truncate' // align + // verticalAlign + + }, + upperLabel: { + show: false, + position: [0, '50%'], + height: 20, + // formatter: null, + // color: '#fff', + overflow: 'truncate', + // align: null, + verticalAlign: 'middle' + }, + itemStyle: { + color: null, + colorAlpha: null, + colorSaturation: null, + borderWidth: 0, + gapWidth: 0, + borderColor: '#fff', + borderColorSaturation: null // If specified, borderColor will be ineffective, and the + // border color is evaluated by color of current node and + // borderColorSaturation. + + }, + emphasis: { + upperLabel: { + show: true, + position: [0, '50%'], + overflow: 'truncate', + verticalAlign: 'middle' + } + }, + visualDimension: 0, + visualMin: null, + visualMax: null, + color: [], + // level[n].color (if necessary). + // + Specify color list of each level. level[0].color would be global + // color list if not specified. (see method `setDefault`). + // + But set as a empty array to forbid fetch color from global palette + // when using nodeModel.get('color'), otherwise nodes on deep level + // will always has color palette set and are not able to inherit color + // from parent node. + // + TreemapSeries.color can not be set as 'none', otherwise effect + // legend color fetching (see seriesColor.js). + colorAlpha: null, + colorSaturation: null, + colorMappingBy: 'index', + visibleMin: 10, + // be rendered. Only works when sort is 'asc' or 'desc'. + childrenVisibleMin: null, + // grandchildren will not show. + // Why grandchildren? If not grandchildren but children, + // some siblings show children and some not, + // the appearance may be mess and not consistent, + levels: [] // Each item: { + // visibleMin, itemStyle, visualDimension, label + // } + // data: { + // value: [], + // children: [], + // link: 'http://xxx.xxx.xxx', + // target: 'blank' or 'self' + // } + + }; + return TreemapSeriesModel; + }(SeriesModel); + + /** + * @param {Object} dataNode + */ + + + function completeTreeValue(dataNode) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + each(dataNode.children, function (child) { + completeTreeValue(child); + var childValue = child.value; + isArray(childValue) && (childValue = childValue[0]); + sum += childValue; + }); + var thisValue = dataNode.value; + + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } // Value should not less than 0. + + + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; + } + + /** + * set default to level configuration + */ + + + function setDefault(levels, ecModel) { + var globalColorList = normalizeToArray(ecModel.get('color')); + var globalDecalList = normalizeToArray(ecModel.get(['aria', 'decal', 'decals'])); + + if (!globalColorList) { + return; + } + + levels = levels || []; + var hasColorDefine; + var hasDecalDefine; + each(levels, function (levelDefine) { + var model = new Model(levelDefine); + var modelColor = model.get('color'); + var modelDecal = model.get('decal'); + + if (model.get(['itemStyle', 'color']) || modelColor && modelColor !== 'none') { + hasColorDefine = true; + } + + if (model.get(['itemStyle', 'decal']) || modelDecal && modelDecal !== 'none') { + hasDecalDefine = true; + } + }); + var level0 = levels[0] || (levels[0] = {}); + + if (!hasColorDefine) { + level0.color = globalColorList.slice(); + } + + if (!hasDecalDefine && globalDecalList) { + level0.decal = globalDecalList.slice(); + } + + return levels; + } + + var TEXT_PADDING = 8; + var ITEM_GAP = 8; + var ARRAY_LENGTH = 5; + + var Breadcrumb = + /** @class */ + function () { + function Breadcrumb(containerGroup) { + this.group = new Group(); + containerGroup.add(this.group); + } + + Breadcrumb.prototype.render = function (seriesModel, api, targetNode, onSelect) { + var model = seriesModel.getModel('breadcrumb'); + var thisGroup = this.group; + thisGroup.removeAll(); + + if (!model.get('show') || !targetNode) { + return; + } + + var normalStyleModel = model.getModel('itemStyle'); // let emphasisStyleModel = model.getModel('emphasis.itemStyle'); + + var textStyleModel = normalStyleModel.getModel('textStyle'); + var layoutParam = { + pos: { + left: model.get('left'), + right: model.get('right'), + top: model.get('top'), + bottom: model.get('bottom') + }, + box: { + width: api.getWidth(), + height: api.getHeight() + }, + emptyItemWidth: model.get('emptyItemWidth'), + totalWidth: 0, + renderList: [] + }; + + this._prepare(targetNode, layoutParam, textStyleModel); + + this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect); + + positionElement(thisGroup, layoutParam.pos, layoutParam.box); + }; + /** + * Prepare render list and total width + * @private + */ + + + Breadcrumb.prototype._prepare = function (targetNode, layoutParam, textStyleModel) { + for (var node = targetNode; node; node = node.parentNode) { + var text = convertOptionIdName(node.getModel().get('name'), ''); + var textRect = textStyleModel.getTextRect(text); + var itemWidth = Math.max(textRect.width + TEXT_PADDING * 2, layoutParam.emptyItemWidth); + layoutParam.totalWidth += itemWidth + ITEM_GAP; + layoutParam.renderList.push({ + node: node, + text: text, + width: itemWidth + }); + } + }; + /** + * @private + */ + + + Breadcrumb.prototype._renderContent = function (seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect) { + // Start rendering. + var lastX = 0; + var emptyItemWidth = layoutParam.emptyItemWidth; + var height = seriesModel.get(['breadcrumb', 'height']); + var availableSize = getAvailableSize(layoutParam.pos, layoutParam.box); + var totalWidth = layoutParam.totalWidth; + var renderList = layoutParam.renderList; + + for (var i = renderList.length - 1; i >= 0; i--) { + var item = renderList[i]; + var itemNode = item.node; + var itemWidth = item.width; + var text = item.text; // Hdie text and shorten width if necessary. + + if (totalWidth > availableSize.width) { + totalWidth -= itemWidth - emptyItemWidth; + itemWidth = emptyItemWidth; + text = null; + } + + var el = new Polygon({ + shape: { + points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0) + }, + style: defaults(normalStyleModel.getItemStyle(), { + lineJoin: 'bevel' + }), + textContent: new ZRText({ + style: { + text: text, + fill: textStyleModel.getTextColor(), + font: textStyleModel.getFont() + } + }), + textConfig: { + position: 'inside' + }, + z2: Z2_EMPHASIS_LIFT * 1e4, + onclick: curry(onSelect, itemNode) + }); + el.disableLabelAnimation = true; + this.group.add(el); + packEventData(el, seriesModel, itemNode); + lastX += itemWidth + ITEM_GAP; + } + }; + + Breadcrumb.prototype.remove = function () { + this.group.removeAll(); + }; + + return Breadcrumb; + }(); + + function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) { + var points = [[head ? x : x - ARRAY_LENGTH, y], [x + itemWidth, y], [x + itemWidth, y + itemHeight], [head ? x : x - ARRAY_LENGTH, y + itemHeight]]; + !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]); + !head && points.push([x, y + itemHeight / 2]); + return points; + } // Package custom mouse event. + + + function packEventData(el, seriesModel, itemNode) { + getECData(el).eventData = { + componentType: 'series', + componentSubType: 'treemap', + componentIndex: seriesModel.componentIndex, + seriesIndex: seriesModel.seriesIndex, + seriesName: seriesModel.name, + seriesType: 'treemap', + selfType: 'breadcrumb', + nodeData: { + dataIndex: itemNode && itemNode.dataIndex, + name: itemNode && itemNode.name + }, + treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel) + }; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * Animate multiple elements with a single done-callback. + * + * @example + * animation + * .createWrap() + * .add(el1, {x: 10, y: 10}) + * .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400) + * .done(function () { // done }) + * .start('cubicOut'); + */ + var AnimationWrap = + /** @class */ + function () { + function AnimationWrap() { + this._storage = []; + this._elExistsMap = {}; + } + + /** + * Caution: a el can only be added once, otherwise 'done' + * might not be called. This method checks this (by el.id), + * suppresses adding and returns false when existing el found. + * + * @return Whether adding succeeded. + */ + + + AnimationWrap.prototype.add = function (el, target, duration, delay, easing) { + if (this._elExistsMap[el.id]) { + return false; + } + + this._elExistsMap[el.id] = true; + + this._storage.push({ + el: el, + target: target, + duration: duration, + delay: delay, + easing: easing + }); + + return true; + }; + /** + * Only execute when animation done/aborted. + */ + + + AnimationWrap.prototype.finished = function (callback) { + this._finishedCallback = callback; + return this; + }; + /** + * Will stop exist animation firstly. + */ + + + AnimationWrap.prototype.start = function () { + var _this = this; + + var count = this._storage.length; + + var checkTerminate = function () { + count--; + + if (count <= 0) { + // Guard. + _this._storage.length = 0; + _this._elExistsMap = {}; + _this._finishedCallback && _this._finishedCallback(); + } + }; + + for (var i = 0, len = this._storage.length; i < len; i++) { + var item = this._storage[i]; + item.el.animateTo(item.target, { + duration: item.duration, + delay: item.delay, + easing: item.easing, + setToFinal: true, + done: checkTerminate, + aborted: checkTerminate + }); + } + + return this; + }; + + return AnimationWrap; + }(); + + function createWrap() { + return new AnimationWrap(); + } + + var Group$1 = Group; + var Rect$1 = Rect; + var DRAG_THRESHOLD = 3; + var PATH_LABEL_NOAMAL = 'label'; + var PATH_UPPERLABEL_NORMAL = 'upperLabel'; // Should larger than emphasis states lift z + + var Z2_BASE = Z2_EMPHASIS_LIFT * 10; // Should bigger than every z2. + + var Z2_BG = Z2_EMPHASIS_LIFT * 2; + var Z2_CONTENT = Z2_EMPHASIS_LIFT * 3; + var getStateItemStyle = makeStyleMapper([['fill', 'color'], // `borderColor` and `borderWidth` has been occupied, + // so use `stroke` to indicate the stroke of the rect. + ['stroke', 'strokeColor'], ['lineWidth', 'strokeWidth'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ]); + + var getItemStyleNormal = function (model) { + // Normal style props should include emphasis style props. + var itemStyle = getStateItemStyle(model); // Clear styles set by emphasis. + + itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null; + return itemStyle; + }; + + var inner$8 = makeInner(); + + var TreemapView = + /** @class */ + function (_super) { + __extends(TreemapView, _super); + + function TreemapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TreemapView.type; + _this._state = 'ready'; + _this._storage = createStorage(); + return _this; + } + + /** + * @override + */ + + + TreemapView.prototype.render = function (seriesModel, ecModel, api, payload) { + var models = ecModel.findComponents({ + mainType: 'series', + subType: 'treemap', + query: payload + }); + + if (indexOf(models, seriesModel) < 0) { + return; + } + + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var payloadType = payload && payload.type; + var layoutInfo = seriesModel.layoutInfo; + var isInit = !this._oldTree; + var thisStorage = this._storage; // Mark new root when action is treemapRootToNode. + + var reRoot = payloadType === 'treemapRootToNode' && targetInfo && thisStorage ? { + rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()], + direction: payload.direction + } : null; + + var containerGroup = this._giveContainerGroup(layoutInfo); + + var hasAnimation = seriesModel.get('animation'); + + var renderResult = this._doRender(containerGroup, seriesModel, reRoot); + + hasAnimation && !isInit && (!payloadType || payloadType === 'treemapZoomToNode' || payloadType === 'treemapRootToNode') ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) : renderResult.renderFinally(); + + this._resetController(api); + + this._renderBreadcrumb(seriesModel, api, targetInfo); + }; + + TreemapView.prototype._giveContainerGroup = function (layoutInfo) { + var containerGroup = this._containerGroup; + + if (!containerGroup) { + // FIXME + // 加一层containerGroup是为了clip,但是现在clip功能并没有实现。 + containerGroup = this._containerGroup = new Group$1(); + + this._initEvents(containerGroup); + + this.group.add(containerGroup); + } + + containerGroup.x = layoutInfo.x; + containerGroup.y = layoutInfo.y; + return containerGroup; + }; + + TreemapView.prototype._doRender = function (containerGroup, seriesModel, reRoot) { + var thisTree = seriesModel.getData().tree; + var oldTree = this._oldTree; // Clear last shape records. + + var lastsForAnimation = createStorage(); + var thisStorage = createStorage(); + var oldStorage = this._storage; + var willInvisibleEls = []; + + function doRenderNode(thisNode, oldNode, parentGroup, depth) { + return renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth); + } // Notice: when thisTree and oldTree are the same tree (see list.cloneShallow), + // the oldTree is actually losted, so we can not find all of the old graphic + // elements from tree. So we use this stragegy: make element storage, move + // from old storage to new storage, clear old storage. + + + dualTravel(thisTree.root ? [thisTree.root] : [], oldTree && oldTree.root ? [oldTree.root] : [], containerGroup, thisTree === oldTree || !oldTree, 0); // Process all removing. + + var willDeleteEls = clearStorage(oldStorage); + this._oldTree = thisTree; + this._storage = thisStorage; + return { + lastsForAnimation: lastsForAnimation, + willDeleteEls: willDeleteEls, + renderFinally: renderFinally + }; + + function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) { + // When 'render' is triggered by action, + // 'this' and 'old' may be the same tree, + // we use rawIndex in that case. + if (sameTree) { + oldViewChildren = thisViewChildren; + each(thisViewChildren, function (child, index) { + !child.isRemoved() && processNode(index, index); + }); + } // Diff hierarchically (diff only in each subtree, but not whole). + // because, consistency of view is important. + else { + new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute(); + } + + function getKey(node) { + // Identify by name or raw index. + return node.getId(); + } + + function processNode(newIndex, oldIndex) { + var thisNode = newIndex != null ? thisViewChildren[newIndex] : null; + var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null; + var group = doRenderNode(thisNode, oldNode, parentGroup, depth); + group && dualTravel(thisNode && thisNode.viewChildren || [], oldNode && oldNode.viewChildren || [], group, sameTree, depth + 1); + } + } + + function clearStorage(storage) { + var willDeleteEls = createStorage(); + storage && each(storage, function (store, storageName) { + var delEls = willDeleteEls[storageName]; + each(store, function (el) { + el && (delEls.push(el), inner$8(el).willDelete = true); + }); + }); + return willDeleteEls; + } + + function renderFinally() { + each(willDeleteEls, function (els) { + each(els, function (el) { + el.parent && el.parent.remove(el); + }); + }); + each(willInvisibleEls, function (el) { + el.invisible = true; // Setting invisible is for optimizing, so no need to set dirty, + // just mark as invisible. + + el.dirty(); + }); + } + }; + + TreemapView.prototype._doAnimation = function (containerGroup, renderResult, seriesModel, reRoot) { + var durationOption = seriesModel.get('animationDurationUpdate'); + var easingOption = seriesModel.get('animationEasing'); // TODO: do not support function until necessary. + + var duration = (isFunction(durationOption) ? 0 : durationOption) || 0; + var easing = (isFunction(easingOption) ? null : easingOption) || 'cubicOut'; + var animationWrap = createWrap(); // Make delete animations. + + each(renderResult.willDeleteEls, function (store, storageName) { + each(store, function (el, rawIndex) { + if (el.invisible) { + return; + } + + var parent = el.parent; // Always has parent, and parent is nodeGroup. + + var target; + var innerStore = inner$8(parent); + + if (reRoot && reRoot.direction === 'drillDown') { + target = parent === reRoot.rootNodeGroup // This is the content element of view root. + // Only `content` will enter this branch, because + // `background` and `nodeGroup` will not be deleted. + ? { + shape: { + x: 0, + y: 0, + width: innerStore.nodeWidth, + height: innerStore.nodeHeight + }, + style: { + opacity: 0 + } + } // Others. + : { + style: { + opacity: 0 + } + }; + } else { + var targetX = 0; + var targetY = 0; + + if (!innerStore.willDelete) { + // Let node animate to right-bottom corner, cooperating with fadeout, + // which is appropriate for user understanding. + // Divided by 2 for reRoot rolling up effect. + targetX = innerStore.nodeWidth / 2; + targetY = innerStore.nodeHeight / 2; + } + + target = storageName === 'nodeGroup' ? { + x: targetX, + y: targetY, + style: { + opacity: 0 + } + } : { + shape: { + x: targetX, + y: targetY, + width: 0, + height: 0 + }, + style: { + opacity: 0 + } + }; + } // TODO: do not support delay until necessary. + + + target && animationWrap.add(el, target, duration, 0, easing); + }); + }); // Make other animations + + each(this._storage, function (store, storageName) { + each(store, function (el, rawIndex) { + var last = renderResult.lastsForAnimation[storageName][rawIndex]; + var target = {}; + + if (!last) { + return; + } + + if (el instanceof Group) { + if (last.oldX != null) { + target.x = el.x; + target.y = el.y; + el.x = last.oldX; + el.y = last.oldY; + } + } else { + if (last.oldShape) { + target.shape = extend({}, el.shape); + el.setShape(last.oldShape); + } + + if (last.fadein) { + el.setStyle('opacity', 0); + target.style = { + opacity: 1 + }; + } // When animation is stopped for succedent animation starting, + // el.style.opacity might not be 1 + else if (el.style.opacity !== 1) { + target.style = { + opacity: 1 + }; + } + } + + animationWrap.add(el, target, duration, 0, easing); + }); + }, this); + this._state = 'animating'; + animationWrap.finished(bind(function () { + this._state = 'ready'; + renderResult.renderFinally(); + }, this)).start(); + }; + + TreemapView.prototype._resetController = function (api) { + var controller = this._controller; // Init controller. + + if (!controller) { + controller = this._controller = new RoamController(api.getZr()); + controller.enable(this.seriesModel.get('roam')); + controller.on('pan', bind(this._onPan, this)); + controller.on('zoom', bind(this._onZoom, this)); + } + + var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight()); + controller.setPointerChecker(function (e, x, y) { + return rect.contain(x, y); + }); + }; + + TreemapView.prototype._clearController = function () { + var controller = this._controller; + + if (controller) { + controller.dispose(); + controller = null; + } + }; + + TreemapView.prototype._onPan = function (e) { + if (this._state !== 'animating' && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)) { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + this.api.dispatchAction({ + type: 'treemapMove', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rootLayout.x + e.dx, + y: rootLayout.y + e.dy, + width: rootLayout.width, + height: rootLayout.height + } + }); + } + }; + + TreemapView.prototype._onZoom = function (e) { + var mouseX = e.originX; + var mouseY = e.originY; + + if (this._state !== 'animating') { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + var rect = new BoundingRect(rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height); + var layoutInfo = this.seriesModel.layoutInfo; // Transform mouse coord from global to containerGroup. + + mouseX -= layoutInfo.x; + mouseY -= layoutInfo.y; // Scale root bounding rect. + + var m = create$1(); + translate(m, m, [-mouseX, -mouseY]); + scale$1(m, m, [e.scale, e.scale]); + translate(m, m, [mouseX, mouseY]); + rect.applyTransform(m); + this.api.dispatchAction({ + type: 'treemapRender', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + } + }); + } + }; + + TreemapView.prototype._initEvents = function (containerGroup) { + var _this = this; + + containerGroup.on('click', function (e) { + if (_this._state !== 'ready') { + return; + } + + var nodeClick = _this.seriesModel.get('nodeClick', true); + + if (!nodeClick) { + return; + } + + var targetInfo = _this.findTarget(e.offsetX, e.offsetY); + + if (!targetInfo) { + return; + } + + var node = targetInfo.node; + + if (node.getLayout().isLeafRoot) { + _this._rootToNode(targetInfo); + } else { + if (nodeClick === 'zoomToNode') { + _this._zoomToNode(targetInfo); + } else if (nodeClick === 'link') { + var itemModel = node.hostTree.data.getItemModel(node.dataIndex); + var link = itemModel.get('link', true); + var linkTarget = itemModel.get('target', true) || 'blank'; + link && windowOpen(link, linkTarget); + } + } + }, this); + }; + + TreemapView.prototype._renderBreadcrumb = function (seriesModel, api, targetInfo) { + var _this = this; + + if (!targetInfo) { + targetInfo = seriesModel.get('leafDepth', true) != null ? { + node: seriesModel.getViewRoot() + } // FIXME + // better way? + // Find breadcrumb tail on center of containerGroup. + : this.findTarget(api.getWidth() / 2, api.getHeight() / 2); + + if (!targetInfo) { + targetInfo = { + node: seriesModel.getData().tree.root + }; + } + } + + (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))).render(seriesModel, api, targetInfo.node, function (node) { + if (_this._state !== 'animating') { + aboveViewRoot(seriesModel.getViewRoot(), node) ? _this._rootToNode({ + node: node + }) : _this._zoomToNode({ + node: node + }); + } + }); + }; + /** + * @override + */ + + + TreemapView.prototype.remove = function () { + this._clearController(); + + this._containerGroup && this._containerGroup.removeAll(); + this._storage = createStorage(); + this._state = 'ready'; + this._breadcrumb && this._breadcrumb.remove(); + }; + + TreemapView.prototype.dispose = function () { + this._clearController(); + }; + + TreemapView.prototype._zoomToNode = function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapZoomToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }; + + TreemapView.prototype._rootToNode = function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapRootToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }; + /** + * @public + * @param {number} x Global coord x. + * @param {number} y Global coord y. + * @return {Object} info If not found, return undefined; + * @return {number} info.node Target node. + * @return {number} info.offsetX x refer to target node. + * @return {number} info.offsetY y refer to target node. + */ + + + TreemapView.prototype.findTarget = function (x, y) { + var targetInfo; + var viewRoot = this.seriesModel.getViewRoot(); + viewRoot.eachNode({ + attr: 'viewChildren', + order: 'preorder' + }, function (node) { + var bgEl = this._storage.background[node.getRawIndex()]; // If invisible, there might be no element. + + + if (bgEl) { + var point = bgEl.transformCoordToLocal(x, y); + var shape = bgEl.shape; // For performance consideration, dont use 'getBoundingRect'. + + if (shape.x <= point[0] && point[0] <= shape.x + shape.width && shape.y <= point[1] && point[1] <= shape.y + shape.height) { + targetInfo = { + node: node, + offsetX: point[0], + offsetY: point[1] + }; + } else { + return false; // Suppress visit subtree. + } + } + }, this); + return targetInfo; + }; + + TreemapView.type = 'treemap'; + return TreemapView; + }(ChartView); + + /** + * @inner + */ + + + function createStorage() { + return { + nodeGroup: [], + background: [], + content: [] + }; + } + + /** + * @inner + * @return Return undefined means do not travel further. + */ + + + function renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth) { + // Whether under viewRoot. + if (!thisNode) { + // Deleting nodes will be performed finally. This method just find + // element from old storage, or create new element, set them to new + // storage, and set styles. + return; + } // ------------------------------------------------------------------- + // Start of closure variables available in "Procedures in renderNode". + + + var thisLayout = thisNode.getLayout(); + var data = seriesModel.getData(); + var nodeModel = thisNode.getModel(); // Only for enabling highlight/downplay. Clear firstly. + // Because some node will not be rendered. + + data.setItemGraphicEl(thisNode.dataIndex, null); + + if (!thisLayout || !thisLayout.isInView) { + return; + } + + var thisWidth = thisLayout.width; + var thisHeight = thisLayout.height; + var borderWidth = thisLayout.borderWidth; + var thisInvisible = thisLayout.invisible; + var thisRawIndex = thisNode.getRawIndex(); + var oldRawIndex = oldNode && oldNode.getRawIndex(); + var thisViewChildren = thisNode.viewChildren; + var upperHeight = thisLayout.upperHeight; + var isParent = thisViewChildren && thisViewChildren.length; + var itemStyleNormalModel = nodeModel.getModel('itemStyle'); + var itemStyleEmphasisModel = nodeModel.getModel(['emphasis', 'itemStyle']); + var itemStyleBlurModel = nodeModel.getModel(['blur', 'itemStyle']); + var itemStyleSelectModel = nodeModel.getModel(['select', 'itemStyle']); + var borderRadius = itemStyleNormalModel.get('borderRadius') || 0; // End of closure ariables available in "Procedures in renderNode". + // ----------------------------------------------------------------- + // Node group + + var group = giveGraphic('nodeGroup', Group$1); + + if (!group) { + return; + } + + parentGroup.add(group); // x,y are not set when el is above view root. + + group.x = thisLayout.x || 0; + group.y = thisLayout.y || 0; + group.markRedraw(); + inner$8(group).nodeWidth = thisWidth; + inner$8(group).nodeHeight = thisHeight; + + if (thisLayout.isAboveViewRoot) { + return group; + } // Background + + + var bg = giveGraphic('background', Rect$1, depth, Z2_BG); + bg && renderBackground(group, bg, isParent && thisLayout.upperLabelHeight); + var emphasisModel = nodeModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var isDisabled = emphasisModel.get('disabled'); + var focusOrIndices = focus === 'ancestor' ? thisNode.getAncestorsIndices() : focus === 'descendant' ? thisNode.getDescendantIndices() : focus; // No children, render content. + + if (isParent) { + // Because of the implementation about "traverse" in graphic hover style, we + // can not set hover listener on the "group" of non-leaf node. Otherwise the + // hover event from the descendents will be listenered. + if (isHighDownDispatcher(group)) { + setAsHighDownDispatcher(group, false); + } + + if (bg) { + setAsHighDownDispatcher(bg, !isDisabled); // Only for enabling highlight/downplay. + + data.setItemGraphicEl(thisNode.dataIndex, bg); + enableHoverFocus(bg, focusOrIndices, blurScope); + } + } else { + var content = giveGraphic('content', Rect$1, depth, Z2_CONTENT); + content && renderContent(group, content); + bg.disableMorphing = true; + + if (bg && isHighDownDispatcher(bg)) { + setAsHighDownDispatcher(bg, false); + } + + setAsHighDownDispatcher(group, !isDisabled); // Only for enabling highlight/downplay. + + data.setItemGraphicEl(thisNode.dataIndex, group); + enableHoverFocus(group, focusOrIndices, blurScope); + } + + return group; // ---------------------------- + // | Procedures in renderNode | + // ---------------------------- + + function renderBackground(group, bg, useUpperLabel) { + var ecData = getECData(bg); // For tooltip. + + ecData.dataIndex = thisNode.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + bg.setShape({ + x: 0, + y: 0, + width: thisWidth, + height: thisHeight, + r: borderRadius + }); + + if (thisInvisible) { + // If invisible, do not set visual, otherwise the element will + // change immediately before animation. We think it is OK to + // remain its origin color when moving out of the view window. + processInvisible(bg); + } else { + bg.invisible = false; + var style = thisNode.getVisual('style'); + var visualBorderColor = style.stroke; + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualBorderColor; + var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); + emphasisStyle.fill = itemStyleEmphasisModel.get('borderColor'); + var blurStyle = getStateItemStyle(itemStyleBlurModel); + blurStyle.fill = itemStyleBlurModel.get('borderColor'); + var selectStyle = getStateItemStyle(itemStyleSelectModel); + selectStyle.fill = itemStyleSelectModel.get('borderColor'); + + if (useUpperLabel) { + var upperLabelWidth = thisWidth - 2 * borderWidth; + prepareText( // PENDING: convert ZRColor to ColorString for text. + bg, visualBorderColor, style.opacity, { + x: borderWidth, + y: 0, + width: upperLabelWidth, + height: upperHeight + }); + } // For old bg. + else { + bg.removeTextContent(); + } + + bg.setStyle(normalStyle); + bg.ensureState('emphasis').style = emphasisStyle; + bg.ensureState('blur').style = blurStyle; + bg.ensureState('select').style = selectStyle; + setDefaultStateProxy(bg); + } + + group.add(bg); + } + + function renderContent(group, content) { + var ecData = getECData(content); // For tooltip. + + ecData.dataIndex = thisNode.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0); + var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0); + content.culling = true; + content.setShape({ + x: borderWidth, + y: borderWidth, + width: contentWidth, + height: contentHeight, + r: borderRadius + }); + + if (thisInvisible) { + // If invisible, do not set visual, otherwise the element will + // change immediately before animation. We think it is OK to + // remain its origin color when moving out of the view window. + processInvisible(content); + } else { + content.invisible = false; + var nodeStyle = thisNode.getVisual('style'); + var visualColor = nodeStyle.fill; + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualColor; + normalStyle.decal = nodeStyle.decal; + var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel); + var blurStyle = getStateItemStyle(itemStyleBlurModel); + var selectStyle = getStateItemStyle(itemStyleSelectModel); // PENDING: convert ZRColor to ColorString for text. + + prepareText(content, visualColor, nodeStyle.opacity, null); + content.setStyle(normalStyle); + content.ensureState('emphasis').style = emphasisStyle; + content.ensureState('blur').style = blurStyle; + content.ensureState('select').style = selectStyle; + setDefaultStateProxy(content); + } + + group.add(content); + } + + function processInvisible(element) { + // Delay invisible setting utill animation finished, + // avoid element vanish suddenly before animation. + !element.invisible && willInvisibleEls.push(element); + } + + function prepareText(rectEl, visualColor, visualOpacity, // Can be null/undefined + upperLabelRect) { + var normalLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL); + var defaultText = convertOptionIdName(nodeModel.get('name'), null); + var isShow = normalLabelModel.getShallow('show'); + setLabelStyle(rectEl, getLabelStatesModels(nodeModel, upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL), { + defaultText: isShow ? defaultText : null, + inheritColor: visualColor, + defaultOpacity: visualOpacity, + labelFetcher: seriesModel, + labelDataIndex: thisNode.dataIndex + }); + var textEl = rectEl.getTextContent(); + + if (!textEl) { + return; + } + + var textStyle = textEl.style; + var textPadding = normalizeCssArray(textStyle.padding || 0); + + if (upperLabelRect) { + rectEl.setTextConfig({ + layoutRect: upperLabelRect + }); + textEl.disableLabelLayout = true; + } + + textEl.beforeUpdate = function () { + var width = Math.max((upperLabelRect ? upperLabelRect.width : rectEl.shape.width) - textPadding[1] - textPadding[3], 0); + var height = Math.max((upperLabelRect ? upperLabelRect.height : rectEl.shape.height) - textPadding[0] - textPadding[2], 0); + + if (textStyle.width !== width || textStyle.height !== height) { + textEl.setStyle({ + width: width, + height: height + }); + } + }; + + textStyle.truncateMinChar = 2; + textStyle.lineOverflow = 'truncate'; + addDrillDownIcon(textStyle, upperLabelRect, thisLayout); + var textEmphasisState = textEl.getState('emphasis'); + addDrillDownIcon(textEmphasisState ? textEmphasisState.style : null, upperLabelRect, thisLayout); + } + + function addDrillDownIcon(style, upperLabelRect, thisLayout) { + var text = style ? style.text : null; + + if (!upperLabelRect && thisLayout.isLeafRoot && text != null) { + var iconChar = seriesModel.get('drillDownIcon', true); + style.text = iconChar ? iconChar + ' ' + text : text; + } + } + + function giveGraphic(storageName, Ctor, depth, z) { + var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex]; + var lasts = lastsForAnimation[storageName]; + + if (element) { + // Remove from oldStorage + oldStorage[storageName][oldRawIndex] = null; + prepareAnimationWhenHasOld(lasts, element); + } // If invisible and no old element, do not create new element (for optimizing). + else if (!thisInvisible) { + element = new Ctor(); + + if (element instanceof Displayable) { + element.z2 = calculateZ2(depth, z); + } + + prepareAnimationWhenNoOld(lasts, element); + } // Set to thisStorage + + + return thisStorage[storageName][thisRawIndex] = element; + } + + function prepareAnimationWhenHasOld(lasts, element) { + var lastCfg = lasts[thisRawIndex] = {}; + + if (element instanceof Group$1) { + lastCfg.oldX = element.x; + lastCfg.oldY = element.y; + } else { + lastCfg.oldShape = extend({}, element.shape); + } + } // If a element is new, we need to find the animation start point carefully, + // otherwise it will looks strange when 'zoomToNode'. + + + function prepareAnimationWhenNoOld(lasts, element) { + var lastCfg = lasts[thisRawIndex] = {}; + var parentNode = thisNode.parentNode; + var isGroup = element instanceof Group; + + if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) { + var parentOldX = 0; + var parentOldY = 0; // New nodes appear from right-bottom corner in 'zoomToNode' animation. + // For convenience, get old bounding rect from background. + + var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()]; + + if (!reRoot && parentOldBg && parentOldBg.oldShape) { + parentOldX = parentOldBg.oldShape.width; + parentOldY = parentOldBg.oldShape.height; + } // When no parent old shape found, its parent is new too, + // so we can just use {x:0, y:0}. + + + if (isGroup) { + lastCfg.oldX = 0; + lastCfg.oldY = parentOldY; + } else { + lastCfg.oldShape = { + x: parentOldX, + y: parentOldY, + width: 0, + height: 0 + }; + } + } // Fade in, user can be aware that these nodes are new. + + + lastCfg.fadein = !isGroup; + } + } // We can not set all backgroud with the same z, Because the behaviour of + // drill down and roll up differ background creation sequence from tree + // hierarchy sequence, which cause that lowser background element overlap + // upper ones. So we calculate z based on depth. + // Moreover, we try to shrink down z interval to [0, 1] to avoid that + // treemap with large z overlaps other components. + + + function calculateZ2(depth, z2InLevel) { + return depth * Z2_BASE + z2InLevel; + } + + var each$3 = each; + var isObject$3 = isObject; + var CATEGORY_DEFAULT_VISUAL_INDEX = -1; + + var VisualMapping = + /** @class */ + function () { + function VisualMapping(option) { + var mappingMethod = option.mappingMethod; + var visualType = option.type; + var thisOption = this.option = clone(option); + this.type = visualType; + this.mappingMethod = mappingMethod; + this._normalizeData = normalizers[mappingMethod]; + var visualHandler = VisualMapping.visualHandlers[visualType]; + this.applyVisual = visualHandler.applyVisual; + this.getColorMapper = visualHandler.getColorMapper; + this._normalizedToVisual = visualHandler._normalizedToVisual[mappingMethod]; + + if (mappingMethod === 'piecewise') { + normalizeVisualRange(thisOption); + preprocessForPiecewise(thisOption); + } else if (mappingMethod === 'category') { + thisOption.categories ? preprocessForSpecifiedCategory(thisOption) // categories is ordinal when thisOption.categories not specified, + // which need no more preprocess except normalize visual. + : normalizeVisualRange(thisOption, true); + } else { + // mappingMethod === 'linear' or 'fixed' + assert(mappingMethod !== 'linear' || thisOption.dataExtent); + normalizeVisualRange(thisOption); + } + } + + VisualMapping.prototype.mapValueToVisual = function (value) { + var normalized = this._normalizeData(value); + + return this._normalizedToVisual(normalized, value); + }; + + VisualMapping.prototype.getNormalizer = function () { + return bind(this._normalizeData, this); + }; + /** + * List available visual types. + * + * @public + * @return {Array.} + */ + + + VisualMapping.listVisualTypes = function () { + return keys(VisualMapping.visualHandlers); + }; // /** + // * @public + // */ + // static addVisualHandler(name, handler) { + // visualHandlers[name] = handler; + // } + + /** + * @public + */ + + + VisualMapping.isValidType = function (visualType) { + return VisualMapping.visualHandlers.hasOwnProperty(visualType); + }; + /** + * Convinent method. + * Visual can be Object or Array or primary type. + */ + + + VisualMapping.eachVisual = function (visual, callback, context) { + if (isObject(visual)) { + each(visual, callback, context); + } else { + callback.call(context, visual); + } + }; + + VisualMapping.mapVisual = function (visual, callback, context) { + var isPrimary; + var newVisual = isArray(visual) ? [] : isObject(visual) ? {} : (isPrimary = true, null); + VisualMapping.eachVisual(visual, function (v, key) { + var newVal = callback.call(context, v, key); + isPrimary ? newVisual = newVal : newVisual[key] = newVal; + }); + return newVisual; + }; + /** + * Retrieve visual properties from given object. + */ + + + VisualMapping.retrieveVisuals = function (obj) { + var ret = {}; + var hasVisual; + obj && each$3(VisualMapping.visualHandlers, function (h, visualType) { + if (obj.hasOwnProperty(visualType)) { + ret[visualType] = obj[visualType]; + hasVisual = true; + } + }); + return hasVisual ? ret : null; + }; + /** + * Give order to visual types, considering colorSaturation, colorAlpha depends on color. + * + * @public + * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...} + * IF Array, like: ['color', 'symbol', 'colorSaturation'] + * @return {Array.} Sorted visual types. + */ + + + VisualMapping.prepareVisualTypes = function (visualTypes) { + if (isArray(visualTypes)) { + visualTypes = visualTypes.slice(); + } else if (isObject$3(visualTypes)) { + var types_1 = []; + each$3(visualTypes, function (item, type) { + types_1.push(type); + }); + visualTypes = types_1; + } else { + return []; + } + + visualTypes.sort(function (type1, type2) { + // color should be front of colorSaturation, colorAlpha, ... + // symbol and symbolSize do not matter. + return type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0 ? 1 : -1; + }); + return visualTypes; + }; + /** + * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'. + * Other visuals are only depends on themself. + */ + + + VisualMapping.dependsOn = function (visualType1, visualType2) { + return visualType2 === 'color' ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2; + }; + /** + * @param value + * @param pieceList [{value: ..., interval: [min, max]}, ...] + * Always from small to big. + * @param findClosestWhenOutside Default to be false + * @return index + */ + + + VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) { + var possibleI; + var abs = Infinity; // value has the higher priority. + + for (var i = 0, len = pieceList.length; i < len; i++) { + var pieceValue = pieceList[i].value; + + if (pieceValue != null) { + if (pieceValue === value // FIXME + // It is supposed to compare value according to value type of dimension, + // but currently value type can exactly be string or number. + // Compromise for numeric-like string (like '12'), especially + // in the case that visualMap.categories is ['22', '33']. + || isString(pieceValue) && pieceValue === value + '') { + return i; + } + + findClosestWhenOutside && updatePossible(pieceValue, i); + } + } + + for (var i = 0, len = pieceList.length; i < len; i++) { + var piece = pieceList[i]; + var interval = piece.interval; + var close_1 = piece.close; + + if (interval) { + if (interval[0] === -Infinity) { + if (littleThan(close_1[1], value, interval[1])) { + return i; + } + } else if (interval[1] === Infinity) { + if (littleThan(close_1[0], interval[0], value)) { + return i; + } + } else if (littleThan(close_1[0], interval[0], value) && littleThan(close_1[1], value, interval[1])) { + return i; + } + + findClosestWhenOutside && updatePossible(interval[0], i); + findClosestWhenOutside && updatePossible(interval[1], i); + } + } + + if (findClosestWhenOutside) { + return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI; + } + + function updatePossible(val, index) { + var newAbs = Math.abs(val - value); + + if (newAbs < abs) { + abs = newAbs; + possibleI = index; + } + } + }; + + VisualMapping.visualHandlers = { + color: { + applyVisual: makeApplyVisual('color'), + getColorMapper: function () { + var thisOption = this.option; + return bind(thisOption.mappingMethod === 'category' ? function (value, isNormalized) { + !isNormalized && (value = this._normalizeData(value)); + return doMapCategory.call(this, value); + } : function (value, isNormalized, out) { + // If output rgb array + // which will be much faster and useful in pixel manipulation + var returnRGBArray = !!out; + !isNormalized && (value = this._normalizeData(value)); + out = fastLerp(value, thisOption.parsedVisual, out); + return returnRGBArray ? out : stringify(out, 'rgba'); + }, this); + }, + _normalizedToVisual: { + linear: function (normalized) { + return stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba'); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba'); + } + + return result; + }, + fixed: doMapFixed + } + }, + colorHue: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, value); + }), + colorSaturation: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, null, value); + }), + colorLightness: makePartialColorVisualHandler(function (color$1, value) { + return modifyHSL(color$1, null, null, value); + }), + colorAlpha: makePartialColorVisualHandler(function (color$1, value) { + return modifyAlpha(color$1, value); + }), + decal: { + applyVisual: makeApplyVisual('decal'), + _normalizedToVisual: { + linear: null, + category: doMapCategory, + piecewise: null, + fixed: null + } + }, + opacity: { + applyVisual: makeApplyVisual('opacity'), + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + }, + liftZ: { + applyVisual: makeApplyVisual('liftZ'), + _normalizedToVisual: { + linear: doMapFixed, + category: doMapFixed, + piecewise: doMapFixed, + fixed: doMapFixed + } + }, + symbol: { + applyVisual: function (value, getter, setter) { + var symbolCfg = this.mapValueToVisual(value); + setter('symbol', symbolCfg); + }, + _normalizedToVisual: { + linear: doMapToArray, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = doMapToArray.call(this, normalized); + } + + return result; + }, + fixed: doMapFixed + } + }, + symbolSize: { + applyVisual: makeApplyVisual('symbolSize'), + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + } + }; + return VisualMapping; + }(); + + function preprocessForPiecewise(thisOption) { + var pieceList = thisOption.pieceList; + thisOption.hasSpecialVisual = false; + each(pieceList, function (piece, index) { + piece.originIndex = index; // piece.visual is "result visual value" but not + // a visual range, so it does not need to be normalized. + + if (piece.visual != null) { + thisOption.hasSpecialVisual = true; + } + }); + } + + function preprocessForSpecifiedCategory(thisOption) { + // Hash categories. + var categories = thisOption.categories; + var categoryMap = thisOption.categoryMap = {}; + var visual = thisOption.visual; + each$3(categories, function (cate, index) { + categoryMap[cate] = index; + }); // Process visual map input. + + if (!isArray(visual)) { + var visualArr_1 = []; + + if (isObject(visual)) { + each$3(visual, function (v, cate) { + var index = categoryMap[cate]; + visualArr_1[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v; + }); + } else { + // Is primary type, represents default visual. + visualArr_1[CATEGORY_DEFAULT_VISUAL_INDEX] = visual; + } + + visual = setVisualToOption(thisOption, visualArr_1); + } // Remove categories that has no visual, + // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX. + + + for (var i = categories.length - 1; i >= 0; i--) { + if (visual[i] == null) { + delete categoryMap[categories[i]]; + categories.pop(); + } + } + } + + function normalizeVisualRange(thisOption, isCategory) { + var visual = thisOption.visual; + var visualArr = []; + + if (isObject(visual)) { + each$3(visual, function (v) { + visualArr.push(v); + }); + } else if (visual != null) { + visualArr.push(visual); + } + + var doNotNeedPair = { + color: 1, + symbol: 1 + }; + + if (!isCategory && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) { + // Do not care visualArr.length === 0, which is illegal. + visualArr[1] = visualArr[0]; + } + + setVisualToOption(thisOption, visualArr); + } + + function makePartialColorVisualHandler(applyValue) { + return { + applyVisual: function (value, getter, setter) { + // Only used in HSL + var colorChannel = this.mapValueToVisual(value); // Must not be array value + + setter('color', applyValue(getter('color'), colorChannel)); + }, + _normalizedToVisual: createNormalizedToNumericVisual([0, 1]) + }; + } + + function doMapToArray(normalized) { + var visual = this.option.visual; + return visual[Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))] || {}; // TODO {}? + } + + function makeApplyVisual(visualType) { + return function (value, getter, setter) { + setter(visualType, this.mapValueToVisual(value)); + }; + } + + function doMapCategory(normalized) { + var visual = this.option.visual; + return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized]; + } + + function doMapFixed() { + // visual will be convert to array. + return this.option.visual[0]; + } + + /** + * Create mapped to numeric visual + */ + + + function createNormalizedToNumericVisual(sourceExtent) { + return { + linear: function (normalized) { + return linearMap(normalized, sourceExtent, this.option.visual, true); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + + if (result == null) { + result = linearMap(normalized, sourceExtent, this.option.visual, true); + } + + return result; + }, + fixed: doMapFixed + }; + } + + function getSpecifiedVisual(value) { + var thisOption = this.option; + var pieceList = thisOption.pieceList; + + if (thisOption.hasSpecialVisual) { + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList); + var piece = pieceList[pieceIndex]; + + if (piece && piece.visual) { + return piece.visual[this.type]; + } + } + } + + function setVisualToOption(thisOption, visualArr) { + thisOption.visual = visualArr; + + if (thisOption.type === 'color') { + thisOption.parsedVisual = map(visualArr, function (item) { + var color$1 = parse(item); + + if (!color$1 && "development" !== 'production') { + warn("'" + item + "' is an illegal color, fallback to '#000000'", true); + } + + return color$1 || [0, 0, 0, 1]; + }); + } + + return visualArr; + } + + /** + * Normalizers by mapping methods. + */ + + + var normalizers = { + linear: function (value) { + return linearMap(value, this.option.dataExtent, [0, 1], true); + }, + piecewise: function (value) { + var pieceList = this.option.pieceList; + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true); + + if (pieceIndex != null) { + return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true); + } + }, + category: function (value) { + var index = this.option.categories ? this.option.categoryMap[value] : value; // ordinal value + + return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index; + }, + fixed: noop + }; + + function littleThan(close, a, b) { + return close ? a <= b : a < b; + } + + var ITEM_STYLE_NORMAL = 'itemStyle'; + var inner$9 = makeInner(); + var treemapVisual = { + seriesType: 'treemap', + reset: function (seriesModel) { + var tree = seriesModel.getData().tree; + var root = tree.root; + + if (root.isRemoved()) { + return; + } + + travelTree(root, // Visual should calculate from tree root but not view root. + {}, seriesModel.getViewRoot().getAncestors(), seriesModel); + } + }; + + function travelTree(node, designatedVisual, viewRootAncestors, seriesModel) { + var nodeModel = node.getModel(); + var nodeLayout = node.getLayout(); + var data = node.hostTree.data; // Optimize + + if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) { + return; + } + + var nodeItemStyleModel = nodeModel.getModel(ITEM_STYLE_NORMAL); + var visuals = buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel); + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); // calculate border color + + var borderColor = nodeItemStyleModel.get('borderColor'); + var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation'); + var thisNodeColor; + + if (borderColorSaturation != null) { + // For performance, do not always execute 'calculateColor'. + thisNodeColor = calculateColor(visuals); + borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor); + } + + existsStyle.stroke = borderColor; + var viewChildren = node.viewChildren; + + if (!viewChildren || !viewChildren.length) { + thisNodeColor = calculateColor(visuals); // Apply visual to this node. + + existsStyle.fill = thisNodeColor; + } else { + var mapping_1 = buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren); // Designate visual to children. + + each(viewChildren, function (child, index) { + // If higher than viewRoot, only ancestors of viewRoot is needed to visit. + if (child.depth >= viewRootAncestors.length || child === viewRootAncestors[child.depth]) { + var childVisual = mapVisual(nodeModel, visuals, child, index, mapping_1, seriesModel); + travelTree(child, childVisual, viewRootAncestors, seriesModel); + } + }); + } + } + + function buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel) { + var visuals = extend({}, designatedVisual); + var designatedVisualItemStyle = seriesModel.designatedVisualItemStyle; + each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) { + // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel + designatedVisualItemStyle[visualName] = designatedVisual[visualName]; + var val = nodeItemStyleModel.get(visualName); + designatedVisualItemStyle[visualName] = null; + val != null && (visuals[visualName] = val); + }); + return visuals; + } + + function calculateColor(visuals) { + var color = getValueVisualDefine(visuals, 'color'); + + if (color) { + var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha'); + var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation'); + + if (colorSaturation) { + color = modifyHSL(color, null, null, colorSaturation); + } + + if (colorAlpha) { + color = modifyAlpha(color, colorAlpha); + } + + return color; + } + } + + function calculateBorderColor(borderColorSaturation, thisNodeColor) { + return thisNodeColor != null // Can only be string + ? modifyHSL(thisNodeColor, null, null, borderColorSaturation) : null; + } + + function getValueVisualDefine(visuals, name) { + var value = visuals[name]; + + if (value != null && value !== 'none') { + return value; + } + } + + function buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren) { + if (!viewChildren || !viewChildren.length) { + return; + } + + var rangeVisual = getRangeVisual(nodeModel, 'color') || visuals.color != null && visuals.color !== 'none' && (getRangeVisual(nodeModel, 'colorAlpha') || getRangeVisual(nodeModel, 'colorSaturation')); + + if (!rangeVisual) { + return; + } + + var visualMin = nodeModel.get('visualMin'); + var visualMax = nodeModel.get('visualMax'); + var dataExtent = nodeLayout.dataExtent.slice(); + visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin); + visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax); + var colorMappingBy = nodeModel.get('colorMappingBy'); + var opt = { + type: rangeVisual.name, + dataExtent: dataExtent, + visual: rangeVisual.range + }; + + if (opt.type === 'color' && (colorMappingBy === 'index' || colorMappingBy === 'id')) { + opt.mappingMethod = 'category'; + opt.loop = true; // categories is ordinal, so do not set opt.categories. + } else { + opt.mappingMethod = 'linear'; + } + + var mapping = new VisualMapping(opt); + inner$9(mapping).drColorMappingBy = colorMappingBy; + return mapping; + } // Notice: If we dont have the attribute 'colorRange', but only use + // attribute 'color' to represent both concepts of 'colorRange' and 'color', + // (It means 'colorRange' when 'color' is Array, means 'color' when not array), + // this problem will be encountered: + // If a level-1 node dont have children, and its siblings has children, + // and colorRange is set on level-1, then the node can not be colored. + // So we separate 'colorRange' and 'color' to different attributes. + + + function getRangeVisual(nodeModel, name) { + // 'colorRange', 'colorARange', 'colorSRange'. + // If not exsits on this node, fetch from levels and series. + var range = nodeModel.get(name); + return isArray(range) && range.length ? { + name: name, + range: range + } : null; + } + + function mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) { + var childVisuals = extend({}, visuals); + + if (mapping) { + // Only support color, colorAlpha, colorSaturation. + var mappingType = mapping.type; + var colorMappingBy = mappingType === 'color' && inner$9(mapping).drColorMappingBy; + var value = colorMappingBy === 'index' ? index : colorMappingBy === 'id' ? seriesModel.mapIdToIndex(child.getId()) : child.getValue(nodeModel.get('visualDimension')); + childVisuals[mappingType] = mapping.mapValueToVisual(value); + } + + return childVisuals; + } + + var mathMax$7 = Math.max; + var mathMin$7 = Math.min; + var retrieveValue = retrieve; + var each$4 = each; + var PATH_BORDER_WIDTH = ['itemStyle', 'borderWidth']; + var PATH_GAP_WIDTH = ['itemStyle', 'gapWidth']; + var PATH_UPPER_LABEL_SHOW = ['upperLabel', 'show']; + var PATH_UPPER_LABEL_HEIGHT = ['upperLabel', 'height']; + /** + * @public + */ + + var treemapLayout = { + seriesType: 'treemap', + reset: function (seriesModel, ecModel, api, payload) { + // Layout result in each node: + // {x, y, width, height, area, borderWidth} + var ecWidth = api.getWidth(); + var ecHeight = api.getHeight(); + var seriesOption = seriesModel.option; + var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + var size = seriesOption.size || []; // Compatible with ec2. + + var containerWidth = parsePercent$1(retrieveValue(layoutInfo.width, size[0]), ecWidth); + var containerHeight = parsePercent$1(retrieveValue(layoutInfo.height, size[1]), ecHeight); // Fetch payload info. + + var payloadType = payload && payload.type; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var rootRect = payloadType === 'treemapRender' || payloadType === 'treemapMove' ? payload.rootRect : null; + var viewRoot = seriesModel.getViewRoot(); + var viewAbovePath = getPathToRoot(viewRoot); + + if (payloadType !== 'treemapMove') { + var rootSize = payloadType === 'treemapZoomToNode' ? estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) : rootRect ? [rootRect.width, rootRect.height] : [containerWidth, containerHeight]; + var sort_1 = seriesOption.sort; + + if (sort_1 && sort_1 !== 'asc' && sort_1 !== 'desc') { + // Default to be desc order. + sort_1 = 'desc'; + } + + var options = { + squareRatio: seriesOption.squareRatio, + sort: sort_1, + leafDepth: seriesOption.leafDepth + }; // layout should be cleared because using updateView but not update. + + viewRoot.hostTree.clearLayouts(); // TODO + // optimize: if out of view clip, do not layout. + // But take care that if do not render node out of view clip, + // how to calculate start po + + var viewRootLayout_1 = { + x: 0, + y: 0, + width: rootSize[0], + height: rootSize[1], + area: rootSize[0] * rootSize[1] + }; + viewRoot.setLayout(viewRootLayout_1); + squarify(viewRoot, options, false, 0); // Supplement layout. + + viewRootLayout_1 = viewRoot.getLayout(); + each$4(viewAbovePath, function (node, index) { + var childValue = (viewAbovePath[index + 1] || viewRoot).getValue(); + node.setLayout(extend({ + dataExtent: [childValue, childValue], + borderWidth: 0, + upperHeight: 0 + }, viewRootLayout_1)); + }); + } + + var treeRoot = seriesModel.getData().tree.root; + treeRoot.setLayout(calculateRootPosition(layoutInfo, rootRect, targetInfo), true); + seriesModel.setLayoutInfo(layoutInfo); // FIXME + // 现在没有clip功能,暂时取ec高宽。 + + prunning(treeRoot, // Transform to base element coordinate system. + new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), viewAbovePath, viewRoot, 0); + } + }; + + /** + * Layout treemap with squarify algorithm. + * The original presentation of this algorithm + * was made by Mark Bruls, Kees Huizing, and Jarke J. van Wijk + * . + * The implementation of this algorithm was originally copied from "d3.js" + * + * with some modifications made for this program. + * See the license statement at the head of this file. + * + * @protected + * @param {module:echarts/data/Tree~TreeNode} node + * @param {Object} options + * @param {string} options.sort 'asc' or 'desc' + * @param {number} options.squareRatio + * @param {boolean} hideChildren + * @param {number} depth + */ + + function squarify(node, options, hideChildren, depth) { + var width; + var height; + + if (node.isRemoved()) { + return; + } + + var thisLayout = node.getLayout(); + width = thisLayout.width; + height = thisLayout.height; // Considering border and gap + + var nodeModel = node.getModel(); + var borderWidth = nodeModel.get(PATH_BORDER_WIDTH); + var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2; + var upperLabelHeight = getUpperLabelHeight(nodeModel); + var upperHeight = Math.max(borderWidth, upperLabelHeight); + var layoutOffset = borderWidth - halfGapWidth; + var layoutOffsetUpper = upperHeight - halfGapWidth; + node.setLayout({ + borderWidth: borderWidth, + upperHeight: upperHeight, + upperLabelHeight: upperLabelHeight + }, true); + width = mathMax$7(width - 2 * layoutOffset, 0); + height = mathMax$7(height - layoutOffset - layoutOffsetUpper, 0); + var totalArea = width * height; + var viewChildren = initChildren(node, nodeModel, totalArea, options, hideChildren, depth); + + if (!viewChildren.length) { + return; + } + + var rect = { + x: layoutOffset, + y: layoutOffsetUpper, + width: width, + height: height + }; + var rowFixedLength = mathMin$7(width, height); + var best = Infinity; // the best row score so far + + var row = []; + row.area = 0; + + for (var i = 0, len = viewChildren.length; i < len;) { + var child = viewChildren[i]; + row.push(child); + row.area += child.getLayout().area; + var score = worst(row, rowFixedLength, options.squareRatio); // continue with this orientation + + if (score <= best) { + i++; + best = score; + } // abort, and try a different orientation + else { + row.area -= row.pop().getLayout().area; + position(row, rowFixedLength, rect, halfGapWidth, false); + rowFixedLength = mathMin$7(rect.width, rect.height); + row.length = row.area = 0; + best = Infinity; + } + } + + if (row.length) { + position(row, rowFixedLength, rect, halfGapWidth, true); + } + + if (!hideChildren) { + var childrenVisibleMin = nodeModel.get('childrenVisibleMin'); + + if (childrenVisibleMin != null && totalArea < childrenVisibleMin) { + hideChildren = true; + } + } + + for (var i = 0, len = viewChildren.length; i < len; i++) { + squarify(viewChildren[i], options, hideChildren, depth + 1); + } + } + + /** + * Set area to each child, and calculate data extent for visual coding. + */ + + + function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) { + var viewChildren = node.children || []; + var orderBy = options.sort; + orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null); + var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth; // leafDepth has higher priority. + + if (hideChildren && !overLeafDepth) { + return node.viewChildren = []; + } // Sort children, order by desc. + + + viewChildren = filter(viewChildren, function (child) { + return !child.isRemoved(); + }); + sort$1(viewChildren, orderBy); + var info = statistic(nodeModel, viewChildren, orderBy); + + if (info.sum === 0) { + return node.viewChildren = []; + } + + info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren); + + if (info.sum === 0) { + return node.viewChildren = []; + } // Set area to each child. + + + for (var i = 0, len = viewChildren.length; i < len; i++) { + var area = viewChildren[i].getValue() / info.sum * totalArea; // Do not use setLayout({...}, true), because it is needed to clear last layout. + + viewChildren[i].setLayout({ + area: area + }); + } + + if (overLeafDepth) { + viewChildren.length && node.setLayout({ + isLeafRoot: true + }, true); + viewChildren.length = 0; + } + + node.viewChildren = viewChildren; + node.setLayout({ + dataExtent: info.dataExtent + }, true); + return viewChildren; + } + + /** + * Consider 'visibleMin'. Modify viewChildren and get new sum. + */ + + + function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) { + // visibleMin is not supported yet when no option.sort. + if (!orderBy) { + return sum; + } + + var visibleMin = nodeModel.get('visibleMin'); + var len = orderedChildren.length; + var deletePoint = len; // Always travel from little value to big value. + + for (var i = len - 1; i >= 0; i--) { + var value = orderedChildren[orderBy === 'asc' ? len - i - 1 : i].getValue(); + + if (value / sum * totalArea < visibleMin) { + deletePoint = i; + sum -= value; + } + } + + orderBy === 'asc' ? orderedChildren.splice(0, len - deletePoint) : orderedChildren.splice(deletePoint, len - deletePoint); + return sum; + } + + /** + * Sort + */ + + + function sort$1(viewChildren, orderBy) { + if (orderBy) { + viewChildren.sort(function (a, b) { + var diff = orderBy === 'asc' ? a.getValue() - b.getValue() : b.getValue() - a.getValue(); + return diff === 0 ? orderBy === 'asc' ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex : diff; + }); + } + + return viewChildren; + } + + /** + * Statistic + */ + + + function statistic(nodeModel, children, orderBy) { + // Calculate sum. + var sum = 0; + + for (var i = 0, len = children.length; i < len; i++) { + sum += children[i].getValue(); + } // Statistic data extent for latter visual coding. + // Notice: data extent should be calculate based on raw children + // but not filtered view children, otherwise visual mapping will not + // be stable when zoom (where children is filtered by visibleMin). + + + var dimension = nodeModel.get('visualDimension'); + var dataExtent; // The same as area dimension. + + if (!children || !children.length) { + dataExtent = [NaN, NaN]; + } else if (dimension === 'value' && orderBy) { + dataExtent = [children[children.length - 1].getValue(), children[0].getValue()]; + orderBy === 'asc' && dataExtent.reverse(); + } // Other dimension. + else { + dataExtent = [Infinity, -Infinity]; + each$4(children, function (child) { + var value = child.getValue(dimension); + value < dataExtent[0] && (dataExtent[0] = value); + value > dataExtent[1] && (dataExtent[1] = value); + }); + } + + return { + sum: sum, + dataExtent: dataExtent + }; + } + + /** + * Computes the score for the specified row, + * as the worst aspect ratio. + */ + + + function worst(row, rowFixedLength, ratio) { + var areaMax = 0; + var areaMin = Infinity; + + for (var i = 0, area = void 0, len = row.length; i < len; i++) { + area = row[i].getLayout().area; + + if (area) { + area < areaMin && (areaMin = area); + area > areaMax && (areaMax = area); + } + } + + var squareArea = row.area * row.area; + var f = rowFixedLength * rowFixedLength * ratio; + return squareArea ? mathMax$7(f * areaMax / squareArea, squareArea / (f * areaMin)) : Infinity; + } + + /** + * Positions the specified row of nodes. Modifies `rect`. + */ + + + function position(row, rowFixedLength, rect, halfGapWidth, flush) { + // When rowFixedLength === rect.width, + // it is horizontal subdivision, + // rowFixedLength is the width of the subdivision, + // rowOtherLength is the height of the subdivision, + // and nodes will be positioned from left to right. + // wh[idx0WhenH] means: when horizontal, + // wh[idx0WhenH] => wh[0] => 'width'. + // xy[idx1WhenH] => xy[1] => 'y'. + var idx0WhenH = rowFixedLength === rect.width ? 0 : 1; + var idx1WhenH = 1 - idx0WhenH; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + var last = rect[xy[idx0WhenH]]; + var rowOtherLength = rowFixedLength ? row.area / rowFixedLength : 0; + + if (flush || rowOtherLength > rect[wh[idx1WhenH]]) { + rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow + } + + for (var i = 0, rowLen = row.length; i < rowLen; i++) { + var node = row[i]; + var nodeLayout = {}; + var step = rowOtherLength ? node.getLayout().area / rowOtherLength : 0; + var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax$7(rowOtherLength - 2 * halfGapWidth, 0); // We use Math.max/min to avoid negative width/height when considering gap width. + + var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last; + var modWH = i === rowLen - 1 || remain < step ? remain : step; + var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax$7(modWH - 2 * halfGapWidth, 0); + nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin$7(halfGapWidth, wh1 / 2); + nodeLayout[xy[idx0WhenH]] = last + mathMin$7(halfGapWidth, wh0 / 2); + last += modWH; + node.setLayout(nodeLayout, true); + } + + rect[xy[idx1WhenH]] += rowOtherLength; + rect[wh[idx1WhenH]] -= rowOtherLength; + } // Return [containerWidth, containerHeight] as default. + + + function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) { + // If targetInfo.node exists, we zoom to the node, + // so estimate whold width and heigth by target node. + var currNode = (targetInfo || {}).node; + var defaultSize = [containerWidth, containerHeight]; + + if (!currNode || currNode === viewRoot) { + return defaultSize; + } + + var parent; + var viewArea = containerWidth * containerHeight; + var area = viewArea * seriesModel.option.zoomToNodeRatio; + + while (parent = currNode.parentNode) { + // jshint ignore:line + var sum = 0; + var siblings = parent.children; + + for (var i = 0, len = siblings.length; i < len; i++) { + sum += siblings[i].getValue(); + } + + var currNodeValue = currNode.getValue(); + + if (currNodeValue === 0) { + return defaultSize; + } + + area *= sum / currNodeValue; // Considering border, suppose aspect ratio is 1. + + var parentModel = parent.getModel(); + var borderWidth = parentModel.get(PATH_BORDER_WIDTH); + var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel)); + area += 4 * borderWidth * borderWidth + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5); + area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER); + currNode = parent; + } + + area < viewArea && (area = viewArea); + var scale = Math.pow(area / viewArea, 0.5); + return [containerWidth * scale, containerHeight * scale]; + } // Root postion base on coord of containerGroup + + + function calculateRootPosition(layoutInfo, rootRect, targetInfo) { + if (rootRect) { + return { + x: rootRect.x, + y: rootRect.y + }; + } + + var defaultPosition = { + x: 0, + y: 0 + }; + + if (!targetInfo) { + return defaultPosition; + } // If targetInfo is fetched by 'retrieveTargetInfo', + // old tree and new tree are the same tree, + // so the node still exists and we can visit it. + + + var targetNode = targetInfo.node; + var layout = targetNode.getLayout(); + + if (!layout) { + return defaultPosition; + } // Transform coord from local to container. + + + var targetCenter = [layout.width / 2, layout.height / 2]; + var node = targetNode; + + while (node) { + var nodeLayout = node.getLayout(); + targetCenter[0] += nodeLayout.x; + targetCenter[1] += nodeLayout.y; + node = node.parentNode; + } + + return { + x: layoutInfo.width / 2 - targetCenter[0], + y: layoutInfo.height / 2 - targetCenter[1] + }; + } // Mark nodes visible for prunning when visual coding and rendering. + // Prunning depends on layout and root position, so we have to do it after layout. + + + function prunning(node, clipRect, viewAbovePath, viewRoot, depth) { + var nodeLayout = node.getLayout(); + var nodeInViewAbovePath = viewAbovePath[depth]; + var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node; + + if (nodeInViewAbovePath && !isAboveViewRoot || depth === viewAbovePath.length && node !== viewRoot) { + return; + } + + node.setLayout({ + // isInView means: viewRoot sub tree + viewAbovePath + isInView: true, + // invisible only means: outside view clip so that the node can not + // see but still layout for animation preparation but not render. + invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout), + isAboveViewRoot: isAboveViewRoot + }, true); // Transform to child coordinate. + + var childClipRect = new BoundingRect(clipRect.x - nodeLayout.x, clipRect.y - nodeLayout.y, clipRect.width, clipRect.height); + each$4(node.viewChildren || [], function (child) { + prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1); + }); + } + + function getUpperLabelHeight(model) { + return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0; + } + + function install$c(registers) { + registers.registerSeriesModel(TreemapSeriesModel); + registers.registerChartView(TreemapView); + registers.registerVisual(treemapVisual); + registers.registerLayout(treemapLayout); + installTreemapAction(registers); + } + + function categoryFilter(ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (!legendModels || !legendModels.length) { + return; + } + + ecModel.eachSeriesByType('graph', function (graphSeries) { + var categoriesData = graphSeries.getCategoriesData(); + var graph = graphSeries.getGraph(); + var data = graph.data; + var categoryNames = categoriesData.mapArray(categoriesData.getName); + data.filterSelf(function (idx) { + var model = data.getItemModel(idx); + var category = model.getShallow('category'); + + if (category != null) { + if (isNumber(category)) { + category = categoryNames[category]; + } // If in any legend component the status is not selected. + + + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(category)) { + return false; + } + } + } + + return true; + }); + }); + } + + function categoryVisual(ecModel) { + var paletteScope = {}; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var categoriesData = seriesModel.getCategoriesData(); + var data = seriesModel.getData(); + var categoryNameIdxMap = {}; + categoriesData.each(function (idx) { + var name = categoriesData.getName(idx); // Add prefix to avoid conflict with Object.prototype. + + categoryNameIdxMap['ec-' + name] = idx; + var itemModel = categoriesData.getItemModel(idx); + var style = itemModel.getModel('itemStyle').getItemStyle(); + + if (!style.fill) { + // Get color from palette. + style.fill = seriesModel.getColorFromPalette(name, paletteScope); + } + + categoriesData.setItemVisual(idx, 'style', style); + var symbolVisualList = ['symbol', 'symbolSize', 'symbolKeepAspect']; + + for (var i = 0; i < symbolVisualList.length; i++) { + var symbolVisual = itemModel.getShallow(symbolVisualList[i], true); + + if (symbolVisual != null) { + categoriesData.setItemVisual(idx, symbolVisualList[i], symbolVisual); + } + } + }); // Assign category color to visual + + if (categoriesData.count()) { + data.each(function (idx) { + var model = data.getItemModel(idx); + var categoryIdx = model.getShallow('category'); + + if (categoryIdx != null) { + if (isString(categoryIdx)) { + categoryIdx = categoryNameIdxMap['ec-' + categoryIdx]; + } + + var categoryStyle = categoriesData.getItemVisual(categoryIdx, 'style'); + var style = data.ensureUniqueItemVisual(idx, 'style'); + extend(style, categoryStyle); + var visualList = ['symbol', 'symbolSize', 'symbolKeepAspect']; + + for (var i = 0; i < visualList.length; i++) { + data.setItemVisual(idx, visualList[i], categoriesData.getItemVisual(categoryIdx, visualList[i])); + } + } + }); + } + }); + } + + function normalize$2(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + + return a; + } + + function graphEdgeVisual(ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var graph = seriesModel.getGraph(); + var edgeData = seriesModel.getEdgeData(); + var symbolType = normalize$2(seriesModel.get('edgeSymbol')); + var symbolSize = normalize$2(seriesModel.get('edgeSymbolSize')); // const colorQuery = ['lineStyle', 'color'] as const; + // const opacityQuery = ['lineStyle', 'opacity'] as const; + + edgeData.setVisual('fromSymbol', symbolType && symbolType[0]); + edgeData.setVisual('toSymbol', symbolType && symbolType[1]); + edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + edgeData.setVisual('style', seriesModel.getModel('lineStyle').getLineStyle()); + edgeData.each(function (idx) { + var itemModel = edgeData.getItemModel(idx); + var edge = graph.getEdgeByIndex(idx); + var symbolType = normalize$2(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$2(itemModel.getShallow('symbolSize', true)); // Edge visual must after node visual + + var style = itemModel.getModel('lineStyle').getLineStyle(); + var existsStyle = edgeData.ensureUniqueItemVisual(idx, 'style'); + extend(existsStyle, style); + + switch (existsStyle.stroke) { + case 'source': { + var nodeStyle = edge.node1.getVisual('style'); + existsStyle.stroke = nodeStyle && nodeStyle.fill; + break; + } + + case 'target': { + var nodeStyle = edge.node2.getVisual('style'); + existsStyle.stroke = nodeStyle && nodeStyle.fill; + break; + } + } + + symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]); + symbolType[1] && edge.setVisual('toSymbol', symbolType[1]); + symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]); + symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]); + }); + }); + } + + var KEY_DELIMITER = '-->'; + /** + * params handler + * @param {module:echarts/model/SeriesModel} seriesModel + * @returns {*} + */ + + var getAutoCurvenessParams = function (seriesModel) { + return seriesModel.get('autoCurveness') || null; + }; + /** + * Generate a list of edge curvatures, 20 is the default + * @param {module:echarts/model/SeriesModel} seriesModel + * @param {number} appendLength + * @return 20 => [0, -0.2, 0.2, -0.4, 0.4, -0.6, 0.6, -0.8, 0.8, -1, 1, -1.2, 1.2, -1.4, 1.4, -1.6, 1.6, -1.8, 1.8, -2] + */ + + + var createCurveness = function (seriesModel, appendLength) { + var autoCurvenessParmas = getAutoCurvenessParams(seriesModel); + var length = 20; + var curvenessList = []; // handler the function set + + if (isNumber(autoCurvenessParmas)) { + length = autoCurvenessParmas; + } else if (isArray(autoCurvenessParmas)) { + seriesModel.__curvenessList = autoCurvenessParmas; + return; + } // append length + + + if (appendLength > length) { + length = appendLength; + } // make sure the length is even + + + var len = length % 2 ? length + 2 : length + 3; + curvenessList = []; + + for (var i = 0; i < len; i++) { + curvenessList.push((i % 2 ? i + 1 : i) / 10 * (i % 2 ? -1 : 1)); + } + + seriesModel.__curvenessList = curvenessList; + }; + /** + * Create different cache key data in the positive and negative directions, in order to set the curvature later + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {module:echarts/model/SeriesModel} seriesModel + * @returns {string} key + */ + + + var getKeyOfEdges = function (n1, n2, seriesModel) { + var source = [n1.id, n1.dataIndex].join('.'); + var target = [n2.id, n2.dataIndex].join('.'); + return [seriesModel.uid, source, target].join(KEY_DELIMITER); + }; + /** + * get opposite key + * @param {string} key + * @returns {string} + */ + + + var getOppositeKey = function (key) { + var keys = key.split(KEY_DELIMITER); + return [keys[0], keys[2], keys[1]].join(KEY_DELIMITER); + }; + /** + * get edgeMap with key + * @param edge + * @param {module:echarts/model/SeriesModel} seriesModel + */ + + + var getEdgeFromMap = function (edge, seriesModel) { + var key = getKeyOfEdges(edge.node1, edge.node2, seriesModel); + return seriesModel.__edgeMap[key]; + }; + /** + * calculate all cases total length + * @param edge + * @param seriesModel + * @returns {number} + */ + + + var getTotalLengthBetweenNodes = function (edge, seriesModel) { + var len = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node1, edge.node2, seriesModel), seriesModel); + var lenV = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node2, edge.node1, seriesModel), seriesModel); + return len + lenV; + }; + /** + * + * @param key + */ + + + var getEdgeMapLengthWithKey = function (key, seriesModel) { + var edgeMap = seriesModel.__edgeMap; + return edgeMap[key] ? edgeMap[key].length : 0; + }; + + /** + * Count the number of edges between the same two points, used to obtain the curvature table and the parity of the edge + * @see /graph/GraphSeries.js@getInitialData + * @param {module:echarts/model/SeriesModel} seriesModel + */ + + + function initCurvenessList(seriesModel) { + if (!getAutoCurvenessParams(seriesModel)) { + return; + } + + seriesModel.__curvenessList = []; + seriesModel.__edgeMap = {}; // calc the array of curveness List + + createCurveness(seriesModel); + } + + /** + * set edgeMap with key + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {module:echarts/model/SeriesModel} seriesModel + * @param {number} index + */ + + function createEdgeMapForCurveness(n1, n2, seriesModel, index) { + if (!getAutoCurvenessParams(seriesModel)) { + return; + } + + var key = getKeyOfEdges(n1, n2, seriesModel); + var edgeMap = seriesModel.__edgeMap; + var oppositeEdges = edgeMap[getOppositeKey(key)]; // set direction + + if (edgeMap[key] && !oppositeEdges) { + edgeMap[key].isForward = true; + } else if (oppositeEdges && edgeMap[key]) { + oppositeEdges.isForward = true; + edgeMap[key].isForward = false; + } + + edgeMap[key] = edgeMap[key] || []; + edgeMap[key].push(index); + } + + /** + * get curvature for edge + * @param edge + * @param {module:echarts/model/SeriesModel} seriesModel + * @param index + */ + + function getCurvenessForEdge(edge, seriesModel, index, needReverse) { + var autoCurvenessParams = getAutoCurvenessParams(seriesModel); + var isArrayParam = isArray(autoCurvenessParams); + + if (!autoCurvenessParams) { + return null; + } + + var edgeArray = getEdgeFromMap(edge, seriesModel); + + if (!edgeArray) { + return null; + } + + var edgeIndex = -1; + + for (var i = 0; i < edgeArray.length; i++) { + if (edgeArray[i] === index) { + edgeIndex = i; + break; + } + } // if totalLen is Longer createCurveness + + + var totalLen = getTotalLengthBetweenNodes(edge, seriesModel); + createCurveness(seriesModel, totalLen); + edge.lineStyle = edge.lineStyle || {}; // if is opposite edge, must set curvenss to opposite number + + var curKey = getKeyOfEdges(edge.node1, edge.node2, seriesModel); + var curvenessList = seriesModel.__curvenessList; // if pass array no need parity + + var parityCorrection = isArrayParam ? 0 : totalLen % 2 ? 0 : 1; + + if (!edgeArray.isForward) { + // the opposite edge show outside + var oppositeKey = getOppositeKey(curKey); + var len = getEdgeMapLengthWithKey(oppositeKey, seriesModel); + var resValue = curvenessList[edgeIndex + len + parityCorrection]; // isNeedReverse, simple, force type need reverse the curveness in the junction of the forword and the opposite + + if (needReverse) { + // set as array may make the parity handle with the len of opposite + if (isArrayParam) { + if (autoCurvenessParams && autoCurvenessParams[0] === 0) { + return (len + parityCorrection) % 2 ? resValue : -resValue; + } else { + return ((len % 2 ? 0 : 1) + parityCorrection) % 2 ? resValue : -resValue; + } + } else { + return (len + parityCorrection) % 2 ? resValue : -resValue; + } + } else { + return curvenessList[edgeIndex + len + parityCorrection]; + } + } else { + return curvenessList[parityCorrection + edgeIndex]; + } + } + + function simpleLayout(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + var graph = seriesModel.getGraph(); + graph.eachNode(function (node) { + var model = node.getModel(); + node.setLayout([+model.get('x'), +model.get('y')]); + }); + simpleLayoutEdge(graph, seriesModel); + } + + function simpleLayoutEdge(graph, seriesModel) { + graph.eachEdge(function (edge, index) { + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, seriesModel, index, true), 0); + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var points = [p1, p2]; + + if (+curveness) { + points.push([(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness]); + } + + edge.setLayout(points); + }); + } + + function graphSimpleLayout(ecModel, api) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var layout = seriesModel.get('layout'); + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + var data_1 = seriesModel.getData(); + var dimensions_1 = []; + each(coordSys.dimensions, function (coordDim) { + dimensions_1 = dimensions_1.concat(data_1.mapDimensionsAll(coordDim)); + }); + + for (var dataIndex = 0; dataIndex < data_1.count(); dataIndex++) { + var value = []; + var hasValue = false; + + for (var i = 0; i < dimensions_1.length; i++) { + var val = data_1.get(dimensions_1[i], dataIndex); + + if (!isNaN(val)) { + hasValue = true; + } + + value.push(val); + } + + if (hasValue) { + data_1.setItemLayout(dataIndex, coordSys.dataToPoint(value)); + } else { + // Also {Array.}, not undefined to avoid if...else... statement + data_1.setItemLayout(dataIndex, [NaN, NaN]); + } + } + + simpleLayoutEdge(data_1.graph, seriesModel); + } else if (!layout || layout === 'none') { + simpleLayout(seriesModel); + } + }); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function getNodeGlobalScale(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = seriesModel.option.nodeScaleRatio; + var groupZoom = coordSys.scaleX; // Scale node when zoom changes + + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + return nodeScale / groupZoom; + } + + function getSymbolSize(node) { + var symbolSize = node.getVisual('symbolSize'); + + if (symbolSize instanceof Array) { + symbolSize = (symbolSize[0] + symbolSize[1]) / 2; + } + + return +symbolSize; + } + + var PI$6 = Math.PI; + var _symbolRadiansHalf = []; + + /** + * `basedOn` can be: + * 'value': + * This layout is not accurate and have same bad case. For example, + * if the min value is very smaller than the max value, the nodes + * with the min value probably overlap even though there is enough + * space to layout them. So we only use this approach in the as the + * init layout of the force layout. + * FIXME + * Probably we do not need this method any more but use + * `basedOn: 'symbolSize'` in force layout if + * delay its init operations to GraphView. + * 'symbolSize': + * This approach work only if all of the symbol size calculated. + * That is, the progressive rendering is not applied to graph. + * FIXME + * If progressive rendering is applied to graph some day, + * probably we have to use `basedOn: 'value'`. + */ + + function circularLayout(seriesModel, basedOn) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + var rect = coordSys.getBoundingRect(); + var nodeData = seriesModel.getData(); + var graph = nodeData.graph; + var cx = rect.width / 2 + rect.x; + var cy = rect.height / 2 + rect.y; + var r = Math.min(rect.width, rect.height) / 2; + var count = nodeData.count(); + nodeData.setLayout({ + cx: cx, + cy: cy + }); + + if (!count) { + return; + } + + _layoutNodesBasedOn[basedOn](seriesModel, graph, nodeData, r, cx, cy, count); + + graph.eachEdge(function (edge, index) { + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), getCurvenessForEdge(edge, seriesModel, index), 0); + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var cp1; + var x12 = (p1[0] + p2[0]) / 2; + var y12 = (p1[1] + p2[1]) / 2; + + if (+curveness) { + curveness *= 3; + cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)]; + } + + edge.setLayout([p1, p2, cp1]); + }); + } + + var _layoutNodesBasedOn = { + value: function (seriesModel, graph, nodeData, r, cx, cy, count) { + var angle = 0; + var sum = nodeData.getSum('value'); + var unitAngle = Math.PI * 2 / (sum || count); + graph.eachNode(function (node) { + var value = node.getValue('value'); + var radianHalf = unitAngle * (sum ? value : 1) / 2; + angle += radianHalf; + node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); + angle += radianHalf; + }); + }, + symbolSize: function (seriesModel, graph, nodeData, r, cx, cy, count) { + var sumRadian = 0; + _symbolRadiansHalf.length = count; + var nodeScale = getNodeGlobalScale(seriesModel); + graph.eachNode(function (node) { + var symbolSize = getSymbolSize(node); // Normally this case will not happen, but we still add + // some the defensive code (2px is an arbitrary value). + + isNaN(symbolSize) && (symbolSize = 2); + symbolSize < 0 && (symbolSize = 0); + symbolSize *= nodeScale; + var symbolRadianHalf = Math.asin(symbolSize / 2 / r); // when `symbolSize / 2` is bigger than `r`. + + isNaN(symbolRadianHalf) && (symbolRadianHalf = PI$6 / 2); + _symbolRadiansHalf[node.dataIndex] = symbolRadianHalf; + sumRadian += symbolRadianHalf * 2; + }); + var halfRemainRadian = (2 * PI$6 - sumRadian) / count / 2; + var angle = 0; + graph.eachNode(function (node) { + var radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex]; + angle += radianHalf; + node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]); + angle += radianHalf; + }); + } + }; + + function graphCircularLayout(ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + if (seriesModel.get('layout') === 'circular') { + circularLayout(seriesModel, 'symbolSize'); + } + }); + } + + var scaleAndAdd$1 = scaleAndAdd; // function adjacentNode(n, e) { + // return e.n1 === n ? e.n2 : e.n1; + // } + + function forceLayout(inNodes, inEdges, opts) { + var nodes = inNodes; + var edges = inEdges; + var rect = opts.rect; + var width = rect.width; + var height = rect.height; + var center = [rect.x + width / 2, rect.y + height / 2]; // let scale = opts.scale || 1; + + var gravity = opts.gravity == null ? 0.1 : opts.gravity; // for (let i = 0; i < edges.length; i++) { + // let e = edges[i]; + // let n1 = e.n1; + // let n2 = e.n2; + // n1.edges = n1.edges || []; + // n2.edges = n2.edges || []; + // n1.edges.push(e); + // n2.edges.push(e); + // } + // Init position + + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + + if (!n.p) { + n.p = create(width * (Math.random() - 0.5) + center[0], height * (Math.random() - 0.5) + center[1]); + } + + n.pp = clone$1(n.p); + n.edges = null; + } // Formula in 'Graph Drawing by Force-directed Placement' + // let k = scale * Math.sqrt(width * height / nodes.length); + // let k2 = k * k; + + + var initialFriction = opts.friction == null ? 0.6 : opts.friction; + var friction = initialFriction; + var beforeStepCallback; + var afterStepCallback; + return { + warmUp: function () { + friction = initialFriction * 0.8; + }, + setFixed: function (idx) { + nodes[idx].fixed = true; + }, + setUnfixed: function (idx) { + nodes[idx].fixed = false; + }, + + /** + * Before step hook + */ + beforeStep: function (cb) { + beforeStepCallback = cb; + }, + + /** + * After step hook + */ + afterStep: function (cb) { + afterStepCallback = cb; + }, + + /** + * Some formulas were originally copied from "d3.js" + * https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/layout/force.js + * with some modifications made for this project. + * See the license statement at the head of this file. + */ + step: function (cb) { + beforeStepCallback && beforeStepCallback(nodes, edges); + var v12 = []; + var nLen = nodes.length; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + + if (e.ignoreForceLayout) { + continue; + } + + var n1 = e.n1; + var n2 = e.n2; + sub(v12, n2.p, n1.p); + var d = len(v12) - e.d; + var w = n2.w / (n1.w + n2.w); + + if (isNaN(w)) { + w = 0; + } + + normalize(v12, v12); + !n1.fixed && scaleAndAdd$1(n1.p, n1.p, v12, w * d * friction); + !n2.fixed && scaleAndAdd$1(n2.p, n2.p, v12, -(1 - w) * d * friction); + } // Gravity + + + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + + if (!n.fixed) { + sub(v12, center, n.p); // let d = vec2.len(v12); + // vec2.scale(v12, v12, 1 / d); + // let gravityFactor = gravity; + + scaleAndAdd$1(n.p, n.p, v12, gravity * friction); + } + } // Repulsive + // PENDING + + + for (var i = 0; i < nLen; i++) { + var n1 = nodes[i]; + + for (var j = i + 1; j < nLen; j++) { + var n2 = nodes[j]; + sub(v12, n2.p, n1.p); + var d = len(v12); + + if (d === 0) { + // Random repulse + set(v12, Math.random() - 0.5, Math.random() - 0.5); + d = 1; + } + + var repFact = (n1.rep + n2.rep) / d / d; + !n1.fixed && scaleAndAdd$1(n1.pp, n1.pp, v12, repFact); + !n2.fixed && scaleAndAdd$1(n2.pp, n2.pp, v12, -repFact); + } + } + + var v = []; + + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + + if (!n.fixed) { + sub(v, n.p, n.pp); + scaleAndAdd$1(n.p, n.p, v, friction); + copy(n.pp, n.p); + } + } + + friction = friction * 0.992; + var finished = friction < 0.01; + afterStepCallback && afterStepCallback(nodes, edges, finished); + cb && cb(finished); + } + }; + } + + function graphForceLayout(ecModel) { + ecModel.eachSeriesByType('graph', function (graphSeries) { + var coordSys = graphSeries.coordinateSystem; + + if (coordSys && coordSys.type !== 'view') { + return; + } + + if (graphSeries.get('layout') === 'force') { + var preservedPoints_1 = graphSeries.preservedPoints || {}; + var graph_1 = graphSeries.getGraph(); + var nodeData_1 = graph_1.data; + var edgeData = graph_1.edgeData; + var forceModel = graphSeries.getModel('force'); + var initLayout = forceModel.get('initLayout'); + + if (graphSeries.preservedPoints) { + nodeData_1.each(function (idx) { + var id = nodeData_1.getId(idx); + nodeData_1.setItemLayout(idx, preservedPoints_1[id] || [NaN, NaN]); + }); + } else if (!initLayout || initLayout === 'none') { + simpleLayout(graphSeries); + } else if (initLayout === 'circular') { + circularLayout(graphSeries, 'value'); + } + + var nodeDataExtent_1 = nodeData_1.getDataExtent('value'); + var edgeDataExtent_1 = edgeData.getDataExtent('value'); // let edgeDataExtent = edgeData.getDataExtent('value'); + + var repulsion = forceModel.get('repulsion'); + var edgeLength = forceModel.get('edgeLength'); + var repulsionArr_1 = isArray(repulsion) ? repulsion : [repulsion, repulsion]; + var edgeLengthArr_1 = isArray(edgeLength) ? edgeLength : [edgeLength, edgeLength]; // Larger value has smaller length + + edgeLengthArr_1 = [edgeLengthArr_1[1], edgeLengthArr_1[0]]; + var nodes_1 = nodeData_1.mapArray('value', function (value, idx) { + var point = nodeData_1.getItemLayout(idx); + var rep = linearMap(value, nodeDataExtent_1, repulsionArr_1); + + if (isNaN(rep)) { + rep = (repulsionArr_1[0] + repulsionArr_1[1]) / 2; + } + + return { + w: rep, + rep: rep, + fixed: nodeData_1.getItemModel(idx).get('fixed'), + p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point + }; + }); + var edges = edgeData.mapArray('value', function (value, idx) { + var edge = graph_1.getEdgeByIndex(idx); + var d = linearMap(value, edgeDataExtent_1, edgeLengthArr_1); + + if (isNaN(d)) { + d = (edgeLengthArr_1[0] + edgeLengthArr_1[1]) / 2; + } + + var edgeModel = edge.getModel(); + var curveness = retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, graphSeries, idx, true), 0); + return { + n1: nodes_1[edge.node1.dataIndex], + n2: nodes_1[edge.node2.dataIndex], + d: d, + curveness: curveness, + ignoreForceLayout: edgeModel.get('ignoreForceLayout') + }; + }); // let coordSys = graphSeries.coordinateSystem; + + var rect = coordSys.getBoundingRect(); + var forceInstance = forceLayout(nodes_1, edges, { + rect: rect, + gravity: forceModel.get('gravity'), + friction: forceModel.get('friction') + }); + forceInstance.beforeStep(function (nodes, edges) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (nodes[i].fixed) { + // Write back to layout instance + copy(nodes[i].p, graph_1.getNodeByIndex(i).getLayout()); + } + } + }); + forceInstance.afterStep(function (nodes, edges, stopped) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (!nodes[i].fixed) { + graph_1.getNodeByIndex(i).setLayout(nodes[i].p); + } + + preservedPoints_1[nodeData_1.getId(i)] = nodes[i].p; + } + + for (var i = 0, l = edges.length; i < l; i++) { + var e = edges[i]; + var edge = graph_1.getEdgeByIndex(i); + var p1 = e.n1.p; + var p2 = e.n2.p; + var points = edge.getLayout(); + points = points ? points.slice() : []; + points[0] = points[0] || []; + points[1] = points[1] || []; + copy(points[0], p1); + copy(points[1], p2); + + if (+e.curveness) { + points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness]; + } + + edge.setLayout(points); + } + }); + graphSeries.forceLayout = forceInstance; + graphSeries.preservedPoints = preservedPoints_1; // Step to get the layout + + forceInstance.step(); + } else { + // Remove prev injected forceLayout instance + graphSeries.forceLayout = null; + } + }); + } + + function getViewRect$2(seriesModel, api, aspect) { + var option = extend(seriesModel.getBoxLayoutParams(), { + aspect: aspect + }); + return getLayoutRect(option, { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function createViewCoordSys(ecModel, api) { + var viewList = []; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var coordSysType = seriesModel.get('coordinateSystem'); + + if (!coordSysType || coordSysType === 'view') { + var data_1 = seriesModel.getData(); + var positions = data_1.mapArray(function (idx) { + var itemModel = data_1.getItemModel(idx); + return [+itemModel.get('x'), +itemModel.get('y')]; + }); + var min = []; + var max = []; + fromPoints(positions, min, max); // If width or height is 0 + + if (max[0] - min[0] === 0) { + max[0] += 1; + min[0] -= 1; + } + + if (max[1] - min[1] === 0) { + max[1] += 1; + min[1] -= 1; + } + + var aspect = (max[0] - min[0]) / (max[1] - min[1]); // FIXME If get view rect after data processed? + + var viewRect = getViewRect$2(seriesModel, api, aspect); // Position may be NaN, use view rect instead + + if (isNaN(aspect)) { + min = [viewRect.x, viewRect.y]; + max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height]; + } + + var bbWidth = max[0] - min[0]; + var bbHeight = max[1] - min[1]; + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + viewCoordSys.setBoundingRect(min[0], min[1], bbWidth, bbHeight); + viewCoordSys.setViewRect(viewRect.x, viewRect.y, viewWidth, viewHeight); // Update roam info + + viewCoordSys.setCenter(seriesModel.get('center')); + viewCoordSys.setZoom(seriesModel.get('zoom')); + viewList.push(viewCoordSys); + } + }); + return viewList; + } + + var straightLineProto = Line.prototype; + var bezierCurveProto = BezierCurve.prototype; + + var StraightLineShape = + /** @class */ + function () { + function StraightLineShape() { + // Start point + this.x1 = 0; + this.y1 = 0; // End point + + this.x2 = 0; + this.y2 = 0; + this.percent = 1; + } + + return StraightLineShape; + }(); + + var CurveShape = + /** @class */ + function (_super) { + __extends(CurveShape, _super); + + function CurveShape() { + return _super !== null && _super.apply(this, arguments) || this; + } + + return CurveShape; + }(StraightLineShape); + + function isStraightLine(shape) { + return isNaN(+shape.cpx1) || isNaN(+shape.cpy1); + } + + var ECLinePath = + /** @class */ + function (_super) { + __extends(ECLinePath, _super); + + function ECLinePath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'ec-line'; + return _this; + } + + ECLinePath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + ECLinePath.prototype.getDefaultShape = function () { + return new StraightLineShape(); + }; + + ECLinePath.prototype.buildPath = function (ctx, shape) { + if (isStraightLine(shape)) { + straightLineProto.buildPath.call(this, ctx, shape); + } else { + bezierCurveProto.buildPath.call(this, ctx, shape); + } + }; + + ECLinePath.prototype.pointAt = function (t) { + if (isStraightLine(this.shape)) { + return straightLineProto.pointAt.call(this, t); + } else { + return bezierCurveProto.pointAt.call(this, t); + } + }; + + ECLinePath.prototype.tangentAt = function (t) { + var shape = this.shape; + var p = isStraightLine(shape) ? [shape.x2 - shape.x1, shape.y2 - shape.y1] : bezierCurveProto.tangentAt.call(this, t); + return normalize(p, p); + }; + + return ECLinePath; + }(Path); + + var SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol']; + + function makeSymbolTypeKey(symbolCategory) { + return '_' + symbolCategory + 'Type'; + } + + /** + * @inner + */ + + + function createSymbol$1(name, lineData, idx) { + var symbolType = lineData.getItemVisual(idx, name); + + if (!symbolType || symbolType === 'none') { + return; + } + + var symbolSize = lineData.getItemVisual(idx, name + 'Size'); + var symbolRotate = lineData.getItemVisual(idx, name + 'Rotate'); + var symbolOffset = lineData.getItemVisual(idx, name + 'Offset'); + var symbolKeepAspect = lineData.getItemVisual(idx, name + 'KeepAspect'); + var symbolSizeArr = normalizeSymbolSize(symbolSize); + var symbolOffsetArr = normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr); + var symbolPath = createSymbol(symbolType, -symbolSizeArr[0] / 2 + symbolOffsetArr[0], -symbolSizeArr[1] / 2 + symbolOffsetArr[1], symbolSizeArr[0], symbolSizeArr[1], null, symbolKeepAspect); + symbolPath.__specifiedRotation = symbolRotate == null || isNaN(symbolRotate) ? void 0 : +symbolRotate * Math.PI / 180 || 0; + symbolPath.name = name; + return symbolPath; + } + + function createLine(points) { + var line = new ECLinePath({ + name: 'line', + subPixelOptimize: true + }); + setLinePoints(line.shape, points); + return line; + } + + function setLinePoints(targetShape, points) { + targetShape.x1 = points[0][0]; + targetShape.y1 = points[0][1]; + targetShape.x2 = points[1][0]; + targetShape.y2 = points[1][1]; + targetShape.percent = 1; + var cp1 = points[2]; + + if (cp1) { + targetShape.cpx1 = cp1[0]; + targetShape.cpy1 = cp1[1]; + } else { + targetShape.cpx1 = NaN; + targetShape.cpy1 = NaN; + } + } + + var Line$1 = + /** @class */ + function (_super) { + __extends(Line, _super); + + function Line(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this._createLine(lineData, idx, seriesScope); + + return _this; + } + + Line.prototype._createLine = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var linePoints = lineData.getItemLayout(idx); + var line = createLine(linePoints); + line.shape.percent = 0; + initProps(line, { + shape: { + percent: 1 + } + }, seriesModel, idx); + this.add(line); + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = createSymbol$1(symbolCategory, lineData, idx); // symbols must added after line to make sure + // it will be updated after line#update. + // Or symbol position and rotation update in line#beforeUpdate will be one frame slow + + this.add(symbol); + this[makeSymbolTypeKey(symbolCategory)] = lineData.getItemVisual(idx, symbolCategory); + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); + }; // TODO More strict on the List type in parameters? + + + Line.prototype.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childOfName('line'); + var linePoints = lineData.getItemLayout(idx); + var target = { + shape: {} + }; + setLinePoints(target.shape, linePoints); + updateProps(line, target, seriesModel, idx); + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbolType = lineData.getItemVisual(idx, symbolCategory); + var key = makeSymbolTypeKey(symbolCategory); // Symbol changed + + if (this[key] !== symbolType) { + this.remove(this.childOfName(symbolCategory)); + var symbol = createSymbol$1(symbolCategory, lineData, idx); + this.add(symbol); + } + + this[key] = symbolType; + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Line.prototype.getLinePath = function () { + return this.childAt(0); + }; + + Line.prototype._updateCommonStl = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childOfName('line'); + var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; + var blurLineStyle = seriesScope && seriesScope.blurLineStyle; + var selectLineStyle = seriesScope && seriesScope.selectLineStyle; + var labelStatesModels = seriesScope && seriesScope.labelStatesModels; + var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled; + var focus = seriesScope && seriesScope.focus; + var blurScope = seriesScope && seriesScope.blurScope; // Optimization for large dataset + + if (!seriesScope || lineData.hasItemOption) { + var itemModel = lineData.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle(); + blurLineStyle = itemModel.getModel(['blur', 'lineStyle']).getLineStyle(); + selectLineStyle = itemModel.getModel(['select', 'lineStyle']).getLineStyle(); + emphasisDisabled = emphasisModel.get('disabled'); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + labelStatesModels = getLabelStatesModels(itemModel); + } + + var lineStyle = lineData.getItemVisual(idx, 'style'); + var visualColor = lineStyle.stroke; + line.useStyle(lineStyle); + line.style.fill = null; + line.style.strokeNoScale = true; + line.ensureState('emphasis').style = emphasisLineStyle; + line.ensureState('blur').style = blurLineStyle; + line.ensureState('select').style = selectLineStyle; // Update symbol + + each(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = this.childOfName(symbolCategory); + + if (symbol) { + // Share opacity and color with line. + symbol.setColor(visualColor); + symbol.style.opacity = lineStyle.opacity; + + for (var i = 0; i < SPECIAL_STATES.length; i++) { + var stateName = SPECIAL_STATES[i]; + var lineState = line.getState(stateName); + + if (lineState) { + var lineStateStyle = lineState.style || {}; + var state = symbol.ensureState(stateName); + var stateStyle = state.style || (state.style = {}); + + if (lineStateStyle.stroke != null) { + stateStyle[symbol.__isEmptyBrush ? 'stroke' : 'fill'] = lineStateStyle.stroke; + } + + if (lineStateStyle.opacity != null) { + stateStyle.opacity = lineStateStyle.opacity; + } + } + } + + symbol.markRedraw(); + } + }, this); + var rawVal = seriesModel.getRawValue(idx); + setLabelStyle(this, labelStatesModels, { + labelDataIndex: idx, + labelFetcher: { + getFormattedLabel: function (dataIndex, stateName) { + return seriesModel.getFormattedLabel(dataIndex, stateName, lineData.dataType); + } + }, + inheritColor: visualColor || '#000', + defaultOpacity: lineStyle.opacity, + defaultText: (rawVal == null ? lineData.getName(idx) : isFinite(rawVal) ? round(rawVal) : rawVal) + '' + }); + var label = this.getTextContent(); // Always set `textStyle` even if `normalStyle.text` is null, because default + // values have to be set on `normalStyle`. + + if (label) { + var labelNormalModel = labelStatesModels.normal; + label.__align = label.style.align; + label.__verticalAlign = label.style.verticalAlign; // 'start', 'middle', 'end' + + label.__position = labelNormalModel.get('position') || 'middle'; + var distance = labelNormalModel.get('distance'); + + if (!isArray(distance)) { + distance = [distance, distance]; + } + + label.__labelDistance = distance; + } + + this.setTextConfig({ + position: null, + local: true, + inside: false // Can't be inside for stroke element. + + }); + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Line.prototype.highlight = function () { + enterEmphasis(this); + }; + + Line.prototype.downplay = function () { + leaveEmphasis(this); + }; + + Line.prototype.updateLayout = function (lineData, idx) { + this.setLinePoints(lineData.getItemLayout(idx)); + }; + + Line.prototype.setLinePoints = function (points) { + var linePath = this.childOfName('line'); + setLinePoints(linePath.shape, points); + linePath.dirty(); + }; + + Line.prototype.beforeUpdate = function () { + var lineGroup = this; + var symbolFrom = lineGroup.childOfName('fromSymbol'); + var symbolTo = lineGroup.childOfName('toSymbol'); + var label = lineGroup.getTextContent(); // Quick reject + + if (!symbolFrom && !symbolTo && (!label || label.ignore)) { + return; + } + + var invScale = 1; + var parentNode = this.parent; + + while (parentNode) { + if (parentNode.scaleX) { + invScale /= parentNode.scaleX; + } + + parentNode = parentNode.parent; + } + + var line = lineGroup.childOfName('line'); // If line not changed + // FIXME Parent scale changed + + if (!this.__dirty && !line.__dirty) { + return; + } + + var percent = line.shape.percent; + var fromPos = line.pointAt(0); + var toPos = line.pointAt(percent); + var d = sub([], toPos, fromPos); + normalize(d, d); + + function setSymbolRotation(symbol, percent) { + // Fix #12388 + // when symbol is set to be 'arrow' in markLine, + // symbolRotate value will be ignored, and compulsively use tangent angle. + // rotate by default if symbol rotation is not specified + var specifiedRotation = symbol.__specifiedRotation; + + if (specifiedRotation == null) { + var tangent = line.tangentAt(percent); + symbol.attr('rotation', (percent === 1 ? -1 : 1) * Math.PI / 2 - Math.atan2(tangent[1], tangent[0])); + } else { + symbol.attr('rotation', specifiedRotation); + } + } + + if (symbolFrom) { + symbolFrom.setPosition(fromPos); + setSymbolRotation(symbolFrom, 0); + symbolFrom.scaleX = symbolFrom.scaleY = invScale * percent; + symbolFrom.markRedraw(); + } + + if (symbolTo) { + symbolTo.setPosition(toPos); + setSymbolRotation(symbolTo, 1); + symbolTo.scaleX = symbolTo.scaleY = invScale * percent; + symbolTo.markRedraw(); + } + + if (label && !label.ignore) { + label.x = label.y = 0; + label.originX = label.originY = 0; + var textAlign = void 0; + var textVerticalAlign = void 0; + var distance = label.__labelDistance; + var distanceX = distance[0] * invScale; + var distanceY = distance[1] * invScale; + var halfPercent = percent / 2; + var tangent = line.tangentAt(halfPercent); + var n = [tangent[1], -tangent[0]]; + var cp = line.pointAt(halfPercent); + + if (n[1] > 0) { + n[0] = -n[0]; + n[1] = -n[1]; + } + + var dir = tangent[0] < 0 ? -1 : 1; + + if (label.__position !== 'start' && label.__position !== 'end') { + var rotation = -Math.atan2(tangent[1], tangent[0]); + + if (toPos[0] < fromPos[0]) { + rotation = Math.PI + rotation; + } + + label.rotation = rotation; + } + + var dy = void 0; + + switch (label.__position) { + case 'insideStartTop': + case 'insideMiddleTop': + case 'insideEndTop': + case 'middle': + dy = -distanceY; + textVerticalAlign = 'bottom'; + break; + + case 'insideStartBottom': + case 'insideMiddleBottom': + case 'insideEndBottom': + dy = distanceY; + textVerticalAlign = 'top'; + break; + + default: + dy = 0; + textVerticalAlign = 'middle'; + } + + switch (label.__position) { + case 'end': + label.x = d[0] * distanceX + toPos[0]; + label.y = d[1] * distanceY + toPos[1]; + textAlign = d[0] > 0.8 ? 'left' : d[0] < -0.8 ? 'right' : 'center'; + textVerticalAlign = d[1] > 0.8 ? 'top' : d[1] < -0.8 ? 'bottom' : 'middle'; + break; + + case 'start': + label.x = -d[0] * distanceX + fromPos[0]; + label.y = -d[1] * distanceY + fromPos[1]; + textAlign = d[0] > 0.8 ? 'right' : d[0] < -0.8 ? 'left' : 'center'; + textVerticalAlign = d[1] > 0.8 ? 'bottom' : d[1] < -0.8 ? 'top' : 'middle'; + break; + + case 'insideStartTop': + case 'insideStart': + case 'insideStartBottom': + label.x = distanceX * dir + fromPos[0]; + label.y = fromPos[1] + dy; + textAlign = tangent[0] < 0 ? 'right' : 'left'; + label.originX = -distanceX * dir; + label.originY = -dy; + break; + + case 'insideMiddleTop': + case 'insideMiddle': + case 'insideMiddleBottom': + case 'middle': + label.x = cp[0]; + label.y = cp[1] + dy; + textAlign = 'center'; + label.originY = -dy; + break; + + case 'insideEndTop': + case 'insideEnd': + case 'insideEndBottom': + label.x = -distanceX * dir + toPos[0]; + label.y = toPos[1] + dy; + textAlign = tangent[0] >= 0 ? 'right' : 'left'; + label.originX = distanceX * dir; + label.originY = -dy; + break; + } + + label.scaleX = label.scaleY = invScale; + label.setStyle({ + // Use the user specified text align and baseline first + verticalAlign: label.__verticalAlign || textVerticalAlign, + align: label.__align || textAlign + }); + } + }; + + return Line; + }(Group); + + var LineDraw = + /** @class */ + function () { + function LineDraw(LineCtor) { + this.group = new Group(); + this._LineCtor = LineCtor || Line$1; + } + + LineDraw.prototype.updateData = function (lineData) { + var _this = this; // Remove progressive els. + + + this._progressiveEls = null; + var lineDraw = this; + var group = lineDraw.group; + var oldLineData = lineDraw._lineData; + lineDraw._lineData = lineData; // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!oldLineData) { + group.removeAll(); + } + + var seriesScope = makeSeriesScope$1(lineData); + lineData.diff(oldLineData).add(function (idx) { + _this._doAdd(lineData, idx, seriesScope); + }).update(function (newIdx, oldIdx) { + _this._doUpdate(oldLineData, lineData, oldIdx, newIdx, seriesScope); + }).remove(function (idx) { + group.remove(oldLineData.getItemGraphicEl(idx)); + }).execute(); + }; + + LineDraw.prototype.updateLayout = function () { + var lineData = this._lineData; // Do not support update layout in incremental mode. + + if (!lineData) { + return; + } + + lineData.eachItemGraphicEl(function (el, idx) { + el.updateLayout(lineData, idx); + }, this); + }; + + LineDraw.prototype.incrementalPrepareUpdate = function (lineData) { + this._seriesScope = makeSeriesScope$1(lineData); + this._lineData = null; + this.group.removeAll(); + }; + + LineDraw.prototype.incrementalUpdate = function (taskParams, lineData) { + this._progressiveEls = []; + + function updateIncrementalAndHover(el) { + if (!el.isGroup && !isEffectObject(el)) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var itemLayout = lineData.getItemLayout(idx); + + if (lineNeedsDraw(itemLayout)) { + var el = new this._LineCtor(lineData, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + this.group.add(el); + lineData.setItemGraphicEl(idx, el); + + this._progressiveEls.push(el); + } + } + }; + + LineDraw.prototype.remove = function () { + this.group.removeAll(); + }; + + LineDraw.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + LineDraw.prototype._doAdd = function (lineData, idx, seriesScope) { + var itemLayout = lineData.getItemLayout(idx); + + if (!lineNeedsDraw(itemLayout)) { + return; + } + + var el = new this._LineCtor(lineData, idx, seriesScope); + lineData.setItemGraphicEl(idx, el); + this.group.add(el); + }; + + LineDraw.prototype._doUpdate = function (oldLineData, newLineData, oldIdx, newIdx, seriesScope) { + var itemEl = oldLineData.getItemGraphicEl(oldIdx); + + if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) { + this.group.remove(itemEl); + return; + } + + if (!itemEl) { + itemEl = new this._LineCtor(newLineData, newIdx, seriesScope); + } else { + itemEl.updateData(newLineData, newIdx, seriesScope); + } + + newLineData.setItemGraphicEl(newIdx, itemEl); + this.group.add(itemEl); + }; + + return LineDraw; + }(); + + function isEffectObject(el) { + return el.animators && el.animators.length > 0; + } + + function makeSeriesScope$1(lineData) { + var hostModel = lineData.hostModel; + var emphasisModel = hostModel.getModel('emphasis'); + return { + lineStyle: hostModel.getModel('lineStyle').getLineStyle(), + emphasisLineStyle: emphasisModel.getModel(['lineStyle']).getLineStyle(), + blurLineStyle: hostModel.getModel(['blur', 'lineStyle']).getLineStyle(), + selectLineStyle: hostModel.getModel(['select', 'lineStyle']).getLineStyle(), + emphasisDisabled: emphasisModel.get('disabled'), + blurScope: emphasisModel.get('blurScope'), + focus: emphasisModel.get('focus'), + labelStatesModels: getLabelStatesModels(hostModel) + }; + } + + function isPointNaN(pt) { + return isNaN(pt[0]) || isNaN(pt[1]); + } + + function lineNeedsDraw(pts) { + return pts && !isPointNaN(pts[0]) && !isPointNaN(pts[1]); + } + + var v1 = []; + var v2 = []; + var v3 = []; + var quadraticAt$1 = quadraticAt; + var v2DistSquare = distSquare; + var mathAbs$2 = Math.abs; + + function intersectCurveCircle(curvePoints, center, radius) { + var p0 = curvePoints[0]; + var p1 = curvePoints[1]; + var p2 = curvePoints[2]; + var d = Infinity; + var t; + var radiusSquare = radius * radius; + var interval = 0.1; + + for (var _t = 0.1; _t <= 0.9; _t += 0.1) { + v1[0] = quadraticAt$1(p0[0], p1[0], p2[0], _t); + v1[1] = quadraticAt$1(p0[1], p1[1], p2[1], _t); + var diff = mathAbs$2(v2DistSquare(v1, center) - radiusSquare); + + if (diff < d) { + d = diff; + t = _t; + } + } // Assume the segment is monotone,Find root through Bisection method + // At most 32 iteration + + + for (var i = 0; i < 32; i++) { + // let prev = t - interval; + var next = t + interval; // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev); + // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev); + + v2[0] = quadraticAt$1(p0[0], p1[0], p2[0], t); + v2[1] = quadraticAt$1(p0[1], p1[1], p2[1], t); + v3[0] = quadraticAt$1(p0[0], p1[0], p2[0], next); + v3[1] = quadraticAt$1(p0[1], p1[1], p2[1], next); + var diff = v2DistSquare(v2, center) - radiusSquare; + + if (mathAbs$2(diff) < 1e-2) { + break; + } // let prevDiff = v2DistSquare(v1, center) - radiusSquare; + + + var nextDiff = v2DistSquare(v3, center) - radiusSquare; + interval /= 2; + + if (diff < 0) { + if (nextDiff >= 0) { + t = t + interval; + } else { + t = t - interval; + } + } else { + if (nextDiff >= 0) { + t = t - interval; + } else { + t = t + interval; + } + } + } + + return t; + } // Adjust edge to avoid + + + function adjustEdge(graph, scale) { + var tmp0 = []; + var quadraticSubdivide$1 = quadraticSubdivide; + var pts = [[], [], []]; + var pts2 = [[], []]; + var v = []; + scale /= 2; + graph.eachEdge(function (edge, idx) { + var linePoints = edge.getLayout(); + var fromSymbol = edge.getVisual('fromSymbol'); + var toSymbol = edge.getVisual('toSymbol'); + + if (!linePoints.__original) { + linePoints.__original = [clone$1(linePoints[0]), clone$1(linePoints[1])]; + + if (linePoints[2]) { + linePoints.__original.push(clone$1(linePoints[2])); + } + } + + var originalPoints = linePoints.__original; // Quadratic curve + + if (linePoints[2] != null) { + copy(pts[0], originalPoints[0]); + copy(pts[1], originalPoints[2]); + copy(pts[2], originalPoints[1]); + + if (fromSymbol && fromSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node1); + var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale); // Subdivide and get the second + + quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[0][0] = tmp0[3]; + pts[1][0] = tmp0[4]; + quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[0][1] = tmp0[3]; + pts[1][1] = tmp0[4]; + } + + if (toSymbol && toSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node2); + var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale); // Subdivide and get the first + + quadraticSubdivide$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[1][0] = tmp0[1]; + pts[2][0] = tmp0[2]; + quadraticSubdivide$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[1][1] = tmp0[1]; + pts[2][1] = tmp0[2]; + } // Copy back to layout + + + copy(linePoints[0], pts[0]); + copy(linePoints[1], pts[2]); + copy(linePoints[2], pts[1]); + } // Line + else { + copy(pts2[0], originalPoints[0]); + copy(pts2[1], originalPoints[1]); + sub(v, pts2[1], pts2[0]); + normalize(v, v); + + if (fromSymbol && fromSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node1); + scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale); + } + + if (toSymbol && toSymbol !== 'none') { + var symbolSize = getSymbolSize(edge.node2); + scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale); + } + + copy(linePoints[0], pts2[0]); + copy(linePoints[1], pts2[1]); + } + }); + } + + function isViewCoordSys(coordSys) { + return coordSys.type === 'view'; + } + + var GraphView = + /** @class */ + function (_super) { + __extends(GraphView, _super); + + function GraphView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphView.type; + return _this; + } + + GraphView.prototype.init = function (ecModel, api) { + var symbolDraw = new SymbolDraw(); + var lineDraw = new LineDraw(); + var group = this.group; + this._controller = new RoamController(api.getZr()); + this._controllerHost = { + target: group + }; + group.add(symbolDraw.group); + group.add(lineDraw.group); + this._symbolDraw = symbolDraw; + this._lineDraw = lineDraw; + this._firstRender = true; + }; + + GraphView.prototype.render = function (seriesModel, ecModel, api) { + var _this = this; + + var coordSys = seriesModel.coordinateSystem; + this._model = seriesModel; + var symbolDraw = this._symbolDraw; + var lineDraw = this._lineDraw; + var group = this.group; + + if (isViewCoordSys(coordSys)) { + var groupNewProp = { + x: coordSys.x, + y: coordSys.y, + scaleX: coordSys.scaleX, + scaleY: coordSys.scaleY + }; + + if (this._firstRender) { + group.attr(groupNewProp); + } else { + updateProps(group, groupNewProp, seriesModel); + } + } // Fix edge contact point with node + + + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + var data = seriesModel.getData(); + symbolDraw.updateData(data); + var edgeData = seriesModel.getEdgeData(); // TODO: TYPE + + lineDraw.updateData(edgeData); + + this._updateNodeAndLinkScale(); + + this._updateController(seriesModel, ecModel, api); + + clearTimeout(this._layoutTimeout); + var forceLayout = seriesModel.forceLayout; + var layoutAnimation = seriesModel.get(['force', 'layoutAnimation']); + + if (forceLayout) { + this._startForceLayoutIteration(forceLayout, layoutAnimation); + } + + data.graph.eachNode(function (node) { + var idx = node.dataIndex; + var el = node.getGraphicEl(); + var itemModel = node.getModel(); + + if (!el) { + return; + } // Update draggable + + + el.off('drag').off('dragend'); + var draggable = itemModel.get('draggable'); + + if (draggable) { + el.on('drag', function () { + if (forceLayout) { + forceLayout.warmUp(); + !_this._layouting && _this._startForceLayoutIteration(forceLayout, layoutAnimation); + forceLayout.setFixed(idx); // Write position back to layout + + data.setItemLayout(idx, [el.x, el.y]); + } + }).on('dragend', function () { + if (forceLayout) { + forceLayout.setUnfixed(idx); + } + }); + } + + el.setDraggable(draggable && !!forceLayout); + var focus = itemModel.get(['emphasis', 'focus']); + + if (focus === 'adjacency') { + getECData(el).focus = node.getAdjacentDataIndices(); + } + }); + data.graph.eachEdge(function (edge) { + var el = edge.getGraphicEl(); + var focus = edge.getModel().get(['emphasis', 'focus']); + + if (!el) { + return; + } + + if (focus === 'adjacency') { + getECData(el).focus = { + edge: [edge.dataIndex], + node: [edge.node1.dataIndex, edge.node2.dataIndex] + }; + } + }); + var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get(['circular', 'rotateLabel']); + var cx = data.getLayout('cx'); + var cy = data.getLayout('cy'); + data.eachItemGraphicEl(function (el, idx) { + var itemModel = data.getItemModel(idx); + var labelRotate = itemModel.get(['label', 'rotate']) || 0; + var symbolPath = el.getSymbolPath(); + + if (circularRotateLabel) { + var pos = data.getItemLayout(idx); + var rad = Math.atan2(pos[1] - cy, pos[0] - cx); + + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + + var isLeft = pos[0] < cx; + + if (isLeft) { + rad = rad - Math.PI; + } + + var textPosition = isLeft ? 'left' : 'right'; + symbolPath.setTextConfig({ + rotation: -rad, + position: textPosition, + origin: 'center' + }); + var emphasisState = symbolPath.ensureState('emphasis'); + extend(emphasisState.textConfig || (emphasisState.textConfig = {}), { + position: textPosition + }); + } else { + symbolPath.setTextConfig({ + rotation: labelRotate *= Math.PI / 180 + }); + } + }); + this._firstRender = false; + }; + + GraphView.prototype.dispose = function () { + this._controller && this._controller.dispose(); + this._controllerHost = null; + }; + + GraphView.prototype._startForceLayoutIteration = function (forceLayout, layoutAnimation) { + var self = this; + + (function step() { + forceLayout.step(function (stopped) { + self.updateLayout(self._model); + (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step()); + }); + })(); + }; + + GraphView.prototype._updateController = function (seriesModel, ecModel, api) { + var _this = this; + + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); + }); + + if (!isViewCoordSys(seriesModel.coordinateSystem)) { + controller.disable(); + return; + } + + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + controller.off('pan').off('zoom').on('pan', function (e) { + updateViewOnPan(controllerHost, e.dx, e.dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + dx: e.dx, + dy: e.dy + }); + }).on('zoom', function (e) { + updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + zoom: e.scale, + originX: e.originX, + originY: e.originY + }); + + _this._updateNodeAndLinkScale(); + + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + + _this._lineDraw.updateLayout(); // Only update label layout on zoom + + + api.updateLabelLayout(); + }); + }; + + GraphView.prototype._updateNodeAndLinkScale = function () { + var seriesModel = this._model; + var data = seriesModel.getData(); + var nodeScale = getNodeGlobalScale(seriesModel); + data.eachItemGraphicEl(function (el, idx) { + el && el.setSymbolScale(nodeScale); + }); + }; + + GraphView.prototype.updateLayout = function (seriesModel) { + adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); + + this._symbolDraw.updateLayout(); + + this._lineDraw.updateLayout(); + }; + + GraphView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(); + this._lineDraw && this._lineDraw.remove(); + }; + + GraphView.type = 'graph'; + return GraphView; + }(ChartView); + + function generateNodeKey(id) { + return '_EC_' + id; + } + + var Graph = + /** @class */ + function () { + function Graph(directed) { + this.type = 'graph'; + this.nodes = []; + this.edges = []; + this._nodesMap = {}; + /** + * @type {Object.} + * @private + */ + + this._edgesMap = {}; + this._directed = directed || false; + } + + /** + * If is directed graph + */ + + + Graph.prototype.isDirected = function () { + return this._directed; + }; + /** + * Add a new node + */ + + Graph.prototype.addNode = function (id, dataIndex) { + id = id == null ? '' + dataIndex : '' + id; + var nodesMap = this._nodesMap; + + if (nodesMap[generateNodeKey(id)]) { + if ("development" !== 'production') { + console.error('Graph nodes have duplicate name or id'); + } + + return; + } + + var node = new GraphNode(id, dataIndex); + node.hostGraph = this; + this.nodes.push(node); + nodesMap[generateNodeKey(id)] = node; + return node; + }; + /** + * Get node by data index + */ + + Graph.prototype.getNodeByIndex = function (dataIndex) { + var rawIdx = this.data.getRawIndex(dataIndex); + return this.nodes[rawIdx]; + }; + /** + * Get node by id + */ + + Graph.prototype.getNodeById = function (id) { + return this._nodesMap[generateNodeKey(id)]; + }; + /** + * Add a new edge + */ + + Graph.prototype.addEdge = function (n1, n2, dataIndex) { + var nodesMap = this._nodesMap; + var edgesMap = this._edgesMap; // PNEDING + + if (isNumber(n1)) { + n1 = this.nodes[n1]; + } + + if (isNumber(n2)) { + n2 = this.nodes[n2]; + } + + if (!(n1 instanceof GraphNode)) { + n1 = nodesMap[generateNodeKey(n1)]; + } + + if (!(n2 instanceof GraphNode)) { + n2 = nodesMap[generateNodeKey(n2)]; + } + + if (!n1 || !n2) { + return; + } + + var key = n1.id + '-' + n2.id; + var edge = new GraphEdge(n1, n2, dataIndex); + edge.hostGraph = this; + + if (this._directed) { + n1.outEdges.push(edge); + n2.inEdges.push(edge); + } + + n1.edges.push(edge); + + if (n1 !== n2) { + n2.edges.push(edge); + } + + this.edges.push(edge); + edgesMap[key] = edge; + return edge; + }; + /** + * Get edge by data index + */ + + Graph.prototype.getEdgeByIndex = function (dataIndex) { + var rawIdx = this.edgeData.getRawIndex(dataIndex); + return this.edges[rawIdx]; + }; + /** + * Get edge by two linked nodes + */ + + Graph.prototype.getEdge = function (n1, n2) { + if (n1 instanceof GraphNode) { + n1 = n1.id; + } + + if (n2 instanceof GraphNode) { + n2 = n2.id; + } + + var edgesMap = this._edgesMap; + + if (this._directed) { + return edgesMap[n1 + '-' + n2]; + } else { + return edgesMap[n1 + '-' + n2] || edgesMap[n2 + '-' + n1]; + } + }; + /** + * Iterate all nodes + */ + + Graph.prototype.eachNode = function (cb, context) { + var nodes = this.nodes; + var len = nodes.length; + + for (var i = 0; i < len; i++) { + if (nodes[i].dataIndex >= 0) { + cb.call(context, nodes[i], i); + } + } + }; + /** + * Iterate all edges + */ + + Graph.prototype.eachEdge = function (cb, context) { + var edges = this.edges; + var len = edges.length; + + for (var i = 0; i < len; i++) { + if (edges[i].dataIndex >= 0 && edges[i].node1.dataIndex >= 0 && edges[i].node2.dataIndex >= 0) { + cb.call(context, edges[i], i); + } + } + }; + /** + * Breadth first traverse + * Return true to stop traversing + */ + + Graph.prototype.breadthFirstTraverse = function (cb, startNode, direction, context) { + if (!(startNode instanceof GraphNode)) { + startNode = this._nodesMap[generateNodeKey(startNode)]; + } + + if (!startNode) { + return; + } + + var edgeType = direction === 'out' ? 'outEdges' : direction === 'in' ? 'inEdges' : 'edges'; + + for (var i = 0; i < this.nodes.length; i++) { + this.nodes[i].__visited = false; + } + + if (cb.call(context, startNode, null)) { + return; + } + + var queue = [startNode]; + + while (queue.length) { + var currentNode = queue.shift(); + var edges = currentNode[edgeType]; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + var otherNode = e.node1 === currentNode ? e.node2 : e.node1; + + if (!otherNode.__visited) { + if (cb.call(context, otherNode, currentNode)) { + // Stop traversing + return; + } + + queue.push(otherNode); + otherNode.__visited = true; + } + } + } + }; + // depthFirstTraverse( + // cb, startNode, direction, context + // ) { + // }; + // Filter update + + Graph.prototype.update = function () { + var data = this.data; + var edgeData = this.edgeData; + var nodes = this.nodes; + var edges = this.edges; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + + edgeData.filterSelf(function (idx) { + var edge = edges[edgeData.getRawIndex(idx)]; + return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0; + }); // Update edge + + for (var i = 0, len = edges.length; i < len; i++) { + edges[i].dataIndex = -1; + } + + for (var i = 0, len = edgeData.count(); i < len; i++) { + edges[edgeData.getRawIndex(i)].dataIndex = i; + } + }; + /** + * @return {module:echarts/data/Graph} + */ + + Graph.prototype.clone = function () { + var graph = new Graph(this._directed); + var nodes = this.nodes; + var edges = this.edges; + + for (var i = 0; i < nodes.length; i++) { + graph.addNode(nodes[i].id, nodes[i].dataIndex); + } + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + graph.addEdge(e.node1.id, e.node2.id, e.dataIndex); + } + + return graph; + }; + return Graph; + }(); + + var GraphNode = + /** @class */ + function () { + function GraphNode(id, dataIndex) { + this.inEdges = []; + this.outEdges = []; + this.edges = []; + this.dataIndex = -1; + this.id = id == null ? '' : id; + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } + + /** + * @return {number} + */ + + + GraphNode.prototype.degree = function () { + return this.edges.length; + }; + /** + * @return {number} + */ + + + GraphNode.prototype.inDegree = function () { + return this.inEdges.length; + }; + /** + * @return {number} + */ + + + GraphNode.prototype.outDegree = function () { + return this.outEdges.length; + }; + + GraphNode.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var graph = this.hostGraph; + var itemModel = graph.data.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; + + GraphNode.prototype.getAdjacentDataIndices = function () { + var dataIndices = { + edge: [], + node: [] + }; + + for (var i = 0; i < this.edges.length; i++) { + var adjacentEdge = this.edges[i]; + + if (adjacentEdge.dataIndex < 0) { + continue; + } + + dataIndices.edge.push(adjacentEdge.dataIndex); + dataIndices.node.push(adjacentEdge.node1.dataIndex, adjacentEdge.node2.dataIndex); + } + + return dataIndices; + }; + + return GraphNode; + }(); + + var GraphEdge = + /** @class */ + function () { + function GraphEdge(n1, n2, dataIndex) { + this.dataIndex = -1; + this.node1 = n1; + this.node2 = n2; + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } // eslint-disable-next-line @typescript-eslint/no-unused-vars + + + GraphEdge.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + + var graph = this.hostGraph; + var itemModel = graph.edgeData.getItemModel(this.dataIndex); + return itemModel.getModel(path); + }; + + GraphEdge.prototype.getAdjacentDataIndices = function () { + return { + edge: [this.dataIndex], + node: [this.node1.dataIndex, this.node2.dataIndex] + }; + }; + + return GraphEdge; + }(); + + function createGraphDataProxyMixin(hostName, dataName) { + return { + /** + * @param Default 'value'. can be 'a', 'b', 'c', 'd', 'e'. + */ + getValue: function (dimension) { + var data = this[hostName][dataName]; + return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex); + }, + // TODO: TYPE stricter type. + setVisual: function (key, value) { + this.dataIndex >= 0 && this[hostName][dataName].setItemVisual(this.dataIndex, key, value); + }, + getVisual: function (key) { + return this[hostName][dataName].getItemVisual(this.dataIndex, key); + }, + setLayout: function (layout, merge) { + this.dataIndex >= 0 && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge); + }, + getLayout: function () { + return this[hostName][dataName].getItemLayout(this.dataIndex); + }, + getGraphicEl: function () { + return this[hostName][dataName].getItemGraphicEl(this.dataIndex); + }, + getRawIndex: function () { + return this[hostName][dataName].getRawIndex(this.dataIndex); + } + }; + } + + mixin(GraphNode, createGraphDataProxyMixin('hostGraph', 'data')); + mixin(GraphEdge, createGraphDataProxyMixin('hostGraph', 'edgeData')); + + function createGraphFromNodeEdge(nodes, edges, seriesModel, directed, beforeLink) { + // ??? TODO + // support dataset? + var graph = new Graph(directed); + + for (var i = 0; i < nodes.length; i++) { + graph.addNode(retrieve( // Id, name, dataIndex + nodes[i].id, nodes[i].name, i), i); + } + + var linkNameList = []; + var validEdges = []; + var linkCount = 0; + + for (var i = 0; i < edges.length; i++) { + var link = edges[i]; + var source = link.source; + var target = link.target; // addEdge may fail when source or target not exists + + if (graph.addEdge(source, target, linkCount)) { + validEdges.push(link); + linkNameList.push(retrieve(convertOptionIdName(link.id, null), source + ' > ' + target)); + linkCount++; + } + } + + var coordSys = seriesModel.get('coordinateSystem'); + var nodeData; + + if (coordSys === 'cartesian2d' || coordSys === 'polar') { + nodeData = createSeriesData(nodes, seriesModel); + } else { + var coordSysCtor = CoordinateSystemManager.get(coordSys); + var coordDimensions = coordSysCtor ? coordSysCtor.dimensions || [] : []; // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs + // `value` dimension, but graph need `value` dimension. It's better to + // uniform this behavior. + + if (indexOf(coordDimensions, 'value') < 0) { + coordDimensions.concat(['value']); + } + + var dimensions = prepareSeriesDataSchema(nodes, { + coordDimensions: coordDimensions, + encodeDefine: seriesModel.getEncode() + }).dimensions; + nodeData = new SeriesData(dimensions, seriesModel); + nodeData.initData(nodes); + } + + var edgeData = new SeriesData(['value'], seriesModel); + edgeData.initData(validEdges, linkNameList); + beforeLink && beforeLink(nodeData, edgeData); + linkSeriesData({ + mainData: nodeData, + struct: graph, + structAttr: 'graph', + datas: { + node: nodeData, + edge: edgeData + }, + datasAttr: { + node: 'data', + edge: 'edgeData' + } + }); // Update dataIndex of nodes and edges because invalid edge may be removed + + graph.update(); + return graph; + } + + var GraphSeriesModel = + /** @class */ + function (_super) { + __extends(GraphSeriesModel, _super); + + function GraphSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + GraphSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); + + var self = this; + + function getCategoriesData() { + return self._categoriesData; + } // Provide data for legend select + + + this.legendVisualProvider = new LegendVisualProvider(getCategoriesData, getCategoriesData); + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }; + + GraphSeriesModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }; + + GraphSeriesModel.prototype.mergeDefaultAndTheme = function (option) { + _super.prototype.mergeDefaultAndTheme.apply(this, arguments); + + defaultEmphasis(option, 'edgeLabel', ['show']); + }; + + GraphSeriesModel.prototype.getInitialData = function (option, ecModel) { + var edges = option.edges || option.links || []; + var nodes = option.data || option.nodes || []; + var self = this; + + if (nodes && edges) { + // auto curveness + initCurvenessList(this); + var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink); + each(graph.edges, function (edge) { + createEdgeMapForCurveness(edge.node1, edge.node2, this, edge.dataIndex); + }, this); + return graph.data; + } + + function beforeLink(nodeData, edgeData) { + // Overwrite nodeData.getItemModel to + nodeData.wrapMethod('getItemModel', function (model) { + var categoriesModels = self._categoriesModels; + var categoryIdx = model.getShallow('category'); + var categoryModel = categoriesModels[categoryIdx]; + + if (categoryModel) { + categoryModel.parentModel = model.parentModel; + model.parentModel = categoryModel; + } + + return model; + }); // TODO Inherit resolveParentPath by default in Model#getModel? + + var oldGetModel = Model.prototype.getModel; + + function newGetModel(path, parentModel) { + var model = oldGetModel.call(this, path, parentModel); + model.resolveParentPath = resolveParentPath; + return model; + } + + edgeData.wrapMethod('getItemModel', function (model) { + model.resolveParentPath = resolveParentPath; + model.getModel = newGetModel; + return model; + }); + + function resolveParentPath(pathArr) { + if (pathArr && (pathArr[0] === 'label' || pathArr[1] === 'label')) { + var newPathArr = pathArr.slice(); + + if (pathArr[0] === 'label') { + newPathArr[0] = 'edgeLabel'; + } else if (pathArr[1] === 'label') { + newPathArr[1] = 'edgeLabel'; + } + + return newPathArr; + } + + return pathArr; + } + } + }; + + GraphSeriesModel.prototype.getGraph = function () { + return this.getData().graph; + }; + + GraphSeriesModel.prototype.getEdgeData = function () { + return this.getGraph().edgeData; + }; + + GraphSeriesModel.prototype.getCategoriesData = function () { + return this._categoriesData; + }; + + GraphSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + if (dataType === 'edge') { + var nodeData = this.getData(); + var params = this.getDataParams(dataIndex, dataType); + var edge = nodeData.graph.getEdgeByIndex(dataIndex); + var sourceName = nodeData.getName(edge.node1.dataIndex); + var targetName = nodeData.getName(edge.node2.dataIndex); + var nameArr = []; + sourceName != null && nameArr.push(sourceName); + targetName != null && nameArr.push(targetName); + return createTooltipMarkup('nameValue', { + name: nameArr.join(' > '), + value: params.value, + noValue: params.value == null + }); + } // dataType === 'node' or empty + + + var nodeMarkup = defaultSeriesFormatTooltip({ + series: this, + dataIndex: dataIndex, + multipleSeries: multipleSeries + }); + return nodeMarkup; + }; + + GraphSeriesModel.prototype._updateCategoriesData = function () { + var categories = map(this.option.categories || [], function (category) { + // Data must has value + return category.value != null ? category : extend({ + value: 0 + }, category); + }); + var categoriesData = new SeriesData(['value'], this); + categoriesData.initData(categories); + this._categoriesData = categoriesData; + this._categoriesModels = categoriesData.mapArray(function (idx) { + return categoriesData.getItemModel(idx); + }); + }; + + GraphSeriesModel.prototype.setZoom = function (zoom) { + this.option.zoom = zoom; + }; + + GraphSeriesModel.prototype.setCenter = function (center) { + this.option.center = center; + }; + + GraphSeriesModel.prototype.isAnimationEnabled = function () { + return _super.prototype.isAnimationEnabled.call(this) // Not enable animation when do force layout + && !(this.get('layout') === 'force' && this.get(['force', 'layoutAnimation'])); + }; + + GraphSeriesModel.type = 'series.graph'; + GraphSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + GraphSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + // Default option for all coordinate systems + // xAxisIndex: 0, + // yAxisIndex: 0, + // polarIndex: 0, + // geoIndex: 0, + legendHoverLink: true, + layout: null, + // Configuration of circular layout + circular: { + rotateLabel: false + }, + // Configuration of force directed layout + force: { + initLayout: null, + // Node repulsion. Can be an array to represent range. + repulsion: [0, 50], + gravity: 0.1, + // Initial friction + friction: 0.6, + // Edge length. Can be an array to represent range. + edgeLength: 30, + layoutAnimation: true + }, + left: 'center', + top: 'center', + // right: null, + // bottom: null, + // width: '80%', + // height: '80%', + symbol: 'circle', + symbolSize: 10, + edgeSymbol: ['none', 'none'], + edgeSymbolSize: 10, + edgeLabel: { + position: 'middle', + distance: 5 + }, + draggable: false, + roam: false, + // Default on center of graph + center: null, + zoom: 1, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.6, + // cursor: null, + // categories: [], + // data: [] + // Or + // nodes: [] + // + // links: [] + // Or + // edges: [] + label: { + show: false, + formatter: '{b}' + }, + itemStyle: {}, + lineStyle: { + color: '#aaa', + width: 1, + opacity: 0.5 + }, + emphasis: { + scale: true, + label: { + show: true + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return GraphSeriesModel; + }(SeriesModel); + + var actionInfo = { + type: 'graphRoam', + event: 'graphRoam', + update: 'none' + }; + + function install$d(registers) { + registers.registerChartView(GraphView); + registers.registerSeriesModel(GraphSeriesModel); + registers.registerProcessor(categoryFilter); + registers.registerVisual(categoryVisual); + registers.registerVisual(graphEdgeVisual); + registers.registerLayout(graphSimpleLayout); + registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, graphCircularLayout); + registers.registerLayout(graphForceLayout); + registers.registerCoordinateSystem('graphView', { + dimensions: View.dimensions, + create: createViewCoordSys + }); // Register legacy focus actions + + registers.registerAction({ + type: 'focusNodeAdjacency', + event: 'focusNodeAdjacency', + update: 'series:focusNodeAdjacency' + }, noop); + registers.registerAction({ + type: 'unfocusNodeAdjacency', + event: 'unfocusNodeAdjacency', + update: 'series:unfocusNodeAdjacency' + }, noop); // Register roam action. + + registers.registerAction(actionInfo, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + query: payload + }, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var res = updateCenterAndZoom(coordSys, payload); + seriesModel.setCenter && seriesModel.setCenter(res.center); + seriesModel.setZoom && seriesModel.setZoom(res.zoom); + }); + }); + } + + var PointerShape = + /** @class */ + function () { + function PointerShape() { + this.angle = 0; + this.width = 10; + this.r = 10; + this.x = 0; + this.y = 0; + } + + return PointerShape; + }(); + + var PointerPath = + /** @class */ + function (_super) { + __extends(PointerPath, _super); + + function PointerPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'pointer'; + return _this; + } + + PointerPath.prototype.getDefaultShape = function () { + return new PointerShape(); + }; + + PointerPath.prototype.buildPath = function (ctx, shape) { + var mathCos = Math.cos; + var mathSin = Math.sin; + var r = shape.r; + var width = shape.width; + var angle = shape.angle; + var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2); + var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2); + angle = shape.angle - Math.PI / 2; + ctx.moveTo(x, y); + ctx.lineTo(shape.x + mathCos(angle) * width, shape.y + mathSin(angle) * width); + ctx.lineTo(shape.x + mathCos(shape.angle) * r, shape.y + mathSin(shape.angle) * r); + ctx.lineTo(shape.x - mathCos(angle) * width, shape.y - mathSin(angle) * width); + ctx.lineTo(x, y); + }; + + return PointerPath; + }(Path); + + function parsePosition(seriesModel, api) { + var center = seriesModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], api.getWidth()); + var cy = parsePercent$1(center[1], api.getHeight()); + var r = parsePercent$1(seriesModel.get('radius'), size / 2); + return { + cx: cx, + cy: cy, + r: r + }; + } + + function formatLabel(value, labelFormatter) { + var label = value == null ? '' : value + ''; + + if (labelFormatter) { + if (isString(labelFormatter)) { + label = labelFormatter.replace('{value}', label); + } else if (isFunction(labelFormatter)) { + label = labelFormatter(value); + } + } + + return label; + } + + var GaugeView = + /** @class */ + function (_super) { + __extends(GaugeView, _super); + + function GaugeView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GaugeView.type; + return _this; + } + + GaugeView.prototype.render = function (seriesModel, ecModel, api) { + this.group.removeAll(); + var colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']); + var posInfo = parsePosition(seriesModel, api); + + this._renderMain(seriesModel, ecModel, api, colorList, posInfo); + + this._data = seriesModel.getData(); + }; + + GaugeView.prototype.dispose = function () { + }; + + GaugeView.prototype._renderMain = function (seriesModel, ecModel, api, colorList, posInfo) { + var group = this.group; + var clockwise = seriesModel.get('clockwise'); + var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI; + var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI; + var axisLineModel = seriesModel.getModel('axisLine'); + var roundCap = axisLineModel.get('roundCap'); + var MainPath = roundCap ? SausagePath : Sector; + var showAxis = axisLineModel.get('show'); + var lineStyleModel = axisLineModel.getModel('lineStyle'); + var axisLineWidth = lineStyleModel.get('width'); + var angles = [startAngle, endAngle]; + normalizeArcAngles(angles, !clockwise); + startAngle = angles[0]; + endAngle = angles[1]; + var angleRangeSpan = endAngle - startAngle; + var prevEndAngle = startAngle; + + for (var i = 0; showAxis && i < colorList.length; i++) { + // Clamp + var percent = Math.min(Math.max(colorList[i][0], 0), 1); + endAngle = startAngle + angleRangeSpan * percent; + var sector = new MainPath({ + shape: { + startAngle: prevEndAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: posInfo.r - axisLineWidth, + r: posInfo.r + }, + silent: true + }); + sector.setStyle({ + fill: colorList[i][1] + }); + sector.setStyle(lineStyleModel.getLineStyle( // Because we use sector to simulate arc + // so the properties for stroking are useless + ['color', 'width'])); + group.add(sector); + prevEndAngle = endAngle; + } + + var getColor = function (percent) { + // Less than 0 + if (percent <= 0) { + return colorList[0][1]; + } + + var i; + + for (i = 0; i < colorList.length; i++) { + if (colorList[i][0] >= percent && (i === 0 ? 0 : colorList[i - 1][0]) < percent) { + return colorList[i][1]; + } + } // More than 1 + + + return colorList[i - 1][1]; + }; + + this._renderTicks(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth); + + this._renderTitleAndDetail(seriesModel, ecModel, api, getColor, posInfo); + + this._renderAnchor(seriesModel, posInfo); + + this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth); + }; + + GaugeView.prototype._renderTicks = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { + var group = this.group; + var cx = posInfo.cx; + var cy = posInfo.cy; + var r = posInfo.r; + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var splitLineModel = seriesModel.getModel('splitLine'); + var tickModel = seriesModel.getModel('axisTick'); + var labelModel = seriesModel.getModel('axisLabel'); + var splitNumber = seriesModel.get('splitNumber'); + var subSplitNumber = tickModel.get('splitNumber'); + var splitLineLen = parsePercent$1(splitLineModel.get('length'), r); + var tickLen = parsePercent$1(tickModel.get('length'), r); + var angle = startAngle; + var step = (endAngle - startAngle) / splitNumber; + var subStep = step / subSplitNumber; + var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle(); + var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle(); + var splitLineDistance = splitLineModel.get('distance'); + var unitX; + var unitY; + + for (var i = 0; i <= splitNumber; i++) { + unitX = Math.cos(angle); + unitY = Math.sin(angle); // Split line + + if (splitLineModel.get('show')) { + var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth; + var splitLine = new Line({ + shape: { + x1: unitX * (r - distance) + cx, + y1: unitY * (r - distance) + cy, + x2: unitX * (r - splitLineLen - distance) + cx, + y2: unitY * (r - splitLineLen - distance) + cy + }, + style: splitLineStyle, + silent: true + }); + + if (splitLineStyle.stroke === 'auto') { + splitLine.setStyle({ + stroke: getColor(i / splitNumber) + }); + } + + group.add(splitLine); + } // Label + + + if (labelModel.get('show')) { + var distance = labelModel.get('distance') + splitLineDistance; + var label = formatLabel(round(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get('formatter')); + var autoColor = getColor(i / splitNumber); + group.add(new ZRText({ + style: createTextStyle(labelModel, { + text: label, + x: unitX * (r - splitLineLen - distance) + cx, + y: unitY * (r - splitLineLen - distance) + cy, + verticalAlign: unitY < -0.8 ? 'top' : unitY > 0.8 ? 'bottom' : 'middle', + align: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center' + }, { + inheritColor: autoColor + }), + silent: true + })); + } // Axis tick + + + if (tickModel.get('show') && i !== splitNumber) { + var distance = tickModel.get('distance'); + distance = distance ? distance + axisLineWidth : axisLineWidth; + + for (var j = 0; j <= subSplitNumber; j++) { + unitX = Math.cos(angle); + unitY = Math.sin(angle); + var tickLine = new Line({ + shape: { + x1: unitX * (r - distance) + cx, + y1: unitY * (r - distance) + cy, + x2: unitX * (r - tickLen - distance) + cx, + y2: unitY * (r - tickLen - distance) + cy + }, + silent: true, + style: tickLineStyle + }); + + if (tickLineStyle.stroke === 'auto') { + tickLine.setStyle({ + stroke: getColor((i + j / subSplitNumber) / splitNumber) + }); + } + + group.add(tickLine); + angle += subStep; + } + + angle -= subStep; + } else { + angle += step; + } + } + }; + + GaugeView.prototype._renderPointer = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) { + var group = this.group; + var oldData = this._data; + var oldProgressData = this._progressEls; + var progressList = []; + var showPointer = seriesModel.get(['pointer', 'show']); + var progressModel = seriesModel.getModel('progress'); + var showProgress = progressModel.get('show'); + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var valueExtent = [minVal, maxVal]; + var angleExtent = [startAngle, endAngle]; + + function createPointer(idx, angle) { + var itemModel = data.getItemModel(idx); + var pointerModel = itemModel.getModel('pointer'); + var pointerWidth = parsePercent$1(pointerModel.get('width'), posInfo.r); + var pointerLength = parsePercent$1(pointerModel.get('length'), posInfo.r); + var pointerStr = seriesModel.get(['pointer', 'icon']); + var pointerOffset = pointerModel.get('offsetCenter'); + var pointerOffsetX = parsePercent$1(pointerOffset[0], posInfo.r); + var pointerOffsetY = parsePercent$1(pointerOffset[1], posInfo.r); + var pointerKeepAspect = pointerModel.get('keepAspect'); + var pointer; // not exist icon type will be set 'rect' + + if (pointerStr) { + pointer = createSymbol(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect); + } else { + pointer = new PointerPath({ + shape: { + angle: -Math.PI / 2, + width: pointerWidth, + r: pointerLength, + x: pointerOffsetX, + y: pointerOffsetY + } + }); + } + + pointer.rotation = -(angle + Math.PI / 2); + pointer.x = posInfo.cx; + pointer.y = posInfo.cy; + return pointer; + } + + function createProgress(idx, endAngle) { + var roundCap = progressModel.get('roundCap'); + var ProgressPath = roundCap ? SausagePath : Sector; + var isOverlap = progressModel.get('overlap'); + var progressWidth = isOverlap ? progressModel.get('width') : axisLineWidth / data.count(); + var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth; + var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth; + var progress = new ProgressPath({ + shape: { + startAngle: startAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: r0, + r: r + } + }); + isOverlap && (progress.z2 = maxVal - data.get(valueDim, idx) % maxVal); + return progress; + } + + if (showProgress || showPointer) { + data.diff(oldData).add(function (idx) { + var val = data.get(valueDim, idx); + + if (showPointer) { + var pointer = createPointer(idx, startAngle); // TODO hide pointer on NaN value? + + initProps(pointer, { + rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2) + }, seriesModel); + group.add(pointer); + data.setItemGraphicEl(idx, pointer); + } + + if (showProgress) { + var progress = createProgress(idx, startAngle); + var isClip = progressModel.get('clip'); + initProps(progress, { + shape: { + endAngle: linearMap(val, valueExtent, angleExtent, isClip) + } + }, seriesModel); + group.add(progress); // Add data index and series index for indexing the data by element + // Useful in tooltip + + setCommonECData(seriesModel.seriesIndex, data.dataType, idx, progress); + progressList[idx] = progress; + } + }).update(function (newIdx, oldIdx) { + var val = data.get(valueDim, newIdx); + + if (showPointer) { + var previousPointer = oldData.getItemGraphicEl(oldIdx); + var previousRotate = previousPointer ? previousPointer.rotation : startAngle; + var pointer = createPointer(newIdx, previousRotate); + pointer.rotation = previousRotate; + updateProps(pointer, { + rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2) + }, seriesModel); + group.add(pointer); + data.setItemGraphicEl(newIdx, pointer); + } + + if (showProgress) { + var previousProgress = oldProgressData[oldIdx]; + var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle; + var progress = createProgress(newIdx, previousEndAngle); + var isClip = progressModel.get('clip'); + updateProps(progress, { + shape: { + endAngle: linearMap(val, valueExtent, angleExtent, isClip) + } + }, seriesModel); + group.add(progress); // Add data index and series index for indexing the data by element + // Useful in tooltip + + setCommonECData(seriesModel.seriesIndex, data.dataType, newIdx, progress); + progressList[newIdx] = progress; + } + }).execute(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + + if (showPointer) { + var pointer = data.getItemGraphicEl(idx); + var symbolStyle = data.getItemVisual(idx, 'style'); + var visualColor = symbolStyle.fill; + + if (pointer instanceof ZRImage) { + var pathStyle = pointer.style; + pointer.useStyle(extend({ + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolStyle)); + } else { + pointer.useStyle(symbolStyle); + pointer.type !== 'pointer' && pointer.setColor(visualColor); + } + + pointer.setStyle(itemModel.getModel(['pointer', 'itemStyle']).getItemStyle()); + + if (pointer.style.fill === 'auto') { + pointer.setStyle('fill', getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true))); + } + + pointer.z2EmphasisLift = 0; + setStatesStylesFromModel(pointer, itemModel); + toggleHoverEmphasis(pointer, focus, blurScope, emphasisDisabled); + } + + if (showProgress) { + var progress = progressList[idx]; + progress.useStyle(data.getItemVisual(idx, 'style')); + progress.setStyle(itemModel.getModel(['progress', 'itemStyle']).getItemStyle()); + progress.z2EmphasisLift = 0; + setStatesStylesFromModel(progress, itemModel); + toggleHoverEmphasis(progress, focus, blurScope, emphasisDisabled); + } + }); + this._progressEls = progressList; + } + }; + + GaugeView.prototype._renderAnchor = function (seriesModel, posInfo) { + var anchorModel = seriesModel.getModel('anchor'); + var showAnchor = anchorModel.get('show'); + + if (showAnchor) { + var anchorSize = anchorModel.get('size'); + var anchorType = anchorModel.get('icon'); + var offsetCenter = anchorModel.get('offsetCenter'); + var anchorKeepAspect = anchorModel.get('keepAspect'); + var anchor = createSymbol(anchorType, posInfo.cx - anchorSize / 2 + parsePercent$1(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent$1(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect); + anchor.z2 = anchorModel.get('showAbove') ? 1 : 0; + anchor.setStyle(anchorModel.getModel('itemStyle').getItemStyle()); + this.group.add(anchor); + } + }; + + GaugeView.prototype._renderTitleAndDetail = function (seriesModel, ecModel, api, getColor, posInfo) { + var _this = this; + + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var contentGroup = new Group(); + var newTitleEls = []; + var newDetailEls = []; + var hasAnimation = seriesModel.isAnimationEnabled(); + var showPointerAbove = seriesModel.get(['pointer', 'showAbove']); + data.diff(this._data).add(function (idx) { + newTitleEls[idx] = new ZRText({ + silent: true + }); + newDetailEls[idx] = new ZRText({ + silent: true + }); + }).update(function (idx, oldIdx) { + newTitleEls[idx] = _this._titleEls[oldIdx]; + newDetailEls[idx] = _this._detailEls[oldIdx]; + }).execute(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var value = data.get(valueDim, idx); + var itemGroup = new Group(); + var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true)); + var itemTitleModel = itemModel.getModel('title'); + + if (itemTitleModel.get('show')) { + var titleOffsetCenter = itemTitleModel.get('offsetCenter'); + var titleX = posInfo.cx + parsePercent$1(titleOffsetCenter[0], posInfo.r); + var titleY = posInfo.cy + parsePercent$1(titleOffsetCenter[1], posInfo.r); + var labelEl = newTitleEls[idx]; + labelEl.attr({ + z2: showPointerAbove ? 0 : 2, + style: createTextStyle(itemTitleModel, { + x: titleX, + y: titleY, + text: data.getName(idx), + align: 'center', + verticalAlign: 'middle' + }, { + inheritColor: autoColor + }) + }); + itemGroup.add(labelEl); + } + + var itemDetailModel = itemModel.getModel('detail'); + + if (itemDetailModel.get('show')) { + var detailOffsetCenter = itemDetailModel.get('offsetCenter'); + var detailX = posInfo.cx + parsePercent$1(detailOffsetCenter[0], posInfo.r); + var detailY = posInfo.cy + parsePercent$1(detailOffsetCenter[1], posInfo.r); + var width = parsePercent$1(itemDetailModel.get('width'), posInfo.r); + var height = parsePercent$1(itemDetailModel.get('height'), posInfo.r); + var detailColor = seriesModel.get(['progress', 'show']) ? data.getItemVisual(idx, 'style').fill : autoColor; + var labelEl = newDetailEls[idx]; + var formatter_1 = itemDetailModel.get('formatter'); + labelEl.attr({ + z2: showPointerAbove ? 0 : 2, + style: createTextStyle(itemDetailModel, { + x: detailX, + y: detailY, + text: formatLabel(value, formatter_1), + width: isNaN(width) ? null : width, + height: isNaN(height) ? null : height, + align: 'center', + verticalAlign: 'middle' + }, { + inheritColor: detailColor + }) + }); + setLabelValueAnimation(labelEl, { + normal: itemDetailModel + }, value, function (value) { + return formatLabel(value, formatter_1); + }); + hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, { + getFormattedLabel: function (labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) { + return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1); + } + }); + itemGroup.add(labelEl); + } + + contentGroup.add(itemGroup); + }); + this.group.add(contentGroup); + this._titleEls = newTitleEls; + this._detailEls = newDetailEls; + }; + + GaugeView.type = 'gauge'; + return GaugeView; + }(ChartView); + + var GaugeSeriesModel = + /** @class */ + function (_super) { + __extends(GaugeSeriesModel, _super); + + function GaugeSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GaugeSeriesModel.type; + _this.visualStyleAccessPath = 'itemStyle'; + return _this; + } + + GaugeSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, ['value']); + }; + + GaugeSeriesModel.type = 'series.gauge'; + GaugeSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + // 默认全局居中 + center: ['50%', '50%'], + legendHoverLink: true, + radius: '75%', + startAngle: 225, + endAngle: -45, + clockwise: true, + // 最小值 + min: 0, + // 最大值 + max: 100, + // 分割段数,默认为10 + splitNumber: 10, + // 坐标轴线 + axisLine: { + // 默认显示,属性show控制显示与否 + show: true, + roundCap: false, + lineStyle: { + color: [[1, '#E6EBF8']], + width: 10 + } + }, + // 坐标轴线 + progress: { + // 默认显示,属性show控制显示与否 + show: false, + overlap: true, + width: 10, + roundCap: false, + clip: true + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性length控制线长 + length: 10, + distance: 10, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: '#63677A', + width: 3, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认不显示 + show: true, + // 每份split细分多少段 + splitNumber: 5, + // 属性length控制线长 + length: 6, + distance: 10, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#63677A', + width: 1, + type: 'solid' + } + }, + axisLabel: { + show: true, + distance: 15, + // formatter: null, + color: '#464646', + fontSize: 12 + }, + pointer: { + icon: null, + offsetCenter: [0, 0], + show: true, + showAbove: true, + length: '60%', + width: 6, + keepAspect: false + }, + anchor: { + show: false, + showAbove: false, + size: 6, + icon: 'circle', + offsetCenter: [0, 0], + keepAspect: false, + itemStyle: { + color: '#fff', + borderWidth: 0, + borderColor: '#5470c6' + } + }, + title: { + show: true, + // x, y,单位px + offsetCenter: [0, '20%'], + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#464646', + fontSize: 16, + valueAnimation: false + }, + detail: { + show: true, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 0, + borderColor: '#ccc', + width: 100, + height: null, + padding: [5, 10], + // x, y,单位px + offsetCenter: [0, '40%'], + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#464646', + fontSize: 30, + fontWeight: 'bold', + lineHeight: 30, + valueAnimation: false + } + }; + return GaugeSeriesModel; + }(SeriesModel); + + function install$e(registers) { + registers.registerChartView(GaugeView); + registers.registerSeriesModel(GaugeSeriesModel); + } + + var opacityAccessPath = ['itemStyle', 'opacity']; + /** + * Piece of pie including Sector, Label, LabelLine + */ + + var FunnelPiece = + /** @class */ + function (_super) { + __extends(FunnelPiece, _super); + + function FunnelPiece(data, idx) { + var _this = _super.call(this) || this; + + var polygon = _this; + var labelLine = new Polyline(); + var text = new ZRText(); + polygon.setTextContent(text); + + _this.setTextGuideLine(labelLine); + + _this.updateData(data, idx, true); + + return _this; + } + + FunnelPiece.prototype.updateData = function (data, idx, firstCreate) { + var polygon = this; + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var emphasisModel = itemModel.getModel('emphasis'); + var opacity = itemModel.get(opacityAccessPath); + opacity = opacity == null ? 1 : opacity; + + if (!firstCreate) { + saveOldStyle(polygon); + } // Update common style + + + polygon.useStyle(data.getItemVisual(idx, 'style')); + polygon.style.lineJoin = 'round'; + + if (firstCreate) { + polygon.setShape({ + points: layout.points + }); + polygon.style.opacity = 0; + initProps(polygon, { + style: { + opacity: opacity + } + }, seriesModel, idx); + } else { + updateProps(polygon, { + style: { + opacity: opacity + }, + shape: { + points: layout.points + } + }, seriesModel, idx); + } + + setStatesStylesFromModel(polygon, itemModel); + + this._updateLabel(data, idx); + + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + FunnelPiece.prototype._updateLabel = function (data, idx) { + var polygon = this; + var labelLine = this.getTextGuideLine(); + var labelText = polygon.getTextContent(); + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var style = data.getItemVisual(idx, 'style'); + var visualColor = style.fill; + setLabelStyle( // position will not be used in setLabelStyle + labelText, getLabelStatesModels(itemModel), { + labelFetcher: data.hostModel, + labelDataIndex: idx, + defaultOpacity: style.opacity, + defaultText: data.getName(idx) + }, { + normal: { + align: labelLayout.textAlign, + verticalAlign: labelLayout.verticalAlign + } + }); + polygon.setTextConfig({ + local: true, + inside: !!labelLayout.inside, + insideStroke: visualColor, + // insideFill: 'auto', + outsideFill: visualColor + }); + var linePoints = labelLayout.linePoints; + labelLine.setShape({ + points: linePoints + }); + polygon.textGuideLineConfig = { + anchor: linePoints ? new Point(linePoints[0][0], linePoints[0][1]) : null + }; // Make sure update style on labelText after setLabelStyle. + // Because setLabelStyle will replace a new style on it. + + updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel, idx); + labelText.attr({ + rotation: labelLayout.rotation, + originX: labelLayout.x, + originY: labelLayout.y, + z2: 10 + }); + setLabelLineStyle(polygon, getLabelLineStatesModels(itemModel), { + // Default use item visual color + stroke: visualColor + }); + }; + + return FunnelPiece; + }(Polygon); + + var FunnelView = + /** @class */ + function (_super) { + __extends(FunnelView, _super); + + function FunnelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = FunnelView.type; + _this.ignoreLabelLineUpdate = true; + return _this; + } + + FunnelView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + data.diff(oldData).add(function (idx) { + var funnelPiece = new FunnelPiece(data, idx); + data.setItemGraphicEl(idx, funnelPiece); + group.add(funnelPiece); + }).update(function (newIdx, oldIdx) { + var piece = oldData.getItemGraphicEl(oldIdx); + piece.updateData(data, newIdx); + group.add(piece); + data.setItemGraphicEl(newIdx, piece); + }).remove(function (idx) { + var piece = oldData.getItemGraphicEl(idx); + removeElementWithFadeOut(piece, seriesModel, idx); + }).execute(); + this._data = data; + }; + + FunnelView.prototype.remove = function () { + this.group.removeAll(); + this._data = null; + }; + + FunnelView.prototype.dispose = function () { + }; + + FunnelView.type = 'funnel'; + return FunnelView; + }(ChartView); + + var FunnelSeriesModel = + /** @class */ + function (_super) { + __extends(FunnelSeriesModel, _super); + + function FunnelSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = FunnelSeriesModel.type; + return _this; + } + + FunnelSeriesModel.prototype.init = function (option) { + _super.prototype.init.apply(this, arguments); // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); // Extend labelLine emphasis + + this._defaultLabelLine(option); + }; + + FunnelSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesDataSimply(this, { + coordDimensions: ['value'], + encodeDefaulter: curry(makeSeriesEncodeForNameBased, this) + }); + }; + + FunnelSeriesModel.prototype._defaultLabelLine = function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false` + + labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show; + }; // Overwrite + + + FunnelSeriesModel.prototype.getDataParams = function (dataIndex) { + var data = this.getData(); + + var params = _super.prototype.getDataParams.call(this, dataIndex); + + var valueDim = data.mapDimension('value'); + var sum = data.getSum(valueDim); // Percent is 0 if sum is 0 + + params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) / sum * 100).toFixed(2); + params.$vars.push('percent'); + return params; + }; + + FunnelSeriesModel.type = 'series.funnel'; + FunnelSeriesModel.defaultOption = { + // zlevel: 0, // 一级层叠 + z: 2, + legendHoverLink: true, + colorBy: 'data', + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + // 默认取数据最小最大值 + // min: 0, + // max: 100, + minSize: '0%', + maxSize: '100%', + sort: 'descending', + orient: 'vertical', + gap: 0, + funnelAlign: 'center', + label: { + show: true, + position: 'outer' // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + }, + labelLine: { + show: true, + length: 20, + lineStyle: { + // color: 各异, + width: 1 + } + }, + itemStyle: { + // color: 各异, + borderColor: '#fff', + borderWidth: 1 + }, + emphasis: { + label: { + show: true + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return FunnelSeriesModel; + }(SeriesModel); + + function getViewRect$3(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function getSortedIndices(data, sort) { + var valueDim = data.mapDimension('value'); + var valueArr = data.mapArray(valueDim, function (val) { + return val; + }); + var indices = []; + var isAscending = sort === 'ascending'; + + for (var i = 0, len = data.count(); i < len; i++) { + indices[i] = i; + } // Add custom sortable function & none sortable opetion by "options.sort" + + + if (isFunction(sort)) { + indices.sort(sort); + } else if (sort !== 'none') { + indices.sort(function (a, b) { + return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a]; + }); + } + + return indices; + } + + function labelLayout(data) { + var seriesModel = data.hostModel; + var orient = seriesModel.get('orient'); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + var labelPosition = labelModel.get('position'); + var labelLineModel = itemModel.getModel('labelLine'); + var layout = data.getItemLayout(idx); + var points = layout.points; + var isLabelInside = labelPosition === 'inner' || labelPosition === 'inside' || labelPosition === 'center' || labelPosition === 'insideLeft' || labelPosition === 'insideRight'; + var textAlign; + var textX; + var textY; + var linePoints; + + if (isLabelInside) { + if (labelPosition === 'insideLeft') { + textX = (points[0][0] + points[3][0]) / 2 + 5; + textY = (points[0][1] + points[3][1]) / 2; + textAlign = 'left'; + } else if (labelPosition === 'insideRight') { + textX = (points[1][0] + points[2][0]) / 2 - 5; + textY = (points[1][1] + points[2][1]) / 2; + textAlign = 'right'; + } else { + textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4; + textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4; + textAlign = 'center'; + } + + linePoints = [[textX, textY], [textX, textY]]; + } else { + var x1 = void 0; + var y1 = void 0; + var x2 = void 0; + var y2 = void 0; + var labelLineLen = labelLineModel.get('length'); + + if ("development" !== 'production') { + if (orient === 'vertical' && ['top', 'bottom'].indexOf(labelPosition) > -1) { + labelPosition = 'left'; + console.warn('Position error: Funnel chart on vertical orient dose not support top and bottom.'); + } + + if (orient === 'horizontal' && ['left', 'right'].indexOf(labelPosition) > -1) { + labelPosition = 'bottom'; + console.warn('Position error: Funnel chart on horizontal orient dose not support left and right.'); + } + } + + if (labelPosition === 'left') { + // Left side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } else if (labelPosition === 'right') { + // Right side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } else if (labelPosition === 'top') { + // Top side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else if (labelPosition === 'bottom') { + // Bottom side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else if (labelPosition === 'rightTop') { + // RightTop side + x1 = orient === 'horizontal' ? points[3][0] : points[1][0]; + y1 = orient === 'horizontal' ? points[3][1] : points[1][1]; + + if (orient === 'horizontal') { + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'top'; + } + } else if (labelPosition === 'rightBottom') { + // RightBottom side + x1 = points[2][0]; + y1 = points[2][1]; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'bottom'; + } + } else if (labelPosition === 'leftTop') { + // LeftTop side + x1 = points[0][0]; + y1 = orient === 'horizontal' ? points[0][1] : points[1][1]; + + if (orient === 'horizontal') { + y2 = y1 - labelLineLen; + textY = y2 - 5; + textAlign = 'center'; + } else { + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + } else if (labelPosition === 'leftBottom') { + // LeftBottom side + x1 = orient === 'horizontal' ? points[1][0] : points[3][0]; + y1 = orient === 'horizontal' ? points[1][1] : points[2][1]; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + } else { + // Right side or Bottom side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + + if (orient === 'horizontal') { + y2 = y1 + labelLineLen; + textY = y2 + 5; + textAlign = 'center'; + } else { + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } + } + + if (orient === 'horizontal') { + x2 = x1; + textX = x2; + } else { + y2 = y1; + textY = y2; + } + + linePoints = [[x1, y1], [x2, y2]]; + } + + layout.label = { + linePoints: linePoints, + x: textX, + y: textY, + verticalAlign: 'middle', + textAlign: textAlign, + inside: isLabelInside + }; + }); + } + + function funnelLayout(ecModel, api) { + ecModel.eachSeriesByType('funnel', function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var sort = seriesModel.get('sort'); + var viewRect = getViewRect$3(seriesModel, api); + var orient = seriesModel.get('orient'); + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + var indices = getSortedIndices(data, sort); + var x = viewRect.x; + var y = viewRect.y; + var sizeExtent = orient === 'horizontal' ? [parsePercent$1(seriesModel.get('minSize'), viewHeight), parsePercent$1(seriesModel.get('maxSize'), viewHeight)] : [parsePercent$1(seriesModel.get('minSize'), viewWidth), parsePercent$1(seriesModel.get('maxSize'), viewWidth)]; + var dataExtent = data.getDataExtent(valueDim); + var min = seriesModel.get('min'); + var max = seriesModel.get('max'); + + if (min == null) { + min = Math.min(dataExtent[0], 0); + } + + if (max == null) { + max = dataExtent[1]; + } + + var funnelAlign = seriesModel.get('funnelAlign'); + var gap = seriesModel.get('gap'); + var viewSize = orient === 'horizontal' ? viewWidth : viewHeight; + var itemSize = (viewSize - gap * (data.count() - 1)) / data.count(); + + var getLinePoints = function (idx, offset) { + // End point index is data.count() and we assign it 0 + if (orient === 'horizontal') { + var val_1 = data.get(valueDim, idx) || 0; + var itemHeight = linearMap(val_1, [min, max], sizeExtent, true); + var y0 = void 0; + + switch (funnelAlign) { + case 'top': + y0 = y; + break; + + case 'center': + y0 = y + (viewHeight - itemHeight) / 2; + break; + + case 'bottom': + y0 = y + (viewHeight - itemHeight); + break; + } + + return [[offset, y0], [offset, y0 + itemHeight]]; + } + + var val = data.get(valueDim, idx) || 0; + var itemWidth = linearMap(val, [min, max], sizeExtent, true); + var x0; + + switch (funnelAlign) { + case 'left': + x0 = x; + break; + + case 'center': + x0 = x + (viewWidth - itemWidth) / 2; + break; + + case 'right': + x0 = x + viewWidth - itemWidth; + break; + } + + return [[x0, offset], [x0 + itemWidth, offset]]; + }; + + if (sort === 'ascending') { + // From bottom to top + itemSize = -itemSize; + gap = -gap; + + if (orient === 'horizontal') { + x += viewWidth; + } else { + y += viewHeight; + } + + indices = indices.reverse(); + } + + for (var i = 0; i < indices.length; i++) { + var idx = indices[i]; + var nextIdx = indices[i + 1]; + var itemModel = data.getItemModel(idx); + + if (orient === 'horizontal') { + var width = itemModel.get(['itemStyle', 'width']); + + if (width == null) { + width = itemSize; + } else { + width = parsePercent$1(width, viewWidth); + + if (sort === 'ascending') { + width = -width; + } + } + + var start = getLinePoints(idx, x); + var end = getLinePoints(nextIdx, x + width); + x += width + gap; + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } else { + var height = itemModel.get(['itemStyle', 'height']); + + if (height == null) { + height = itemSize; + } else { + height = parsePercent$1(height, viewHeight); + + if (sort === 'ascending') { + height = -height; + } + } + + var start = getLinePoints(idx, y); + var end = getLinePoints(nextIdx, y + height); + y += height + gap; + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } + } + + labelLayout(data); + }); + } + + function install$f(registers) { + registers.registerChartView(FunnelView); + registers.registerSeriesModel(FunnelSeriesModel); + registers.registerLayout(funnelLayout); + registers.registerProcessor(dataFilter('funnel')); + } + + var DEFAULT_SMOOTH = 0.3; + + var ParallelView = + /** @class */ + function (_super) { + __extends(ParallelView, _super); + + function ParallelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelView.type; + _this._dataGroup = new Group(); + _this._initialized = false; + return _this; + } + + ParallelView.prototype.init = function () { + this.group.add(this._dataGroup); + }; + /** + * @override + */ + + + ParallelView.prototype.render = function (seriesModel, ecModel, api, payload) { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + var dataGroup = this._dataGroup; + var data = seriesModel.getData(); + var oldData = this._data; + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + data.diff(oldData).add(add).update(update).remove(remove).execute(); + + function add(newDataIndex) { + var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function update(newDataIndex, oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + var points = createLinePoints(data, newDataIndex, dimensions, coordSys); + data.setItemGraphicEl(newDataIndex, line); + updateProps(line, { + shape: { + points: points + } + }, seriesModel, newDataIndex); + saveOldStyle(line); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function remove(oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + dataGroup.remove(line); + } // First create + + + if (!this._initialized) { + this._initialized = true; + var clipPath = createGridClipShape(coordSys, seriesModel, function () { + // Callback will be invoked immediately if there is no animation + setTimeout(function () { + dataGroup.removeClipPath(); + }); + }); + dataGroup.setClipPath(clipPath); + } + + this._data = data; + }; + + ParallelView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this._initialized = true; + this._data = null; + + this._dataGroup.removeAll(); + }; + + ParallelView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + var progressiveEls = this._progressiveEls = []; + + for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) { + var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys); + line.incremental = true; + updateElCommon(line, data, dataIndex, seriesScope); + progressiveEls.push(line); + } + }; + + ParallelView.prototype.remove = function () { + this._dataGroup && this._dataGroup.removeAll(); + this._data = null; + }; + + ParallelView.type = 'parallel'; + return ParallelView; + }(ChartView); + + function createGridClipShape(coordSys, seriesModel, cb) { + var parallelModel = coordSys.model; + var rect = coordSys.getRect(); + var rectEl = new Rect({ + shape: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + } + }); + var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height'; + rectEl.setShape(dim, 0); + initProps(rectEl, { + shape: { + width: rect.width, + height: rect.height + } + }, seriesModel, cb); + return rectEl; + } + + function createLinePoints(data, dataIndex, dimensions, coordSys) { + var points = []; + + for (var i = 0; i < dimensions.length; i++) { + var dimName = dimensions[i]; + var value = data.get(data.mapDimension(dimName), dataIndex); + + if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) { + points.push(coordSys.dataToPoint(value, dimName)); + } + } + + return points; + } + + function addEl(data, dataGroup, dataIndex, dimensions, coordSys) { + var points = createLinePoints(data, dataIndex, dimensions, coordSys); + var line = new Polyline({ + shape: { + points: points + }, + // silent: true, + z2: 10 + }); + dataGroup.add(line); + data.setItemGraphicEl(dataIndex, line); + return line; + } + + function makeSeriesScope$2(seriesModel) { + var smooth = seriesModel.get('smooth', true); + smooth === true && (smooth = DEFAULT_SMOOTH); + smooth = numericToNumber(smooth); + eqNaN(smooth) && (smooth = 0); + return { + smooth: smooth + }; + } + + function updateElCommon(el, data, dataIndex, seriesScope) { + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.fill = null; + el.setShape('smooth', seriesScope.smooth); + var itemModel = data.getItemModel(dataIndex); + var emphasisModel = itemModel.getModel('emphasis'); + setStatesStylesFromModel(el, itemModel, 'lineStyle'); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } // function simpleDiff(oldData, newData, dimensions) { + // let oldLen; + // if (!oldData + // || !oldData.__plProgressive + // || (oldLen = oldData.count()) !== newData.count() + // ) { + // return true; + // } + // let dimLen = dimensions.length; + // for (let i = 0; i < oldLen; i++) { + // for (let j = 0; j < dimLen; j++) { + // if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) { + // return true; + // } + // } + // } + // return false; + // } + // FIXME put in common util? + + + function isEmptyValue(val, axisType) { + return axisType === 'category' ? val == null : val == null || isNaN(val); // axisType === 'value' + } + + var ParallelSeriesModel = + /** @class */ + function (_super) { + __extends(ParallelSeriesModel, _super); + + function ParallelSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelSeriesModel.type; + _this.visualStyleAccessPath = 'lineStyle'; + _this.visualDrawType = 'stroke'; + return _this; + } + + ParallelSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: bind(makeDefaultEncode, null, this) + }); + }; + /** + * User can get data raw indices on 'axisAreaSelected' event received. + * + * @return Raw indices + */ + + + ParallelSeriesModel.prototype.getRawIndicesByActiveState = function (activeState) { + var coordSys = this.coordinateSystem; + var data = this.getData(); + var indices = []; + coordSys.eachActiveState(data, function (theActiveState, dataIndex) { + if (activeState === theActiveState) { + indices.push(data.getRawIndex(dataIndex)); + } + }); + return indices; + }; + + ParallelSeriesModel.type = 'series.parallel'; + ParallelSeriesModel.dependencies = ['parallel']; + ParallelSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'parallel', + parallelIndex: 0, + label: { + show: false + }, + inactiveOpacity: 0.05, + activeOpacity: 1, + lineStyle: { + width: 1, + opacity: 0.45, + type: 'solid' + }, + emphasis: { + label: { + show: false + } + }, + progressive: 500, + smooth: false, + animationEasing: 'linear' + }; + return ParallelSeriesModel; + }(SeriesModel); + + function makeDefaultEncode(seriesModel) { + // The mapping of parallelAxis dimension to data dimension can + // be specified in parallelAxis.option.dim. For example, if + // parallelAxis.option.dim is 'dim3', it mapping to the third + // dimension of data. But `data.encode` has higher priority. + // Moreover, parallelModel.dimension should not be regarded as data + // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6']; + var parallelModel = seriesModel.ecModel.getComponent('parallel', seriesModel.get('parallelIndex')); + + if (!parallelModel) { + return; + } + + var encodeDefine = {}; + each(parallelModel.dimensions, function (axisDim) { + var dataDimIndex = convertDimNameToNumber(axisDim); + encodeDefine[axisDim] = dataDimIndex; + }); + return encodeDefine; + } + + function convertDimNameToNumber(dimName) { + return +dimName.replace('dim', ''); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var opacityAccessPath$1 = ['lineStyle', 'opacity']; + var parallelVisual = { + seriesType: 'parallel', + reset: function (seriesModel, ecModel) { + var coordSys = seriesModel.coordinateSystem; + var opacityMap = { + normal: seriesModel.get(['lineStyle', 'opacity']), + active: seriesModel.get('activeOpacity'), + inactive: seriesModel.get('inactiveOpacity') + }; + return { + progress: function (params, data) { + coordSys.eachActiveState(data, function (activeState, dataIndex) { + var opacity = opacityMap[activeState]; + + if (activeState === 'normal' && data.hasItemOption) { + var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath$1, true); + itemOpacity != null && (opacity = itemOpacity); + } + + var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style'); + existsStyle.opacity = opacity; + }, params.start, params.end); + } + }; + } + }; + + function parallelPreprocessor(option) { + createParallelIfNeeded(option); + mergeAxisOptionFromParallel(option); + } + + /** + * Create a parallel coordinate if not exists. + * @inner + */ + + function createParallelIfNeeded(option) { + if (option.parallel) { + return; + } + + var hasParallelSeries = false; + each(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'parallel') { + hasParallelSeries = true; + } + }); + + if (hasParallelSeries) { + option.parallel = [{}]; + } + } + + /** + * Merge aixs definition from parallel option (if exists) to axis option. + * @inner + */ + + + function mergeAxisOptionFromParallel(option) { + var axes = normalizeToArray(option.parallelAxis); + each(axes, function (axisOption) { + if (!isObject(axisOption)) { + return; + } + + var parallelIndex = axisOption.parallelIndex || 0; + var parallelOption = normalizeToArray(option.parallel)[parallelIndex]; + + if (parallelOption && parallelOption.parallelAxisDefault) { + merge(axisOption, parallelOption.parallelAxisDefault, false); + } + }); + } + + var CLICK_THRESHOLD = 5; // > 4 + + var ParallelView$1 = + /** @class */ + function (_super) { + __extends(ParallelView, _super); + + function ParallelView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelView.type; + return _this; + } + + ParallelView.prototype.render = function (parallelModel, ecModel, api) { + this._model = parallelModel; + this._api = api; + + if (!this._handlers) { + this._handlers = {}; + each(handlers, function (handler, eventName) { + api.getZr().on(eventName, this._handlers[eventName] = bind(handler, this)); + }, this); + } + + createOrUpdate(this, '_throttledDispatchExpand', parallelModel.get('axisExpandRate'), 'fixRate'); + }; + + ParallelView.prototype.dispose = function (ecModel, api) { + clear(this, '_throttledDispatchExpand'); + each(this._handlers, function (handler, eventName) { + api.getZr().off(eventName, handler); + }); + this._handlers = null; + }; + /** + * @internal + * @param {Object} [opt] If null, cancle the last action triggering for debounce. + */ + + + ParallelView.prototype._throttledDispatchExpand = function (opt) { + this._dispatchExpand(opt); + }; + /** + * @internal + */ + + + ParallelView.prototype._dispatchExpand = function (opt) { + opt && this._api.dispatchAction(extend({ + type: 'parallelAxisExpand' + }, opt)); + }; + + ParallelView.type = 'parallel'; + return ParallelView; + }(ComponentView); + + var handlers = { + mousedown: function (e) { + if (checkTrigger(this, 'click')) { + this._mouseDownPoint = [e.offsetX, e.offsetY]; + } + }, + mouseup: function (e) { + var mouseDownPoint = this._mouseDownPoint; + + if (checkTrigger(this, 'click') && mouseDownPoint) { + var point = [e.offsetX, e.offsetY]; + var dist = Math.pow(mouseDownPoint[0] - point[0], 2) + Math.pow(mouseDownPoint[1] - point[1], 2); + + if (dist > CLICK_THRESHOLD) { + return; + } + + var result = this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); + + result.behavior !== 'none' && this._dispatchExpand({ + axisExpandWindow: result.axisExpandWindow + }); + } + + this._mouseDownPoint = null; + }, + mousemove: function (e) { + // Should do nothing when brushing. + if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) { + return; + } + + var model = this._model; + var result = model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]); + var behavior = result.behavior; + behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce')); + + this._throttledDispatchExpand(behavior === 'none' ? null // Cancle the last trigger, in case that mouse slide out of the area quickly. + : { + axisExpandWindow: result.axisExpandWindow, + // Jumping uses animation, and sliding suppresses animation. + animation: behavior === 'jump' ? null : { + duration: 0 // Disable animation. + + } + }); + } + }; + + function checkTrigger(view, triggerOn) { + var model = view._model; + return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn; + } + + var ParallelModel = + /** @class */ + function (_super) { + __extends(ParallelModel, _super); + + function ParallelModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelModel.type; + return _this; + } + + ParallelModel.prototype.init = function () { + _super.prototype.init.apply(this, arguments); + + this.mergeOption({}); + }; + + ParallelModel.prototype.mergeOption = function (newOption) { + var thisOption = this.option; + newOption && merge(thisOption, newOption, true); + + this._initDimensions(); + }; + /** + * Whether series or axis is in this coordinate system. + */ + + + ParallelModel.prototype.contains = function (model, ecModel) { + var parallelIndex = model.get('parallelIndex'); + return parallelIndex != null && ecModel.getComponent('parallel', parallelIndex) === this; + }; + + ParallelModel.prototype.setAxisExpand = function (opt) { + each(['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'], function (name) { + if (opt.hasOwnProperty(name)) { + // @ts-ignore FIXME: why "never" inferred in this.option[name]? + this.option[name] = opt[name]; + } + }, this); + }; + + ParallelModel.prototype._initDimensions = function () { + var dimensions = this.dimensions = []; + var parallelAxisIndex = this.parallelAxisIndex = []; + var axisModels = filter(this.ecModel.queryComponents({ + mainType: 'parallelAxis' + }), function (axisModel) { + // Can not use this.contains here, because + // initialization has not been completed yet. + return (axisModel.get('parallelIndex') || 0) === this.componentIndex; + }, this); + each(axisModels, function (axisModel) { + dimensions.push('dim' + axisModel.get('dim')); + parallelAxisIndex.push(axisModel.componentIndex); + }); + }; + + ParallelModel.type = 'parallel'; + ParallelModel.dependencies = ['parallelAxis']; + ParallelModel.layoutMode = 'box'; + ParallelModel.defaultOption = { + // zlevel: 0, + z: 0, + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + layout: 'horizontal', + // FIXME + // naming? + axisExpandable: false, + axisExpandCenter: null, + axisExpandCount: 0, + axisExpandWidth: 50, + axisExpandRate: 17, + axisExpandDebounce: 50, + // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full. + // Do not doc to user until necessary. + axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4], + axisExpandTriggerOn: 'click', + parallelAxisDefault: null + }; + return ParallelModel; + }(ComponentModel); + + var ParallelAxis = + /** @class */ + function (_super) { + __extends(ParallelAxis, _super); + + function ParallelAxis(dim, scale, coordExtent, axisType, axisIndex) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + _this.axisIndex = axisIndex; + return _this; + } + + ParallelAxis.prototype.isHorizontal = function () { + return this.coordinateSystem.getModel().get('layout') !== 'horizontal'; + }; + + return ParallelAxis; + }(Axis); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /** + * Calculate slider move result. + * Usage: + * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as + * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`. + * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`. + * + * @param delta Move length. + * @param handleEnds handleEnds[0] can be bigger then handleEnds[1]. + * handleEnds will be modified in this method. + * @param extent handleEnds is restricted by extent. + * extent[0] should less or equals than extent[1]. + * @param handleIndex Can be 'all', means that both move the two handleEnds. + * @param minSpan The range of dataZoom can not be smaller than that. + * If not set, handle0 and cross handle1. If set as a non-negative + * number (including `0`), handles will push each other when reaching + * the minSpan. + * @param maxSpan The range of dataZoom can not be larger than that. + * @return The input handleEnds. + */ + function sliderMove(delta, handleEnds, extent, handleIndex, minSpan, maxSpan) { + delta = delta || 0; + var extentSpan = extent[1] - extent[0]; // Notice maxSpan and minSpan can be null/undefined. + + if (minSpan != null) { + minSpan = restrict(minSpan, [0, extentSpan]); + } + + if (maxSpan != null) { + maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0); + } + + if (handleIndex === 'all') { + var handleSpan = Math.abs(handleEnds[1] - handleEnds[0]); + handleSpan = restrict(handleSpan, [0, extentSpan]); + minSpan = maxSpan = restrict(handleSpan, [minSpan, maxSpan]); + handleIndex = 0; + } + + handleEnds[0] = restrict(handleEnds[0], extent); + handleEnds[1] = restrict(handleEnds[1], extent); + var originalDistSign = getSpanSign(handleEnds, handleIndex); + handleEnds[handleIndex] += delta; // Restrict in extent. + + var extentMinSpan = minSpan || 0; + var realExtent = extent.slice(); + originalDistSign.sign < 0 ? realExtent[0] += extentMinSpan : realExtent[1] -= extentMinSpan; + handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent); // Expand span. + + var currDistSign; + currDistSign = getSpanSign(handleEnds, handleIndex); + + if (minSpan != null && (currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan)) { + // If minSpan exists, 'cross' is forbidden. + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan; + } // Shrink span. + + + currDistSign = getSpanSign(handleEnds, handleIndex); + + if (maxSpan != null && currDistSign.span > maxSpan) { + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan; + } + + return handleEnds; + } + + function getSpanSign(handleEnds, handleIndex) { + var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex]; // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0] + // is at left of handleEnds[1] for non-cross case. + + return { + span: Math.abs(dist), + sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1 + }; + } + + function restrict(value, extend) { + return Math.min(extend[1] != null ? extend[1] : Infinity, Math.max(extend[0] != null ? extend[0] : -Infinity, value)); + } + + var each$5 = each; + var mathMin$8 = Math.min; + var mathMax$8 = Math.max; + var mathFloor$1 = Math.floor; + var mathCeil$1 = Math.ceil; + var round$3 = round; + var PI$7 = Math.PI; + + var Parallel = + /** @class */ + function () { + function Parallel(parallelModel, ecModel, api) { + this.type = 'parallel'; + /** + * key: dimension + */ + + this._axesMap = createHashMap(); + /** + * key: dimension + * value: {position: [], rotation, } + */ + + this._axesLayout = {}; + this.dimensions = parallelModel.dimensions; + this._model = parallelModel; + + this._init(parallelModel, ecModel, api); + } + + Parallel.prototype._init = function (parallelModel, ecModel, api) { + var dimensions = parallelModel.dimensions; + var parallelAxisIndex = parallelModel.parallelAxisIndex; + each$5(dimensions, function (dim, idx) { + var axisIndex = parallelAxisIndex[idx]; + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + + var axis = this._axesMap.set(dim, new ParallelAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisIndex)); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); // Injection + + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = axisModel.coordinateSystem = this; + }, this); + }; + /** + * Update axis scale after data processed + */ + + + Parallel.prototype.update = function (ecModel, api) { + this._updateAxesFromSeries(this._model, ecModel); + }; + + Parallel.prototype.containPoint = function (point) { + var layoutInfo = this._makeLayoutInfo(); + + var axisBase = layoutInfo.axisBase; + var layoutBase = layoutInfo.layoutBase; + var pixelDimIndex = layoutInfo.pixelDimIndex; + var pAxis = point[1 - pixelDimIndex]; + var pLayout = point[pixelDimIndex]; + return pAxis >= axisBase && pAxis <= axisBase + layoutInfo.axisLength && pLayout >= layoutBase && pLayout <= layoutBase + layoutInfo.layoutLength; + }; + + Parallel.prototype.getModel = function () { + return this._model; + }; + /** + * Update properties from series + */ + + + Parallel.prototype._updateAxesFromSeries = function (parallelModel, ecModel) { + ecModel.eachSeries(function (seriesModel) { + if (!parallelModel.contains(seriesModel, ecModel)) { + return; + } + + var data = seriesModel.getData(); + each$5(this.dimensions, function (dim) { + var axis = this._axesMap.get(dim); + + axis.scale.unionExtentFromData(data, data.mapDimension(dim)); + niceScaleExtent(axis.scale, axis.model); + }, this); + }, this); + }; + /** + * Resize the parallel coordinate system. + */ + + + Parallel.prototype.resize = function (parallelModel, api) { + this._rect = getLayoutRect(parallelModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + + this._layoutAxes(); + }; + + Parallel.prototype.getRect = function () { + return this._rect; + }; + + Parallel.prototype._makeLayoutInfo = function () { + var parallelModel = this._model; + var rect = this._rect; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + var layout = parallelModel.get('layout'); + var pixelDimIndex = layout === 'horizontal' ? 0 : 1; + var layoutLength = rect[wh[pixelDimIndex]]; + var layoutExtent = [0, layoutLength]; + var axisCount = this.dimensions.length; + var axisExpandWidth = restrict$1(parallelModel.get('axisExpandWidth'), layoutExtent); + var axisExpandCount = restrict$1(parallelModel.get('axisExpandCount') || 0, [0, axisCount]); + var axisExpandable = parallelModel.get('axisExpandable') && axisCount > 3 && axisCount > axisExpandCount && axisExpandCount > 1 && axisExpandWidth > 0 && layoutLength > 0; // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength], + // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow), + // where collapsed axes should be overlapped. + + var axisExpandWindow = parallelModel.get('axisExpandWindow'); + var winSize; + + if (!axisExpandWindow) { + winSize = restrict$1(axisExpandWidth * (axisExpandCount - 1), layoutExtent); + var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor$1(axisCount / 2); + axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2]; + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } else { + winSize = restrict$1(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent); + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } + + var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount); // Avoid axisCollapseWidth is too small. + + axisCollapseWidth < 3 && (axisCollapseWidth = 0); // Find the first and last indices > ewin[0] and < ewin[1]. + + var winInnerIndices = [mathFloor$1(round$3(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, mathCeil$1(round$3(axisExpandWindow[1] / axisExpandWidth, 1)) - 1]; // Pos in ec coordinates. + + var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0]; + return { + layout: layout, + pixelDimIndex: pixelDimIndex, + layoutBase: rect[xy[pixelDimIndex]], + layoutLength: layoutLength, + axisBase: rect[xy[1 - pixelDimIndex]], + axisLength: rect[wh[1 - pixelDimIndex]], + axisExpandable: axisExpandable, + axisExpandWidth: axisExpandWidth, + axisCollapseWidth: axisCollapseWidth, + axisExpandWindow: axisExpandWindow, + axisCount: axisCount, + winInnerIndices: winInnerIndices, + axisExpandWindow0Pos: axisExpandWindow0Pos + }; + }; + + Parallel.prototype._layoutAxes = function () { + var rect = this._rect; + var axes = this._axesMap; + var dimensions = this.dimensions; + + var layoutInfo = this._makeLayoutInfo(); + + var layout = layoutInfo.layout; + axes.each(function (axis) { + var axisExtent = [0, layoutInfo.axisLength]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(axisExtent[idx], axisExtent[1 - idx]); + }); + each$5(dimensions, function (dim, idx) { + var posInfo = (layoutInfo.axisExpandable ? layoutAxisWithExpand : layoutAxisWithoutExpand)(idx, layoutInfo); + var positionTable = { + horizontal: { + x: posInfo.position, + y: layoutInfo.axisLength + }, + vertical: { + x: 0, + y: posInfo.position + } + }; + var rotationTable = { + horizontal: PI$7 / 2, + vertical: 0 + }; + var position = [positionTable[layout].x + rect.x, positionTable[layout].y + rect.y]; + var rotation = rotationTable[layout]; + var transform = create$1(); + rotate(transform, transform, rotation); + translate(transform, transform, position); // TODO + // tick layout info + // TODO + // update dimensions info based on axis order. + + this._axesLayout[dim] = { + position: position, + rotation: rotation, + transform: transform, + axisNameAvailableWidth: posInfo.axisNameAvailableWidth, + axisLabelShow: posInfo.axisLabelShow, + nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth, + tickDirection: 1, + labelDirection: 1 + }; + }, this); + }; + /** + * Get axis by dim. + */ + + + Parallel.prototype.getAxis = function (dim) { + return this._axesMap.get(dim); + }; + /** + * Convert a dim value of a single item of series data to Point. + */ + + + Parallel.prototype.dataToPoint = function (value, dim) { + return this.axisCoordToPoint(this._axesMap.get(dim).dataToCoord(value), dim); + }; + /** + * Travel data for one time, get activeState of each data item. + * @param start the start dataIndex that travel from. + * @param end the next dataIndex of the last dataIndex will be travel. + */ + + + Parallel.prototype.eachActiveState = function (data, callback, start, end) { + start == null && (start = 0); + end == null && (end = data.count()); + var axesMap = this._axesMap; + var dimensions = this.dimensions; + var dataDimensions = []; + var axisModels = []; + each(dimensions, function (axisDim) { + dataDimensions.push(data.mapDimension(axisDim)); + axisModels.push(axesMap.get(axisDim).model); + }); + var hasActiveSet = this.hasAxisBrushed(); + + for (var dataIndex = start; dataIndex < end; dataIndex++) { + var activeState = void 0; + + if (!hasActiveSet) { + activeState = 'normal'; + } else { + activeState = 'active'; + var values = data.getValues(dataDimensions, dataIndex); + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + var state = axisModels[j].getActiveState(values[j]); + + if (state === 'inactive') { + activeState = 'inactive'; + break; + } + } + } + + callback(activeState, dataIndex); + } + }; + /** + * Whether has any activeSet. + */ + + + Parallel.prototype.hasAxisBrushed = function () { + var dimensions = this.dimensions; + var axesMap = this._axesMap; + var hasActiveSet = false; + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') { + hasActiveSet = true; + } + } + + return hasActiveSet; + }; + /** + * Convert coords of each axis to Point. + * Return point. For example: [10, 20] + */ + + + Parallel.prototype.axisCoordToPoint = function (coord, dim) { + var axisLayout = this._axesLayout[dim]; + return applyTransform$1([coord, 0], axisLayout.transform); + }; + /** + * Get axis layout. + */ + + + Parallel.prototype.getAxisLayout = function (dim) { + return clone(this._axesLayout[dim]); + }; + /** + * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}. + */ + + + Parallel.prototype.getSlidedAxisExpandWindow = function (point) { + var layoutInfo = this._makeLayoutInfo(); + + var pixelDimIndex = layoutInfo.pixelDimIndex; + var axisExpandWindow = layoutInfo.axisExpandWindow.slice(); + var winSize = axisExpandWindow[1] - axisExpandWindow[0]; + var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)]; // Out of the area of coordinate system. + + if (!this.containPoint(point)) { + return { + behavior: 'none', + axisExpandWindow: axisExpandWindow + }; + } // Conver the point from global to expand coordinates. + + + var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos; // For dragging operation convenience, the window should not be + // slided when mouse is the center area of the window. + + var delta; + var behavior = 'slide'; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + + var triggerArea = this._model.get('axisExpandSlideTriggerArea'); // But consider touch device, jump is necessary. + + + var useJump = triggerArea[0] != null; + + if (axisCollapseWidth) { + if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) { + behavior = 'jump'; + delta = pointCoord - winSize * triggerArea[2]; + } else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) { + behavior = 'jump'; + delta = pointCoord - winSize * (1 - triggerArea[2]); + } else { + (delta = pointCoord - winSize * triggerArea[1]) >= 0 && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 && (delta = 0); + } + + delta *= layoutInfo.axisExpandWidth / axisCollapseWidth; + delta ? sliderMove(delta, axisExpandWindow, extent, 'all') // Avoid nonsense triger on mousemove. + : behavior = 'none'; + } // When screen is too narrow, make it visible and slidable, although it is hard to interact. + else { + var winSize2 = axisExpandWindow[1] - axisExpandWindow[0]; + var pos = extent[1] * pointCoord / winSize2; + axisExpandWindow = [mathMax$8(0, pos - winSize2 / 2)]; + axisExpandWindow[1] = mathMin$8(extent[1], axisExpandWindow[0] + winSize2); + axisExpandWindow[0] = axisExpandWindow[1] - winSize2; + } + + return { + axisExpandWindow: axisExpandWindow, + behavior: behavior + }; + }; + + return Parallel; + }(); + + function restrict$1(len, extent) { + return mathMin$8(mathMax$8(len, extent[0]), extent[1]); + } + + function layoutAxisWithoutExpand(axisIndex, layoutInfo) { + var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1); + return { + position: step * axisIndex, + axisNameAvailableWidth: step, + axisLabelShow: true + }; + } + + function layoutAxisWithExpand(axisIndex, layoutInfo) { + var layoutLength = layoutInfo.layoutLength; + var axisExpandWidth = layoutInfo.axisExpandWidth; + var axisCount = layoutInfo.axisCount; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + var winInnerIndices = layoutInfo.winInnerIndices; + var position; + var axisNameAvailableWidth = axisCollapseWidth; + var axisLabelShow = false; + var nameTruncateMaxWidth; + + if (axisIndex < winInnerIndices[0]) { + position = axisIndex * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } else if (axisIndex <= winInnerIndices[1]) { + position = layoutInfo.axisExpandWindow0Pos + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0]; + axisNameAvailableWidth = axisExpandWidth; + axisLabelShow = true; + } else { + position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } + + return { + position: position, + axisNameAvailableWidth: axisNameAvailableWidth, + axisLabelShow: axisLabelShow, + nameTruncateMaxWidth: nameTruncateMaxWidth + }; + } + + function createParallelCoordSys(ecModel, api) { + var coordSysList = []; + ecModel.eachComponent('parallel', function (parallelModel, idx) { + var coordSys = new Parallel(parallelModel, ecModel, api); + coordSys.name = 'parallel_' + idx; + coordSys.resize(parallelModel, api); + parallelModel.coordinateSystem = coordSys; + coordSys.model = parallelModel; + coordSysList.push(coordSys); + }); // Inject the coordinateSystems into seriesModel + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'parallel') { + var parallelModel = seriesModel.getReferringComponents('parallel', SINGLE_REFERRING).models[0]; + seriesModel.coordinateSystem = parallelModel.coordinateSystem; + } + }); + return coordSysList; + } + + var parallelCoordSysCreator = { + create: createParallelCoordSys + }; + + var ParallelAxisModel = + /** @class */ + function (_super) { + __extends(ParallelAxisModel, _super); + + function ParallelAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelAxisModel.type; + /** + * @readOnly + */ + + _this.activeIntervals = []; + return _this; + } + + ParallelAxisModel.prototype.getAreaSelectStyle = function () { + return makeStyleMapper([['fill', 'color'], ['lineWidth', 'borderWidth'], ['stroke', 'borderColor'], ['width', 'width'], ['opacity', 'opacity'] // Option decal is in `DecalObject` but style.decal is in `PatternObject`. + // So do not transfer decal directly. + ])(this.getModel('areaSelectStyle')); + }; + /** + * The code of this feature is put on AxisModel but not ParallelAxis, + * because axisModel can be alive after echarts updating but instance of + * ParallelAxis having been disposed. this._activeInterval should be kept + * when action dispatched (i.e. legend click). + * + * @param intervals `interval.length === 0` means set all active. + */ + + + ParallelAxisModel.prototype.setActiveIntervals = function (intervals) { + var activeIntervals = this.activeIntervals = clone(intervals); // Normalize + + if (activeIntervals) { + for (var i = activeIntervals.length - 1; i >= 0; i--) { + asc(activeIntervals[i]); + } + } + }; + /** + * @param value When only attempting detect whether 'no activeIntervals set', + * `value` is not needed to be input. + */ + + + ParallelAxisModel.prototype.getActiveState = function (value) { + var activeIntervals = this.activeIntervals; + + if (!activeIntervals.length) { + return 'normal'; + } + + if (value == null || isNaN(+value)) { + return 'inactive'; + } // Simple optimization + + + if (activeIntervals.length === 1) { + var interval = activeIntervals[0]; + + if (interval[0] <= value && value <= interval[1]) { + return 'active'; + } + } else { + for (var i = 0, len = activeIntervals.length; i < len; i++) { + if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) { + return 'active'; + } + } + } + + return 'inactive'; + }; + + return ParallelAxisModel; + }(ComponentModel); + + mixin(ParallelAxisModel, AxisModelCommonMixin); + + var BRUSH_PANEL_GLOBAL = true; + var mathMin$9 = Math.min; + var mathMax$9 = Math.max; + var mathPow$2 = Math.pow; + var COVER_Z = 10000; + var UNSELECT_THRESHOLD = 6; + var MIN_RESIZE_LINE_WIDTH = 6; + var MUTEX_RESOURCE_KEY = 'globalPan'; + var DIRECTION_MAP = { + w: [0, 0], + e: [0, 1], + n: [1, 0], + s: [1, 1] + }; + var CURSOR_MAP = { + w: 'ew', + e: 'ew', + n: 'ns', + s: 'ns', + ne: 'nesw', + sw: 'nesw', + nw: 'nwse', + se: 'nwse' + }; + var DEFAULT_BRUSH_OPT = { + brushStyle: { + lineWidth: 2, + stroke: 'rgba(210,219,238,0.3)', + fill: '#D2DBEE' + }, + transformable: true, + brushMode: 'single', + removeOnClick: false + }; + var baseUID = 0; + /** + * params: + * areas: Array., coord relates to container group, + * If no container specified, to global. + * opt { + * isEnd: boolean, + * removeOnClick: boolean + * } + */ + + var BrushController = + /** @class */ + function (_super) { + __extends(BrushController, _super); + + function BrushController(zr) { + var _this = _super.call(this) || this; + /** + * @internal + */ + + + _this._track = []; + /** + * @internal + */ + + _this._covers = []; + _this._handlers = {}; + + if ("development" !== 'production') { + assert(zr); + } + + _this._zr = zr; + _this.group = new Group(); + _this._uid = 'brushController_' + baseUID++; + each(pointerHandlers, function (handler, eventName) { + this._handlers[eventName] = bind(handler, this); + }, _this); + return _this; + } + + /** + * If set to `false`, select disabled. + */ + + + BrushController.prototype.enableBrush = function (brushOption) { + if ("development" !== 'production') { + assert(this._mounted); + } + + this._brushType && this._doDisableBrush(); + brushOption.brushType && this._doEnableBrush(brushOption); + return this; + }; + + BrushController.prototype._doEnableBrush = function (brushOption) { + var zr = this._zr; // Consider roam, which takes globalPan too. + + if (!this._enableGlobalPan) { + take(zr, MUTEX_RESOURCE_KEY, this._uid); + } + + each(this._handlers, function (handler, eventName) { + zr.on(eventName, handler); + }); + this._brushType = brushOption.brushType; + this._brushOption = merge(clone(DEFAULT_BRUSH_OPT), brushOption, true); + }; + + BrushController.prototype._doDisableBrush = function () { + var zr = this._zr; + release(zr, MUTEX_RESOURCE_KEY, this._uid); + each(this._handlers, function (handler, eventName) { + zr.off(eventName, handler); + }); + this._brushType = this._brushOption = null; + }; + /** + * @param panelOpts If not pass, it is global brush. + */ + + + BrushController.prototype.setPanels = function (panelOpts) { + if (panelOpts && panelOpts.length) { + var panels_1 = this._panels = {}; + each(panelOpts, function (panelOpts) { + panels_1[panelOpts.panelId] = clone(panelOpts); + }); + } else { + this._panels = null; + } + + return this; + }; + + BrushController.prototype.mount = function (opt) { + opt = opt || {}; + + if ("development" !== 'production') { + this._mounted = true; // should be at first. + } + + this._enableGlobalPan = opt.enableGlobalPan; + var thisGroup = this.group; + + this._zr.add(thisGroup); + + thisGroup.attr({ + x: opt.x || 0, + y: opt.y || 0, + rotation: opt.rotation || 0, + scaleX: opt.scaleX || 1, + scaleY: opt.scaleY || 1 + }); + this._transform = thisGroup.getLocalTransform(); + return this; + }; // eachCover(cb, context): void { + // each(this._covers, cb, context); + // } + + /** + * Update covers. + * @param coverConfigList + * If coverConfigList is null/undefined, all covers removed. + */ + + + BrushController.prototype.updateCovers = function (coverConfigList) { + if ("development" !== 'production') { + assert(this._mounted); + } + + coverConfigList = map(coverConfigList, function (coverConfig) { + return merge(clone(DEFAULT_BRUSH_OPT), coverConfig, true); + }); + var tmpIdPrefix = '\0-brush-index-'; + var oldCovers = this._covers; + var newCovers = this._covers = []; + var controller = this; + var creatingCover = this._creatingCover; + new DataDiffer(oldCovers, coverConfigList, oldGetKey, getKey).add(addOrUpdate).update(addOrUpdate).remove(remove).execute(); + return this; + + function getKey(brushOption, index) { + return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + '-' + brushOption.brushType; + } + + function oldGetKey(cover, index) { + return getKey(cover.__brushOption, index); + } + + function addOrUpdate(newIndex, oldIndex) { + var newBrushInternal = coverConfigList[newIndex]; // Consider setOption in event listener of brushSelect, + // where updating cover when creating should be forbiden. + + if (oldIndex != null && oldCovers[oldIndex] === creatingCover) { + newCovers[newIndex] = oldCovers[oldIndex]; + } else { + var cover = newCovers[newIndex] = oldIndex != null ? (oldCovers[oldIndex].__brushOption = newBrushInternal, oldCovers[oldIndex]) : endCreating(controller, createCover(controller, newBrushInternal)); + updateCoverAfterCreation(controller, cover); + } + } + + function remove(oldIndex) { + if (oldCovers[oldIndex] !== creatingCover) { + controller.group.remove(oldCovers[oldIndex]); + } + } + }; + + BrushController.prototype.unmount = function () { + if ("development" !== 'production') { + if (!this._mounted) { + return; + } + } + + this.enableBrush(false); // container may 'removeAll' outside. + + clearCovers(this); + + this._zr.remove(this.group); + + if ("development" !== 'production') { + this._mounted = false; // should be at last. + } + + return this; + }; + + BrushController.prototype.dispose = function () { + this.unmount(); + this.off(); + }; + + return BrushController; + }(Eventful); + + function createCover(controller, brushOption) { + var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption); + cover.__brushOption = brushOption; + updateZ(cover, brushOption); + controller.group.add(cover); + return cover; + } + + function endCreating(controller, creatingCover) { + var coverRenderer = getCoverRenderer(creatingCover); + + if (coverRenderer.endCreating) { + coverRenderer.endCreating(controller, creatingCover); + updateZ(creatingCover, creatingCover.__brushOption); + } + + return creatingCover; + } + + function updateCoverShape(controller, cover) { + var brushOption = cover.__brushOption; + getCoverRenderer(cover).updateCoverShape(controller, cover, brushOption.range, brushOption); + } + + function updateZ(cover, brushOption) { + var z = brushOption.z; + z == null && (z = COVER_Z); + cover.traverse(function (el) { + el.z = z; + el.z2 = z; // Consider in given container. + }); + } + + function updateCoverAfterCreation(controller, cover) { + getCoverRenderer(cover).updateCommon(controller, cover); + updateCoverShape(controller, cover); + } + + function getCoverRenderer(cover) { + return coverRenderers[cover.__brushOption.brushType]; + } // return target panel or `true` (means global panel) + + + function getPanelByPoint(controller, e, localCursorPoint) { + var panels = controller._panels; + + if (!panels) { + return BRUSH_PANEL_GLOBAL; // Global panel + } + + var panel; + var transform = controller._transform; + each(panels, function (pn) { + pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn); + }); + return panel; + } // Return a panel or true + + + function getPanelByCover(controller, cover) { + var panels = controller._panels; + + if (!panels) { + return BRUSH_PANEL_GLOBAL; // Global panel + } + + var panelId = cover.__brushOption.panelId; // User may give cover without coord sys info, + // which is then treated as global panel. + + return panelId != null ? panels[panelId] : BRUSH_PANEL_GLOBAL; + } + + function clearCovers(controller) { + var covers = controller._covers; + var originalLength = covers.length; + each(covers, function (cover) { + controller.group.remove(cover); + }, controller); + covers.length = 0; + return !!originalLength; + } + + function trigger$1(controller, opt) { + var areas = map(controller._covers, function (cover) { + var brushOption = cover.__brushOption; + var range = clone(brushOption.range); + return { + brushType: brushOption.brushType, + panelId: brushOption.panelId, + range: range + }; + }); + controller.trigger('brush', { + areas: areas, + isEnd: !!opt.isEnd, + removeOnClick: !!opt.removeOnClick + }); + } + + function shouldShowCover(controller) { + var track = controller._track; + + if (!track.length) { + return false; + } + + var p2 = track[track.length - 1]; + var p1 = track[0]; + var dx = p2[0] - p1[0]; + var dy = p2[1] - p1[1]; + var dist = mathPow$2(dx * dx + dy * dy, 0.5); + return dist > UNSELECT_THRESHOLD; + } + + function getTrackEnds(track) { + var tail = track.length - 1; + tail < 0 && (tail = 0); + return [track[0], track[tail]]; + } + + function createBaseRectCover(rectRangeConverter, controller, brushOption, edgeNameSequences) { + var cover = new Group(); + cover.add(new Rect({ + name: 'main', + style: makeStyle(brushOption), + silent: true, + draggable: true, + cursor: 'move', + drift: curry(driftRect, rectRangeConverter, controller, cover, ['n', 's', 'w', 'e']), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + each(edgeNameSequences, function (nameSequence) { + cover.add(new Rect({ + name: nameSequence.join(''), + style: { + opacity: 0 + }, + draggable: true, + silent: true, + invisible: true, + drift: curry(driftRect, rectRangeConverter, controller, cover, nameSequence), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + }); + return cover; + } + + function updateBaseRect(controller, cover, localRange, brushOption) { + var lineWidth = brushOption.brushStyle.lineWidth || 0; + var handleSize = mathMax$9(lineWidth, MIN_RESIZE_LINE_WIDTH); + var x = localRange[0][0]; + var y = localRange[1][0]; + var xa = x - lineWidth / 2; + var ya = y - lineWidth / 2; + var x2 = localRange[0][1]; + var y2 = localRange[1][1]; + var x2a = x2 - handleSize + lineWidth / 2; + var y2a = y2 - handleSize + lineWidth / 2; + var width = x2 - x; + var height = y2 - y; + var widtha = width + lineWidth; + var heighta = height + lineWidth; + updateRectShape(controller, cover, 'main', x, y, width, height); + + if (brushOption.transformable) { + updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta); + updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta); + updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize); + updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize); + updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize); + updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize); + } + } + + function updateCommon(controller, cover) { + var brushOption = cover.__brushOption; + var transformable = brushOption.transformable; + var mainEl = cover.childAt(0); + mainEl.useStyle(makeStyle(brushOption)); + mainEl.attr({ + silent: !transformable, + cursor: transformable ? 'move' : 'default' + }); + each([['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']], function (nameSequence) { + var el = cover.childOfName(nameSequence.join('')); + var globalDir = nameSequence.length === 1 ? getGlobalDirection1(controller, nameSequence[0]) : getGlobalDirection2(controller, nameSequence); + el && el.attr({ + silent: !transformable, + invisible: !transformable, + cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null + }); + }); + } + + function updateRectShape(controller, cover, name, x, y, w, h) { + var el = cover.childOfName(name); + el && el.setShape(pointsToRect(clipByPanel(controller, cover, [[x, y], [x + w, y + h]]))); + } + + function makeStyle(brushOption) { + return defaults({ + strokeNoScale: true + }, brushOption.brushStyle); + } + + function formatRectRange(x, y, x2, y2) { + var min = [mathMin$9(x, x2), mathMin$9(y, y2)]; + var max = [mathMax$9(x, x2), mathMax$9(y, y2)]; + return [[min[0], max[0]], [min[1], max[1]] // y range + ]; + } + + function getTransform$1(controller) { + return getTransform(controller.group); + } + + function getGlobalDirection1(controller, localDirName) { + var map = { + w: 'left', + e: 'right', + n: 'top', + s: 'bottom' + }; + var inverseMap = { + left: 'w', + right: 'e', + top: 'n', + bottom: 's' + }; + var dir = transformDirection(map[localDirName], getTransform$1(controller)); + return inverseMap[dir]; + } + + function getGlobalDirection2(controller, localDirNameSeq) { + var globalDir = [getGlobalDirection1(controller, localDirNameSeq[0]), getGlobalDirection1(controller, localDirNameSeq[1])]; + (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse(); + return globalDir.join(''); + } + + function driftRect(rectRangeConverter, controller, cover, dirNameSequence, dx, dy) { + var brushOption = cover.__brushOption; + var rectRange = rectRangeConverter.toRectRange(brushOption.range); + var localDelta = toLocalDelta(controller, dx, dy); + each(dirNameSequence, function (dirName) { + var ind = DIRECTION_MAP[dirName]; + rectRange[ind[0]][ind[1]] += localDelta[ind[0]]; + }); + brushOption.range = rectRangeConverter.fromRectRange(formatRectRange(rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1])); + updateCoverAfterCreation(controller, cover); + trigger$1(controller, { + isEnd: false + }); + } + + function driftPolygon(controller, cover, dx, dy) { + var range = cover.__brushOption.range; + var localDelta = toLocalDelta(controller, dx, dy); + each(range, function (point) { + point[0] += localDelta[0]; + point[1] += localDelta[1]; + }); + updateCoverAfterCreation(controller, cover); + trigger$1(controller, { + isEnd: false + }); + } + + function toLocalDelta(controller, dx, dy) { + var thisGroup = controller.group; + var localD = thisGroup.transformCoordToLocal(dx, dy); + var localZero = thisGroup.transformCoordToLocal(0, 0); + return [localD[0] - localZero[0], localD[1] - localZero[1]]; + } + + function clipByPanel(controller, cover, data) { + var panel = getPanelByCover(controller, cover); + return panel && panel !== BRUSH_PANEL_GLOBAL ? panel.clipPath(data, controller._transform) : clone(data); + } + + function pointsToRect(points) { + var xmin = mathMin$9(points[0][0], points[1][0]); + var ymin = mathMin$9(points[0][1], points[1][1]); + var xmax = mathMax$9(points[0][0], points[1][0]); + var ymax = mathMax$9(points[0][1], points[1][1]); + return { + x: xmin, + y: ymin, + width: xmax - xmin, + height: ymax - ymin + }; + } + + function resetCursor(controller, e, localCursorPoint) { + if ( // Check active + !controller._brushType // resetCursor should be always called when mouse is in zr area, + // but not called when mouse is out of zr area to avoid bad influence + // if `mousemove`, `mouseup` are triggered from `document` event. + || isOutsideZrArea(controller, e.offsetX, e.offsetY)) { + return; + } + + var zr = controller._zr; + var covers = controller._covers; + var currPanel = getPanelByPoint(controller, e, localCursorPoint); // Check whether in covers. + + if (!controller._dragging) { + for (var i = 0; i < covers.length; i++) { + var brushOption = covers[i].__brushOption; + + if (currPanel && (currPanel === BRUSH_PANEL_GLOBAL || brushOption.panelId === currPanel.panelId) && coverRenderers[brushOption.brushType].contain(covers[i], localCursorPoint[0], localCursorPoint[1])) { + // Use cursor style set on cover. + return; + } + } + } + + currPanel && zr.setCursorStyle('crosshair'); + } + + function preventDefault(e) { + var rawE = e.event; + rawE.preventDefault && rawE.preventDefault(); + } + + function mainShapeContain(cover, x, y) { + return cover.childOfName('main').contain(x, y); + } + + function updateCoverByMouse(controller, e, localCursorPoint, isEnd) { + var creatingCover = controller._creatingCover; + var panel = controller._creatingPanel; + var thisBrushOption = controller._brushOption; + var eventParams; + + controller._track.push(localCursorPoint.slice()); + + if (shouldShowCover(controller) || creatingCover) { + if (panel && !creatingCover) { + thisBrushOption.brushMode === 'single' && clearCovers(controller); + var brushOption = clone(thisBrushOption); + brushOption.brushType = determineBrushType(brushOption.brushType, panel); + brushOption.panelId = panel === BRUSH_PANEL_GLOBAL ? null : panel.panelId; + creatingCover = controller._creatingCover = createCover(controller, brushOption); + + controller._covers.push(creatingCover); + } + + if (creatingCover) { + var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)]; + var coverBrushOption = creatingCover.__brushOption; + coverBrushOption.range = coverRenderer.getCreatingRange(clipByPanel(controller, creatingCover, controller._track)); + + if (isEnd) { + endCreating(controller, creatingCover); + coverRenderer.updateCommon(controller, creatingCover); + } + + updateCoverShape(controller, creatingCover); + eventParams = { + isEnd: isEnd + }; + } + } else if (isEnd && thisBrushOption.brushMode === 'single' && thisBrushOption.removeOnClick) { + // Help user to remove covers easily, only by a tiny drag, in 'single' mode. + // But a single click do not clear covers, because user may have casual + // clicks (for example, click on other component and do not expect covers + // disappear). + // Only some cover removed, trigger action, but not every click trigger action. + if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) { + eventParams = { + isEnd: isEnd, + removeOnClick: true + }; + } + } + + return eventParams; + } + + function determineBrushType(brushType, panel) { + if (brushType === 'auto') { + if ("development" !== 'production') { + assert(panel && panel.defaultBrushType, 'MUST have defaultBrushType when brushType is "atuo"'); + } + + return panel.defaultBrushType; + } + + return brushType; + } + + var pointerHandlers = { + mousedown: function (e) { + if (this._dragging) { + // In case some browser do not support globalOut, + // and release mouse out side the browser. + handleDragEnd(this, e); + } else if (!e.target || !e.target.draggable) { + preventDefault(e); + var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY); + this._creatingCover = null; + var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint); + + if (panel) { + this._dragging = true; + this._track = [localCursorPoint.slice()]; + } + } + }, + mousemove: function (e) { + var x = e.offsetX; + var y = e.offsetY; + var localCursorPoint = this.group.transformCoordToLocal(x, y); + resetCursor(this, e, localCursorPoint); + + if (this._dragging) { + preventDefault(e); + var eventParams = updateCoverByMouse(this, e, localCursorPoint, false); + eventParams && trigger$1(this, eventParams); + } + }, + mouseup: function (e) { + handleDragEnd(this, e); + } + }; + + function handleDragEnd(controller, e) { + if (controller._dragging) { + preventDefault(e); + var x = e.offsetX; + var y = e.offsetY; + var localCursorPoint = controller.group.transformCoordToLocal(x, y); + var eventParams = updateCoverByMouse(controller, e, localCursorPoint, true); + controller._dragging = false; + controller._track = []; + controller._creatingCover = null; // trigger event shoule be at final, after procedure will be nested. + + eventParams && trigger$1(controller, eventParams); + } + } + + function isOutsideZrArea(controller, x, y) { + var zr = controller._zr; + return x < 0 || x > zr.getWidth() || y < 0 || y > zr.getHeight(); + } + + /** + * key: brushType + */ + + + var coverRenderers = { + lineX: getLineRenderer(0), + lineY: getLineRenderer(1), + rect: { + createCover: function (controller, brushOption) { + function returnInput(range) { + return range; + } + + return createBaseRectCover({ + toRectRange: returnInput, + fromRectRange: returnInput + }, controller, brushOption, [['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']]); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + updateBaseRect(controller, cover, localRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }, + polygon: { + createCover: function (controller, brushOption) { + var cover = new Group(); // Do not use graphic.Polygon because graphic.Polyline do not close the + // border of the shape when drawing, which is a better experience for user. + + cover.add(new Polyline({ + name: 'main', + style: makeStyle(brushOption), + silent: true + })); + return cover; + }, + getCreatingRange: function (localTrack) { + return localTrack; + }, + endCreating: function (controller, cover) { + cover.remove(cover.childAt(0)); // Use graphic.Polygon close the shape. + + cover.add(new Polygon({ + name: 'main', + draggable: true, + drift: curry(driftPolygon, controller, cover), + ondragend: curry(trigger$1, controller, { + isEnd: true + }) + })); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + cover.childAt(0).setShape({ + points: clipByPanel(controller, cover, localRange) + }); + }, + updateCommon: updateCommon, + contain: mainShapeContain + } + }; + + function getLineRenderer(xyIndex) { + return { + createCover: function (controller, brushOption) { + return createBaseRectCover({ + toRectRange: function (range) { + var rectRange = [range, [0, 100]]; + xyIndex && rectRange.reverse(); + return rectRange; + }, + fromRectRange: function (rectRange) { + return rectRange[xyIndex]; + } + }, controller, brushOption, [[['w'], ['e']], [['n'], ['s']]][xyIndex]); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + var min = mathMin$9(ends[0][xyIndex], ends[1][xyIndex]); + var max = mathMax$9(ends[0][xyIndex], ends[1][xyIndex]); + return [min, max]; + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + var otherExtent; // If brushWidth not specified, fit the panel. + + var panel = getPanelByCover(controller, cover); + + if (panel !== BRUSH_PANEL_GLOBAL && panel.getLinearBrushOtherExtent) { + otherExtent = panel.getLinearBrushOtherExtent(xyIndex); + } else { + var zr = controller._zr; + otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]]; + } + + var rectRange = [localRange, otherExtent]; + xyIndex && rectRange.reverse(); + updateBaseRect(controller, cover, rectRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }; + } + + function makeRectPanelClipPath(rect) { + rect = normalizeRect(rect); + return function (localPoints) { + return clipPointsByRect(localPoints, rect); + }; + } + + function makeLinearBrushOtherExtent(rect, specifiedXYIndex) { + rect = normalizeRect(rect); + return function (xyIndex) { + var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex; + var brushWidth = idx ? rect.width : rect.height; + var base = idx ? rect.x : rect.y; + return [base, base + (brushWidth || 0)]; + }; + } + + function makeRectIsTargetByCursor(rect, api, targetModel) { + var boundingRect = normalizeRect(rect); + return function (e, localCursorPoint) { + return boundingRect.contain(localCursorPoint[0], localCursorPoint[1]) && !onIrrelevantElement(e, api, targetModel); + }; + } // Consider width/height is negative. + + function normalizeRect(rect) { + return BoundingRect.create(rect); + } + + var elementList = ['axisLine', 'axisTickLabel', 'axisName']; + + var ParallelAxisView = + /** @class */ + function (_super) { + __extends(ParallelAxisView, _super); + + function ParallelAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ParallelAxisView.type; + return _this; + } + + ParallelAxisView.prototype.init = function (ecModel, api) { + _super.prototype.init.apply(this, arguments); + + (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)); + }; + + ParallelAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + if (fromAxisAreaSelect(axisModel, ecModel, payload)) { + return; + } + + this.axisModel = axisModel; + this.api = api; + this.group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var coordSysModel = getCoordSysModel(axisModel, ecModel); + var coordSys = coordSysModel.coordinateSystem; + var areaSelectStyle = axisModel.getAreaSelectStyle(); + var areaWidth = areaSelectStyle.width; + var dim = axisModel.axis.dim; + var axisLayout = coordSys.getAxisLayout(dim); + var builderOpt = extend({ + strokeContainThreshold: areaWidth + }, axisLayout); + var axisBuilder = new AxisBuilder(axisModel, builderOpt); + each(elementList, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api); + + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + }; // /** + // * @override + // */ + // updateVisual(axisModel, ecModel, api, payload) { + // this._brushController && this._brushController + // .updateCovers(getCoverInfoList(axisModel)); + // } + + + ParallelAxisView.prototype._refreshBrushController = function (builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api) { + // After filtering, axis may change, select area needs to be update. + var extent = axisModel.axis.getExtent(); + var extentLen = extent[1] - extent[0]; + var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value. + // width/height might be negative, which will be + // normalized in BoundingRect. + + var rect = BoundingRect.create({ + x: extent[0], + y: -areaWidth / 2, + width: extentLen, + height: areaWidth + }); + rect.x -= extra; + rect.width += 2 * extra; + + this._brushController.mount({ + enableGlobalPan: true, + rotation: builderOpt.rotation, + x: builderOpt.position[0], + y: builderOpt.position[1] + }).setPanels([{ + panelId: 'pl', + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect, 0) + }]).enableBrush({ + brushType: 'lineX', + brushStyle: areaSelectStyle, + removeOnClick: true + }).updateCovers(getCoverInfoList(axisModel)); + }; + + ParallelAxisView.prototype._onBrush = function (eventParam) { + var coverInfoList = eventParam.areas; // Do not cache these object, because the mey be changed. + + var axisModel = this.axisModel; + var axis = axisModel.axis; + var intervals = map(coverInfoList, function (coverInfo) { + return [axis.coordToData(coverInfo.range[0], true), axis.coordToData(coverInfo.range[1], true)]; + }); // If realtime is true, action is not dispatched on drag end, because + // the drag end emits the same params with the last drag move event, + // and may have some delay when using touch pad. + + if (!axisModel.option.realtime === eventParam.isEnd || eventParam.removeOnClick) { + // jshint ignore:line + this.api.dispatchAction({ + type: 'axisAreaSelect', + parallelAxisId: axisModel.id, + intervals: intervals + }); + } + }; + + ParallelAxisView.prototype.dispose = function () { + this._brushController.dispose(); + }; + + ParallelAxisView.type = 'parallelAxis'; + return ParallelAxisView; + }(ComponentView); + + function fromAxisAreaSelect(axisModel, ecModel, payload) { + return payload && payload.type === 'axisAreaSelect' && ecModel.findComponents({ + mainType: 'parallelAxis', + query: payload + })[0] === axisModel; + } + + function getCoverInfoList(axisModel) { + var axis = axisModel.axis; + return map(axisModel.activeIntervals, function (interval) { + return { + brushType: 'lineX', + panelId: 'pl', + range: [axis.dataToCoord(interval[0], true), axis.dataToCoord(interval[1], true)] + }; + }); + } + + function getCoordSysModel(axisModel, ecModel) { + return ecModel.getComponent('parallel', axisModel.get('parallelIndex')); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var actionInfo$1 = { + type: 'axisAreaSelect', + event: 'axisAreaSelected' // update: 'updateVisual' + + }; + + function installParallelActions(registers) { + registers.registerAction(actionInfo$1, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'parallelAxis', + query: payload + }, function (parallelAxisModel) { + parallelAxisModel.axis.model.setActiveIntervals(payload.intervals); + }); + }); + /** + * @payload + */ + + registers.registerAction('parallelAxisExpand', function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'parallel', + query: payload + }, function (parallelModel) { + parallelModel.setAxisExpand(payload); + }); + }); + } + + var defaultAxisOption = { + type: 'value', + areaSelectStyle: { + width: 20, + borderWidth: 1, + borderColor: 'rgba(160,197,232)', + color: 'rgba(160,197,232)', + opacity: 0.3 + }, + realtime: true, + z: 10 + }; + + function install$g(registers) { + registers.registerComponentView(ParallelView$1); + registers.registerComponentModel(ParallelModel); + registers.registerCoordinateSystem('parallel', parallelCoordSysCreator); + registers.registerPreprocessor(parallelPreprocessor); + registers.registerComponentModel(ParallelAxisModel); + registers.registerComponentView(ParallelAxisView); + axisModelCreator(registers, 'parallel', ParallelAxisModel, defaultAxisOption); + installParallelActions(registers); + } + + function install$h(registers) { + use(install$g); + registers.registerChartView(ParallelView); + registers.registerSeriesModel(ParallelSeriesModel); + registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, parallelVisual); + } + + var SankeyPathShape = + /** @class */ + function () { + function SankeyPathShape() { + this.x1 = 0; + this.y1 = 0; + this.x2 = 0; + this.y2 = 0; + this.cpx1 = 0; + this.cpy1 = 0; + this.cpx2 = 0; + this.cpy2 = 0; + this.extent = 0; + } + + return SankeyPathShape; + }(); + + var SankeyPath = + /** @class */ + function (_super) { + __extends(SankeyPath, _super); + + function SankeyPath(opts) { + return _super.call(this, opts) || this; + } + + SankeyPath.prototype.getDefaultShape = function () { + return new SankeyPathShape(); + }; + + SankeyPath.prototype.buildPath = function (ctx, shape) { + var extent = shape.extent; + ctx.moveTo(shape.x1, shape.y1); + ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2); + + if (shape.orient === 'vertical') { + ctx.lineTo(shape.x2 + extent, shape.y2); + ctx.bezierCurveTo(shape.cpx2 + extent, shape.cpy2, shape.cpx1 + extent, shape.cpy1, shape.x1 + extent, shape.y1); + } else { + ctx.lineTo(shape.x2, shape.y2 + extent); + ctx.bezierCurveTo(shape.cpx2, shape.cpy2 + extent, shape.cpx1, shape.cpy1 + extent, shape.x1, shape.y1 + extent); + } + + ctx.closePath(); + }; + + SankeyPath.prototype.highlight = function () { + enterEmphasis(this); + }; + + SankeyPath.prototype.downplay = function () { + leaveEmphasis(this); + }; + + return SankeyPath; + }(Path); + + var SankeyView = + /** @class */ + function (_super) { + __extends(SankeyView, _super); + + function SankeyView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SankeyView.type; + _this._focusAdjacencyDisabled = false; + return _this; + } + + SankeyView.prototype.render = function (seriesModel, ecModel, api) { + var sankeyView = this; + var graph = seriesModel.getGraph(); + var group = this.group; + var layoutInfo = seriesModel.layoutInfo; // view width + + var width = layoutInfo.width; // view height + + var height = layoutInfo.height; + var nodeData = seriesModel.getData(); + var edgeData = seriesModel.getData('edge'); + var orient = seriesModel.get('orient'); + this._model = seriesModel; + group.removeAll(); + group.x = layoutInfo.x; + group.y = layoutInfo.y; // generate a bezire Curve for each edge + + graph.eachEdge(function (edge) { + var curve = new SankeyPath(); + var ecData = getECData(curve); + ecData.dataIndex = edge.dataIndex; + ecData.seriesIndex = seriesModel.seriesIndex; + ecData.dataType = 'edge'; + var edgeModel = edge.getModel(); + var lineStyleModel = edgeModel.getModel('lineStyle'); + var curvature = lineStyleModel.get('curveness'); + var n1Layout = edge.node1.getLayout(); + var node1Model = edge.node1.getModel(); + var dragX1 = node1Model.get('localX'); + var dragY1 = node1Model.get('localY'); + var n2Layout = edge.node2.getLayout(); + var node2Model = edge.node2.getModel(); + var dragX2 = node2Model.get('localX'); + var dragY2 = node2Model.get('localY'); + var edgeLayout = edge.getLayout(); + var x1; + var y1; + var x2; + var y2; + var cpx1; + var cpy1; + var cpx2; + var cpy2; + curve.shape.extent = Math.max(1, edgeLayout.dy); + curve.shape.orient = orient; + + if (orient === 'vertical') { + x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + edgeLayout.sy; + y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + n1Layout.dy; + x2 = (dragX2 != null ? dragX2 * width : n2Layout.x) + edgeLayout.ty; + y2 = dragY2 != null ? dragY2 * height : n2Layout.y; + cpx1 = x1; + cpy1 = y1 * (1 - curvature) + y2 * curvature; + cpx2 = x2; + cpy2 = y1 * curvature + y2 * (1 - curvature); + } else { + x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx; + y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy; + x2 = dragX2 != null ? dragX2 * width : n2Layout.x; + y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty; + cpx1 = x1 * (1 - curvature) + x2 * curvature; + cpy1 = y1; + cpx2 = x1 * curvature + x2 * (1 - curvature); + cpy2 = y2; + } + + curve.setShape({ + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }); + curve.useStyle(lineStyleModel.getItemStyle()); // Special color, use source node color or target node color + + switch (curve.style.fill) { + case 'source': + curve.style.fill = edge.node1.getVisual('color'); + curve.style.decal = edge.node1.getVisual('style').decal; + break; + + case 'target': + curve.style.fill = edge.node2.getVisual('color'); + curve.style.decal = edge.node2.getVisual('style').decal; + break; + + case 'gradient': + var sourceColor = edge.node1.getVisual('color'); + var targetColor = edge.node2.getVisual('color'); + + if (isString(sourceColor) && isString(targetColor)) { + curve.style.fill = new LinearGradient(0, 0, +(orient === 'horizontal'), +(orient === 'vertical'), [{ + color: sourceColor, + offset: 0 + }, { + color: targetColor, + offset: 1 + }]); + } + + } + + var emphasisModel = edgeModel.getModel('emphasis'); + setStatesStylesFromModel(curve, edgeModel, 'lineStyle', function (model) { + return model.getItemStyle(); + }); + group.add(curve); + edgeData.setItemGraphicEl(edge.dataIndex, curve); + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(curve, focus === 'adjacency' ? edge.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + getECData(curve).dataType = 'edge'; + }); // Generate a rect for each node + + graph.eachNode(function (node) { + var layout = node.getLayout(); + var itemModel = node.getModel(); + var dragX = itemModel.get('localX'); + var dragY = itemModel.get('localY'); + var emphasisModel = itemModel.getModel('emphasis'); + var rect = new Rect({ + shape: { + x: dragX != null ? dragX * width : layout.x, + y: dragY != null ? dragY * height : layout.y, + width: layout.dx, + height: layout.dy + }, + style: itemModel.getModel('itemStyle').getItemStyle(), + z2: 10 + }); + setLabelStyle(rect, getLabelStatesModels(itemModel), { + labelFetcher: seriesModel, + labelDataIndex: node.dataIndex, + defaultText: node.id + }); + rect.disableLabelAnimation = true; + rect.setStyle('fill', node.getVisual('color')); + rect.setStyle('decal', node.getVisual('style').decal); + setStatesStylesFromModel(rect, itemModel); + group.add(rect); + nodeData.setItemGraphicEl(node.dataIndex, rect); + getECData(rect).dataType = 'node'; + var focus = emphasisModel.get('focus'); + toggleHoverEmphasis(rect, focus === 'adjacency' ? node.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }); + nodeData.eachItemGraphicEl(function (el, dataIndex) { + var itemModel = nodeData.getItemModel(dataIndex); + + if (itemModel.get('draggable')) { + el.drift = function (dx, dy) { + sankeyView._focusAdjacencyDisabled = true; + this.shape.x += dx; + this.shape.y += dy; + this.dirty(); + api.dispatchAction({ + type: 'dragNode', + seriesId: seriesModel.id, + dataIndex: nodeData.getRawIndex(dataIndex), + localX: this.shape.x / width, + localY: this.shape.y / height + }); + }; + + el.ondragend = function () { + sankeyView._focusAdjacencyDisabled = false; + }; + + el.draggable = true; + el.cursor = 'move'; + } + }); + + if (!this._data && seriesModel.isAnimationEnabled()) { + group.setClipPath(createGridClipShape$1(group.getBoundingRect(), seriesModel, function () { + group.removeClipPath(); + })); + } + + this._data = seriesModel.getData(); + }; + + SankeyView.prototype.dispose = function () { + }; + + SankeyView.type = 'sankey'; + return SankeyView; + }(ChartView); // Add animation to the view + + + function createGridClipShape$1(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + width: rect.width + 20 + } + }, seriesModel, cb); + return rectEl; + } + + var SankeySeriesModel = + /** @class */ + function (_super) { + __extends(SankeySeriesModel, _super); + + function SankeySeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SankeySeriesModel.type; + return _this; + } + + /** + * Init a graph data structure from data in option series + */ + + + SankeySeriesModel.prototype.getInitialData = function (option, ecModel) { + var links = option.edges || option.links; + var nodes = option.data || option.nodes; + var levels = option.levels; + this.levelModels = []; + var levelModels = this.levelModels; + + for (var i = 0; i < levels.length; i++) { + if (levels[i].depth != null && levels[i].depth >= 0) { + levelModels[levels[i].depth] = new Model(levels[i], this, ecModel); + } else { + if ("development" !== 'production') { + throw new Error('levels[i].depth is mandatory and should be natural number'); + } + } + } + + if (nodes && links) { + var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink); + return graph.data; + } + + function beforeLink(nodeData, edgeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var seriesModel = model.parentModel; + var layout = seriesModel.getData().getItemLayout(idx); + + if (layout) { + var nodeDepth = layout.depth; + var levelModel = seriesModel.levelModels[nodeDepth]; + + if (levelModel) { + model.parentModel = levelModel; + } + } + + return model; + }); + edgeData.wrapMethod('getItemModel', function (model, idx) { + var seriesModel = model.parentModel; + var edge = seriesModel.getGraph().getEdgeByIndex(idx); + var layout = edge.node1.getLayout(); + + if (layout) { + var depth = layout.depth; + var levelModel = seriesModel.levelModels[depth]; + + if (levelModel) { + model.parentModel = levelModel; + } + } + + return model; + }); + } + }; + + SankeySeriesModel.prototype.setNodePosition = function (dataIndex, localPosition) { + var nodes = this.option.data || this.option.nodes; + var dataItem = nodes[dataIndex]; + dataItem.localX = localPosition[0]; + dataItem.localY = localPosition[1]; + }; + /** + * Return the graphic data structure + * + * @return graphic data structure + */ + + + SankeySeriesModel.prototype.getGraph = function () { + return this.getData().graph; + }; + /** + * Get edge data of graphic data structure + * + * @return data structure of list + */ + + + SankeySeriesModel.prototype.getEdgeData = function () { + return this.getGraph().edgeData; + }; + + SankeySeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + function noValue(val) { + return isNaN(val) || val == null; + } // dataType === 'node' or empty do not show tooltip by default + + + if (dataType === 'edge') { + var params = this.getDataParams(dataIndex, dataType); + var rawDataOpt = params.data; + var edgeValue = params.value; + var edgeName = rawDataOpt.source + ' -- ' + rawDataOpt.target; + return createTooltipMarkup('nameValue', { + name: edgeName, + value: edgeValue, + noValue: noValue(edgeValue) + }); + } // dataType === 'node' + else { + var node = this.getGraph().getNodeByIndex(dataIndex); + var value = node.getLayout().value; + var name_1 = this.getDataParams(dataIndex, dataType).data.name; + return createTooltipMarkup('nameValue', { + name: name_1 != null ? name_1 + '' : null, + value: value, + noValue: noValue(value) + }); + } + }; + + SankeySeriesModel.prototype.optionUpdated = function () { + }; // Override Series.getDataParams() + + + SankeySeriesModel.prototype.getDataParams = function (dataIndex, dataType) { + var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); + + if (params.value == null && dataType === 'node') { + var node = this.getGraph().getNodeByIndex(dataIndex); + var nodeValue = node.getLayout().value; + params.value = nodeValue; + } + + return params; + }; + + SankeySeriesModel.type = 'series.sankey'; + SankeySeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'view', + left: '5%', + top: '5%', + right: '20%', + bottom: '5%', + orient: 'horizontal', + nodeWidth: 20, + nodeGap: 8, + draggable: true, + layoutIterations: 32, + label: { + show: true, + position: 'right', + fontSize: 12 + }, + levels: [], + nodeAlign: 'justify', + lineStyle: { + color: '#314656', + opacity: 0.2, + curveness: 0.5 + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + opacity: 0.5 + } + }, + select: { + itemStyle: { + borderColor: '#212121' + } + }, + animationEasing: 'linear', + animationDuration: 1000 + }; + return SankeySeriesModel; + }(SeriesModel); + + function sankeyLayout(ecModel, api) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var nodeWidth = seriesModel.get('nodeWidth'); + var nodeGap = seriesModel.get('nodeGap'); + var layoutInfo = getViewRect$4(seriesModel, api); + seriesModel.layoutInfo = layoutInfo; + var width = layoutInfo.width; + var height = layoutInfo.height; + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + var edges = graph.edges; + computeNodeValues(nodes); + var filteredNodes = filter(nodes, function (node) { + return node.getLayout().value === 0; + }); + var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations'); + var orient = seriesModel.get('orient'); + var nodeAlign = seriesModel.get('nodeAlign'); + layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign); + }); + } + + /** + * Get the layout position of the whole view + */ + + function getViewRect$4(seriesModel, api) { + return getLayoutRect(seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + } + + function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) { + computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign); + computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient); + computeEdgeDepths(nodes, orient); + } + + /** + * Compute the value of each node by summing the associated edge's value + */ + + + function computeNodeValues(nodes) { + each(nodes, function (node) { + var value1 = sum(node.outEdges, getEdgeValue); + var value2 = sum(node.inEdges, getEdgeValue); + var nodeRawValue = node.getValue() || 0; + var value = Math.max(value1, value2, nodeRawValue); + node.setLayout({ + value: value + }, true); + }); + } + + /** + * Compute the x-position for each node. + * + * Here we use Kahn algorithm to detect cycle when we traverse + * the node to computer the initial x position. + */ + + + function computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) { + // Used to mark whether the edge is deleted. if it is deleted, + // the value is 0, otherwise it is 1. + var remainEdges = []; // Storage each node's indegree. + + var indegreeArr = []; //Used to storage the node with indegree is equal to 0. + + var zeroIndegrees = []; + var nextTargetNode = []; + var x = 0; // let kx = 0; + + for (var i = 0; i < edges.length; i++) { + remainEdges[i] = 1; + } + + for (var i = 0; i < nodes.length; i++) { + indegreeArr[i] = nodes[i].inEdges.length; + + if (indegreeArr[i] === 0) { + zeroIndegrees.push(nodes[i]); + } + } + + var maxNodeDepth = -1; // Traversing nodes using topological sorting to calculate the + // horizontal(if orient === 'horizontal') or vertical(if orient === 'vertical') + // position of the nodes. + + while (zeroIndegrees.length) { + for (var idx = 0; idx < zeroIndegrees.length; idx++) { + var node = zeroIndegrees[idx]; + var item = node.hostGraph.data.getRawDataItem(node.dataIndex); + var isItemDepth = item.depth != null && item.depth >= 0; + + if (isItemDepth && item.depth > maxNodeDepth) { + maxNodeDepth = item.depth; + } + + node.setLayout({ + depth: isItemDepth ? item.depth : x + }, true); + orient === 'vertical' ? node.setLayout({ + dy: nodeWidth + }, true) : node.setLayout({ + dx: nodeWidth + }, true); + + for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) { + var edge = node.outEdges[edgeIdx]; + var indexEdge = edges.indexOf(edge); + remainEdges[indexEdge] = 0; + var targetNode = edge.node2; + var nodeIndex = nodes.indexOf(targetNode); + + if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) { + nextTargetNode.push(targetNode); + } + } + } + + ++x; + zeroIndegrees = nextTargetNode; + nextTargetNode = []; + } + + for (var i = 0; i < remainEdges.length; i++) { + if (remainEdges[i] === 1) { + throw new Error('Sankey is a DAG, the original data has cycle!'); + } + } + + var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1; + + if (nodeAlign && nodeAlign !== 'left') { + adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth); + } + + var kx = orient === 'vertical' ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth; + scaleNodeBreadths(nodes, kx, orient); + } + + function isNodeDepth(node) { + var item = node.hostGraph.data.getRawDataItem(node.dataIndex); + return item.depth != null && item.depth >= 0; + } + + function adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) { + if (nodeAlign === 'right') { + var nextSourceNode = []; + var remainNodes = nodes; + var nodeHeight = 0; + + while (remainNodes.length) { + for (var i = 0; i < remainNodes.length; i++) { + var node = remainNodes[i]; + node.setLayout({ + skNodeHeight: nodeHeight + }, true); + + for (var j = 0; j < node.inEdges.length; j++) { + var edge = node.inEdges[j]; + + if (nextSourceNode.indexOf(edge.node1) < 0) { + nextSourceNode.push(edge.node1); + } + } + } + + remainNodes = nextSourceNode; + nextSourceNode = []; + ++nodeHeight; + } + + each(nodes, function (node) { + if (!isNodeDepth(node)) { + node.setLayout({ + depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight) + }, true); + } + }); + } else if (nodeAlign === 'justify') { + moveSinksRight(nodes, maxDepth); + } + } + + /** + * All the node without outEgdes are assigned maximum x-position and + * be aligned in the last column. + * + * @param nodes. node of sankey view. + * @param maxDepth. use to assign to node without outEdges as x-position. + */ + + + function moveSinksRight(nodes, maxDepth) { + each(nodes, function (node) { + if (!isNodeDepth(node) && !node.outEdges.length) { + node.setLayout({ + depth: maxDepth + }, true); + } + }); + } + + /** + * Scale node x-position to the width + * + * @param nodes node of sankey view + * @param kx multiple used to scale nodes + */ + + + function scaleNodeBreadths(nodes, kx, orient) { + each(nodes, function (node) { + var nodeDepth = node.getLayout().depth * kx; + orient === 'vertical' ? node.setLayout({ + y: nodeDepth + }, true) : node.setLayout({ + x: nodeDepth + }, true); + }); + } + + /** + * Using Gauss-Seidel iterations method to compute the node depth(y-position) + * + * @param nodes node of sankey view + * @param edges edge of sankey view + * @param height the whole height of the area to draw the view + * @param nodeGap the vertical distance between two nodes + * in the same column. + * @param iterations the number of iterations for the algorithm + */ + + + function computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) { + var nodesByBreadth = prepareNodesByBreadth(nodes, orient); + initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + + for (var alpha = 1; iterations > 0; iterations--) { + // 0.99 is a experience parameter, ensure that each iterations of + // changes as small as possible. + alpha *= 0.99; + relaxRightToLeft(nodesByBreadth, alpha, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + relaxLeftToRight(nodesByBreadth, alpha, orient); + resolveCollisions(nodesByBreadth, nodeGap, height, width, orient); + } + } + + function prepareNodesByBreadth(nodes, orient) { + var nodesByBreadth = []; + var keyAttr = orient === 'vertical' ? 'y' : 'x'; + var groupResult = groupData(nodes, function (node) { + return node.getLayout()[keyAttr]; + }); + groupResult.keys.sort(function (a, b) { + return a - b; + }); + each(groupResult.keys, function (key) { + nodesByBreadth.push(groupResult.buckets.get(key)); + }); + return nodesByBreadth; + } + + /** + * Compute the original y-position for each node + */ + + + function initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) { + var minKy = Infinity; + each(nodesByBreadth, function (nodes) { + var n = nodes.length; + var sum = 0; + each(nodes, function (node) { + sum += node.getLayout().value; + }); + var ky = orient === 'vertical' ? (width - (n - 1) * nodeGap) / sum : (height - (n - 1) * nodeGap) / sum; + + if (ky < minKy) { + minKy = ky; + } + }); + each(nodesByBreadth, function (nodes) { + each(nodes, function (node, i) { + var nodeDy = node.getLayout().value * minKy; + + if (orient === 'vertical') { + node.setLayout({ + x: i + }, true); + node.setLayout({ + dx: nodeDy + }, true); + } else { + node.setLayout({ + y: i + }, true); + node.setLayout({ + dy: nodeDy + }, true); + } + }); + }); + each(edges, function (edge) { + var edgeDy = +edge.getValue() * minKy; + edge.setLayout({ + dy: edgeDy + }, true); + }); + } + + /** + * Resolve the collision of initialized depth (y-position) + */ + + + function resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) { + var keyAttr = orient === 'vertical' ? 'x' : 'y'; + each(nodesByBreadth, function (nodes) { + nodes.sort(function (a, b) { + return a.getLayout()[keyAttr] - b.getLayout()[keyAttr]; + }); + var nodeX; + var node; + var dy; + var y0 = 0; + var n = nodes.length; + var nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy'; + + for (var i = 0; i < n; i++) { + node = nodes[i]; + dy = y0 - node.getLayout()[keyAttr]; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] + dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + } + + y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap; + } + + var viewWidth = orient === 'vertical' ? width : height; // If the bottommost node goes outside the bounds, push it back up + + dy = y0 - nodeGap - viewWidth; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] - dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + y0 = nodeX; + + for (var i = n - 2; i >= 0; --i) { + node = nodes[i]; + dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0; + + if (dy > 0) { + nodeX = node.getLayout()[keyAttr] - dy; + orient === 'vertical' ? node.setLayout({ + x: nodeX + }, true) : node.setLayout({ + y: nodeX + }, true); + } + + y0 = node.getLayout()[keyAttr]; + } + } + }); + } + + /** + * Change the y-position of the nodes, except most the right side nodes + * @param nodesByBreadth + * @param alpha parameter used to adjust the nodes y-position + */ + + + function relaxRightToLeft(nodesByBreadth, alpha, orient) { + each(nodesByBreadth.slice().reverse(), function (nodes) { + each(nodes, function (node) { + if (node.outEdges.length) { + var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue); + + if (isNaN(y)) { + var len = node.outEdges.length; + y = len ? sum(node.outEdges, centerTarget, orient) / len : 0; + } + + if (orient === 'vertical') { + var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha; + node.setLayout({ + x: nodeX + }, true); + } else { + var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha; + node.setLayout({ + y: nodeY + }, true); + } + } + }); + }); + } + + function weightedTarget(edge, orient) { + return center$1(edge.node2, orient) * edge.getValue(); + } + + function centerTarget(edge, orient) { + return center$1(edge.node2, orient); + } + + function weightedSource(edge, orient) { + return center$1(edge.node1, orient) * edge.getValue(); + } + + function centerSource(edge, orient) { + return center$1(edge.node1, orient); + } + + function center$1(node, orient) { + return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2; + } + + function getEdgeValue(edge) { + return edge.getValue(); + } + + function sum(array, cb, orient) { + var sum = 0; + var len = array.length; + var i = -1; + + while (++i < len) { + var value = +cb(array[i], orient); + + if (!isNaN(value)) { + sum += value; + } + } + + return sum; + } + + /** + * Change the y-position of the nodes, except most the left side nodes + */ + + + function relaxLeftToRight(nodesByBreadth, alpha, orient) { + each(nodesByBreadth, function (nodes) { + each(nodes, function (node) { + if (node.inEdges.length) { + var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue); + + if (isNaN(y)) { + var len = node.inEdges.length; + y = len ? sum(node.inEdges, centerSource, orient) / len : 0; + } + + if (orient === 'vertical') { + var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha; + node.setLayout({ + x: nodeX + }, true); + } else { + var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha; + node.setLayout({ + y: nodeY + }, true); + } + } + }); + }); + } + + /** + * Compute the depth(y-position) of each edge + */ + + + function computeEdgeDepths(nodes, orient) { + var keyAttr = orient === 'vertical' ? 'x' : 'y'; + each(nodes, function (node) { + node.outEdges.sort(function (a, b) { + return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr]; + }); + node.inEdges.sort(function (a, b) { + return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr]; + }); + }); + each(nodes, function (node) { + var sy = 0; + var ty = 0; + each(node.outEdges, function (edge) { + edge.setLayout({ + sy: sy + }, true); + sy += edge.getLayout().dy; + }); + each(node.inEdges, function (edge) { + edge.setLayout({ + ty: ty + }, true); + ty += edge.getLayout().dy; + }); + }); + } + + function sankeyVisual(ecModel) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + + if (nodes.length) { + var minValue_1 = Infinity; + var maxValue_1 = -Infinity; + each(nodes, function (node) { + var nodeValue = node.getLayout().value; + + if (nodeValue < minValue_1) { + minValue_1 = nodeValue; + } + + if (nodeValue > maxValue_1) { + maxValue_1 = nodeValue; + } + }); + each(nodes, function (node) { + var mapping = new VisualMapping({ + type: 'color', + mappingMethod: 'linear', + dataExtent: [minValue_1, maxValue_1], + visual: seriesModel.get('color') + }); + var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value); + var customColor = node.getModel().get(['itemStyle', 'color']); + + if (customColor != null) { + node.setVisual('color', customColor); + node.setVisual('style', { + fill: customColor + }); + } else { + node.setVisual('color', mapValueToColor); + node.setVisual('style', { + fill: mapValueToColor + }); + } + }); + } + }); + } + + function install$i(registers) { + registers.registerChartView(SankeyView); + registers.registerSeriesModel(SankeySeriesModel); + registers.registerLayout(sankeyLayout); + registers.registerVisual(sankeyVisual); + registers.registerAction({ + type: 'dragNode', + event: 'dragnode', + // here can only use 'update' now, other value is not support in echarts. + update: 'update' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'sankey', + query: payload + }, function (seriesModel) { + seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]); + }); + }); + } + + var WhiskerBoxCommonMixin = + /** @class */ + function () { + function WhiskerBoxCommonMixin() { + } + + /** + * @override + */ + + + WhiskerBoxCommonMixin.prototype.getInitialData = function (option, ecModel) { + // When both types of xAxis and yAxis are 'value', layout is + // needed to be specified by user. Otherwise, layout can be + // judged by which axis is category. + var ordinalMeta; + var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex')); + var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex')); + var xAxisType = xAxisModel.get('type'); + var yAxisType = yAxisModel.get('type'); + var addOrdinal; // FIXME + // Consider time axis. + + if (xAxisType === 'category') { + option.layout = 'horizontal'; + ordinalMeta = xAxisModel.getOrdinalMeta(); + addOrdinal = true; + } else if (yAxisType === 'category') { + option.layout = 'vertical'; + ordinalMeta = yAxisModel.getOrdinalMeta(); + addOrdinal = true; + } else { + option.layout = option.layout || 'horizontal'; + } + + var coordDims = ['x', 'y']; + var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1; + var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex]; + var otherAxisDim = coordDims[1 - baseAxisDimIndex]; + var axisModels = [xAxisModel, yAxisModel]; + var baseAxisType = axisModels[baseAxisDimIndex].get('type'); + var otherAxisType = axisModels[1 - baseAxisDimIndex].get('type'); + var data = option.data; // Clone a new data for next setOption({}) usage. + // Avoid modifying current data will affect further update. + + if (data && addOrdinal) { + var newOptionData_1 = []; + each(data, function (item, index) { + var newItem; + + if (isArray(item)) { + newItem = item.slice(); // Modify current using data. + + item.unshift(index); + } else if (isArray(item.value)) { + newItem = extend({}, item); + newItem.value = newItem.value.slice(); // Modify current using data. + + item.value.unshift(index); + } else { + newItem = item; + } + + newOptionData_1.push(newItem); + }); + option.data = newOptionData_1; + } + + var defaultValueDimensions = this.defaultValueDimensions; + var coordDimensions = [{ + name: baseAxisDim, + type: getDimensionTypeByAxis(baseAxisType), + ordinalMeta: ordinalMeta, + otherDims: { + tooltip: false, + itemName: 0 + }, + dimsDef: ['base'] + }, { + name: otherAxisDim, + type: getDimensionTypeByAxis(otherAxisType), + dimsDef: defaultValueDimensions.slice() + }]; + return createSeriesDataSimply(this, { + coordDimensions: coordDimensions, + dimensionsCount: defaultValueDimensions.length + 1, + encodeDefaulter: curry(makeSeriesEncodeForAxisCoordSys, coordDimensions, this) + }); + }; + /** + * If horizontal, base axis is x, otherwise y. + * @override + */ + + + WhiskerBoxCommonMixin.prototype.getBaseAxis = function () { + var dim = this._baseAxisDim; + return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis; + }; + + return WhiskerBoxCommonMixin; + }(); + + var BoxplotSeriesModel = + /** @class */ + function (_super) { + __extends(BoxplotSeriesModel, _super); + + function BoxplotSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BoxplotSeriesModel.type; // TODO + // box width represents group size, so dimension should have 'size'. + + /** + * @see + * The meanings of 'min' and 'max' depend on user, + * and echarts do not need to know it. + * @readOnly + */ + + _this.defaultValueDimensions = [{ + name: 'min', + defaultTooltip: true + }, { + name: 'Q1', + defaultTooltip: true + }, { + name: 'median', + defaultTooltip: true + }, { + name: 'Q3', + defaultTooltip: true + }, { + name: 'max', + defaultTooltip: true + }]; + _this.visualDrawType = 'stroke'; + return _this; + } + + BoxplotSeriesModel.type = 'series.boxplot'; + BoxplotSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid']; + BoxplotSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + layout: null, + boxWidth: [7, 50], + itemStyle: { + color: '#fff', + borderWidth: 1 + }, + emphasis: { + scale: true, + itemStyle: { + borderWidth: 2, + shadowBlur: 5, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0,0,0,0.2)' + } + }, + animationDuration: 800 + }; + return BoxplotSeriesModel; + }(SeriesModel); + + mixin(BoxplotSeriesModel, WhiskerBoxCommonMixin, true); + + var BoxplotView = + /** @class */ + function (_super) { + __extends(BoxplotView, _super); + + function BoxplotView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BoxplotView.type; + return _this; + } + + BoxplotView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var group = this.group; + var oldData = this._data; // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!this._data) { + group.removeAll(); + } + + var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0; + data.diff(oldData).add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + var symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }).update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); // Empty data + + if (!data.hasValue(newIdx)) { + group.remove(symbolEl); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + + if (!symbolEl) { + symbolEl = createNormalBox(itemLayout, data, newIdx, constDim); + } else { + saveOldStyle(symbolEl); + updateNormalBoxData(itemLayout, symbolEl, data, newIdx); + } + + group.add(symbolEl); + data.setItemGraphicEl(newIdx, symbolEl); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }).execute(); + this._data = data; + }; + + BoxplotView.prototype.remove = function (ecModel) { + var group = this.group; + var data = this._data; + this._data = null; + data && data.eachItemGraphicEl(function (el) { + el && group.remove(el); + }); + }; + + BoxplotView.type = 'boxplot'; + return BoxplotView; + }(ChartView); + + var BoxPathShape = + /** @class */ + function () { + function BoxPathShape() { + } + + return BoxPathShape; + }(); + + var BoxPath = + /** @class */ + function (_super) { + __extends(BoxPath, _super); + + function BoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'boxplotBoxPath'; + return _this; + } + + BoxPath.prototype.getDefaultShape = function () { + return new BoxPathShape(); + }; + + BoxPath.prototype.buildPath = function (ctx, shape) { + var ends = shape.points; + var i = 0; + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + + for (; i < 4; i++) { + ctx.lineTo(ends[i][0], ends[i][1]); + } + + ctx.closePath(); + + for (; i < ends.length; i++) { + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + ctx.lineTo(ends[i][0], ends[i][1]); + } + }; + + return BoxPath; + }(Path); + + function createNormalBox(itemLayout, data, dataIndex, constDim, isInit) { + var ends = itemLayout.ends; + var el = new BoxPath({ + shape: { + points: isInit ? transInit(ends, constDim, itemLayout) : ends + } + }); + updateNormalBoxData(itemLayout, el, data, dataIndex, isInit); + return el; + } + + function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) { + var seriesModel = data.hostModel; + var updateMethod = graphic[isInit ? 'initProps' : 'updateProps']; + updateMethod(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, dataIndex); + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.strokeNoScale = true; + el.z2 = 100; + var itemModel = data.getItemModel(dataIndex); + var emphasisModel = itemModel.getModel('emphasis'); + setStatesStylesFromModel(el, itemModel); + toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } + + function transInit(points, dim, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[dim] = itemLayout.initBaseline; + return point; + }); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function boxplotVisual(ecModel, api) { + } + + var each$6 = each; + + function boxplotLayout(ecModel) { + var groupResult = groupSeriesByAxis(ecModel); + each$6(groupResult, function (groupItem) { + var seriesModels = groupItem.seriesModels; + + if (!seriesModels.length) { + return; + } + + calculateBase(groupItem); + each$6(seriesModels, function (seriesModel, idx) { + layoutSingleSeries(seriesModel, groupItem.boxOffsetList[idx], groupItem.boxWidthList[idx]); + }); + }); + } + + /** + * Group series by axis. + */ + + function groupSeriesByAxis(ecModel) { + var result = []; + var axisList = []; + ecModel.eachSeriesByType('boxplot', function (seriesModel) { + var baseAxis = seriesModel.getBaseAxis(); + var idx = indexOf(axisList, baseAxis); + + if (idx < 0) { + idx = axisList.length; + axisList[idx] = baseAxis; + result[idx] = { + axis: baseAxis, + seriesModels: [] + }; + } + + result[idx].seriesModels.push(seriesModel); + }); + return result; + } + + /** + * Calculate offset and box width for each series. + */ + + + function calculateBase(groupItem) { + var baseAxis = groupItem.axis; + var seriesModels = groupItem.seriesModels; + var seriesCount = seriesModels.length; + var boxWidthList = groupItem.boxWidthList = []; + var boxOffsetList = groupItem.boxOffsetList = []; + var boundList = []; + var bandWidth; + + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } else { + var maxDataCount_1 = 0; + each$6(seriesModels, function (seriesModel) { + maxDataCount_1 = Math.max(maxDataCount_1, seriesModel.getData().count()); + }); + var extent = baseAxis.getExtent(); + bandWidth = Math.abs(extent[1] - extent[0]) / maxDataCount_1; + } + + each$6(seriesModels, function (seriesModel) { + var boxWidthBound = seriesModel.get('boxWidth'); + + if (!isArray(boxWidthBound)) { + boxWidthBound = [boxWidthBound, boxWidthBound]; + } + + boundList.push([parsePercent$1(boxWidthBound[0], bandWidth) || 0, parsePercent$1(boxWidthBound[1], bandWidth) || 0]); + }); + var availableWidth = bandWidth * 0.8 - 2; + var boxGap = availableWidth / seriesCount * 0.3; + var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount; + var base = boxWidth / 2 - availableWidth / 2; + each$6(seriesModels, function (seriesModel, idx) { + boxOffsetList.push(base); + base += boxGap + boxWidth; + boxWidthList.push(Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1])); + }); + } + + /** + * Calculate points location for each series. + */ + + + function layoutSingleSeries(seriesModel, offset, boxWidth) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var halfWidth = boxWidth / 2; + var cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1; + var vDimIdx = 1 - cDimIdx; + var coordDims = ['x', 'y']; + var cDim = data.mapDimension(coordDims[cDimIdx]); + var vDims = data.mapDimensionsAll(coordDims[vDimIdx]); + + if (cDim == null || vDims.length < 5) { + return; + } + + for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) { + var axisDimVal = data.get(cDim, dataIndex); + var median = getPoint(axisDimVal, vDims[2], dataIndex); + var end1 = getPoint(axisDimVal, vDims[0], dataIndex); + var end2 = getPoint(axisDimVal, vDims[1], dataIndex); + var end4 = getPoint(axisDimVal, vDims[3], dataIndex); + var end5 = getPoint(axisDimVal, vDims[4], dataIndex); + var ends = []; + addBodyEnd(ends, end2, false); + addBodyEnd(ends, end4, true); + ends.push(end1, end2, end5, end4); + layEndLine(ends, end1); + layEndLine(ends, end5); + layEndLine(ends, median); + data.setItemLayout(dataIndex, { + initBaseline: median[vDimIdx], + ends: ends + }); + } + + function getPoint(axisDimVal, dim, dataIndex) { + var val = data.get(dim, dataIndex); + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + var point; + + if (isNaN(axisDimVal) || isNaN(val)) { + point = [NaN, NaN]; + } else { + point = coordSys.dataToPoint(p); + point[cDimIdx] += offset; + } + + return point; + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] += halfWidth; + point2[cDimIdx] -= halfWidth; + start ? ends.push(point1, point2) : ends.push(point2, point1); + } + + function layEndLine(ends, endCenter) { + var from = endCenter.slice(); + var to = endCenter.slice(); + from[cDimIdx] -= halfWidth; + to[cDimIdx] += halfWidth; + ends.push(from, to); + } + } + + /** + * See: + * + * + * + * Helper method for preparing data. + * + * @param rawData like + * [ + * [12,232,443], (raw data set for the first box) + * [3843,5545,1232], (raw data set for the second box) + * ... + * ] + * @param opt.boundIQR=1.5 Data less than min bound is outlier. + * default 1.5, means Q1 - 1.5 * (Q3 - Q1). + * If 'none'/0 passed, min bound will not be used. + */ + + function prepareBoxplotData(rawData, opt) { + opt = opt || {}; + var boxData = []; + var outliers = []; + var boundIQR = opt.boundIQR; + var useExtreme = boundIQR === 'none' || boundIQR === 0; + + for (var i = 0; i < rawData.length; i++) { + var ascList = asc(rawData[i].slice()); + var Q1 = quantile(ascList, 0.25); + var Q2 = quantile(ascList, 0.5); + var Q3 = quantile(ascList, 0.75); + var min = ascList[0]; + var max = ascList[ascList.length - 1]; + var bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1); + var low = useExtreme ? min : Math.max(min, Q1 - bound); + var high = useExtreme ? max : Math.min(max, Q3 + bound); + var itemNameFormatter = opt.itemNameFormatter; + var itemName = isFunction(itemNameFormatter) ? itemNameFormatter({ + value: i + }) : isString(itemNameFormatter) ? itemNameFormatter.replace('{value}', i + '') : i + ''; + boxData.push([itemName, low, Q1, Q2, Q3, high]); + + for (var j = 0; j < ascList.length; j++) { + var dataItem = ascList[j]; + + if (dataItem < low || dataItem > high) { + var outlier = [itemName, dataItem]; + outliers.push(outlier); + } + } + } + + return { + boxData: boxData, + outliers: outliers + }; + } + + var boxplotTransform = { + type: 'echarts:boxplot', + transform: function transform(params) { + var upstream = params.upstream; + + if (upstream.sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('source data is not applicable for this boxplot transform. Expect number[][].'); + } + + throwError(errMsg); + } + + var result = prepareBoxplotData(upstream.getRawData(), params.config); + return [{ + dimensions: ['ItemName', 'Low', 'Q1', 'Q2', 'Q3', 'High'], + data: result.boxData + }, { + data: result.outliers + }]; + } + }; + + function install$j(registers) { + registers.registerSeriesModel(BoxplotSeriesModel); + registers.registerChartView(BoxplotView); + registers.registerVisual(boxplotVisual); + registers.registerLayout(boxplotLayout); + registers.registerTransform(boxplotTransform); + } + + var SKIP_PROPS = ['color', 'borderColor']; + + var CandlestickView = + /** @class */ + function (_super) { + __extends(CandlestickView, _super); + + function CandlestickView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CandlestickView.type; + return _this; + } + + CandlestickView.prototype.render = function (seriesModel, ecModel, api) { + // If there is clipPath created in large mode. Remove it. + this.group.removeClipPath(); // Clear previously rendered progressive elements. + + this._progressiveEls = null; + + this._updateDrawMode(seriesModel); + + this._isLargeDraw ? this._renderLarge(seriesModel) : this._renderNormal(seriesModel); + }; + + CandlestickView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this._clear(); + + this._updateDrawMode(seriesModel); + }; + + CandlestickView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { + this._progressiveEls = []; + this._isLargeDraw ? this._incrementalRenderLarge(params, seriesModel) : this._incrementalRenderNormal(params, seriesModel); + }; + + CandlestickView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + CandlestickView.prototype._updateDrawMode = function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + + if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + + this._clear(); + } + }; + + CandlestickView.prototype._renderNormal = function (seriesModel) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var isSimpleBox = data.getLayout('isSimpleBox'); + var needsClip = seriesModel.get('clip', true); + var coord = seriesModel.coordinateSystem; + var clipArea = coord.getArea && coord.getArea(); // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + + if (!this._data) { + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + + if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { + return; + } + + var el = createNormalBox$1(itemLayout, newIdx, true); + initProps(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, newIdx); + setBoxCommon(el, data, newIdx, isSimpleBox); + group.add(el); + data.setItemGraphicEl(newIdx, el); + } + }).update(function (newIdx, oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); // Empty data + + if (!data.hasValue(newIdx)) { + group.remove(el); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + + if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) { + group.remove(el); + return; + } + + if (!el) { + el = createNormalBox$1(itemLayout); + } else { + updateProps(el, { + shape: { + points: itemLayout.ends + } + }, seriesModel, newIdx); + saveOldStyle(el); + } + + setBoxCommon(el, data, newIdx, isSimpleBox); + group.add(el); + data.setItemGraphicEl(newIdx, el); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }).execute(); + this._data = data; + }; + + CandlestickView.prototype._renderLarge = function (seriesModel) { + this._clear(); + + createLarge$1(seriesModel, this.group); + var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null; + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + }; + + CandlestickView.prototype._incrementalRenderNormal = function (params, seriesModel) { + var data = seriesModel.getData(); + var isSimpleBox = data.getLayout('isSimpleBox'); + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var itemLayout = data.getItemLayout(dataIndex); + var el = createNormalBox$1(itemLayout); + setBoxCommon(el, data, dataIndex, isSimpleBox); + el.incremental = true; + this.group.add(el); + + this._progressiveEls.push(el); + } + }; + + CandlestickView.prototype._incrementalRenderLarge = function (params, seriesModel) { + createLarge$1(seriesModel, this.group, this._progressiveEls, true); + }; + + CandlestickView.prototype.remove = function (ecModel) { + this._clear(); + }; + + CandlestickView.prototype._clear = function () { + this.group.removeAll(); + this._data = null; + }; + + CandlestickView.type = 'candlestick'; + return CandlestickView; + }(ChartView); + + var NormalBoxPathShape = + /** @class */ + function () { + function NormalBoxPathShape() { + } + + return NormalBoxPathShape; + }(); + + var NormalBoxPath = + /** @class */ + function (_super) { + __extends(NormalBoxPath, _super); + + function NormalBoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'normalCandlestickBox'; + return _this; + } + + NormalBoxPath.prototype.getDefaultShape = function () { + return new NormalBoxPathShape(); + }; + + NormalBoxPath.prototype.buildPath = function (ctx, shape) { + var ends = shape.points; + + if (this.__simpleBox) { + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[6][0], ends[6][1]); + } else { + ctx.moveTo(ends[0][0], ends[0][1]); + ctx.lineTo(ends[1][0], ends[1][1]); + ctx.lineTo(ends[2][0], ends[2][1]); + ctx.lineTo(ends[3][0], ends[3][1]); + ctx.closePath(); + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[5][0], ends[5][1]); + ctx.moveTo(ends[6][0], ends[6][1]); + ctx.lineTo(ends[7][0], ends[7][1]); + } + }; + + return NormalBoxPath; + }(Path); + + function createNormalBox$1(itemLayout, dataIndex, isInit) { + var ends = itemLayout.ends; + return new NormalBoxPath({ + shape: { + points: isInit ? transInit$1(ends, itemLayout) : ends + }, + z2: 100 + }); + } + + function isNormalBoxClipped(clipArea, itemLayout) { + var clipped = true; + + for (var i = 0; i < itemLayout.ends.length; i++) { + // If any point are in the region. + if (clipArea.contain(itemLayout.ends[i][0], itemLayout.ends[i][1])) { + clipped = false; + break; + } + } + + return clipped; + } + + function setBoxCommon(el, data, dataIndex, isSimpleBox) { + var itemModel = data.getItemModel(dataIndex); + el.useStyle(data.getItemVisual(dataIndex, 'style')); + el.style.strokeNoScale = true; + el.__simpleBox = isSimpleBox; + setStatesStylesFromModel(el, itemModel); + } + + function transInit$1(points, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[1] = itemLayout.initBaseline; + return point; + }); + } + + var LargeBoxPathShape = + /** @class */ + function () { + function LargeBoxPathShape() { + } + + return LargeBoxPathShape; + }(); + + var LargeBoxPath = + /** @class */ + function (_super) { + __extends(LargeBoxPath, _super); + + function LargeBoxPath(opts) { + var _this = _super.call(this, opts) || this; + + _this.type = 'largeCandlestickBox'; + return _this; + } + + LargeBoxPath.prototype.getDefaultShape = function () { + return new LargeBoxPathShape(); + }; + + LargeBoxPath.prototype.buildPath = function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + + for (var i = 0; i < points.length;) { + if (this.__sign === points[i++]) { + var x = points[i++]; + ctx.moveTo(x, points[i++]); + ctx.lineTo(x, points[i++]); + } else { + i += 3; + } + } + }; + + return LargeBoxPath; + }(Path); + + function createLarge$1(seriesModel, group, progressiveEls, incremental) { + var data = seriesModel.getData(); + var largePoints = data.getLayout('largePoints'); + var elP = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: 1 + }); + group.add(elP); + var elN = new LargeBoxPath({ + shape: { + points: largePoints + }, + __sign: -1 + }); + group.add(elN); + setLargeStyle(1, elP, seriesModel); + setLargeStyle(-1, elN, seriesModel); + + if (incremental) { + elP.incremental = true; + elN.incremental = true; + } + + if (progressiveEls) { + progressiveEls.push(elP, elN); + } + } + + function setLargeStyle(sign, el, seriesModel, data) { + // TODO put in visual? + var borderColor = seriesModel.get(['itemStyle', sign > 0 ? 'borderColor' : 'borderColor0']) || seriesModel.get(['itemStyle', sign > 0 ? 'color' : 'color0']); // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + + var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(SKIP_PROPS); + el.useStyle(itemStyle); + el.style.fill = null; + el.style.stroke = borderColor; + } + + var CandlestickSeriesModel = + /** @class */ + function (_super) { + __extends(CandlestickSeriesModel, _super); + + function CandlestickSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CandlestickSeriesModel.type; + _this.defaultValueDimensions = [{ + name: 'open', + defaultTooltip: true + }, { + name: 'close', + defaultTooltip: true + }, { + name: 'lowest', + defaultTooltip: true + }, { + name: 'highest', + defaultTooltip: true + }]; + return _this; + } + + /** + * Get dimension for shadow in dataZoom + * @return dimension name + */ + + + CandlestickSeriesModel.prototype.getShadowDim = function () { + return 'open'; + }; + + CandlestickSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + var itemLayout = data.getItemLayout(dataIndex); + return itemLayout && selectors.rect(itemLayout.brushRect); + }; + + CandlestickSeriesModel.type = 'series.candlestick'; + CandlestickSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid']; + CandlestickSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // xAxisIndex: 0, + // yAxisIndex: 0, + layout: null, + clip: true, + itemStyle: { + color: '#eb5454', + color0: '#47b262', + borderColor: '#eb5454', + borderColor0: '#47b262', + // borderColor: '#d24040', + // borderColor0: '#398f4f', + borderWidth: 1 + }, + emphasis: { + scale: true, + itemStyle: { + borderWidth: 2 + } + }, + barMaxWidth: null, + barMinWidth: null, + barWidth: null, + large: true, + largeThreshold: 600, + progressive: 3e3, + progressiveThreshold: 1e4, + progressiveChunkMode: 'mod', + animationEasing: 'linear', + animationDuration: 300 + }; + return CandlestickSeriesModel; + }(SeriesModel); + + mixin(CandlestickSeriesModel, WhiskerBoxCommonMixin, true); + + function candlestickPreprocessor(option) { + if (!option || !isArray(option.series)) { + return; + } // Translate 'k' to 'candlestick'. + + + each(option.series, function (seriesItem) { + if (isObject(seriesItem) && seriesItem.type === 'k') { + seriesItem.type = 'candlestick'; + } + }); + } + + var positiveBorderColorQuery = ['itemStyle', 'borderColor']; + var negativeBorderColorQuery = ['itemStyle', 'borderColor0']; + var positiveColorQuery = ['itemStyle', 'color']; + var negativeColorQuery = ['itemStyle', 'color0']; + var candlestickVisual = { + seriesType: 'candlestick', + plan: createRenderPlanner(), + // For legend. + performRawSeries: true, + reset: function (seriesModel, ecModel) { + function getColor(sign, model) { + return model.get(sign > 0 ? positiveColorQuery : negativeColorQuery); + } + + function getBorderColor(sign, model) { + return model.get(sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery); + } // Only visible series has each data be visual encoded + + + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var isLargeRender = seriesModel.pipelineContext.large; + return !isLargeRender && { + progress: function (params, data) { + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var itemModel = data.getItemModel(dataIndex); + var sign = data.getItemLayout(dataIndex).sign; + var style = itemModel.getItemStyle(); + style.fill = getColor(sign, itemModel); + style.stroke = getBorderColor(sign, itemModel) || style.fill; + var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style'); + extend(existsStyle, style); + } + } + }; + } + }; + + var candlestickLayout = { + seriesType: 'candlestick', + plan: createRenderPlanner(), + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var candleWidth = calculateCandleWidth(seriesModel, data); + var cDimIdx = 0; + var vDimIdx = 1; + var coordDims = ['x', 'y']; + var cDimI = data.getDimensionIndex(data.mapDimension(coordDims[cDimIdx])); + var vDimsI = map(data.mapDimensionsAll(coordDims[vDimIdx]), data.getDimensionIndex, data); + var openDimI = vDimsI[0]; + var closeDimI = vDimsI[1]; + var lowestDimI = vDimsI[2]; + var highestDimI = vDimsI[3]; + data.setLayout({ + candleWidth: candleWidth, + // The value is experimented visually. + isSimpleBox: candleWidth <= 1.3 + }); + + if (cDimI < 0 || vDimsI.length < 4) { + return; + } + + return { + progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress + }; + + function normalProgress(params, data) { + var dataIndex; + var store = data.getStore(); + + while ((dataIndex = params.next()) != null) { + var axisDimVal = store.get(cDimI, dataIndex); + var openVal = store.get(openDimI, dataIndex); + var closeVal = store.get(closeDimI, dataIndex); + var lowestVal = store.get(lowestDimI, dataIndex); + var highestVal = store.get(highestDimI, dataIndex); + var ocLow = Math.min(openVal, closeVal); + var ocHigh = Math.max(openVal, closeVal); + var ocLowPoint = getPoint(ocLow, axisDimVal); + var ocHighPoint = getPoint(ocHigh, axisDimVal); + var lowestPoint = getPoint(lowestVal, axisDimVal); + var highestPoint = getPoint(highestVal, axisDimVal); + var ends = []; + addBodyEnd(ends, ocHighPoint, 0); + addBodyEnd(ends, ocLowPoint, 1); + ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint)); + data.setItemLayout(dataIndex, { + sign: getSign(store, dataIndex, openVal, closeVal, closeDimI), + initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], + ends: ends, + brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal) + }); + } + + function getPoint(val, axisDimVal) { + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + return isNaN(axisDimVal) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p); + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] = subPixelOptimize$1(point1[cDimIdx] + candleWidth / 2, 1, false); + point2[cDimIdx] = subPixelOptimize$1(point2[cDimIdx] - candleWidth / 2, 1, true); + start ? ends.push(point1, point2) : ends.push(point2, point1); + } + + function makeBrushRect(lowestVal, highestVal, axisDimVal) { + var pmin = getPoint(lowestVal, axisDimVal); + var pmax = getPoint(highestVal, axisDimVal); + pmin[cDimIdx] -= candleWidth / 2; + pmax[cDimIdx] -= candleWidth / 2; + return { + x: pmin[0], + y: pmin[1], + width: candleWidth, + height: pmax[1] - pmin[1] + }; + } + + function subPixelOptimizePoint(point) { + point[cDimIdx] = subPixelOptimize$1(point[cDimIdx], 1); + return point; + } + } + + function largeProgress(params, data) { + // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...] + var points = createFloat32Array(params.count * 4); + var offset = 0; + var point; + var tmpIn = []; + var tmpOut = []; + var dataIndex; + var store = data.getStore(); + + while ((dataIndex = params.next()) != null) { + var axisDimVal = store.get(cDimI, dataIndex); + var openVal = store.get(openDimI, dataIndex); + var closeVal = store.get(closeDimI, dataIndex); + var lowestVal = store.get(lowestDimI, dataIndex); + var highestVal = store.get(highestDimI, dataIndex); + + if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) { + points[offset++] = NaN; + offset += 3; + continue; + } + + points[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI); + tmpIn[cDimIdx] = axisDimVal; + tmpIn[vDimIdx] = lowestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[0] : NaN; + points[offset++] = point ? point[1] : NaN; + tmpIn[vDimIdx] = highestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[1] : NaN; + } + + data.setLayout('largePoints', points); + } + } + }; + + function getSign(store, dataIndex, openVal, closeVal, closeDimI) { + var sign; + + if (openVal > closeVal) { + sign = -1; + } else if (openVal < closeVal) { + sign = 1; + } else { + sign = dataIndex > 0 // If close === open, compare with close of last record + ? store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1 : // No record of previous, set to be positive + 1; + } + + return sign; + } + + function calculateCandleWidth(seriesModel, data) { + var baseAxis = seriesModel.getBaseAxis(); + var extent; + var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : (extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / data.count()); + var barMaxWidth = parsePercent$1(retrieve2(seriesModel.get('barMaxWidth'), bandWidth), bandWidth); + var barMinWidth = parsePercent$1(retrieve2(seriesModel.get('barMinWidth'), 1), bandWidth); + var barWidth = seriesModel.get('barWidth'); + return barWidth != null ? parsePercent$1(barWidth, bandWidth) // Put max outer to ensure bar visible in spite of overlap. + : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth); + } + + function install$k(registers) { + registers.registerChartView(CandlestickView); + registers.registerSeriesModel(CandlestickSeriesModel); + registers.registerPreprocessor(candlestickPreprocessor); + registers.registerVisual(candlestickVisual); + registers.registerLayout(candlestickLayout); + } + + function updateRipplePath(rippleGroup, effectCfg) { + var color = effectCfg.rippleEffectColor || effectCfg.color; + rippleGroup.eachChild(function (ripplePath) { + ripplePath.attr({ + z: effectCfg.z, + zlevel: effectCfg.zlevel, + style: { + stroke: effectCfg.brushType === 'stroke' ? color : null, + fill: effectCfg.brushType === 'fill' ? color : null + } + }); + }); + } + + var EffectSymbol = + /** @class */ + function (_super) { + __extends(EffectSymbol, _super); + + function EffectSymbol(data, idx) { + var _this = _super.call(this) || this; + + var symbol = new Symbol(data, idx); + var rippleGroup = new Group(); + + _this.add(symbol); + + _this.add(rippleGroup); + + _this.updateData(data, idx); + + return _this; + } + + EffectSymbol.prototype.stopEffectAnimation = function () { + this.childAt(1).removeAll(); + }; + + EffectSymbol.prototype.startEffectAnimation = function (effectCfg) { + var symbolType = effectCfg.symbolType; + var color = effectCfg.color; + var rippleNumber = effectCfg.rippleNumber; + var rippleGroup = this.childAt(1); + + for (var i = 0; i < rippleNumber; i++) { + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4136. + var ripplePath = createSymbol(symbolType, -1, -1, 2, 2, color); + ripplePath.attr({ + style: { + strokeNoScale: true + }, + z2: 99, + silent: true, + scaleX: 0.5, + scaleY: 0.5 + }); + var delay = -i / rippleNumber * effectCfg.period + effectCfg.effectOffset; + ripplePath.animate('', true).when(effectCfg.period, { + scaleX: effectCfg.rippleScale / 2, + scaleY: effectCfg.rippleScale / 2 + }).delay(delay).start(); + ripplePath.animateStyle(true).when(effectCfg.period, { + opacity: 0 + }).delay(delay).start(); + rippleGroup.add(ripplePath); + } + + updateRipplePath(rippleGroup, effectCfg); + }; + /** + * Update effect symbol + */ + + + EffectSymbol.prototype.updateEffectAnimation = function (effectCfg) { + var oldEffectCfg = this._effectCfg; + var rippleGroup = this.childAt(1); // Must reinitialize effect if following configuration changed + + var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale', 'rippleNumber']; + + for (var i = 0; i < DIFFICULT_PROPS.length; i++) { + var propName = DIFFICULT_PROPS[i]; + + if (oldEffectCfg[propName] !== effectCfg[propName]) { + this.stopEffectAnimation(); + this.startEffectAnimation(effectCfg); + return; + } + } + + updateRipplePath(rippleGroup, effectCfg); + }; + /** + * Highlight symbol + */ + + + EffectSymbol.prototype.highlight = function () { + enterEmphasis(this); + }; + /** + * Downplay symbol + */ + + + EffectSymbol.prototype.downplay = function () { + leaveEmphasis(this); + }; + + EffectSymbol.prototype.getSymbolType = function () { + var symbol = this.childAt(0); + return symbol && symbol.getSymbolType(); + }; + /** + * Update symbol properties + */ + + + EffectSymbol.prototype.updateData = function (data, idx) { + var _this = this; + + var seriesModel = data.hostModel; + this.childAt(0).updateData(data, idx); + var rippleGroup = this.childAt(1); + var itemModel = data.getItemModel(idx); + var symbolType = data.getItemVisual(idx, 'symbol'); + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + var symbolStyle = data.getItemVisual(idx, 'style'); + var color = symbolStyle && symbolStyle.fill; + var emphasisModel = itemModel.getModel('emphasis'); + rippleGroup.setScale(symbolSize); + rippleGroup.traverse(function (ripplePath) { + ripplePath.setStyle('fill', color); + }); + var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize); + + if (symbolOffset) { + rippleGroup.x = symbolOffset[0]; + rippleGroup.y = symbolOffset[1]; + } + + var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); + rippleGroup.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var effectCfg = {}; + effectCfg.showEffectOn = seriesModel.get('showEffectOn'); + effectCfg.rippleScale = itemModel.get(['rippleEffect', 'scale']); + effectCfg.brushType = itemModel.get(['rippleEffect', 'brushType']); + effectCfg.period = itemModel.get(['rippleEffect', 'period']) * 1000; + effectCfg.effectOffset = idx / data.count(); + effectCfg.z = seriesModel.getShallow('z') || 0; + effectCfg.zlevel = seriesModel.getShallow('zlevel') || 0; + effectCfg.symbolType = symbolType; + effectCfg.color = color; + effectCfg.rippleEffectColor = itemModel.get(['rippleEffect', 'color']); + effectCfg.rippleNumber = itemModel.get(['rippleEffect', 'number']); + + if (effectCfg.showEffectOn === 'render') { + this._effectCfg ? this.updateEffectAnimation(effectCfg) : this.startEffectAnimation(effectCfg); + this._effectCfg = effectCfg; + } else { + // Not keep old effect config + this._effectCfg = null; + this.stopEffectAnimation(); + + this.onHoverStateChange = function (toState) { + if (toState === 'emphasis') { + if (effectCfg.showEffectOn !== 'render') { + _this.startEffectAnimation(effectCfg); + } + } else if (toState === 'normal') { + if (effectCfg.showEffectOn !== 'render') { + _this.stopEffectAnimation(); + } + } + }; + } + + this._effectCfg = effectCfg; + toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + EffectSymbol.prototype.fadeOut = function (cb) { + cb && cb(); + }; + return EffectSymbol; + }(Group); + + var EffectScatterView = + /** @class */ + function (_super) { + __extends(EffectScatterView, _super); + + function EffectScatterView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = EffectScatterView.type; + return _this; + } + + EffectScatterView.prototype.init = function () { + this._symbolDraw = new SymbolDraw(EffectSymbol); + }; + + EffectScatterView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var effectSymbolDraw = this._symbolDraw; + effectSymbolDraw.updateData(data, { + clipShape: this._getClipShape(seriesModel) + }); + this.group.add(effectSymbolDraw.group); + }; + + EffectScatterView.prototype._getClipShape = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var clipArea = coordSys && coordSys.getArea && coordSys.getArea(); + return seriesModel.get('clip', true) ? clipArea : null; + }; + + EffectScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + this.group.dirty(); + var res = pointsLayout('').reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } + + this._symbolDraw.updateLayout(); + }; + + EffectScatterView.prototype._updateGroupTransform = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.getRoamTransform) { + this.group.transform = clone$2(coordSys.getRoamTransform()); + this.group.decomposeTransform(); + } + }; + + EffectScatterView.prototype.remove = function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + }; + + EffectScatterView.type = 'effectScatter'; + return EffectScatterView; + }(ChartView); + + var EffectScatterSeriesModel = + /** @class */ + function (_super) { + __extends(EffectScatterSeriesModel, _super); + + function EffectScatterSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = EffectScatterSeriesModel.type; + _this.hasSymbolVisual = true; + return _this; + } + + EffectScatterSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + useEncodeDefaulter: true + }); + }; + + EffectScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) { + return selectors.point(data.getItemLayout(dataIndex)); + }; + + EffectScatterSeriesModel.type = 'series.effectScatter'; + EffectScatterSeriesModel.dependencies = ['grid', 'polar']; + EffectScatterSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + effectType: 'ripple', + progressive: 0, + // When to show the effect, option: 'render'|'emphasis' + showEffectOn: 'render', + clip: true, + // Ripple effect config + rippleEffect: { + period: 4, + // Scale of ripple + scale: 2.5, + // Brush type can be fill or stroke + brushType: 'fill', + // Ripple number + number: 3 + }, + universalTransition: { + divideShape: 'clone' + }, + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Polar coordinate system + // polarIndex: 0, + // Geo coordinate system + // geoIndex: 0, + // symbol: null, // 图形类型 + symbolSize: 10 // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + // symbolRotate: null, // 图形旋转控制 + // itemStyle: { + // opacity: 1 + // } + + }; + return EffectScatterSeriesModel; + }(SeriesModel); + + function install$l(registers) { + registers.registerChartView(EffectScatterView); + registers.registerSeriesModel(EffectScatterSeriesModel); + registers.registerLayout(pointsLayout('effectScatter')); + } + + var EffectLine = + /** @class */ + function (_super) { + __extends(EffectLine, _super); + + function EffectLine(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this.add(_this.createLine(lineData, idx, seriesScope)); + + _this._updateEffectSymbol(lineData, idx); + + return _this; + } + + EffectLine.prototype.createLine = function (lineData, idx, seriesScope) { + return new Line$1(lineData, idx, seriesScope); + }; + + EffectLine.prototype._updateEffectSymbol = function (lineData, idx) { + var itemModel = lineData.getItemModel(idx); + var effectModel = itemModel.getModel('effect'); + var size = effectModel.get('symbolSize'); + var symbolType = effectModel.get('symbol'); + + if (!isArray(size)) { + size = [size, size]; + } + + var lineStyle = lineData.getItemVisual(idx, 'style'); + var color = effectModel.get('color') || lineStyle && lineStyle.stroke; + var symbol = this.childAt(1); + + if (this._symbolType !== symbolType) { + // Remove previous + this.remove(symbol); + symbol = createSymbol(symbolType, -0.5, -0.5, 1, 1, color); + symbol.z2 = 100; + symbol.culling = true; + this.add(symbol); + } // Symbol may be removed if loop is false + + + if (!symbol) { + return; + } // Shadow color is same with color in default + + + symbol.setStyle('shadowColor', color); + symbol.setStyle(effectModel.getItemStyle(['color'])); + symbol.scaleX = size[0]; + symbol.scaleY = size[1]; + symbol.setColor(color); + this._symbolType = symbolType; + this._symbolScale = size; + + this._updateEffectAnimation(lineData, effectModel, idx); + }; + + EffectLine.prototype._updateEffectAnimation = function (lineData, effectModel, idx) { + var symbol = this.childAt(1); + + if (!symbol) { + return; + } + + var points = lineData.getItemLayout(idx); + var period = effectModel.get('period') * 1000; + var loop = effectModel.get('loop'); + var constantSpeed = effectModel.get('constantSpeed'); + var delayExpr = retrieve(effectModel.get('delay'), function (idx) { + return idx / lineData.count() * period / 3; + }); // Ignore when updating + + symbol.ignore = true; + + this._updateAnimationPoints(symbol, points); + + if (constantSpeed > 0) { + period = this._getLineLength(symbol) / constantSpeed * 1000; + } + + if (period !== this._period || loop !== this._loop) { + symbol.stopAnimation(); + var delayNum = void 0; + + if (isFunction(delayExpr)) { + delayNum = delayExpr(idx); + } else { + delayNum = delayExpr; + } + + if (symbol.__t > 0) { + delayNum = -period * symbol.__t; + } + + this._animateSymbol(symbol, period, delayNum, loop); + } + + this._period = period; + this._loop = loop; + }; + + EffectLine.prototype._animateSymbol = function (symbol, period, delayNum, loop) { + if (period > 0) { + symbol.__t = 0; + var self_1 = this; + var animator = symbol.animate('', loop).when(period, { + __t: 1 + }).delay(delayNum).during(function () { + self_1._updateSymbolPosition(symbol); + }); + + if (!loop) { + animator.done(function () { + self_1.remove(symbol); + }); + } + + animator.start(); + } + }; + + EffectLine.prototype._getLineLength = function (symbol) { + // Not so accurate + return dist(symbol.__p1, symbol.__cp1) + dist(symbol.__cp1, symbol.__p2); + }; + + EffectLine.prototype._updateAnimationPoints = function (symbol, points) { + symbol.__p1 = points[0]; + symbol.__p2 = points[1]; + symbol.__cp1 = points[2] || [(points[0][0] + points[1][0]) / 2, (points[0][1] + points[1][1]) / 2]; + }; + + EffectLine.prototype.updateData = function (lineData, idx, seriesScope) { + this.childAt(0).updateData(lineData, idx, seriesScope); + + this._updateEffectSymbol(lineData, idx); + }; + + EffectLine.prototype._updateSymbolPosition = function (symbol) { + var p1 = symbol.__p1; + var p2 = symbol.__p2; + var cp1 = symbol.__cp1; + var t = symbol.__t; + var pos = [symbol.x, symbol.y]; + var lastPos = pos.slice(); + var quadraticAt$1 = quadraticAt; + var quadraticDerivativeAt$1 = quadraticDerivativeAt; + pos[0] = quadraticAt$1(p1[0], cp1[0], p2[0], t); + pos[1] = quadraticAt$1(p1[1], cp1[1], p2[1], t); // Tangent + + var tx = quadraticDerivativeAt$1(p1[0], cp1[0], p2[0], t); + var ty = quadraticDerivativeAt$1(p1[1], cp1[1], p2[1], t); + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; // enable continuity trail for 'line', 'rect', 'roundRect' symbolType + + if (this._symbolType === 'line' || this._symbolType === 'rect' || this._symbolType === 'roundRect') { + if (symbol.__lastT !== undefined && symbol.__lastT < symbol.__t) { + symbol.scaleY = dist(lastPos, pos) * 1.05; // make sure the last segment render within endPoint + + if (t === 1) { + pos[0] = lastPos[0] + (pos[0] - lastPos[0]) / 2; + pos[1] = lastPos[1] + (pos[1] - lastPos[1]) / 2; + } + } else if (symbol.__lastT === 1) { + // After first loop, symbol.__t does NOT start with 0, so connect p1 to pos directly. + symbol.scaleY = 2 * dist(p1, pos); + } else { + symbol.scaleY = this._symbolScale[1]; + } + } + + symbol.__lastT = symbol.__t; + symbol.ignore = false; + symbol.x = pos[0]; + symbol.y = pos[1]; + }; + + EffectLine.prototype.updateLayout = function (lineData, idx) { + this.childAt(0).updateLayout(lineData, idx); + var effectModel = lineData.getItemModel(idx).getModel('effect'); + + this._updateEffectAnimation(lineData, effectModel, idx); + }; + + return EffectLine; + }(Group); + + var Polyline$1 = + /** @class */ + function (_super) { + __extends(Polyline$1, _super); + + function Polyline$1(lineData, idx, seriesScope) { + var _this = _super.call(this) || this; + + _this._createPolyline(lineData, idx, seriesScope); + + return _this; + } + + Polyline$1.prototype._createPolyline = function (lineData, idx, seriesScope) { + // let seriesModel = lineData.hostModel; + var points = lineData.getItemLayout(idx); + var line = new Polyline({ + shape: { + points: points + } + }); + this.add(line); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Polyline$1.prototype.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var line = this.childAt(0); + var target = { + shape: { + points: lineData.getItemLayout(idx) + } + }; + updateProps(line, target, seriesModel, idx); + + this._updateCommonStl(lineData, idx, seriesScope); + }; + + Polyline$1.prototype._updateCommonStl = function (lineData, idx, seriesScope) { + var line = this.childAt(0); + var itemModel = lineData.getItemModel(idx); + var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle; + var focus = seriesScope && seriesScope.focus; + var blurScope = seriesScope && seriesScope.blurScope; + var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled; + + if (!seriesScope || lineData.hasItemOption) { + var emphasisModel = itemModel.getModel('emphasis'); + emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle(); + emphasisDisabled = emphasisModel.get('disabled'); + focus = emphasisModel.get('focus'); + blurScope = emphasisModel.get('blurScope'); + } + + line.useStyle(lineData.getItemVisual(idx, 'style')); + line.style.fill = null; + line.style.strokeNoScale = true; + var lineEmphasisState = line.ensureState('emphasis'); + lineEmphasisState.style = emphasisLineStyle; + toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); + }; + + Polyline$1.prototype.updateLayout = function (lineData, idx) { + var polyline = this.childAt(0); + polyline.setShape('points', lineData.getItemLayout(idx)); + }; + return Polyline$1; + }(Group); + + var EffectPolyline = + /** @class */ + function (_super) { + __extends(EffectPolyline, _super); + + function EffectPolyline() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this._lastFrame = 0; + _this._lastFramePercent = 0; + return _this; + } // Override + + + EffectPolyline.prototype.createLine = function (lineData, idx, seriesScope) { + return new Polyline$1(lineData, idx, seriesScope); + }; + + EffectPolyline.prototype._updateAnimationPoints = function (symbol, points) { + this._points = points; + var accLenArr = [0]; + var len = 0; + + for (var i = 1; i < points.length; i++) { + var p1 = points[i - 1]; + var p2 = points[i]; + len += dist(p1, p2); + accLenArr.push(len); + } + + if (len === 0) { + this._length = 0; + return; + } + + for (var i = 0; i < accLenArr.length; i++) { + accLenArr[i] /= len; + } + + this._offsets = accLenArr; + this._length = len; + }; + + EffectPolyline.prototype._getLineLength = function () { + return this._length; + }; + + EffectPolyline.prototype._updateSymbolPosition = function (symbol) { + var t = symbol.__t; + var points = this._points; + var offsets = this._offsets; + var len = points.length; + + if (!offsets) { + // Has length 0 + return; + } + + var lastFrame = this._lastFrame; + var frame; + + if (t < this._lastFramePercent) { + // Start from the next frame + // PENDING start from lastFrame ? + var start = Math.min(lastFrame + 1, len - 1); + + for (frame = start; frame >= 0; frame--) { + if (offsets[frame] <= t) { + break; + } + } // PENDING really need to do this ? + + + frame = Math.min(frame, len - 2); + } else { + for (frame = lastFrame; frame < len; frame++) { + if (offsets[frame] > t) { + break; + } + } + + frame = Math.min(frame - 1, len - 2); + } + + var p = (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]); + var p0 = points[frame]; + var p1 = points[frame + 1]; + symbol.x = p0[0] * (1 - p) + p * p1[0]; + symbol.y = p0[1] * (1 - p) + p * p1[1]; + var tx = p1[0] - p0[0]; + var ty = p1[1] - p0[1]; + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; + this._lastFrame = frame; + this._lastFramePercent = t; + symbol.ignore = false; + }; + return EffectPolyline; + }(EffectLine); + + var LargeLinesPathShape = + /** @class */ + function () { + function LargeLinesPathShape() { + this.polyline = false; + this.curveness = 0; + this.segs = []; + } + + return LargeLinesPathShape; + }(); + + var LargeLinesPath = + /** @class */ + function (_super) { + __extends(LargeLinesPath, _super); + + function LargeLinesPath(opts) { + var _this = _super.call(this, opts) || this; + + _this._off = 0; + _this.hoverDataIdx = -1; + return _this; + } + + LargeLinesPath.prototype.reset = function () { + this.notClear = false; + this._off = 0; + }; + + LargeLinesPath.prototype.getDefaultStyle = function () { + return { + stroke: '#000', + fill: null + }; + }; + + LargeLinesPath.prototype.getDefaultShape = function () { + return new LargeLinesPathShape(); + }; + + LargeLinesPath.prototype.buildPath = function (ctx, shape) { + var segs = shape.segs; + var curveness = shape.curveness; + var i; + + if (shape.polyline) { + for (i = this._off; i < segs.length;) { + var count = segs[i++]; + + if (count > 0) { + ctx.moveTo(segs[i++], segs[i++]); + + for (var k = 1; k < count; k++) { + ctx.lineTo(segs[i++], segs[i++]); + } + } + } + } else { + for (i = this._off; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + ctx.moveTo(x0, y0); + + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + ctx.quadraticCurveTo(x2, y2, x1, y1); + } else { + ctx.lineTo(x1, y1); + } + } + } + + if (this.incremental) { + this._off = i; + this.notClear = true; + } + }; + + LargeLinesPath.prototype.findDataIndex = function (x, y) { + var shape = this.shape; + var segs = shape.segs; + var curveness = shape.curveness; + var lineWidth = this.style.lineWidth; + + if (shape.polyline) { + var dataIndex = 0; + + for (var i = 0; i < segs.length;) { + var count = segs[i++]; + + if (count > 0) { + var x0 = segs[i++]; + var y0 = segs[i++]; + + for (var k = 1; k < count; k++) { + var x1 = segs[i++]; + var y1 = segs[i++]; + + if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } + } + + dataIndex++; + } + } else { + var dataIndex = 0; + + for (var i = 0; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + + if (containStroke$2(x0, y0, x2, y2, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } else { + if (containStroke(x0, y0, x1, y1, lineWidth, x, y)) { + return dataIndex; + } + } + + dataIndex++; + } + } + + return -1; + }; + + LargeLinesPath.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + // Cache found data index. + var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y); + return dataIdx >= 0; + } + + this.hoverDataIdx = -1; + return false; + }; + + LargeLinesPath.prototype.getBoundingRect = function () { + // Ignore stroke for large symbol draw. + var rect = this._rect; + + if (!rect) { + var shape = this.shape; + var points = shape.segs; + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + minX = Math.min(x, minX); + maxX = Math.max(x, maxX); + minY = Math.min(y, minY); + maxY = Math.max(y, maxY); + } + + rect = this._rect = new BoundingRect(minX, minY, maxX, maxY); + } + + return rect; + }; + + return LargeLinesPath; + }(Path); + + var LargeLineDraw = + /** @class */ + function () { + function LargeLineDraw() { + this.group = new Group(); + } + + /** + * Update symbols draw by new data + */ + + + LargeLineDraw.prototype.updateData = function (data) { + this._clear(); + + var lineEl = this._create(); + + lineEl.setShape({ + segs: data.getLayout('linesPoints') + }); + + this._setCommon(lineEl, data); + }; + /** + * @override + */ + + LargeLineDraw.prototype.incrementalPrepareUpdate = function (data) { + this.group.removeAll(); + + this._clear(); + }; + /** + * @override + */ + + LargeLineDraw.prototype.incrementalUpdate = function (taskParams, data) { + var lastAdded = this._newAdded[0]; + var linePoints = data.getLayout('linesPoints'); + var oldSegs = lastAdded && lastAdded.shape.segs; // Merging the exists. Each element has 1e4 points. + // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization) + + if (oldSegs && oldSegs.length < 2e4) { + var oldLen = oldSegs.length; + var newSegs = new Float32Array(oldLen + linePoints.length); // Concat two array + + newSegs.set(oldSegs); + newSegs.set(linePoints, oldLen); + lastAdded.setShape({ + segs: newSegs + }); + } else { + // Clear + this._newAdded = []; + + var lineEl = this._create(); + + lineEl.incremental = true; + lineEl.setShape({ + segs: linePoints + }); + + this._setCommon(lineEl, data); + + lineEl.__startIndex = taskParams.start; + } + }; + /** + * @override + */ + + + LargeLineDraw.prototype.remove = function () { + this._clear(); + }; + + LargeLineDraw.prototype.eachRendered = function (cb) { + this._newAdded[0] && cb(this._newAdded[0]); + }; + + LargeLineDraw.prototype._create = function () { + var lineEl = new LargeLinesPath({ + cursor: 'default' + }); + + this._newAdded.push(lineEl); + + this.group.add(lineEl); + return lineEl; + }; + + LargeLineDraw.prototype._setCommon = function (lineEl, data, isIncremental) { + var hostModel = data.hostModel; + lineEl.setShape({ + polyline: hostModel.get('polyline'), + curveness: hostModel.get(['lineStyle', 'curveness']) + }); + lineEl.useStyle(hostModel.getModel('lineStyle').getLineStyle()); + lineEl.style.strokeNoScale = true; + var style = data.getVisual('style'); + + if (style && style.stroke) { + lineEl.setStyle('stroke', style.stroke); + } + + lineEl.setStyle('fill', null); + var ecData = getECData(lineEl); // Enable tooltip + // PENDING May have performance issue when path is extremely large + + ecData.seriesIndex = hostModel.seriesIndex; + lineEl.on('mousemove', function (e) { + ecData.dataIndex = null; + var dataIndex = lineEl.hoverDataIdx; + + if (dataIndex > 0) { + // Provide dataIndex for tooltip + ecData.dataIndex = dataIndex + lineEl.__startIndex; + } + }); + }; + + LargeLineDraw.prototype._clear = function () { + this._newAdded = []; + this.group.removeAll(); + }; + return LargeLineDraw; + }(); + + var linesLayout = { + seriesType: 'lines', + plan: createRenderPlanner(), + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (!coordSys) { + if ("development" !== 'production') { + error('The lines series must have a coordinate system.'); + } + + return; + } + + var isPolyline = seriesModel.get('polyline'); + var isLarge = seriesModel.pipelineContext.large; + return { + progress: function (params, lineData) { + var lineCoords = []; + + if (isLarge) { + var points = void 0; + var segCount = params.end - params.start; + + if (isPolyline) { + var totalCoordsCount = 0; + + for (var i = params.start; i < params.end; i++) { + totalCoordsCount += seriesModel.getLineCoordsCount(i); + } + + points = new Float32Array(segCount + totalCoordsCount * 2); + } else { + points = new Float32Array(segCount * 4); + } + + var offset = 0; + var pt = []; + + for (var i = params.start; i < params.end; i++) { + var len = seriesModel.getLineCoords(i, lineCoords); + + if (isPolyline) { + points[offset++] = len; + } + + for (var k = 0; k < len; k++) { + pt = coordSys.dataToPoint(lineCoords[k], false, pt); + points[offset++] = pt[0]; + points[offset++] = pt[1]; + } + } + + lineData.setLayout('linesPoints', points); + } else { + for (var i = params.start; i < params.end; i++) { + var itemModel = lineData.getItemModel(i); + var len = seriesModel.getLineCoords(i, lineCoords); + var pts = []; + + if (isPolyline) { + for (var j = 0; j < len; j++) { + pts.push(coordSys.dataToPoint(lineCoords[j])); + } + } else { + pts[0] = coordSys.dataToPoint(lineCoords[0]); + pts[1] = coordSys.dataToPoint(lineCoords[1]); + var curveness = itemModel.get(['lineStyle', 'curveness']); + + if (+curveness) { + pts[2] = [(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness]; + } + } + + lineData.setItemLayout(i, pts); + } + } + } + }; + } + }; + + var LinesView = + /** @class */ + function (_super) { + __extends(LinesView, _super); + + function LinesView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LinesView.type; + return _this; + } + + LinesView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + var zlevel = seriesModel.get('zlevel'); + var trailLength = seriesModel.get(['effect', 'trailLength']); + var zr = api.getZr(); // Avoid the drag cause ghost shadow + // FIXME Better way ? + // SVG doesn't support + + var isSvg = zr.painter.getType() === 'svg'; + + if (!isSvg) { + zr.painter.getLayer(zlevel).clear(true); + } // Config layer with motion blur + + + if (this._lastZlevel != null && !isSvg) { + zr.configLayer(this._lastZlevel, { + motionBlur: false + }); + } + + if (this._showEffect(seriesModel) && trailLength > 0) { + if (!isSvg) { + zr.configLayer(zlevel, { + motionBlur: true, + lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0) + }); + } else if ("development" !== 'production') { + console.warn('SVG render mode doesn\'t support lines with trail effect'); + } + } + + lineDraw.updateData(data); + var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel); + + if (clipPath) { + this.group.setClipPath(clipPath); + } else { + this.group.removeClipPath(); + } + + this._lastZlevel = zlevel; + this._finished = true; + }; + + LinesView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + lineDraw.incrementalPrepareUpdate(data); + + this._clearLayer(api); + + this._finished = false; + }; + + LinesView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) { + this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData()); + + this._finished = taskParams.end === seriesModel.getData().count(); + }; + + LinesView.prototype.eachRendered = function (cb) { + this._lineDraw && this._lineDraw.eachRendered(cb); + }; + + LinesView.prototype.updateTransform = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var pipelineContext = seriesModel.pipelineContext; + + if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) { + // TODO Don't have to do update in large mode. Only do it when there are millions of data. + return { + update: true + }; + } else { + // TODO Use same logic with ScatterView. + // Manually update layout + var res = linesLayout.reset(seriesModel, ecModel, api); + + if (res.progress) { + res.progress({ + start: 0, + end: data.count(), + count: data.count() + }, data); + } // Not in large mode + + + this._lineDraw.updateLayout(); + + this._clearLayer(api); + } + }; + + LinesView.prototype._updateLineDraw = function (data, seriesModel) { + var lineDraw = this._lineDraw; + + var hasEffect = this._showEffect(seriesModel); + + var isPolyline = !!seriesModel.get('polyline'); + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if ("development" !== 'production') { + if (hasEffect && isLargeDraw) { + console.warn('Large lines not support effect'); + } + } + + if (!lineDraw || hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLargeDraw !== this._isLargeDraw) { + if (lineDraw) { + lineDraw.remove(); + } + + lineDraw = this._lineDraw = isLargeDraw ? new LargeLineDraw() : new LineDraw(isPolyline ? hasEffect ? EffectPolyline : Polyline$1 : hasEffect ? EffectLine : Line$1); + this._hasEffet = hasEffect; + this._isPolyline = isPolyline; + this._isLargeDraw = isLargeDraw; + } + + this.group.add(lineDraw.group); + return lineDraw; + }; + + LinesView.prototype._showEffect = function (seriesModel) { + return !!seriesModel.get(['effect', 'show']); + }; + + LinesView.prototype._clearLayer = function (api) { + // Not use motion when dragging or zooming + var zr = api.getZr(); + var isSvg = zr.painter.getType() === 'svg'; + + if (!isSvg && this._lastZlevel != null) { + zr.painter.getLayer(this._lastZlevel).clear(true); + } + }; + + LinesView.prototype.remove = function (ecModel, api) { + this._lineDraw && this._lineDraw.remove(); + this._lineDraw = null; // Clear motion when lineDraw is removed + + this._clearLayer(api); + }; + + LinesView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); + }; + + LinesView.type = 'lines'; + return LinesView; + }(ChartView); + + var Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array; + var Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array; + + function compatEc2(seriesOpt) { + var data = seriesOpt.data; + + if (data && data[0] && data[0][0] && data[0][0].coord) { + if ("development" !== 'production') { + console.warn('Lines data configuration has been changed to' + ' { coords:[[1,2],[2,3]] }'); + } + + seriesOpt.data = map(data, function (itemOpt) { + var coords = [itemOpt[0].coord, itemOpt[1].coord]; + var target = { + coords: coords + }; + + if (itemOpt[0].name) { + target.fromName = itemOpt[0].name; + } + + if (itemOpt[1].name) { + target.toName = itemOpt[1].name; + } + + return mergeAll([target, itemOpt[0], itemOpt[1]]); + }); + } + } + + var LinesSeriesModel = + /** @class */ + function (_super) { + __extends(LinesSeriesModel, _super); + + function LinesSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LinesSeriesModel.type; + _this.visualStyleAccessPath = 'lineStyle'; + _this.visualDrawType = 'stroke'; + return _this; + } + + LinesSeriesModel.prototype.init = function (option) { + // The input data may be null/undefined. + option.data = option.data || []; // Not using preprocessor because mergeOption may not have series.type + + compatEc2(option); + + var result = this._processFlatCoordsArray(option.data); + + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + + _super.prototype.init.apply(this, arguments); + }; + + LinesSeriesModel.prototype.mergeOption = function (option) { + compatEc2(option); + + if (option.data) { + // Only update when have option data to merge. + var result = this._processFlatCoordsArray(option.data); + + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + } + + _super.prototype.mergeOption.apply(this, arguments); + }; + + LinesSeriesModel.prototype.appendData = function (params) { + var result = this._processFlatCoordsArray(params.data); + + if (result.flatCoords) { + if (!this._flatCoords) { + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + } else { + this._flatCoords = concatArray(this._flatCoords, result.flatCoords); + this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset); + } + + params.data = new Float32Array(result.count); + } + + this.getRawData().appendData(params.data); + }; + + LinesSeriesModel.prototype._getCoordsFromItemModel = function (idx) { + var itemModel = this.getData().getItemModel(idx); + var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow('coords'); + + if ("development" !== 'production') { + if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) { + throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.'); + } + } + + return coords; + }; + + LinesSeriesModel.prototype.getLineCoordsCount = function (idx) { + if (this._flatCoordsOffset) { + return this._flatCoordsOffset[idx * 2 + 1]; + } else { + return this._getCoordsFromItemModel(idx).length; + } + }; + + LinesSeriesModel.prototype.getLineCoords = function (idx, out) { + if (this._flatCoordsOffset) { + var offset = this._flatCoordsOffset[idx * 2]; + var len = this._flatCoordsOffset[idx * 2 + 1]; + + for (var i = 0; i < len; i++) { + out[i] = out[i] || []; + out[i][0] = this._flatCoords[offset + i * 2]; + out[i][1] = this._flatCoords[offset + i * 2 + 1]; + } + + return len; + } else { + var coords = this._getCoordsFromItemModel(idx); + + for (var i = 0; i < coords.length; i++) { + out[i] = out[i] || []; + out[i][0] = coords[i][0]; + out[i][1] = coords[i][1]; + } + + return coords.length; + } + }; + + LinesSeriesModel.prototype._processFlatCoordsArray = function (data) { + var startOffset = 0; + + if (this._flatCoords) { + startOffset = this._flatCoords.length; + } // Stored as a typed array. In format + // Points Count(2) | x | y | x | y | Points Count(3) | x | y | x | y | x | y | + + + if (isNumber(data[0])) { + var len = data.length; // Store offset and len of each segment + + var coordsOffsetAndLenStorage = new Uint32Arr(len); + var coordsStorage = new Float64Arr(len); + var coordsCursor = 0; + var offsetCursor = 0; + var dataCount = 0; + + for (var i = 0; i < len;) { + dataCount++; + var count = data[i++]; // Offset + + coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset; // Len + + coordsOffsetAndLenStorage[offsetCursor++] = count; + + for (var k = 0; k < count; k++) { + var x = data[i++]; + var y = data[i++]; + coordsStorage[coordsCursor++] = x; + coordsStorage[coordsCursor++] = y; + + if (i > len) { + if ("development" !== 'production') { + throw new Error('Invalid data format.'); + } + } + } + } + + return { + flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor), + flatCoords: coordsStorage, + count: dataCount + }; + } + + return { + flatCoordsOffset: null, + flatCoords: null, + count: data.length + }; + }; + + LinesSeriesModel.prototype.getInitialData = function (option, ecModel) { + if ("development" !== 'production') { + var CoordSys = CoordinateSystemManager.get(option.coordinateSystem); + + if (!CoordSys) { + throw new Error('Unkown coordinate system ' + option.coordinateSystem); + } + } + + var lineData = new SeriesData(['value'], this); + lineData.hasItemOption = false; + lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) { + // dataItem is simply coords + if (dataItem instanceof Array) { + return NaN; + } else { + lineData.hasItemOption = true; + var value = dataItem.value; + + if (value != null) { + return value instanceof Array ? value[dimIndex] : value; + } + } + }); + return lineData; + }; + + LinesSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + var name = itemModel.get('name'); + + if (name) { + return name; + } + + var fromName = itemModel.get('fromName'); + var toName = itemModel.get('toName'); + var nameArr = []; + fromName != null && nameArr.push(fromName); + toName != null && nameArr.push(toName); + return createTooltipMarkup('nameValue', { + name: nameArr.join(' > ') + }); + }; + + LinesSeriesModel.prototype.preventIncremental = function () { + return !!this.get(['effect', 'show']); + }; + + LinesSeriesModel.prototype.getProgressive = function () { + var progressive = this.option.progressive; + + if (progressive == null) { + return this.option.large ? 1e4 : this.get('progressive'); + } + + return progressive; + }; + + LinesSeriesModel.prototype.getProgressiveThreshold = function () { + var progressiveThreshold = this.option.progressiveThreshold; + + if (progressiveThreshold == null) { + return this.option.large ? 2e4 : this.get('progressiveThreshold'); + } + + return progressiveThreshold; + }; + + LinesSeriesModel.prototype.getZLevelKey = function () { + var effectModel = this.getModel('effect'); + var trailLength = effectModel.get('trailLength'); + return this.getData().count() > this.getProgressiveThreshold() // Each progressive series has individual key. + ? this.id : effectModel.get('show') && trailLength > 0 ? trailLength + '' : ''; + }; + + LinesSeriesModel.type = 'series.lines'; + LinesSeriesModel.dependencies = ['grid', 'polar', 'geo', 'calendar']; + LinesSeriesModel.defaultOption = { + coordinateSystem: 'geo', + // zlevel: 0, + z: 2, + legendHoverLink: true, + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + symbol: ['none', 'none'], + symbolSize: [10, 10], + // Geo coordinate system + geoIndex: 0, + effect: { + show: false, + period: 4, + constantSpeed: 0, + symbol: 'circle', + symbolSize: 3, + loop: true, + trailLength: 0.2 + }, + large: false, + // Available when large is true + largeThreshold: 2000, + polyline: false, + clip: true, + label: { + show: false, + position: 'end' // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + }, + lineStyle: { + opacity: 0.5 + } + }; + return LinesSeriesModel; + }(SeriesModel); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function normalize$3(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + + return a; + } + + var linesVisual = { + seriesType: 'lines', + reset: function (seriesModel) { + var symbolType = normalize$3(seriesModel.get('symbol')); + var symbolSize = normalize$3(seriesModel.get('symbolSize')); + var data = seriesModel.getData(); + data.setVisual('fromSymbol', symbolType && symbolType[0]); + data.setVisual('toSymbol', symbolType && symbolType[1]); + data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + data.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + var symbolType = normalize$3(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$3(itemModel.getShallow('symbolSize', true)); + symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]); + symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]); + symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]); + symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]); + } + + return { + dataEach: data.hasItemOption ? dataEach : null + }; + } + }; + + function install$m(registers) { + registers.registerChartView(LinesView); + registers.registerSeriesModel(LinesSeriesModel); + registers.registerLayout(linesLayout); + registers.registerVisual(linesVisual); + } + + var GRADIENT_LEVELS = 256; + + var HeatmapLayer = + /** @class */ + function () { + function HeatmapLayer() { + this.blurSize = 30; + this.pointSize = 20; + this.maxOpacity = 1; + this.minOpacity = 0; + this._gradientPixels = { + inRange: null, + outOfRange: null + }; + var canvas = platformApi.createCanvas(); + this.canvas = canvas; + } + + /** + * Renders Heatmap and returns the rendered canvas + * @param data array of data, each has x, y, value + * @param width canvas width + * @param height canvas height + */ + + + HeatmapLayer.prototype.update = function (data, width, height, normalize, colorFunc, isInRange) { + var brush = this._getBrush(); + + var gradientInRange = this._getGradient(colorFunc, 'inRange'); + + var gradientOutOfRange = this._getGradient(colorFunc, 'outOfRange'); + + var r = this.pointSize + this.blurSize; + var canvas = this.canvas; + var ctx = canvas.getContext('2d'); + var len = data.length; + canvas.width = width; + canvas.height = height; + + for (var i = 0; i < len; ++i) { + var p = data[i]; + var x = p[0]; + var y = p[1]; + var value = p[2]; // calculate alpha using value + + var alpha = normalize(value); // draw with the circle brush with alpha + + ctx.globalAlpha = alpha; + ctx.drawImage(brush, x - r, y - r); + } + + if (!canvas.width || !canvas.height) { + // Avoid "Uncaught DOMException: Failed to execute 'getImageData' on + // 'CanvasRenderingContext2D': The source height is 0." + return canvas; + } // colorize the canvas using alpha value and set with gradient + + + var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + var pixels = imageData.data; + var offset = 0; + var pixelLen = pixels.length; + var minOpacity = this.minOpacity; + var maxOpacity = this.maxOpacity; + var diffOpacity = maxOpacity - minOpacity; + + while (offset < pixelLen) { + var alpha = pixels[offset + 3] / 256; + var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4; // Simple optimize to ignore the empty data + + if (alpha > 0) { + var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange; // Any alpha > 0 will be mapped to [minOpacity, maxOpacity] + + alpha > 0 && (alpha = alpha * diffOpacity + minOpacity); + pixels[offset++] = gradient[gradientOffset]; + pixels[offset++] = gradient[gradientOffset + 1]; + pixels[offset++] = gradient[gradientOffset + 2]; + pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256; + } else { + offset += 4; + } + } + + ctx.putImageData(imageData, 0, 0); + return canvas; + }; + /** + * get canvas of a black circle brush used for canvas to draw later + */ + + + HeatmapLayer.prototype._getBrush = function () { + var brushCanvas = this._brushCanvas || (this._brushCanvas = platformApi.createCanvas()); // set brush size + + var r = this.pointSize + this.blurSize; + var d = r * 2; + brushCanvas.width = d; + brushCanvas.height = d; + var ctx = brushCanvas.getContext('2d'); + ctx.clearRect(0, 0, d, d); // in order to render shadow without the distinct circle, + // draw the distinct circle in an invisible place, + // and use shadowOffset to draw shadow in the center of the canvas + + ctx.shadowOffsetX = d; + ctx.shadowBlur = this.blurSize; // draw the shadow in black, and use alpha and shadow blur to generate + // color in color map + + ctx.shadowColor = '#000'; // draw circle in the left to the canvas + + ctx.beginPath(); + ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + return brushCanvas; + }; + /** + * get gradient color map + * @private + */ + + + HeatmapLayer.prototype._getGradient = function (colorFunc, state) { + var gradientPixels = this._gradientPixels; + var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4)); + var color = [0, 0, 0, 0]; + var off = 0; + + for (var i = 0; i < 256; i++) { + colorFunc[state](i / 255, true, color); + pixelsSingleState[off++] = color[0]; + pixelsSingleState[off++] = color[1]; + pixelsSingleState[off++] = color[2]; + pixelsSingleState[off++] = color[3]; + } + + return pixelsSingleState; + }; + + return HeatmapLayer; + }(); + + function getIsInPiecewiseRange(dataExtent, pieceList, selected) { + var dataSpan = dataExtent[1] - dataExtent[0]; + pieceList = map(pieceList, function (piece) { + return { + interval: [(piece.interval[0] - dataExtent[0]) / dataSpan, (piece.interval[1] - dataExtent[0]) / dataSpan] + }; + }); + var len = pieceList.length; + var lastIndex = 0; + return function (val) { + var i; // Try to find in the location of the last found + + for (i = lastIndex; i < len; i++) { + var interval = pieceList[i].interval; + + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + + if (i === len) { + // Not found, back interation + for (i = lastIndex - 1; i >= 0; i--) { + var interval = pieceList[i].interval; + + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + } + + return i >= 0 && i < len && selected[i]; + }; + } + + function getIsInContinuousRange(dataExtent, range) { + var dataSpan = dataExtent[1] - dataExtent[0]; + range = [(range[0] - dataExtent[0]) / dataSpan, (range[1] - dataExtent[0]) / dataSpan]; + return function (val) { + return val >= range[0] && val <= range[1]; + }; + } + + function isGeoCoordSys(coordSys) { + var dimensions = coordSys.dimensions; // Not use coorSys.type === 'geo' because coordSys maybe extended + + return dimensions[0] === 'lng' && dimensions[1] === 'lat'; + } + + var HeatmapView = + /** @class */ + function (_super) { + __extends(HeatmapView, _super); + + function HeatmapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = HeatmapView.type; + return _this; + } + + HeatmapView.prototype.render = function (seriesModel, ecModel, api) { + var visualMapOfThisSeries; + ecModel.eachComponent('visualMap', function (visualMap) { + visualMap.eachTargetSeries(function (targetSeries) { + if (targetSeries === seriesModel) { + visualMapOfThisSeries = visualMap; + } + }); + }); + + if ("development" !== 'production') { + if (!visualMapOfThisSeries) { + throw new Error('Heatmap must use with visualMap'); + } + } // Clear previously rendered progressive elements. + + + this._progressiveEls = null; + this.group.removeAll(); + var coordSys = seriesModel.coordinateSystem; + + if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') { + this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count()); + } else if (isGeoCoordSys(coordSys)) { + this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api); + } + }; + + HeatmapView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { + this.group.removeAll(); + }; + + HeatmapView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys) { + // geo does not support incremental rendering? + if (isGeoCoordSys(coordSys)) { + this.render(seriesModel, ecModel, api); + } else { + this._progressiveEls = []; + + this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true); + } + } + }; + + HeatmapView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + HeatmapView.prototype._renderOnCartesianAndCalendar = function (seriesModel, api, start, end, incremental) { + var coordSys = seriesModel.coordinateSystem; + var isCartesian2d = isCoordinateSystemType(coordSys, 'cartesian2d'); + var width; + var height; + var xAxisExtent; + var yAxisExtent; + + if (isCartesian2d) { + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + + if ("development" !== 'production') { + if (!(xAxis.type === 'category' && yAxis.type === 'category')) { + throw new Error('Heatmap on cartesian must have two category axes'); + } + + if (!(xAxis.onBand && yAxis.onBand)) { + throw new Error('Heatmap on cartesian must have two axes with boundaryGap true'); + } + } // add 0.5px to avoid the gaps + + + width = xAxis.getBandWidth() + .5; + height = yAxis.getBandWidth() + .5; + xAxisExtent = xAxis.scale.getExtent(); + yAxisExtent = yAxis.scale.getExtent(); + } + + var group = this.group; + var data = seriesModel.getData(); + var emphasisStyle = seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle(); + var blurStyle = seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(); + var selectStyle = seriesModel.getModel(['select', 'itemStyle']).getItemStyle(); + var borderRadius = seriesModel.get(['itemStyle', 'borderRadius']); + var labelStatesModels = getLabelStatesModels(seriesModel); + var emphasisModel = seriesModel.getModel('emphasis'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var emphasisDisabled = emphasisModel.get('disabled'); + var dataDims = isCartesian2d ? [data.mapDimension('x'), data.mapDimension('y'), data.mapDimension('value')] : [data.mapDimension('time'), data.mapDimension('value')]; + + for (var idx = start; idx < end; idx++) { + var rect = void 0; + var style = data.getItemVisual(idx, 'style'); + + if (isCartesian2d) { + var dataDimX = data.get(dataDims[0], idx); + var dataDimY = data.get(dataDims[1], idx); // Ignore empty data and out of extent data + + if (isNaN(data.get(dataDims[2], idx)) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] || dataDimY > yAxisExtent[1]) { + continue; + } + + var point = coordSys.dataToPoint([dataDimX, dataDimY]); + rect = new Rect({ + shape: { + x: point[0] - width / 2, + y: point[1] - height / 2, + width: width, + height: height + }, + style: style + }); + } else { + // Ignore empty data + if (isNaN(data.get(dataDims[1], idx))) { + continue; + } + + rect = new Rect({ + z2: 1, + shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape, + style: style + }); + } // Optimization for large datset + + + if (data.hasItemOption) { + var itemModel = data.getItemModel(idx); + var emphasisModel_1 = itemModel.getModel('emphasis'); + emphasisStyle = emphasisModel_1.getModel('itemStyle').getItemStyle(); + blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); // Each item value struct in the data would be firstly + // { + // itemStyle: { borderRadius: [30, 30] }, + // value: [2022, 02, 22] + // } + + borderRadius = itemModel.get(['itemStyle', 'borderRadius']); + focus = emphasisModel_1.get('focus'); + blurScope = emphasisModel_1.get('blurScope'); + emphasisDisabled = emphasisModel_1.get('disabled'); + labelStatesModels = getLabelStatesModels(itemModel); + } + + rect.shape.r = borderRadius; + var rawValue = seriesModel.getRawValue(idx); + var defaultText = '-'; + + if (rawValue && rawValue[2] != null) { + defaultText = rawValue[2] + ''; + } + + setLabelStyle(rect, labelStatesModels, { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultOpacity: style.opacity, + defaultText: defaultText + }); + rect.ensureState('emphasis').style = emphasisStyle; + rect.ensureState('blur').style = blurStyle; + rect.ensureState('select').style = selectStyle; + toggleHoverEmphasis(rect, focus, blurScope, emphasisDisabled); + rect.incremental = incremental; // PENDING + + if (incremental) { + // Rect must use hover layer if it's incremental. + rect.states.emphasis.hoverLayer = true; + } + + group.add(rect); + data.setItemGraphicEl(idx, rect); + + if (this._progressiveEls) { + this._progressiveEls.push(rect); + } + } + }; + + HeatmapView.prototype._renderOnGeo = function (geo, seriesModel, visualMapModel, api) { + var inRangeVisuals = visualMapModel.targetVisuals.inRange; + var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange; // if (!visualMapping) { + // throw new Error('Data range must have color visuals'); + // } + + var data = seriesModel.getData(); + var hmLayer = this._hmLayer || this._hmLayer || new HeatmapLayer(); + hmLayer.blurSize = seriesModel.get('blurSize'); + hmLayer.pointSize = seriesModel.get('pointSize'); + hmLayer.minOpacity = seriesModel.get('minOpacity'); + hmLayer.maxOpacity = seriesModel.get('maxOpacity'); + var rect = geo.getViewRect().clone(); + var roamTransform = geo.getRoamTransform(); + rect.applyTransform(roamTransform); // Clamp on viewport + + var x = Math.max(rect.x, 0); + var y = Math.max(rect.y, 0); + var x2 = Math.min(rect.width + rect.x, api.getWidth()); + var y2 = Math.min(rect.height + rect.y, api.getHeight()); + var width = x2 - x; + var height = y2 - y; + var dims = [data.mapDimension('lng'), data.mapDimension('lat'), data.mapDimension('value')]; + var points = data.mapArray(dims, function (lng, lat, value) { + var pt = geo.dataToPoint([lng, lat]); + pt[0] -= x; + pt[1] -= y; + pt.push(value); + return pt; + }); + var dataExtent = visualMapModel.getExtent(); + var isInRange = visualMapModel.type === 'visualMap.continuous' ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) : getIsInPiecewiseRange(dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected); + hmLayer.update(points, width, height, inRangeVisuals.color.getNormalizer(), { + inRange: inRangeVisuals.color.getColorMapper(), + outOfRange: outOfRangeVisuals.color.getColorMapper() + }, isInRange); + var img = new ZRImage({ + style: { + width: width, + height: height, + x: x, + y: y, + image: hmLayer.canvas + }, + silent: true + }); + this.group.add(img); + }; + + HeatmapView.type = 'heatmap'; + return HeatmapView; + }(ChartView); + + var HeatmapSeriesModel = + /** @class */ + function (_super) { + __extends(HeatmapSeriesModel, _super); + + function HeatmapSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = HeatmapSeriesModel.type; + return _this; + } + + HeatmapSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this, { + generateCoord: 'value' + }); + }; + + HeatmapSeriesModel.prototype.preventIncremental = function () { + var coordSysCreator = CoordinateSystemManager.get(this.get('coordinateSystem')); + + if (coordSysCreator && coordSysCreator.dimensions) { + return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat'; + } + }; + + HeatmapSeriesModel.type = 'series.heatmap'; + HeatmapSeriesModel.dependencies = ['grid', 'geo', 'calendar']; + HeatmapSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Geo coordinate system + geoIndex: 0, + blurSize: 30, + pointSize: 20, + maxOpacity: 1, + minOpacity: 0, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }; + return HeatmapSeriesModel; + }(SeriesModel); + + function install$n(registers) { + registers.registerChartView(HeatmapView); + registers.registerSeriesModel(HeatmapSeriesModel); + } + + var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'borderWidth']; // index: +isHorizontal + + var LAYOUT_ATTRS = [{ + xy: 'x', + wh: 'width', + index: 0, + posDesc: ['left', 'right'] + }, { + xy: 'y', + wh: 'height', + index: 1, + posDesc: ['top', 'bottom'] + }]; + var pathForLineWidth = new Circle(); + + var PictorialBarView = + /** @class */ + function (_super) { + __extends(PictorialBarView, _super); + + function PictorialBarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PictorialBarView.type; + return _this; + } + + PictorialBarView.prototype.render = function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + var coordSysRect = cartesian.master.getRect(); + var opt = { + ecSize: { + width: api.getWidth(), + height: api.getHeight() + }, + seriesModel: seriesModel, + coordSys: cartesian, + coordSysExtent: [[coordSysRect.x, coordSysRect.x + coordSysRect.width], [coordSysRect.y, coordSysRect.y + coordSysRect.height]], + isHorizontal: isHorizontal, + valueDim: LAYOUT_ATTRS[+isHorizontal], + categoryDim: LAYOUT_ATTRS[1 - +isHorizontal] + }; + data.diff(oldData).add(function (dataIndex) { + if (!data.hasValue(dataIndex)) { + return; + } + + var itemModel = getItemModel(data, dataIndex); + var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt); + var bar = createBar(data, opt, symbolMeta); + data.setItemGraphicEl(dataIndex, bar); + group.add(bar); + updateCommon$1(bar, opt, symbolMeta); + }).update(function (newIndex, oldIndex) { + var bar = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex)) { + group.remove(bar); + return; + } + + var itemModel = getItemModel(data, newIndex); + var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt); + var pictorialShapeStr = getShapeStr(data, symbolMeta); + + if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) { + group.remove(bar); + data.setItemGraphicEl(newIndex, null); + bar = null; + } + + if (bar) { + updateBar(bar, opt, symbolMeta); + } else { + bar = createBar(data, opt, symbolMeta, true); + } + + data.setItemGraphicEl(newIndex, bar); + bar.__pictorialSymbolMeta = symbolMeta; // Add back + + group.add(bar); + updateCommon$1(bar, opt, symbolMeta); + }).remove(function (dataIndex) { + var bar = oldData.getItemGraphicEl(dataIndex); + bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar); + }).execute(); + this._data = data; + return this.group; + }; + + PictorialBarView.prototype.remove = function (ecModel, api) { + var group = this.group; + var data = this._data; + + if (ecModel.get('animation')) { + if (data) { + data.eachItemGraphicEl(function (bar) { + removeBar(data, getECData(bar).dataIndex, ecModel, bar); + }); + } + } else { + group.removeAll(); + } + }; + + PictorialBarView.type = 'pictorialBar'; + return PictorialBarView; + }(ChartView); // Set or calculate default value about symbol, and calculate layout info. + + + function getSymbolMeta(data, dataIndex, itemModel, opt) { + var layout = data.getItemLayout(dataIndex); + var symbolRepeat = itemModel.get('symbolRepeat'); + var symbolClip = itemModel.get('symbolClip'); + var symbolPosition = itemModel.get('symbolPosition') || 'start'; + var symbolRotate = itemModel.get('symbolRotate'); + var rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var symbolPatternSize = itemModel.get('symbolPatternSize') || 2; + var isAnimationEnabled = itemModel.isAnimationEnabled(); + var symbolMeta = { + dataIndex: dataIndex, + layout: layout, + itemModel: itemModel, + symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle', + style: data.getItemVisual(dataIndex, 'style'), + symbolClip: symbolClip, + symbolRepeat: symbolRepeat, + symbolRepeatDirection: itemModel.get('symbolRepeatDirection'), + symbolPatternSize: symbolPatternSize, + rotation: rotation, + animationModel: isAnimationEnabled ? itemModel : null, + hoverScale: isAnimationEnabled && itemModel.get(['emphasis', 'scale']), + z2: itemModel.getShallow('z', true) || 0 + }; + prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta); + prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength, symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta); + prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta); + var symbolSize = symbolMeta.symbolSize; + var symbolOffset = normalizeSymbolOffset(itemModel.get('symbolOffset'), symbolSize); + prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, opt, symbolMeta); + return symbolMeta; + } // bar length can be negative. + + + function prepareBarLength(itemModel, symbolRepeat, layout, opt, outputSymbolMeta) { + var valueDim = opt.valueDim; + var symbolBoundingData = itemModel.get('symbolBoundingData'); + var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis()); + var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)); + var pxSignIdx = 1 - +(layout[valueDim.wh] <= 0); + var boundingLength; + + if (isArray(symbolBoundingData)) { + var symbolBoundingExtent = [convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx, convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx]; + symbolBoundingExtent[1] < symbolBoundingExtent[0] && symbolBoundingExtent.reverse(); + boundingLength = symbolBoundingExtent[pxSignIdx]; + } else if (symbolBoundingData != null) { + boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx; + } else if (symbolRepeat) { + boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx; + } else { + boundingLength = layout[valueDim.wh]; + } + + outputSymbolMeta.boundingLength = boundingLength; + + if (symbolRepeat) { + outputSymbolMeta.repeatCutLength = layout[valueDim.wh]; + } // if 'pxSign' means sign of pixel, it can't be zero, or symbolScale will be zero + // and when borderWidth be settled, the actual linewidth will be NaN + + + outputSymbolMeta.pxSign = boundingLength > 0 ? 1 : -1; + } + + function convertToCoordOnAxis(axis, value) { + return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value))); + } // Support ['100%', '100%'] + + + function prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength, pxSign, symbolPatternSize, opt, outputSymbolMeta) { + var valueDim = opt.valueDim; + var categoryDim = opt.categoryDim; + var categorySize = Math.abs(layout[categoryDim.wh]); + var symbolSize = data.getItemVisual(dataIndex, 'symbolSize'); + var parsedSymbolSize; + + if (isArray(symbolSize)) { + parsedSymbolSize = symbolSize.slice(); + } else { + if (symbolSize == null) { + // will parse to number below + parsedSymbolSize = ['100%', '100%']; + } else { + parsedSymbolSize = [symbolSize, symbolSize]; + } + } // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is + // to complicated to calculate real percent value if considering scaled lineWidth. + // So the actual size will bigger than layout size if lineWidth is bigger than zero, + // which can be tolerated in pictorial chart. + + + parsedSymbolSize[categoryDim.index] = parsePercent$1(parsedSymbolSize[categoryDim.index], categorySize); + parsedSymbolSize[valueDim.index] = parsePercent$1(parsedSymbolSize[valueDim.index], symbolRepeat ? categorySize : Math.abs(boundingLength)); + outputSymbolMeta.symbolSize = parsedSymbolSize; // If x or y is less than zero, show reversed shape. + + var symbolScale = outputSymbolMeta.symbolScale = [parsedSymbolSize[0] / symbolPatternSize, parsedSymbolSize[1] / symbolPatternSize]; // Follow convention, 'right' and 'top' is the normal scale. + + symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign; + } + + function prepareLineWidth(itemModel, symbolScale, rotation, opt, outputSymbolMeta) { + // In symbols are drawn with scale, so do not need to care about the case that width + // or height are too small. But symbol use strokeNoScale, where acture lineWidth should + // be calculated. + var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0; + + if (valueLineWidth) { + pathForLineWidth.attr({ + scaleX: symbolScale[0], + scaleY: symbolScale[1], + rotation: rotation + }); + pathForLineWidth.updateTransform(); + valueLineWidth /= pathForLineWidth.getLineScale(); + valueLineWidth *= symbolScale[opt.valueDim.index]; + } + + outputSymbolMeta.valueLineWidth = valueLineWidth || 0; + } + + function prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, outputSymbolMeta) { + var categoryDim = opt.categoryDim; + var valueDim = opt.valueDim; + var pxSign = outputSymbolMeta.pxSign; + var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0); + var pathLen = unitLength; // Note: rotation will not effect the layout of symbols, because user may + // want symbols to rotate on its center, which should not be translated + // when rotating. + + if (symbolRepeat) { + var absBoundingLength = Math.abs(boundingLength); + var symbolMargin = retrieve(itemModel.get('symbolMargin'), '15%') + ''; + var hasEndGap = false; + + if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) { + hasEndGap = true; + symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1); + } + + var symbolMarginNumeric = parsePercent$1(symbolMargin, symbolSize[valueDim.index]); + var uLenWithMargin = Math.max(unitLength + symbolMarginNumeric * 2, 0); // When symbol margin is less than 0, margin at both ends will be subtracted + // to ensure that all of the symbols will not be overflow the given area. + + var endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; // Both final repeatTimes and final symbolMarginNumeric area calculated based on + // boundingLength. + + var repeatSpecified = isNumeric(symbolRepeat); + var repeatTimes = repeatSpecified ? symbolRepeat : toIntTimes((absBoundingLength + endFix) / uLenWithMargin); // Adjust calculate margin, to ensure each symbol is displayed + // entirely in the given layout area. + + var mDiff = absBoundingLength - repeatTimes * unitLength; + symbolMarginNumeric = mDiff / 2 / (hasEndGap ? repeatTimes : Math.max(repeatTimes - 1, 1)); + uLenWithMargin = unitLength + symbolMarginNumeric * 2; + endFix = hasEndGap ? 0 : symbolMarginNumeric * 2; // Update repeatTimes when not all symbol will be shown. + + if (!repeatSpecified && symbolRepeat !== 'fixed') { + repeatTimes = repeatCutLength ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) : 0; + } + + pathLen = repeatTimes * uLenWithMargin - endFix; + outputSymbolMeta.repeatTimes = repeatTimes; + outputSymbolMeta.symbolMargin = symbolMarginNumeric; + } + + var sizeFix = pxSign * (pathLen / 2); + var pathPosition = outputSymbolMeta.pathPosition = []; + pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2; + pathPosition[valueDim.index] = symbolPosition === 'start' ? sizeFix : symbolPosition === 'end' ? boundingLength - sizeFix : boundingLength / 2; // 'center' + + if (symbolOffset) { + pathPosition[0] += symbolOffset[0]; + pathPosition[1] += symbolOffset[1]; + } + + var bundlePosition = outputSymbolMeta.bundlePosition = []; + bundlePosition[categoryDim.index] = layout[categoryDim.xy]; + bundlePosition[valueDim.index] = layout[valueDim.xy]; + var barRectShape = outputSymbolMeta.barRectShape = extend({}, layout); + barRectShape[valueDim.wh] = pxSign * Math.max(Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix)); + barRectShape[categoryDim.wh] = layout[categoryDim.wh]; + var clipShape = outputSymbolMeta.clipShape = {}; // Consider that symbol may be overflow layout rect. + + clipShape[categoryDim.xy] = -layout[categoryDim.xy]; + clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh]; + clipShape[valueDim.xy] = 0; + clipShape[valueDim.wh] = layout[valueDim.wh]; + } + + function createPath(symbolMeta) { + var symbolPatternSize = symbolMeta.symbolPatternSize; + var path = createSymbol( // Consider texture img, make a big size. + symbolMeta.symbolType, -symbolPatternSize / 2, -symbolPatternSize / 2, symbolPatternSize, symbolPatternSize); + path.attr({ + culling: true + }); + path.type !== 'image' && path.setStyle({ + strokeNoScale: true + }); + return path; + } + + function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var symbolSize = symbolMeta.symbolSize; + var valueLineWidth = symbolMeta.valueLineWidth; + var pathPosition = symbolMeta.pathPosition; + var valueDim = opt.valueDim; + var repeatTimes = symbolMeta.repeatTimes || 0; + var index = 0; + var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2; + eachPath(bar, function (path) { + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + + if (index < repeatTimes) { + updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate); + } else { + updateAttr(path, null, { + scaleX: 0, + scaleY: 0 + }, symbolMeta, isUpdate, function () { + bundle.remove(path); + }); + } // updateHoverAnimation(path, symbolMeta); + + + index++; + }); + + for (; index < repeatTimes; index++) { + var path = createPath(symbolMeta); + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + bundle.add(path); + var target = makeTarget(index); + updateAttr(path, { + x: target.x, + y: target.y, + scaleX: 0, + scaleY: 0 + }, { + scaleX: target.scaleX, + scaleY: target.scaleY, + rotation: target.rotation + }, symbolMeta, isUpdate); + } + + function makeTarget(index) { + var position = pathPosition.slice(); // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index + // Otherwise: i = index; + + var pxSign = symbolMeta.pxSign; + var i = index; + + if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) { + i = repeatTimes - 1 - index; + } + + position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index]; + return { + x: position[0], + y: position[1], + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1], + rotation: symbolMeta.rotation + }; + } + } + + function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var mainPath = bar.__pictorialMainPath; + + if (!mainPath) { + mainPath = bar.__pictorialMainPath = createPath(symbolMeta); + bundle.add(mainPath); + updateAttr(mainPath, { + x: symbolMeta.pathPosition[0], + y: symbolMeta.pathPosition[1], + scaleX: 0, + scaleY: 0, + rotation: symbolMeta.rotation + }, { + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1] + }, symbolMeta, isUpdate); + } else { + updateAttr(mainPath, null, { + x: symbolMeta.pathPosition[0], + y: symbolMeta.pathPosition[1], + scaleX: symbolMeta.symbolScale[0], + scaleY: symbolMeta.symbolScale[1], + rotation: symbolMeta.rotation + }, symbolMeta, isUpdate); + } + } // bar rect is used for label. + + + function createOrUpdateBarRect(bar, symbolMeta, isUpdate) { + var rectShape = extend({}, symbolMeta.barRectShape); + var barRect = bar.__pictorialBarRect; + + if (!barRect) { + barRect = bar.__pictorialBarRect = new Rect({ + z2: 2, + shape: rectShape, + silent: true, + style: { + stroke: 'transparent', + fill: 'transparent', + lineWidth: 0 + } + }); + barRect.disableMorphing = true; + bar.add(barRect); + } else { + updateAttr(barRect, null, { + shape: rectShape + }, symbolMeta, isUpdate); + } + } + + function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) { + // If not clip, symbol will be remove and rebuilt. + if (symbolMeta.symbolClip) { + var clipPath = bar.__pictorialClipPath; + var clipShape = extend({}, symbolMeta.clipShape); + var valueDim = opt.valueDim; + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + + if (clipPath) { + updateProps(clipPath, { + shape: clipShape + }, animationModel, dataIndex); + } else { + clipShape[valueDim.wh] = 0; + clipPath = new Rect({ + shape: clipShape + }); + + bar.__pictorialBundle.setClipPath(clipPath); + + bar.__pictorialClipPath = clipPath; + var target = {}; + target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh]; + graphic[isUpdate ? 'updateProps' : 'initProps'](clipPath, { + shape: target + }, animationModel, dataIndex); + } + } + } + + function getItemModel(data, dataIndex) { + var itemModel = data.getItemModel(dataIndex); + itemModel.getAnimationDelayParams = getAnimationDelayParams; + itemModel.isAnimationEnabled = isAnimationEnabled; + return itemModel; + } + + function getAnimationDelayParams(path) { + // The order is the same as the z-order, see `symbolRepeatDiretion`. + return { + index: path.__pictorialAnimationIndex, + count: path.__pictorialRepeatTimes + }; + } + + function isAnimationEnabled() { + // `animation` prop can be set on itemModel in pictorial bar chart. + return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation'); + } + + function createBar(data, opt, symbolMeta, isUpdate) { + // bar is the main element for each data. + var bar = new Group(); // bundle is used for location and clip. + + var bundle = new Group(); + bar.add(bundle); + bar.__pictorialBundle = bundle; + bundle.x = symbolMeta.bundlePosition[0]; + bundle.y = symbolMeta.bundlePosition[1]; + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta); + } else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta); + } + + createOrUpdateBarRect(bar, symbolMeta, isUpdate); + createOrUpdateClip(bar, opt, symbolMeta, isUpdate); + bar.__pictorialShapeStr = getShapeStr(data, symbolMeta); + bar.__pictorialSymbolMeta = symbolMeta; + return bar; + } + + function updateBar(bar, opt, symbolMeta) { + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + var bundle = bar.__pictorialBundle; + updateProps(bundle, { + x: symbolMeta.bundlePosition[0], + y: symbolMeta.bundlePosition[1] + }, animationModel, dataIndex); + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true); + } else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta, true); + } + + createOrUpdateBarRect(bar, symbolMeta, true); + createOrUpdateClip(bar, opt, symbolMeta, true); + } + + function removeBar(data, dataIndex, animationModel, bar) { + // Not show text when animating + var labelRect = bar.__pictorialBarRect; + labelRect && labelRect.removeTextContent(); + var pathes = []; + eachPath(bar, function (path) { + pathes.push(path); + }); + bar.__pictorialMainPath && pathes.push(bar.__pictorialMainPath); // I do not find proper remove animation for clip yet. + + bar.__pictorialClipPath && (animationModel = null); + each(pathes, function (path) { + removeElement(path, { + scaleX: 0, + scaleY: 0 + }, animationModel, dataIndex, function () { + bar.parent && bar.parent.remove(bar); + }); + }); + data.setItemGraphicEl(dataIndex, null); + } + + function getShapeStr(data, symbolMeta) { + return [data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none', !!symbolMeta.symbolRepeat, !!symbolMeta.symbolClip].join(':'); + } + + function eachPath(bar, cb, context) { + // Do not use Group#eachChild, because it do not support remove. + each(bar.__pictorialBundle.children(), function (el) { + el !== bar.__pictorialBarRect && cb.call(context, el); + }); + } + + function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) { + immediateAttrs && el.attr(immediateAttrs); // when symbolCip used, only clip path has init animation, otherwise it would be weird effect. + + if (symbolMeta.symbolClip && !isUpdate) { + animationAttrs && el.attr(animationAttrs); + } else { + animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps'](el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb); + } + } + + function updateCommon$1(bar, opt, symbolMeta) { + var dataIndex = symbolMeta.dataIndex; + var itemModel = symbolMeta.itemModel; // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + + var emphasisModel = itemModel.getModel('emphasis'); + var emphasisStyle = emphasisModel.getModel('itemStyle').getItemStyle(); + var blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); + var selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); + var cursorStyle = itemModel.getShallow('cursor'); + var focus = emphasisModel.get('focus'); + var blurScope = emphasisModel.get('blurScope'); + var hoverScale = emphasisModel.get('scale'); + eachPath(bar, function (path) { + if (path instanceof ZRImage) { + var pathStyle = path.style; + path.useStyle(extend({ + // TODO other properties like dx, dy ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, symbolMeta.style)); + } else { + path.useStyle(symbolMeta.style); + } + + var emphasisState = path.ensureState('emphasis'); + emphasisState.style = emphasisStyle; + + if (hoverScale) { + // NOTE: Must after scale is set after updateAttr + emphasisState.scaleX = path.scaleX * 1.1; + emphasisState.scaleY = path.scaleY * 1.1; + } + + path.ensureState('blur').style = blurStyle; + path.ensureState('select').style = selectStyle; + cursorStyle && (path.cursor = cursorStyle); + path.z2 = symbolMeta.z2; + }); + var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)]; + var barRect = bar.__pictorialBarRect; + setLabelStyle(barRect, getLabelStatesModels(itemModel), { + labelFetcher: opt.seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(opt.seriesModel.getData(), dataIndex), + inheritColor: symbolMeta.style.fill, + defaultOpacity: symbolMeta.style.opacity, + defaultOutsidePosition: barPositionOutside + }); + toggleHoverEmphasis(bar, focus, blurScope, emphasisModel.get('disabled')); + } + + function toIntTimes(times) { + var roundedTimes = Math.round(times); // Escapse accurate error + + return Math.abs(times - roundedTimes) < 1e-4 ? roundedTimes : Math.ceil(times); + } + + var PictorialBarSeriesModel = + /** @class */ + function (_super) { + __extends(PictorialBarSeriesModel, _super); + + function PictorialBarSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PictorialBarSeriesModel.type; + _this.hasSymbolVisual = true; + _this.defaultSymbol = 'roundRect'; + return _this; + } + + PictorialBarSeriesModel.prototype.getInitialData = function (option) { + // Disable stack. + option.stack = null; + return _super.prototype.getInitialData.apply(this, arguments); + }; + + PictorialBarSeriesModel.type = 'series.pictorialBar'; + PictorialBarSeriesModel.dependencies = ['grid']; + PictorialBarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, { + symbol: 'circle', + symbolSize: null, + symbolRotate: null, + symbolPosition: null, + symbolOffset: null, + symbolMargin: null, + symbolRepeat: false, + symbolRepeatDirection: 'end', + symbolClip: false, + symbolBoundingData: null, + symbolPatternSize: 400, + barGap: '-100%', + // z can be set in data item, which is z2 actually. + // Disable progressive + progressive: 0, + emphasis: { + // By default pictorialBar do not hover scale. Hover scale is not suitable + // for the case that both has foreground and background. + scale: false + }, + select: { + itemStyle: { + borderColor: '#212121' + } + } + }); + return PictorialBarSeriesModel; + }(BaseBarSeriesModel); + + function install$o(registers) { + registers.registerChartView(PictorialBarView); + registers.registerSeriesModel(PictorialBarSeriesModel); + registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'pictorialBar')); // Do layout after other overall layout, which can preapre some informations. + + registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('pictorialBar')); + } + + var ThemeRiverView = + /** @class */ + function (_super) { + __extends(ThemeRiverView, _super); + + function ThemeRiverView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ThemeRiverView.type; + _this._layers = []; + return _this; + } + + ThemeRiverView.prototype.render = function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var self = this; + var group = this.group; + var layersSeries = seriesModel.getLayerSeries(); + var layoutInfo = data.getLayout('layoutInfo'); + var rect = layoutInfo.rect; + var boundaryGap = layoutInfo.boundaryGap; + group.x = 0; + group.y = rect.y + boundaryGap[0]; + + function keyGetter(item) { + return item.name; + } + + var dataDiffer = new DataDiffer(this._layersSeries || [], layersSeries, keyGetter, keyGetter); + var newLayersGroups = []; + dataDiffer.add(bind(process, this, 'add')).update(bind(process, this, 'update')).remove(bind(process, this, 'remove')).execute(); + + function process(status, idx, oldIdx) { + var oldLayersGroups = self._layers; + + if (status === 'remove') { + group.remove(oldLayersGroups[idx]); + return; + } + + var points0 = []; + var points1 = []; + var style; + var indices = layersSeries[idx].indices; + var j = 0; + + for (; j < indices.length; j++) { + var layout = data.getItemLayout(indices[j]); + var x = layout.x; + var y0 = layout.y0; + var y = layout.y; + points0.push(x, y0); + points1.push(x, y0 + y); + style = data.getItemVisual(indices[j], 'style'); + } + + var polygon; + var textLayout = data.getItemLayout(indices[0]); + var labelModel = seriesModel.getModel('label'); + var margin = labelModel.get('margin'); + var emphasisModel = seriesModel.getModel('emphasis'); + + if (status === 'add') { + var layerGroup = newLayersGroups[idx] = new Group(); + polygon = new ECPolygon({ + shape: { + points: points0, + stackedOnPoints: points1, + smooth: 0.4, + stackedOnSmooth: 0.4, + smoothConstraint: false + }, + z2: 0 + }); + layerGroup.add(polygon); + group.add(layerGroup); + + if (seriesModel.isAnimationEnabled()) { + polygon.setClipPath(createGridClipShape$2(polygon.getBoundingRect(), seriesModel, function () { + polygon.removeClipPath(); + })); + } + } else { + var layerGroup = oldLayersGroups[oldIdx]; + polygon = layerGroup.childAt(0); + group.add(layerGroup); + newLayersGroups[idx] = layerGroup; + updateProps(polygon, { + shape: { + points: points0, + stackedOnPoints: points1 + } + }, seriesModel); + saveOldStyle(polygon); + } + + setLabelStyle(polygon, getLabelStatesModels(seriesModel), { + labelDataIndex: indices[j - 1], + defaultText: data.getName(indices[j - 1]), + inheritColor: style.fill + }, { + normal: { + verticalAlign: 'middle' // align: 'right' + + } + }); + polygon.setTextConfig({ + position: null, + local: true + }); + var labelEl = polygon.getTextContent(); // TODO More label position options. + + if (labelEl) { + labelEl.x = textLayout.x - margin; + labelEl.y = textLayout.y0 + textLayout.y / 2; + } + + polygon.useStyle(style); + data.setItemGraphicEl(idx, polygon); + setStatesStylesFromModel(polygon, seriesModel); + toggleHoverEmphasis(polygon, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + } + + this._layersSeries = layersSeries; + this._layers = newLayersGroups; + }; + + ThemeRiverView.type = 'themeRiver'; + return ThemeRiverView; + }(ChartView); + + function createGridClipShape$2(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + x: rect.x - 50, + width: rect.width + 100, + height: rect.height + 20 + } + }, seriesModel, cb); + return rectEl; + } + + var DATA_NAME_INDEX = 2; + + var ThemeRiverSeriesModel = + /** @class */ + function (_super) { + __extends(ThemeRiverSeriesModel, _super); + + function ThemeRiverSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ThemeRiverSeriesModel.type; + return _this; + } + + /** + * @override + */ + + + ThemeRiverSeriesModel.prototype.init = function (option) { + // eslint-disable-next-line + _super.prototype.init.apply(this, arguments); // Put this function here is for the sake of consistency of code style. + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + + + this.legendVisualProvider = new LegendVisualProvider(bind(this.getData, this), bind(this.getRawData, this)); + }; + /** + * If there is no value of a certain point in the time for some event,set it value to 0. + * + * @param {Array} data initial data in the option + * @return {Array} + */ + + + ThemeRiverSeriesModel.prototype.fixData = function (data) { + var rawDataLength = data.length; + /** + * Make sure every layer data get the same keys. + * The value index tells which layer has visited. + * { + * 2014/01/01: -1 + * } + */ + + var timeValueKeys = {}; // grouped data by name + + var groupResult = groupData(data, function (item) { + if (!timeValueKeys.hasOwnProperty(item[0] + '')) { + timeValueKeys[item[0] + ''] = -1; + } + + return item[2]; + }); + var layerData = []; + groupResult.buckets.each(function (items, key) { + layerData.push({ + name: key, + dataList: items + }); + }); + var layerNum = layerData.length; + + for (var k = 0; k < layerNum; ++k) { + var name_1 = layerData[k].name; + + for (var j = 0; j < layerData[k].dataList.length; ++j) { + var timeValue = layerData[k].dataList[j][0] + ''; + timeValueKeys[timeValue] = k; + } + + for (var timeValue in timeValueKeys) { + if (timeValueKeys.hasOwnProperty(timeValue) && timeValueKeys[timeValue] !== k) { + timeValueKeys[timeValue] = k; + data[rawDataLength] = [timeValue, 0, name_1]; + rawDataLength++; + } + } + } + + return data; + }; + /** + * @override + * @param option the initial option that user gived + * @param ecModel the model object for themeRiver option + */ + + + ThemeRiverSeriesModel.prototype.getInitialData = function (option, ecModel) { + var singleAxisModel = this.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + var axisType = singleAxisModel.get('type'); // filter the data item with the value of label is undefined + + var filterData = filter(option.data, function (dataItem) { + return dataItem[2] !== undefined; + }); // ??? TODO design a stage to transfer data for themeRiver and lines? + + var data = this.fixData(filterData || []); + var nameList = []; + var nameMap = this.nameMap = createHashMap(); + var count = 0; + + for (var i = 0; i < data.length; ++i) { + nameList.push(data[i][DATA_NAME_INDEX]); + + if (!nameMap.get(data[i][DATA_NAME_INDEX])) { + nameMap.set(data[i][DATA_NAME_INDEX], count); + count++; + } + } + + var dimensions = prepareSeriesDataSchema(data, { + coordDimensions: ['single'], + dimensionsDefine: [{ + name: 'time', + type: getDimensionTypeByAxis(axisType) + }, { + name: 'value', + type: 'float' + }, { + name: 'name', + type: 'ordinal' + }], + encodeDefine: { + single: 0, + value: 1, + itemName: 2 + } + }).dimensions; + var list = new SeriesData(dimensions, this); + list.initData(data); + return list; + }; + /** + * The raw data is divided into multiple layers and each layer + * has same name. + */ + + + ThemeRiverSeriesModel.prototype.getLayerSeries = function () { + var data = this.getData(); + var lenCount = data.count(); + var indexArr = []; + + for (var i = 0; i < lenCount; ++i) { + indexArr[i] = i; + } + + var timeDim = data.mapDimension('single'); // data group by name + + var groupResult = groupData(indexArr, function (index) { + return data.get('name', index); + }); + var layerSeries = []; + groupResult.buckets.each(function (items, key) { + items.sort(function (index1, index2) { + return data.get(timeDim, index1) - data.get(timeDim, index2); + }); + layerSeries.push({ + name: key, + indices: items + }); + }); + return layerSeries; + }; + /** + * Get data indices for show tooltip content + */ + + + ThemeRiverSeriesModel.prototype.getAxisTooltipData = function (dim, value, baseAxis) { + if (!isArray(dim)) { + dim = dim ? [dim] : []; + } + + var data = this.getData(); + var layerSeries = this.getLayerSeries(); + var indices = []; + var layerNum = layerSeries.length; + var nestestValue; + + for (var i = 0; i < layerNum; ++i) { + var minDist = Number.MAX_VALUE; + var nearestIdx = -1; + var pointNum = layerSeries[i].indices.length; + + for (var j = 0; j < pointNum; ++j) { + var theValue = data.get(dim[0], layerSeries[i].indices[j]); + var dist = Math.abs(theValue - value); + + if (dist <= minDist) { + nestestValue = theValue; + minDist = dist; + nearestIdx = layerSeries[i].indices[j]; + } + } + + indices.push(nearestIdx); + } + + return { + dataIndices: indices, + nestestValue: nestestValue + }; + }; + + ThemeRiverSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var name = data.getName(dataIndex); + var value = data.get(data.mapDimension('value'), dataIndex); + return createTooltipMarkup('nameValue', { + name: name, + value: value + }); + }; + + ThemeRiverSeriesModel.type = 'series.themeRiver'; + ThemeRiverSeriesModel.dependencies = ['singleAxis']; + ThemeRiverSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + colorBy: 'data', + coordinateSystem: 'singleAxis', + // gap in axis's orthogonal orientation + boundaryGap: ['10%', '10%'], + // legendHoverLink: true, + singleAxisIndex: 0, + animationEasing: 'linear', + label: { + margin: 4, + show: true, + position: 'left', + fontSize: 11 + }, + emphasis: { + label: { + show: true + } + } + }; + return ThemeRiverSeriesModel; + }(SeriesModel); + + function themeRiverLayout(ecModel, api) { + ecModel.eachSeriesByType('themeRiver', function (seriesModel) { + var data = seriesModel.getData(); + var single = seriesModel.coordinateSystem; + var layoutInfo = {}; // use the axis boundingRect for view + + var rect = single.getRect(); + layoutInfo.rect = rect; + var boundaryGap = seriesModel.get('boundaryGap'); + var axis = single.getAxis(); + layoutInfo.boundaryGap = boundaryGap; + + if (axis.orient === 'horizontal') { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.height); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.height); + var height = rect.height - boundaryGap[0] - boundaryGap[1]; + doThemeRiverLayout(data, seriesModel, height); + } else { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.width); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.width); + var width = rect.width - boundaryGap[0] - boundaryGap[1]; + doThemeRiverLayout(data, seriesModel, width); + } + + data.setLayout('layoutInfo', layoutInfo); + }); + } + + /** + * The layout information about themeriver + * + * @param data data in the series + * @param seriesModel the model object of themeRiver series + * @param height value used to compute every series height + */ + + function doThemeRiverLayout(data, seriesModel, height) { + if (!data.count()) { + return; + } + + var coordSys = seriesModel.coordinateSystem; // the data in each layer are organized into a series. + + var layerSeries = seriesModel.getLayerSeries(); // the points in each layer. + + var timeDim = data.mapDimension('single'); + var valueDim = data.mapDimension('value'); + var layerPoints = map(layerSeries, function (singleLayer) { + return map(singleLayer.indices, function (idx) { + var pt = coordSys.dataToPoint(data.get(timeDim, idx)); + pt[1] = data.get(valueDim, idx); + return pt; + }); + }); + var base = computeBaseline(layerPoints); + var baseLine = base.y0; + var ky = height / base.max; // set layout information for each item. + + var n = layerSeries.length; + var m = layerSeries[0].indices.length; + var baseY0; + + for (var j = 0; j < m; ++j) { + baseY0 = baseLine[j] * ky; + data.setItemLayout(layerSeries[0].indices[j], { + layerIndex: 0, + x: layerPoints[0][j][0], + y0: baseY0, + y: layerPoints[0][j][1] * ky + }); + + for (var i = 1; i < n; ++i) { + baseY0 += layerPoints[i - 1][j][1] * ky; + data.setItemLayout(layerSeries[i].indices[j], { + layerIndex: i, + x: layerPoints[i][j][0], + y0: baseY0, + y: layerPoints[i][j][1] * ky + }); + } + } + } + + /** + * Compute the baseLine of the rawdata + * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics + * + * @param data the points in each layer + */ + + + function computeBaseline(data) { + var layerNum = data.length; + var pointNum = data[0].length; + var sums = []; + var y0 = []; + var max = 0; + + for (var i = 0; i < pointNum; ++i) { + var temp = 0; + + for (var j = 0; j < layerNum; ++j) { + temp += data[j][i][1]; + } + + if (temp > max) { + max = temp; + } + + sums.push(temp); + } + + for (var k = 0; k < pointNum; ++k) { + y0[k] = (max - sums[k]) / 2; + } + + max = 0; + + for (var l = 0; l < pointNum; ++l) { + var sum = sums[l] + y0[l]; + + if (sum > max) { + max = sum; + } + } + + return { + y0: y0, + max: max + }; + } + + function install$p(registers) { + registers.registerChartView(ThemeRiverView); + registers.registerSeriesModel(ThemeRiverSeriesModel); + registers.registerLayout(themeRiverLayout); + registers.registerProcessor(dataFilter('themeRiver')); + } + + var DEFAULT_SECTOR_Z = 2; + var DEFAULT_TEXT_Z = 4; + /** + * Sunburstce of Sunburst including Sector, Label, LabelLine + */ + + var SunburstPiece = + /** @class */ + function (_super) { + __extends(SunburstPiece, _super); + + function SunburstPiece(node, seriesModel, ecModel, api) { + var _this = _super.call(this) || this; + + _this.z2 = DEFAULT_SECTOR_Z; + _this.textConfig = { + inside: true + }; + getECData(_this).seriesIndex = seriesModel.seriesIndex; + var text = new ZRText({ + z2: DEFAULT_TEXT_Z, + silent: node.getModel().get(['label', 'silent']) + }); + + _this.setTextContent(text); + + _this.updateData(true, node, seriesModel, ecModel, api); + + return _this; + } + + SunburstPiece.prototype.updateData = function (firstCreate, node, // state: 'emphasis' | 'normal' | 'highlight' | 'downplay', + seriesModel, ecModel, api) { + this.node = node; + node.piece = this; + seriesModel = seriesModel || this._seriesModel; + ecModel = ecModel || this._ecModel; + var sector = this; + getECData(sector).dataIndex = node.dataIndex; + var itemModel = node.getModel(); + var emphasisModel = itemModel.getModel('emphasis'); + var layout = node.getLayout(); + var sectorShape = extend({}, layout); + sectorShape.label = null; + var normalStyle = node.getVisual('style'); + normalStyle.lineJoin = 'bevel'; + var decal = node.getVisual('decal'); + + if (decal) { + normalStyle.decal = createOrUpdatePatternFromDecal(decal, api); + } + + var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape, true); + extend(sectorShape, cornerRadius); + each(SPECIAL_STATES, function (stateName) { + var state = sector.ensureState(stateName); + var itemStyleModel = itemModel.getModel([stateName, 'itemStyle']); + state.style = itemStyleModel.getItemStyle(); // border radius + + var cornerRadius = getSectorCornerRadius(itemStyleModel, sectorShape); + + if (cornerRadius) { + state.shape = cornerRadius; + } + }); + + if (firstCreate) { + sector.setShape(sectorShape); + sector.shape.r = layout.r0; + updateProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, node.dataIndex); + } else { + // Disable animation for gradient since no interpolation method + // is supported for gradient + updateProps(sector, { + shape: sectorShape + }, seriesModel); + saveOldStyle(sector); + } + + sector.useStyle(normalStyle); + + this._updateLabel(seriesModel); + + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + this._seriesModel = seriesModel || this._seriesModel; + this._ecModel = ecModel || this._ecModel; + var focus = emphasisModel.get('focus'); + var focusOrIndices = focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : focus; + toggleHoverEmphasis(this, focusOrIndices, emphasisModel.get('blurScope'), emphasisModel.get('disabled')); + }; + + SunburstPiece.prototype._updateLabel = function (seriesModel) { + var _this = this; + + var itemModel = this.node.getModel(); + var normalLabelModel = itemModel.getModel('label'); + var layout = this.node.getLayout(); + var angle = layout.endAngle - layout.startAngle; + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + var sector = this; + var label = sector.getTextContent(); + var dataIndex = this.node.dataIndex; + var labelMinAngle = normalLabelModel.get('minAngle') / 180 * Math.PI; + var isNormalShown = normalLabelModel.get('show') && !(labelMinAngle != null && Math.abs(angle) < labelMinAngle); + label.ignore = !isNormalShown; // TODO use setLabelStyle + + each(DISPLAY_STATES, function (stateName) { + var labelStateModel = stateName === 'normal' ? itemModel.getModel('label') : itemModel.getModel([stateName, 'label']); + var isNormal = stateName === 'normal'; + var state = isNormal ? label : label.ensureState(stateName); + var text = seriesModel.getFormattedLabel(dataIndex, stateName); + + if (isNormal) { + text = text || _this.node.name; + } + + state.style = createTextStyle(labelStateModel, {}, null, stateName !== 'normal', true); + + if (text) { + state.style.text = text; + } // Not displaying text when angle is too small + + + var isShown = labelStateModel.get('show'); + + if (isShown != null && !isNormal) { + state.ignore = !isShown; + } + + var labelPosition = getLabelAttr(labelStateModel, 'position'); + var sectorState = isNormal ? sector : sector.states[stateName]; + var labelColor = sectorState.style.fill; + sectorState.textConfig = { + outsideFill: labelStateModel.get('color') === 'inherit' ? labelColor : null, + inside: labelPosition !== 'outside' + }; + var r; + var labelPadding = getLabelAttr(labelStateModel, 'distance') || 0; + var textAlign = getLabelAttr(labelStateModel, 'align'); + + if (labelPosition === 'outside') { + r = layout.r + labelPadding; + textAlign = midAngle > Math.PI / 2 ? 'right' : 'left'; + } else { + if (!textAlign || textAlign === 'center') { + // Put label in the center if it's a circle + if (angle === 2 * Math.PI && layout.r0 === 0) { + r = 0; + } else { + r = (layout.r + layout.r0) / 2; + } + + textAlign = 'center'; + } else if (textAlign === 'left') { + r = layout.r0 + labelPadding; + + if (midAngle > Math.PI / 2) { + textAlign = 'right'; + } + } else if (textAlign === 'right') { + r = layout.r - labelPadding; + + if (midAngle > Math.PI / 2) { + textAlign = 'left'; + } + } + } + + state.style.align = textAlign; + state.style.verticalAlign = getLabelAttr(labelStateModel, 'verticalAlign') || 'middle'; + state.x = r * dx + layout.cx; + state.y = r * dy + layout.cy; + var rotateType = getLabelAttr(labelStateModel, 'rotate'); + var rotate = 0; + + if (rotateType === 'radial') { + rotate = -midAngle; + + if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } else if (rotateType === 'tangential') { + rotate = Math.PI / 2 - midAngle; + + if (rotate > Math.PI / 2) { + rotate -= Math.PI; + } else if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } else if (isNumber(rotateType)) { + rotate = rotateType * Math.PI / 180; + } + + state.rotation = rotate; + }); + + function getLabelAttr(model, name) { + var stateAttr = model.get(name); + + if (stateAttr == null) { + return normalLabelModel.get(name); + } + + return stateAttr; + } + + label.dirtyStyle(); + }; + + return SunburstPiece; + }(Sector); + + var ROOT_TO_NODE_ACTION = 'sunburstRootToNode'; + var HIGHLIGHT_ACTION = 'sunburstHighlight'; + var UNHIGHLIGHT_ACTION = 'sunburstUnhighlight'; + + function installSunburstAction(registers) { + registers.registerAction({ + type: ROOT_TO_NODE_ACTION, + update: 'updateView' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'series', + subType: 'sunburst', + query: payload + }, handleRootToNode); + + function handleRootToNode(model, index) { + var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION], model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown'; + } + + model.resetViewRoot(targetInfo.node); + } + } + }); + registers.registerAction({ + type: HIGHLIGHT_ACTION, + update: 'none' + }, function (payload, ecModel, api) { + // Clone + payload = extend({}, payload); + ecModel.eachComponent({ + mainType: 'series', + subType: 'sunburst', + query: payload + }, handleHighlight); + + function handleHighlight(model) { + var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model); + + if (targetInfo) { + payload.dataIndex = targetInfo.node.dataIndex; + } + } + + if ("development" !== 'production') { + deprecateReplaceLog('highlight', 'sunburstHighlight'); + } // Fast forward action + + + api.dispatchAction(extend(payload, { + type: 'highlight' + })); + }); + registers.registerAction({ + type: UNHIGHLIGHT_ACTION, + update: 'updateView' + }, function (payload, ecModel, api) { + payload = extend({}, payload); + + if ("development" !== 'production') { + deprecateReplaceLog('downplay', 'sunburstUnhighlight'); + } + + api.dispatchAction(extend(payload, { + type: 'downplay' + })); + }); + } + + var SunburstView = + /** @class */ + function (_super) { + __extends(SunburstView, _super); + + function SunburstView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SunburstView.type; + return _this; + } + + SunburstView.prototype.render = function (seriesModel, ecModel, api, // @ts-ignore + payload) { + var self = this; + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + var data = seriesModel.getData(); + var virtualRoot = data.tree.root; + var newRoot = seriesModel.getViewRoot(); + var group = this.group; + var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData'); + var newChildren = []; + newRoot.eachNode(function (node) { + newChildren.push(node); + }); + var oldChildren = this._oldChildren || []; + dualTravel(newChildren, oldChildren); + renderRollUp(virtualRoot, newRoot); + + this._initEvents(); + + this._oldChildren = newChildren; + + function dualTravel(newChildren, oldChildren) { + if (newChildren.length === 0 && oldChildren.length === 0) { + return; + } + + new DataDiffer(oldChildren, newChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute(); + + function getKey(node) { + return node.getId(); + } + + function processNode(newIdx, oldIdx) { + var newNode = newIdx == null ? null : newChildren[newIdx]; + var oldNode = oldIdx == null ? null : oldChildren[oldIdx]; + doRenderNode(newNode, oldNode); + } + } + + function doRenderNode(newNode, oldNode) { + if (!renderLabelForZeroData && newNode && !newNode.getValue()) { + // Not render data with value 0 + newNode = null; + } + + if (newNode !== virtualRoot && oldNode !== virtualRoot) { + if (oldNode && oldNode.piece) { + if (newNode) { + // Update + oldNode.piece.updateData(false, newNode, seriesModel, ecModel, api); // For tooltip + + data.setItemGraphicEl(newNode.dataIndex, oldNode.piece); + } else { + // Remove + removeNode(oldNode); + } + } else if (newNode) { + // Add + var piece = new SunburstPiece(newNode, seriesModel, ecModel, api); + group.add(piece); // For tooltip + + data.setItemGraphicEl(newNode.dataIndex, piece); + } + } + } + + function removeNode(node) { + if (!node) { + return; + } + + if (node.piece) { + group.remove(node.piece); + node.piece = null; + } + } + + function renderRollUp(virtualRoot, viewRoot) { + if (viewRoot.depth > 0) { + // Render + if (self.virtualPiece) { + // Update + self.virtualPiece.updateData(false, virtualRoot, seriesModel, ecModel, api); + } else { + // Add + self.virtualPiece = new SunburstPiece(virtualRoot, seriesModel, ecModel, api); + group.add(self.virtualPiece); + } // TODO event scope + + + viewRoot.piece.off('click'); + self.virtualPiece.on('click', function (e) { + self._rootToNode(viewRoot.parentNode); + }); + } else if (self.virtualPiece) { + // Remove + group.remove(self.virtualPiece); + self.virtualPiece = null; + } + } + }; + /** + * @private + */ + + + SunburstView.prototype._initEvents = function () { + var _this = this; + + this.group.off('click'); + this.group.on('click', function (e) { + var targetFound = false; + + var viewRoot = _this.seriesModel.getViewRoot(); + + viewRoot.eachNode(function (node) { + if (!targetFound && node.piece && node.piece === e.target) { + var nodeClick = node.getModel().get('nodeClick'); + + if (nodeClick === 'rootToNode') { + _this._rootToNode(node); + } else if (nodeClick === 'link') { + var itemModel = node.getModel(); + var link = itemModel.get('link'); + + if (link) { + var linkTarget = itemModel.get('target', true) || '_blank'; + windowOpen(link, linkTarget); + } + } + + targetFound = true; + } + }); + }); + }; + /** + * @private + */ + + + SunburstView.prototype._rootToNode = function (node) { + if (node !== this.seriesModel.getViewRoot()) { + this.api.dispatchAction({ + type: ROOT_TO_NODE_ACTION, + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: node + }); + } + }; + /** + * @implement + */ + + + SunburstView.prototype.containPoint = function (point, seriesModel) { + var treeRoot = seriesModel.getData(); + var itemLayout = treeRoot.getItemLayout(0); + + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + }; + + SunburstView.type = 'sunburst'; + return SunburstView; + }(ChartView); + + var SunburstSeriesModel = + /** @class */ + function (_super) { + __extends(SunburstSeriesModel, _super); + + function SunburstSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SunburstSeriesModel.type; + _this.ignoreStyleOnData = true; + return _this; + } + + SunburstSeriesModel.prototype.getInitialData = function (option, ecModel) { + // Create a virtual root. + var root = { + name: option.name, + children: option.data + }; + completeTreeValue$1(root); + var levelModels = this._levelModels = map(option.levels || [], function (levelDefine) { + return new Model(levelDefine, this, ecModel); + }, this); // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + + var tree = Tree.createTree(root, this, beforeLink); + + function beforeLink(nodeData) { + nodeData.wrapMethod('getItemModel', function (model, idx) { + var node = tree.getNodeByDataIndex(idx); + var levelModel = levelModels[node.depth]; + levelModel && (model.parentModel = levelModel); + return model; + }); + } + + return tree.data; + }; + + SunburstSeriesModel.prototype.optionUpdated = function () { + this.resetViewRoot(); + }; + /* + * @override + */ + + + SunburstSeriesModel.prototype.getDataParams = function (dataIndex) { + var params = _super.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treePathInfo = wrapTreePathInfo(node, this); + return params; + }; + + SunburstSeriesModel.prototype.getLevelModel = function (node) { + return this._levelModels && this._levelModels[node.depth]; + }; + + SunburstSeriesModel.prototype.getViewRoot = function () { + return this._viewRoot; + }; + + SunburstSeriesModel.prototype.resetViewRoot = function (viewRoot) { + viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot; + var root = this.getRawData().tree.root; + + if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) { + this._viewRoot = root; + } + }; + + SunburstSeriesModel.prototype.enableAriaDecal = function () { + enableAriaDecalForTree(this); + }; + + SunburstSeriesModel.type = 'series.sunburst'; + SunburstSeriesModel.defaultOption = { + // zlevel: 0, + z: 2, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // If still show when all data zero. + stillShowZeroSum: true, + // 'rootToNode', 'link', or false + nodeClick: 'rootToNode', + renderLabelForZeroData: false, + label: { + // could be: 'radial', 'tangential', or 'none' + rotate: 'radial', + show: true, + opacity: 1, + // 'left' is for inner side of inside, and 'right' is for outter + // side for inside + align: 'center', + position: 'inside', + distance: 5, + silent: true + }, + itemStyle: { + borderWidth: 1, + borderColor: 'white', + borderType: 'solid', + shadowBlur: 0, + shadowColor: 'rgba(0, 0, 0, 0.2)', + shadowOffsetX: 0, + shadowOffsetY: 0, + opacity: 1 + }, + emphasis: { + focus: 'descendant' + }, + blur: { + itemStyle: { + opacity: 0.2 + }, + label: { + opacity: 0.1 + } + }, + // Animation type canbe expansion, scale + animationType: 'expansion', + animationDuration: 1000, + animationDurationUpdate: 500, + data: [], + + /** + * Sort order. + * + * Valid values: 'desc', 'asc', null, or callback function. + * 'desc' and 'asc' for descend and ascendant order; + * null for not sorting; + * example of callback function: + * function(nodeA, nodeB) { + * return nodeA.getValue() - nodeB.getValue(); + * } + */ + sort: 'desc' + }; + return SunburstSeriesModel; + }(SeriesModel); + + function completeTreeValue$1(dataNode) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + each(dataNode.children, function (child) { + completeTreeValue$1(child); + var childValue = child.value; // TODO First value of array must be a number + + isArray(childValue) && (childValue = childValue[0]); + sum += childValue; + }); + var thisValue = dataNode.value; + + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } // Value should not less than 0. + + + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue; + } + + var RADIAN$2 = Math.PI / 180; + + function sunburstLayout(seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + + if (!isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width); + var cy = parsePercent$1(center[1], height); + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + var startAngle = -seriesModel.get('startAngle') * RADIAN$2; + var minAngle = seriesModel.get('minAngle') * RADIAN$2; + var virtualRoot = seriesModel.getData().tree.root; + var treeRoot = seriesModel.getViewRoot(); + var rootDepth = treeRoot.depth; + var sort = seriesModel.get('sort'); + + if (sort != null) { + initChildren$1(treeRoot, sort); + } + + var validDataCount = 0; + each(treeRoot.children, function (child) { + !isNaN(child.getValue()) && validDataCount++; + }); + var sum = treeRoot.getValue(); // Sum may be 0 + + var unitRadian = Math.PI / (sum || validDataCount) * 2; + var renderRollupNode = treeRoot.depth > 0; + var levels = treeRoot.height - (renderRollupNode ? -1 : 1); + var rPerLevel = (r - r0) / (levels || 1); + var clockwise = seriesModel.get('clockwise'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // In the case some sector angle is smaller than minAngle + // let restAngle = PI2; + // let valueSumLargerThanMinAngle = 0; + + var dir = clockwise ? 1 : -1; + /** + * Render a tree + * @return increased angle + */ + + var renderNode = function (node, startAngle) { + if (!node) { + return; + } + + var endAngle = startAngle; // Render self + + if (node !== virtualRoot) { + // Tree node is virtual, so it doesn't need to be drawn + var value = node.getValue(); + var angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian; + + if (angle < minAngle) { + angle = minAngle; // restAngle -= minAngle; + } // else { + // valueSumLargerThanMinAngle += value; + // } + + + endAngle = startAngle + dir * angle; + var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1); + var rStart = r0 + rPerLevel * depth; + var rEnd = r0 + rPerLevel * (depth + 1); + var levelModel = seriesModel.getLevelModel(node); + + if (levelModel) { + var r0_1 = levelModel.get('r0', true); + var r_1 = levelModel.get('r', true); + var radius_1 = levelModel.get('radius', true); + + if (radius_1 != null) { + r0_1 = radius_1[0]; + r_1 = radius_1[1]; + } + + r0_1 != null && (rStart = parsePercent$1(r0_1, size / 2)); + r_1 != null && (rEnd = parsePercent$1(r_1, size / 2)); + } + + node.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } // Render children + + + if (node.children && node.children.length) { + // currentAngle = startAngle; + var siblingAngle_1 = 0; + each(node.children, function (node) { + siblingAngle_1 += renderNode(node, startAngle + siblingAngle_1); + }); + } + + return endAngle - startAngle; + }; // Virtual root node for roll up + + + if (renderRollupNode) { + var rStart = r0; + var rEnd = r0 + rPerLevel; + var angle = Math.PI * 2; + virtualRoot.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: startAngle + angle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } + + renderNode(treeRoot, startAngle); + }); + } + + /** + * Init node children by order and update visual + */ + + function initChildren$1(node, sortOrder) { + var children = node.children || []; + node.children = sort$2(children, sortOrder); // Init children recursively + + if (children.length) { + each(node.children, function (child) { + initChildren$1(child, sortOrder); + }); + } + } + + /** + * Sort children nodes + * + * @param {TreeNode[]} children children of node to be sorted + * @param {string | function | null} sort sort method + * See SunburstSeries.js for details. + */ + + + function sort$2(children, sortOrder) { + if (isFunction(sortOrder)) { + var sortTargets = map(children, function (child, idx) { + var value = child.getValue(); + return { + params: { + depth: child.depth, + height: child.height, + dataIndex: child.dataIndex, + getValue: function () { + return value; + } + }, + index: idx + }; + }); + sortTargets.sort(function (a, b) { + return sortOrder(a.params, b.params); + }); + return map(sortTargets, function (target) { + return children[target.index]; + }); + } else { + var isAsc_1 = sortOrder === 'asc'; + return children.sort(function (a, b) { + var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1); + return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff; + }); + } + } + + function sunburstVisual(ecModel) { + var paletteScope = {}; // Default color strategy + + function pickColor(node, seriesModel, treeHeight) { + // Choose color from palette based on the first level. + var current = node; + + while (current && current.depth > 1) { + current = current.parentNode; + } + + var color = seriesModel.getColorFromPalette(current.name || current.dataIndex + '', paletteScope); + + if (node.depth > 1 && isString(color)) { + // Lighter on the deeper level. + color = lift(color, (node.depth - 1) / (treeHeight - 1) * 0.5); + } + + return color; + } + + ecModel.eachSeriesByType('sunburst', function (seriesModel) { + var data = seriesModel.getData(); + var tree = data.tree; + tree.eachNode(function (node) { + var model = node.getModel(); + var style = model.getModel('itemStyle').getItemStyle(); + + if (!style.fill) { + style.fill = pickColor(node, seriesModel, tree.root.height); + } + + var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style'); + extend(existsStyle, style); + }); + }); + } + + function install$q(registers) { + registers.registerChartView(SunburstView); + registers.registerSeriesModel(SunburstSeriesModel); + registers.registerLayout(curry(sunburstLayout, 'sunburst')); + registers.registerProcessor(curry(dataFilter, 'sunburst')); + registers.registerVisual(sunburstVisual); + installSunburstAction(registers); + } + + // `visual('color') visual('borderColor')` is supported. + + var STYLE_VISUAL_TYPE = { + color: 'fill', + borderColor: 'stroke' + }; + var NON_STYLE_VISUAL_PROPS = { + symbol: 1, + symbolSize: 1, + symbolKeepAspect: 1, + legendIcon: 1, + visualMeta: 1, + liftZ: 1, + decal: 1 + }; + var customInnerStore = makeInner(); + + var CustomSeriesModel = + /** @class */ + function (_super) { + __extends(CustomSeriesModel, _super); + + function CustomSeriesModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CustomSeriesModel.type; + return _this; + } + + CustomSeriesModel.prototype.optionUpdated = function () { + this.currentZLevel = this.get('zlevel', true); + this.currentZ = this.get('z', true); + }; + + CustomSeriesModel.prototype.getInitialData = function (option, ecModel) { + return createSeriesData(null, this); + }; + + CustomSeriesModel.prototype.getDataParams = function (dataIndex, dataType, el) { + var params = _super.prototype.getDataParams.call(this, dataIndex, dataType); + + el && (params.info = customInnerStore(el).info); + return params; + }; + + CustomSeriesModel.type = 'series.custom'; + CustomSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar']; + CustomSeriesModel.defaultOption = { + coordinateSystem: 'cartesian2d', + // zlevel: 0, + z: 2, + legendHoverLink: true, + // Custom series will not clip by default. + // Some case will use custom series to draw label + // For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight + clip: false // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + // Polar coordinate system + // polarIndex: 0, + // Geo coordinate system + // geoIndex: 0, + + }; + return CustomSeriesModel; + }(SeriesModel); + + function dataToCoordSize(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['x', 'y'], function (dim, dimIdx) { + var axis = this.getAxis(dim); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + }, this); + } + + function cartesianPrepareCustom(coordSys) { + var rect = coordSys.master.getRect(); + return { + coordSys: { + // The name exposed to user is always 'cartesian2d' but not 'grid'. + type: 'cartesian2d', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (data) { + // do not provide "out" param + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize, coordSys) + } + }; + } + + function dataToCoordSize$1(dataSize, dataItem) { + dataItem = dataItem || [0, 0]; + return map([0, 1], function (dimIdx) { + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var p1 = []; + var p2 = []; + p1[dimIdx] = val - halfSize; + p2[dimIdx] = val + halfSize; + p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx]; + return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]); + }, this); + } + + function geoPrepareCustom(coordSys) { + var rect = coordSys.getBoundingRect(); + return { + coordSys: { + type: 'geo', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + zoom: coordSys.getZoom() + }, + api: { + coord: function (data) { + // do not provide "out" and noRoam param, + // Compatible with this usage: + // echarts.util.map(item.points, api.coord) + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize$1, coordSys) + } + }; + } + + function dataToCoordSize$2(dataSize, dataItem) { + // dataItem is necessary in log axis. + var axis = this.getAxis(); + var val = dataItem instanceof Array ? dataItem[0] : dataItem; + var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2; + return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + } + + function singlePrepareCustom(coordSys) { + var rect = coordSys.getRect(); + return { + coordSys: { + type: 'singleAxis', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (val) { + // do not provide "out" param + return coordSys.dataToPoint(val); + }, + size: bind(dataToCoordSize$2, coordSys) + } + }; + } + + function dataToCoordSize$3(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['Radius', 'Angle'], function (dim, dimIdx) { + var getterName = 'get' + dim + 'Axis'; // TODO: TYPE Check Angle Axis + + var axis = this[getterName](); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var result = axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + + if (dim === 'Angle') { + result = result * Math.PI / 180; + } + + return result; + }, this); + } + + function polarPrepareCustom(coordSys) { + var radiusAxis = coordSys.getRadiusAxis(); + var angleAxis = coordSys.getAngleAxis(); + var radius = radiusAxis.getExtent(); + radius[0] > radius[1] && radius.reverse(); + return { + coordSys: { + type: 'polar', + cx: coordSys.cx, + cy: coordSys.cy, + r: radius[1], + r0: radius[0] + }, + api: { + coord: function (data) { + var radius = radiusAxis.dataToRadius(data[0]); + var angle = angleAxis.dataToAngle(data[1]); + var coord = coordSys.coordToPoint([radius, angle]); + coord.push(radius, angle * Math.PI / 180); + return coord; + }, + size: bind(dataToCoordSize$3, coordSys) + } + }; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function calendarPrepareCustom(coordSys) { + var rect = coordSys.getRect(); + var rangeInfo = coordSys.getRangeInfo(); + return { + coordSys: { + type: 'calendar', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + cellWidth: coordSys.getCellWidth(), + cellHeight: coordSys.getCellHeight(), + rangeInfo: { + start: rangeInfo.start, + end: rangeInfo.end, + weeks: rangeInfo.weeks, + dayCount: rangeInfo.allDay + } + }, + api: { + coord: function (data, clamp) { + return coordSys.dataToPoint(data, clamp); + } + } + }; + } + + var deprecatedLogs = {}; + + /** + * Whether need to call `convertEC4CompatibleStyle`. + */ + + function isEC4CompatibleStyle(style, elType, hasOwnTextContentOption, hasOwnTextConfig) { + // Since echarts5, `RectText` is separated from its host element and style.text + // does not exist any more. The compat work brings some extra burden on performance. + // So we provide: + // `legacy: true` force make compat. + // `legacy: false`, force do not compat. + // `legacy` not set: auto detect wheter legacy. + // But in this case we do not compat (difficult to detect and rare case): + // Becuse custom series and graphic component support "merge", users may firstly + // only set `textStrokeWidth` style or secondly only set `text`. + return style && (style.legacy || style.legacy !== false && !hasOwnTextContentOption && !hasOwnTextConfig && elType !== 'tspan' // Difficult to detect whether legacy for a "text" el. + && (elType === 'text' || hasOwn(style, 'text'))); + } + + /** + * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format. + * @param hostStyle The properties might be modified. + * @return If be text el, `textContentStyle` and `textConfig` will not be retured. + * Otherwise a `textContentStyle` and `textConfig` will be created, whose props area + * retried from the `hostStyle`. + */ + + function convertFromEC4CompatibleStyle(hostStyle, elType, isNormal) { + var srcStyle = hostStyle; + var textConfig; + var textContent; + var textContentStyle; + + if (elType === 'text') { + textContentStyle = srcStyle; + } else { + textContentStyle = {}; + hasOwn(srcStyle, 'text') && (textContentStyle.text = srcStyle.text); + hasOwn(srcStyle, 'rich') && (textContentStyle.rich = srcStyle.rich); + hasOwn(srcStyle, 'textFill') && (textContentStyle.fill = srcStyle.textFill); + hasOwn(srcStyle, 'textStroke') && (textContentStyle.stroke = srcStyle.textStroke); + hasOwn(srcStyle, 'fontFamily') && (textContentStyle.fontFamily = srcStyle.fontFamily); + hasOwn(srcStyle, 'fontSize') && (textContentStyle.fontSize = srcStyle.fontSize); + hasOwn(srcStyle, 'fontStyle') && (textContentStyle.fontStyle = srcStyle.fontStyle); + hasOwn(srcStyle, 'fontWeight') && (textContentStyle.fontWeight = srcStyle.fontWeight); + textContent = { + type: 'text', + style: textContentStyle, + // ec4 do not support rectText trigger. + // And when text postion is different in normal and emphasis + // => hover text trigger emphasis; + // => text position changed, leave mouse pointer immediately; + // That might cause state incorrect. + silent: true + }; + textConfig = {}; + var hasOwnPos = hasOwn(srcStyle, 'textPosition'); + + if (isNormal) { + textConfig.position = hasOwnPos ? srcStyle.textPosition : 'inside'; + } else { + hasOwnPos && (textConfig.position = srcStyle.textPosition); + } + + hasOwn(srcStyle, 'textPosition') && (textConfig.position = srcStyle.textPosition); + hasOwn(srcStyle, 'textOffset') && (textConfig.offset = srcStyle.textOffset); + hasOwn(srcStyle, 'textRotation') && (textConfig.rotation = srcStyle.textRotation); + hasOwn(srcStyle, 'textDistance') && (textConfig.distance = srcStyle.textDistance); + } + + convertEC4CompatibleRichItem(textContentStyle, hostStyle); + each(textContentStyle.rich, function (richItem) { + convertEC4CompatibleRichItem(richItem, richItem); + }); + return { + textConfig: textConfig, + textContent: textContent + }; + } + + /** + * The result will be set to `out`. + */ + + function convertEC4CompatibleRichItem(out, richItem) { + if (!richItem) { + return; + } // (1) For simplicity, make textXXX properties (deprecated since ec5) has + // higher priority. For example, consider in ec4 `borderColor: 5, textBorderColor: 10` + // on a rect means `borderColor: 4` on the rect and `borderColor: 10` on an attached + // richText in ec5. + // (2) `out === richItem` if and only if `out` is text el or rich item. + // So we can overwite existing props in `out` since textXXX has higher priority. + + + richItem.font = richItem.textFont || richItem.font; + hasOwn(richItem, 'textStrokeWidth') && (out.lineWidth = richItem.textStrokeWidth); + hasOwn(richItem, 'textAlign') && (out.align = richItem.textAlign); + hasOwn(richItem, 'textVerticalAlign') && (out.verticalAlign = richItem.textVerticalAlign); + hasOwn(richItem, 'textLineHeight') && (out.lineHeight = richItem.textLineHeight); + hasOwn(richItem, 'textWidth') && (out.width = richItem.textWidth); + hasOwn(richItem, 'textHeight') && (out.height = richItem.textHeight); + hasOwn(richItem, 'textBackgroundColor') && (out.backgroundColor = richItem.textBackgroundColor); + hasOwn(richItem, 'textPadding') && (out.padding = richItem.textPadding); + hasOwn(richItem, 'textBorderColor') && (out.borderColor = richItem.textBorderColor); + hasOwn(richItem, 'textBorderWidth') && (out.borderWidth = richItem.textBorderWidth); + hasOwn(richItem, 'textBorderRadius') && (out.borderRadius = richItem.textBorderRadius); + hasOwn(richItem, 'textBoxShadowColor') && (out.shadowColor = richItem.textBoxShadowColor); + hasOwn(richItem, 'textBoxShadowBlur') && (out.shadowBlur = richItem.textBoxShadowBlur); + hasOwn(richItem, 'textBoxShadowOffsetX') && (out.shadowOffsetX = richItem.textBoxShadowOffsetX); + hasOwn(richItem, 'textBoxShadowOffsetY') && (out.shadowOffsetY = richItem.textBoxShadowOffsetY); + } + + /** + * Convert to pure echarts4 format style. + * `itemStyle` will be modified, added with ec4 style properties from + * `textStyle` and `textConfig`. + * + * [Caveat]: For simplicity, `insideRollback` in ec4 does not compat, where + * `styleEmphasis: {textFill: 'red'}` will remove the normal auto added stroke. + */ + + + function convertToEC4StyleForCustomSerise(itemStl, txStl, txCfg) { + var out = itemStl; // See `custom.ts`, a trick to set extra `textPosition` firstly. + + out.textPosition = out.textPosition || txCfg.position || 'inside'; + txCfg.offset != null && (out.textOffset = txCfg.offset); + txCfg.rotation != null && (out.textRotation = txCfg.rotation); + txCfg.distance != null && (out.textDistance = txCfg.distance); + var isInside = out.textPosition.indexOf('inside') >= 0; + var hostFill = itemStl.fill || '#000'; + convertToEC4RichItem(out, txStl); + var textFillNotSet = out.textFill == null; + + if (isInside) { + if (textFillNotSet) { + out.textFill = txCfg.insideFill || '#fff'; + !out.textStroke && txCfg.insideStroke && (out.textStroke = txCfg.insideStroke); + !out.textStroke && (out.textStroke = hostFill); + out.textStrokeWidth == null && (out.textStrokeWidth = 2); + } + } else { + if (textFillNotSet) { + out.textFill = itemStl.fill || txCfg.outsideFill || '#000'; + } + + !out.textStroke && txCfg.outsideStroke && (out.textStroke = txCfg.outsideStroke); + } + + out.text = txStl.text; + out.rich = txStl.rich; + each(txStl.rich, function (richItem) { + convertToEC4RichItem(richItem, richItem); + }); + return out; + } + + function convertToEC4RichItem(out, richItem) { + if (!richItem) { + return; + } + + hasOwn(richItem, 'fill') && (out.textFill = richItem.fill); + hasOwn(richItem, 'stroke') && (out.textStroke = richItem.fill); + hasOwn(richItem, 'lineWidth') && (out.textStrokeWidth = richItem.lineWidth); + hasOwn(richItem, 'font') && (out.font = richItem.font); + hasOwn(richItem, 'fontStyle') && (out.fontStyle = richItem.fontStyle); + hasOwn(richItem, 'fontWeight') && (out.fontWeight = richItem.fontWeight); + hasOwn(richItem, 'fontSize') && (out.fontSize = richItem.fontSize); + hasOwn(richItem, 'fontFamily') && (out.fontFamily = richItem.fontFamily); + hasOwn(richItem, 'align') && (out.textAlign = richItem.align); + hasOwn(richItem, 'verticalAlign') && (out.textVerticalAlign = richItem.verticalAlign); + hasOwn(richItem, 'lineHeight') && (out.textLineHeight = richItem.lineHeight); + hasOwn(richItem, 'width') && (out.textWidth = richItem.width); + hasOwn(richItem, 'height') && (out.textHeight = richItem.height); + hasOwn(richItem, 'backgroundColor') && (out.textBackgroundColor = richItem.backgroundColor); + hasOwn(richItem, 'padding') && (out.textPadding = richItem.padding); + hasOwn(richItem, 'borderColor') && (out.textBorderColor = richItem.borderColor); + hasOwn(richItem, 'borderWidth') && (out.textBorderWidth = richItem.borderWidth); + hasOwn(richItem, 'borderRadius') && (out.textBorderRadius = richItem.borderRadius); + hasOwn(richItem, 'shadowColor') && (out.textBoxShadowColor = richItem.shadowColor); + hasOwn(richItem, 'shadowBlur') && (out.textBoxShadowBlur = richItem.shadowBlur); + hasOwn(richItem, 'shadowOffsetX') && (out.textBoxShadowOffsetX = richItem.shadowOffsetX); + hasOwn(richItem, 'shadowOffsetY') && (out.textBoxShadowOffsetY = richItem.shadowOffsetY); + hasOwn(richItem, 'textShadowColor') && (out.textShadowColor = richItem.textShadowColor); + hasOwn(richItem, 'textShadowBlur') && (out.textShadowBlur = richItem.textShadowBlur); + hasOwn(richItem, 'textShadowOffsetX') && (out.textShadowOffsetX = richItem.textShadowOffsetX); + hasOwn(richItem, 'textShadowOffsetY') && (out.textShadowOffsetY = richItem.textShadowOffsetY); + } + + function warnDeprecated(deprecated, insteadApproach) { + if ("development" !== 'production') { + var key = deprecated + '^_^' + insteadApproach; + + if (!deprecatedLogs[key]) { + console.warn("[ECharts] DEPRECATED: \"" + deprecated + "\" has been deprecated. " + insteadApproach); + deprecatedLogs[key] = true; + } + } + } + + var LEGACY_TRANSFORM_PROPS_MAP = { + position: ['x', 'y'], + scale: ['scaleX', 'scaleY'], + origin: ['originX', 'originY'] + }; + var LEGACY_TRANSFORM_PROPS = keys(LEGACY_TRANSFORM_PROPS_MAP); + var TRANSFORM_PROPS_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) { + obj[key] = 1; + return obj; + }, {}); + var transformPropNamesStr = TRANSFORMABLE_PROPS.join(', '); // '' means root + + var ELEMENT_ANIMATABLE_PROPS = ['', 'style', 'shape', 'extra']; + var transitionInnerStore = makeInner(); + + function getElementAnimationConfig(animationType, el, elOption, parentModel, dataIndex) { + var animationProp = animationType + "Animation"; + var config = getAnimationConfig(animationType, parentModel, dataIndex) || {}; + var userDuring = transitionInnerStore(el).userDuring; // Only set when duration is > 0 and it's need to be animated. + + if (config.duration > 0) { + // For simplicity, if during not specified, the previous during will not work any more. + config.during = userDuring ? bind(duringCall, { + el: el, + userDuring: userDuring + }) : null; + config.setToFinal = true; + config.scope = animationType; + } + + extend(config, elOption[animationProp]); + return config; + } + + function applyUpdateTransition(el, elOption, animatableModel, opts) { + opts = opts || {}; + var dataIndex = opts.dataIndex, + isInit = opts.isInit, + clearStyle = opts.clearStyle; + var hasAnimation = animatableModel.isAnimationEnabled(); // Save the meta info for further morphing. Like apply on the sub morphing elements. + + var store = transitionInnerStore(el); + var styleOpt = elOption.style; + store.userDuring = elOption.during; + var transFromProps = {}; + var propsToSet = {}; + prepareTransformAllPropsFinal(el, elOption, propsToSet); + prepareShapeOrExtraAllPropsFinal('shape', elOption, propsToSet); + prepareShapeOrExtraAllPropsFinal('extra', elOption, propsToSet); + + if (!isInit && hasAnimation) { + prepareTransformTransitionFrom(el, elOption, transFromProps); + prepareShapeOrExtraTransitionFrom('shape', el, elOption, transFromProps); + prepareShapeOrExtraTransitionFrom('extra', el, elOption, transFromProps); + prepareStyleTransitionFrom(el, elOption, styleOpt, transFromProps); + } + + propsToSet.style = styleOpt; + applyPropsDirectly(el, propsToSet, clearStyle); + applyMiscProps(el, elOption); + + if (hasAnimation) { + if (isInit) { + var enterFromProps_1 = {}; + each(ELEMENT_ANIMATABLE_PROPS, function (propName) { + var prop = propName ? elOption[propName] : elOption; + + if (prop && prop.enterFrom) { + if (propName) { + enterFromProps_1[propName] = enterFromProps_1[propName] || {}; + } + + extend(propName ? enterFromProps_1[propName] : enterFromProps_1, prop.enterFrom); + } + }); + var config = getElementAnimationConfig('enter', el, elOption, animatableModel, dataIndex); + + if (config.duration > 0) { + el.animateFrom(enterFromProps_1, config); + } + } else { + applyPropsTransition(el, elOption, dataIndex || 0, animatableModel, transFromProps); + } + } // Store leave to be used in leave transition. + + + updateLeaveTo(el, elOption); + styleOpt ? el.dirty() : el.markRedraw(); + } + + function updateLeaveTo(el, elOption) { + // Try merge to previous set leaveTo + var leaveToProps = transitionInnerStore(el).leaveToProps; + + for (var i = 0; i < ELEMENT_ANIMATABLE_PROPS.length; i++) { + var propName = ELEMENT_ANIMATABLE_PROPS[i]; + var prop = propName ? elOption[propName] : elOption; + + if (prop && prop.leaveTo) { + if (!leaveToProps) { + leaveToProps = transitionInnerStore(el).leaveToProps = {}; + } + + if (propName) { + leaveToProps[propName] = leaveToProps[propName] || {}; + } + + extend(propName ? leaveToProps[propName] : leaveToProps, prop.leaveTo); + } + } + } + + function applyLeaveTransition(el, elOption, animatableModel, onRemove) { + if (el) { + var parent_1 = el.parent; + var leaveToProps = transitionInnerStore(el).leaveToProps; + + if (leaveToProps) { + // TODO TODO use leave after leaveAnimation in series is introduced + // TODO Data index? + var config = getElementAnimationConfig('update', el, elOption, animatableModel, 0); + + config.done = function () { + parent_1.remove(el); + onRemove && onRemove(); + }; + + el.animateTo(leaveToProps, config); + } else { + parent_1.remove(el); + onRemove && onRemove(); + } + } + } + + function isTransitionAll(transition) { + return transition === 'all'; + } + + function applyPropsDirectly(el, // Can be null/undefined + allPropsFinal, clearStyle) { + var styleOpt = allPropsFinal.style; + + if (!el.isGroup && styleOpt) { + if (clearStyle) { + el.useStyle({}); // When style object changed, how to trade the existing animation? + // It is probably complicated and not needed to cover all the cases. + // But still need consider the case: + // (1) When using init animation on `style.opacity`, and before the animation + // ended users triggers an update by mousewhel. At that time the init + // animation should better be continued rather than terminated. + // So after `useStyle` called, we should change the animation target manually + // to continue the effect of the init animation. + // (2) PENDING: If the previous animation targeted at a `val1`, and currently we need + // to update the value to `val2` and no animation declared, should be terminate + // the previous animation or just modify the target of the animation? + // Therotically That will happen not only on `style` but also on `shape` and + // `transfrom` props. But we haven't handle this case at present yet. + // (3) PENDING: Is it proper to visit `animators` and `targetName`? + + var animators = el.animators; + + for (var i = 0; i < animators.length; i++) { + var animator = animators[i]; // targetName is the "topKey". + + if (animator.targetName === 'style') { + animator.changeTarget(el.style); + } + } + } + + el.setStyle(styleOpt); + } + + if (allPropsFinal) { + // Not set style here. + allPropsFinal.style = null; // Set el to the final state firstly. + + allPropsFinal && el.attr(allPropsFinal); + allPropsFinal.style = styleOpt; + } + } + + function applyPropsTransition(el, elOption, dataIndex, model, // Can be null/undefined + transFromProps) { + if (transFromProps) { + var config = getElementAnimationConfig('update', el, elOption, model, dataIndex); + + if (config.duration > 0) { + el.animateFrom(transFromProps, config); + } + } + } + + function applyMiscProps(el, elOption) { + // Merge by default. + hasOwn(elOption, 'silent') && (el.silent = elOption.silent); + hasOwn(elOption, 'ignore') && (el.ignore = elOption.ignore); + + if (el instanceof Displayable) { + hasOwn(elOption, 'invisible') && (el.invisible = elOption.invisible); + } + + if (el instanceof Path) { + hasOwn(elOption, 'autoBatch') && (el.autoBatch = elOption.autoBatch); + } + } // Use it to avoid it be exposed to user. + + + var tmpDuringScope = {}; + var transitionDuringAPI = { + // Usually other props do not need to be changed in animation during. + setTransform: function (key, val) { + if ("development" !== 'production') { + assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `setTransform`.'); + } + + tmpDuringScope.el[key] = val; + return this; + }, + getTransform: function (key) { + if ("development" !== 'production') { + assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `getTransform`.'); + } + + return tmpDuringScope.el[key]; + }, + setShape: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var el = tmpDuringScope.el; + var shape = el.shape || (el.shape = {}); + shape[key] = val; + el.dirtyShape && el.dirtyShape(); + return this; + }, + getShape: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var shape = tmpDuringScope.el.shape; + + if (shape) { + return shape[key]; + } + }, + setStyle: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var el = tmpDuringScope.el; + var style = el.style; + + if (style) { + if ("development" !== 'production') { + if (eqNaN(val)) { + warn('style.' + key + ' must not be assigned with NaN.'); + } + } + + style[key] = val; + el.dirtyStyle && el.dirtyStyle(); + } + + return this; + }, + getStyle: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var style = tmpDuringScope.el.style; + + if (style) { + return style[key]; + } + }, + setExtra: function (key, val) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var extra = tmpDuringScope.el.extra || (tmpDuringScope.el.extra = {}); + extra[key] = val; + return this; + }, + getExtra: function (key) { + if ("development" !== 'production') { + assertNotReserved(key); + } + + var extra = tmpDuringScope.el.extra; + + if (extra) { + return extra[key]; + } + } + }; + + function assertNotReserved(key) { + if ("development" !== 'production') { + if (key === 'transition' || key === 'enterFrom' || key === 'leaveTo') { + throw new Error('key must not be "' + key + '"'); + } + } + } + + function duringCall() { + // Do not provide "percent" until some requirements come. + // Because consider thies case: + // enterFrom: {x: 100, y: 30}, transition: 'x'. + // And enter duration is different from update duration. + // Thus it might be confused about the meaning of "percent" in during callback. + var scope = this; + var el = scope.el; + + if (!el) { + return; + } // If el is remove from zr by reason like legend, during still need to called, + // becuase el will be added back to zr and the prop value should not be incorrect. + + + var latestUserDuring = transitionInnerStore(el).userDuring; + var scopeUserDuring = scope.userDuring; // Ensured a during is only called once in each animation frame. + // If a during is called multiple times in one frame, maybe some users' calulation logic + // might be wrong (not sure whether this usage exists). + // The case of a during might be called twice can be: by default there is a animator for + // 'x', 'y' when init. Before the init animation finished, call `setOption` to start + // another animators for 'style'/'shape'/'extra'. + + if (latestUserDuring !== scopeUserDuring) { + // release + scope.el = scope.userDuring = null; + return; + } + + tmpDuringScope.el = el; // Give no `this` to user in "during" calling. + + scopeUserDuring(transitionDuringAPI); // FIXME: if in future meet the case that some prop will be both modified in `during` and `state`, + // consider the issue that the prop might be incorrect when return to "normal" state. + } + + function prepareShapeOrExtraTransitionFrom(mainAttr, fromEl, elOption, transFromProps) { + var attrOpt = elOption[mainAttr]; + + if (!attrOpt) { + return; + } + + var elPropsInAttr = fromEl[mainAttr]; + var transFromPropsInAttr; + + if (elPropsInAttr) { + var transition = elOption.transition; + var attrTransition = attrOpt.transition; + + if (attrTransition) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + + if (isTransitionAll(attrTransition)) { + extend(transFromPropsInAttr, elPropsInAttr); + } else { + var transitionKeys = normalizeToArray(attrTransition); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + var elVal = elPropsInAttr[key]; + transFromPropsInAttr[key] = elVal; + } + } + } else if (isTransitionAll(transition) || indexOf(transition, mainAttr) >= 0) { + !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {}); + var elPropsInAttrKeys = keys(elPropsInAttr); + + for (var i = 0; i < elPropsInAttrKeys.length; i++) { + var key = elPropsInAttrKeys[i]; + var elVal = elPropsInAttr[key]; + + if (isNonStyleTransitionEnabled(attrOpt[key], elVal)) { + transFromPropsInAttr[key] = elVal; + } + } + } + } + } + + function prepareShapeOrExtraAllPropsFinal(mainAttr, elOption, allProps) { + var attrOpt = elOption[mainAttr]; + + if (!attrOpt) { + return; + } + + var allPropsInAttr = allProps[mainAttr] = {}; + var keysInAttr = keys(attrOpt); + + for (var i = 0; i < keysInAttr.length; i++) { + var key = keysInAttr[i]; // To avoid share one object with different element, and + // to avoid user modify the object inexpectedly, have to clone. + + allPropsInAttr[key] = cloneValue(attrOpt[key]); + } + } + + function prepareTransformTransitionFrom(el, elOption, transFromProps) { + var transition = elOption.transition; + var transitionKeys = isTransitionAll(transition) ? TRANSFORMABLE_PROPS : normalizeToArray(transition || []); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + + if (key === 'style' || key === 'shape' || key === 'extra') { + continue; + } + + var elVal = el[key]; + + if ("development" !== 'production') { + checkTransformPropRefer(key, 'el.transition'); + } // Do not clone, animator will perform that clone. + + + transFromProps[key] = elVal; + } + } + + function prepareTransformAllPropsFinal(el, elOption, allProps) { + for (var i = 0; i < LEGACY_TRANSFORM_PROPS.length; i++) { + var legacyName = LEGACY_TRANSFORM_PROPS[i]; + var xyName = LEGACY_TRANSFORM_PROPS_MAP[legacyName]; + var legacyArr = elOption[legacyName]; + + if (legacyArr) { + allProps[xyName[0]] = legacyArr[0]; + allProps[xyName[1]] = legacyArr[1]; + } + } + + for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) { + var key = TRANSFORMABLE_PROPS[i]; + + if (elOption[key] != null) { + allProps[key] = elOption[key]; + } + } + } + + function prepareStyleTransitionFrom(fromEl, elOption, styleOpt, transFromProps) { + if (!styleOpt) { + return; + } + + var fromElStyle = fromEl.style; + var transFromStyleProps; + + if (fromElStyle) { + var styleTransition = styleOpt.transition; + var elTransition = elOption.transition; + + if (styleTransition && !isTransitionAll(styleTransition)) { + var transitionKeys = normalizeToArray(styleTransition); + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + + for (var i = 0; i < transitionKeys.length; i++) { + var key = transitionKeys[i]; + var elVal = fromElStyle[key]; // Do not clone, see `checkNonStyleTansitionRefer`. + + transFromStyleProps[key] = elVal; + } + } else if (fromEl.getAnimationStyleProps && (isTransitionAll(elTransition) || isTransitionAll(styleTransition) || indexOf(elTransition, 'style') >= 0)) { + var animationProps = fromEl.getAnimationStyleProps(); + var animationStyleProps = animationProps ? animationProps.style : null; + + if (animationStyleProps) { + !transFromStyleProps && (transFromStyleProps = transFromProps.style = {}); + var styleKeys = keys(styleOpt); + + for (var i = 0; i < styleKeys.length; i++) { + var key = styleKeys[i]; + + if (animationStyleProps[key]) { + var elVal = fromElStyle[key]; + transFromStyleProps[key] = elVal; + } + } + } + } + } + } + + function isNonStyleTransitionEnabled(optVal, elVal) { + // The same as `checkNonStyleTansitionRefer`. + return !isArrayLike(optVal) ? optVal != null && isFinite(optVal) : optVal !== elVal; + } + + var checkTransformPropRefer; + + if ("development" !== 'production') { + checkTransformPropRefer = function (key, usedIn) { + if (!hasOwn(TRANSFORM_PROPS_MAP, key)) { + warn('Prop `' + key + '` is not a permitted in `' + usedIn + '`. ' + 'Only `' + keys(TRANSFORM_PROPS_MAP).join('`, `') + '` are permitted.'); + } + }; + } + + var getStateToRestore = makeInner(); + var KEYFRAME_EXCLUDE_KEYS = ['percent', 'easing', 'shape', 'style', 'extra']; + + /** + * Stop previous keyframe animation and restore the attributes. + * Avoid new keyframe animation starts with wrong internal state when the percent: 0 is not set. + */ + + function stopPreviousKeyframeAnimationAndRestore(el) { + // Stop previous keyframe animation. + el.stopAnimation('keyframe'); // Restore + + el.attr(getStateToRestore(el)); + } + + function applyKeyframeAnimation(el, animationOpts, animatableModel) { + if (!animatableModel.isAnimationEnabled() || !animationOpts) { + return; + } + + if (isArray(animationOpts)) { + each(animationOpts, function (singleAnimationOpts) { + applyKeyframeAnimation(el, singleAnimationOpts, animatableModel); + }); + return; + } + + var keyframes = animationOpts.keyframes; + var duration = animationOpts.duration; + + if (animatableModel && duration == null) { + // Default to use duration of config. + // NOTE: animation config from payload will be ignored because they are mainly for transitions. + var config = getAnimationConfig('enter', animatableModel, 0); + duration = config && config.duration; + } + + if (!keyframes || !duration) { + return; + } + + var stateToRestore = getStateToRestore(el); + each(ELEMENT_ANIMATABLE_PROPS, function (targetPropName) { + if (targetPropName && !el[targetPropName]) { + return; + } + + var animator; + var endFrameIsSet = false; // Sort keyframes by percent. + + keyframes.sort(function (a, b) { + return a.percent - b.percent; + }); + each(keyframes, function (kf) { + // Stop current animation. + var animators = el.animators; + var kfValues = targetPropName ? kf[targetPropName] : kf; + + if ("development" !== 'production') { + if (kf.percent >= 1) { + endFrameIsSet = true; + } + } + + if (!kfValues) { + return; + } + + var propKeys = keys(kfValues); + + if (!targetPropName) { + // PENDING performance? + propKeys = filter(propKeys, function (key) { + return indexOf(KEYFRAME_EXCLUDE_KEYS, key) < 0; + }); + } + + if (!propKeys.length) { + return; + } + + if (!animator) { + animator = el.animate(targetPropName, animationOpts.loop, true); + animator.scope = 'keyframe'; + } + + for (var i = 0; i < animators.length; i++) { + // Stop all other animation that is not keyframe. + if (animators[i] !== animator && animators[i].targetName === animator.targetName) { + animators[i].stopTracks(propKeys); + } + } + + targetPropName && (stateToRestore[targetPropName] = stateToRestore[targetPropName] || {}); + var savedTarget = targetPropName ? stateToRestore[targetPropName] : stateToRestore; + each(propKeys, function (key) { + // Save original value. + savedTarget[key] = ((targetPropName ? el[targetPropName] : el) || {})[key]; + }); + animator.whenWithKeys(duration * kf.percent, kfValues, propKeys, kf.easing); + }); + + if (!animator) { + return; + } + + if ("development" !== 'production') { + if (!endFrameIsSet) { + warn('End frame with percent: 1 is missing in the keyframeAnimation.', true); + } + } + + animator.delay(animationOpts.delay || 0).duration(duration).start(animationOpts.easing); + }); + } + + var EMPHASIS = 'emphasis'; + var NORMAL = 'normal'; + var BLUR = 'blur'; + var SELECT = 'select'; + var STATES = [NORMAL, EMPHASIS, BLUR, SELECT]; + var PATH_ITEM_STYLE = { + normal: ['itemStyle'], + emphasis: [EMPHASIS, 'itemStyle'], + blur: [BLUR, 'itemStyle'], + select: [SELECT, 'itemStyle'] + }; + var PATH_LABEL = { + normal: ['label'], + emphasis: [EMPHASIS, 'label'], + blur: [BLUR, 'label'], + select: [SELECT, 'label'] + }; + var DEFAULT_TRANSITION = ['x', 'y']; // Use prefix to avoid index to be the same as el.name, + // which will cause weird update animation. + + var GROUP_DIFF_PREFIX = 'e\0\0'; + var attachedTxInfoTmp = { + normal: {}, + emphasis: {}, + blur: {}, + select: {} + }; + /** + * To reduce total package size of each coordinate systems, the modules `prepareCustom` + * of each coordinate systems are not required by each coordinate systems directly, but + * required by the module `custom`. + * + * prepareInfoForCustomSeries {Function}: optional + * @return {Object} {coordSys: {...}, api: { + * coord: function (data, clamp) {}, // return point in global. + * size: function (dataSize, dataItem) {} // return size of each axis in coordSys. + * }} + */ + + var prepareCustoms = { + cartesian2d: cartesianPrepareCustom, + geo: geoPrepareCustom, + singleAxis: singlePrepareCustom, + polar: polarPrepareCustom, + calendar: calendarPrepareCustom + }; + + function isPath$1(el) { + return el instanceof Path; + } + + function isDisplayable(el) { + return el instanceof Displayable; + } + + function copyElement(sourceEl, targetEl) { + targetEl.copyTransform(sourceEl); + + if (isDisplayable(targetEl) && isDisplayable(sourceEl)) { + targetEl.setStyle(sourceEl.style); + targetEl.z = sourceEl.z; + targetEl.z2 = sourceEl.z2; + targetEl.zlevel = sourceEl.zlevel; + targetEl.invisible = sourceEl.invisible; + targetEl.ignore = sourceEl.ignore; + + if (isPath$1(targetEl) && isPath$1(sourceEl)) { + targetEl.setShape(sourceEl.shape); + } + } + } + + var CustomChartView = + /** @class */ + function (_super) { + __extends(CustomChartView, _super); + + function CustomChartView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CustomChartView.type; + return _this; + } + + CustomChartView.prototype.render = function (customSeries, ecModel, api, payload) { + // Clear previously rendered progressive elements. + this._progressiveEls = null; + var oldData = this._data; + var data = customSeries.getData(); + var group = this.group; + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + + if (!oldData) { + // Previous render is incremental render or first render. + // Needs remove the incremental rendered elements. + group.removeAll(); + } + + data.diff(oldData).add(function (newIdx) { + createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data); + }).remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + applyLeaveTransition(el, customInnerStore(el).option, customSeries); + }).update(function (newIdx, oldIdx) { + var oldEl = oldData.getItemGraphicEl(oldIdx); + createOrUpdateItem(api, oldEl, newIdx, renderItem(newIdx, payload), customSeries, group, data); + }).execute(); // Do clipping + + var clipPath = customSeries.get('clip', true) ? createClipPath(customSeries.coordinateSystem, false, customSeries) : null; + + if (clipPath) { + group.setClipPath(clipPath); + } else { + group.removeClipPath(); + } + + this._data = data; + }; + + CustomChartView.prototype.incrementalPrepareRender = function (customSeries, ecModel, api) { + this.group.removeAll(); + this._data = null; + }; + + CustomChartView.prototype.incrementalRender = function (params, customSeries, ecModel, api, payload) { + var data = customSeries.getData(); + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + var progressiveEls = this._progressiveEls = []; + + function setIncrementalAndHoverLayer(el) { + if (!el.isGroup) { + el.incremental = true; + el.ensureState('emphasis').hoverLayer = true; + } + } + + for (var idx = params.start; idx < params.end; idx++) { + var el = createOrUpdateItem(null, null, idx, renderItem(idx, payload), customSeries, this.group, data); + + if (el) { + el.traverse(setIncrementalAndHoverLayer); + progressiveEls.push(el); + } + } + }; + + CustomChartView.prototype.eachRendered = function (cb) { + traverseElements(this._progressiveEls || this.group, cb); + }; + + CustomChartView.prototype.filterForExposedEvent = function (eventType, query, targetEl, packedEvent) { + var elementName = query.element; + + if (elementName == null || targetEl.name === elementName) { + return true; + } // Enable to give a name on a group made by `renderItem`, and listen + // events that triggerd by its descendents. + + + while ((targetEl = targetEl.__hostTarget || targetEl.parent) && targetEl !== this.group) { + if (targetEl.name === elementName) { + return true; + } + } + + return false; + }; + + CustomChartView.type = 'custom'; + return CustomChartView; + }(ChartView); + + function createEl(elOption) { + var graphicType = elOption.type; + var el; // Those graphic elements are not shapes. They should not be + // overwritten by users, so do them first. + + if (graphicType === 'path') { + var shape = elOption.shape; // Using pathRect brings convenience to users sacle svg path. + + var pathRect = shape.width != null && shape.height != null ? { + x: shape.x || 0, + y: shape.y || 0, + width: shape.width, + height: shape.height + } : null; + var pathData = getPathData(shape); // Path is also used for icon, so layout 'center' by default. + + el = makePath(pathData, null, pathRect, shape.layout || 'center'); + customInnerStore(el).customPathData = pathData; + } else if (graphicType === 'image') { + el = new ZRImage({}); + customInnerStore(el).customImagePath = elOption.style.image; + } else if (graphicType === 'text') { + el = new ZRText({}); // customInnerStore(el).customText = (elOption.style as TextStyleProps).text; + } else if (graphicType === 'group') { + el = new Group(); + } else if (graphicType === 'compoundPath') { + throw new Error('"compoundPath" is not supported yet.'); + } else { + var Clz = getShapeClass(graphicType); + + if (!Clz) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = 'graphic type "' + graphicType + '" can not be found.'; + } + + throwError(errMsg); + } + + el = new Clz(); + } + + customInnerStore(el).customGraphicType = graphicType; + el.name = elOption.name; // Compat ec4: the default z2 lift is 1. If changing the number, + // some cases probably be broken: hierarchy layout along z, like circle packing, + // where emphasis only intending to modify color/border rather than lift z2. + + el.z2EmphasisLift = 1; + el.z2SelectLift = 1; + return el; + } + + function updateElNormal( // Can be null/undefined + api, el, dataIndex, elOption, attachedTxInfo, seriesModel, isInit) { + // Stop and restore before update any other attributes. + stopPreviousKeyframeAnimationAndRestore(el); + var txCfgOpt = attachedTxInfo && attachedTxInfo.normal.cfg; + + if (txCfgOpt) { + // PENDING: whether use user object directly rather than clone? + // TODO:5.0 textConfig transition animation? + el.setTextConfig(txCfgOpt); + } // Default transition ['x', 'y'] + + + if (elOption && elOption.transition == null) { + elOption.transition = DEFAULT_TRANSITION; + } // Do some normalization on style. + + + var styleOpt = elOption && elOption.style; + + if (styleOpt) { + if (el.type === 'text') { + var textOptionStyle = styleOpt; // Compatible with ec4: if `textFill` or `textStroke` exists use them. + + hasOwn(textOptionStyle, 'textFill') && (textOptionStyle.fill = textOptionStyle.textFill); + hasOwn(textOptionStyle, 'textStroke') && (textOptionStyle.stroke = textOptionStyle.textStroke); + } + + var decalPattern = void 0; + var decalObj = isPath$1(el) ? styleOpt.decal : null; + + if (api && decalObj) { + decalObj.dirty = true; + decalPattern = createOrUpdatePatternFromDecal(decalObj, api); + } // Always overwrite in case user specify this prop. + + + styleOpt.__decalPattern = decalPattern; + } + + if (isDisplayable(el)) { + if (styleOpt) { + var decalPattern = styleOpt.__decalPattern; + + if (decalPattern) { + styleOpt.decal = decalPattern; + } + } + } + + applyUpdateTransition(el, elOption, seriesModel, { + dataIndex: dataIndex, + isInit: isInit, + clearStyle: true + }); + applyKeyframeAnimation(el, elOption.keyframeAnimation, seriesModel); + } + + function updateElOnState(state, el, elStateOpt, styleOpt, attachedTxInfo) { + var elDisplayable = el.isGroup ? null : el; + var txCfgOpt = attachedTxInfo && attachedTxInfo[state].cfg; // PENDING:5.0 support customize scale change and transition animation? + + if (elDisplayable) { + // By default support auto lift color when hover whether `emphasis` specified. + var stateObj = elDisplayable.ensureState(state); + + if (styleOpt === false) { + var existingEmphasisState = elDisplayable.getState(state); + + if (existingEmphasisState) { + existingEmphasisState.style = null; + } + } else { + // style is needed to enable defaut emphasis. + stateObj.style = styleOpt || null; + } // If `elOption.styleEmphasis` or `elOption.emphasis.style` is `false`, + // remove hover style. + // If `elOption.textConfig` or `elOption.emphasis.textConfig` is null/undefined, it does not + // make sense. So for simplicity, we do not ditinguish `hasOwnProperty` and null/undefined. + + + if (txCfgOpt) { + stateObj.textConfig = txCfgOpt; + } + + setDefaultStateProxy(elDisplayable); + } + } + + function updateZ$1(el, elOption, seriesModel) { + // Group not support textContent and not support z yet. + if (el.isGroup) { + return; + } + + var elDisplayable = el; + var currentZ = seriesModel.currentZ; + var currentZLevel = seriesModel.currentZLevel; // Always erase. + + elDisplayable.z = currentZ; + elDisplayable.zlevel = currentZLevel; // z2 must not be null/undefined, otherwise sort error may occur. + + var optZ2 = elOption.z2; + optZ2 != null && (elDisplayable.z2 = optZ2 || 0); + + for (var i = 0; i < STATES.length; i++) { + updateZForEachState(elDisplayable, elOption, STATES[i]); + } + } + + function updateZForEachState(elDisplayable, elOption, state) { + var isNormal = state === NORMAL; + var elStateOpt = isNormal ? elOption : retrieveStateOption(elOption, state); + var optZ2 = elStateOpt ? elStateOpt.z2 : null; + var stateObj; + + if (optZ2 != null) { + // Do not `ensureState` until required. + stateObj = isNormal ? elDisplayable : elDisplayable.ensureState(state); + stateObj.z2 = optZ2 || 0; + } + } + + function makeRenderItem(customSeries, data, ecModel, api) { + var renderItem = customSeries.get('renderItem'); + var coordSys = customSeries.coordinateSystem; + var prepareResult = {}; + + if (coordSys) { + if ("development" !== 'production') { + assert(renderItem, 'series.render is required.'); + assert(coordSys.prepareCustoms || prepareCustoms[coordSys.type], 'This coordSys does not support custom series.'); + } // `coordSys.prepareCustoms` is used for external coord sys like bmap. + + + prepareResult = coordSys.prepareCustoms ? coordSys.prepareCustoms(coordSys) : prepareCustoms[coordSys.type](coordSys); + } + + var userAPI = defaults({ + getWidth: api.getWidth, + getHeight: api.getHeight, + getZr: api.getZr, + getDevicePixelRatio: api.getDevicePixelRatio, + value: value, + style: style, + ordinalRawValue: ordinalRawValue, + styleEmphasis: styleEmphasis, + visual: visual, + barLayout: barLayout, + currentSeriesIndices: currentSeriesIndices, + font: font + }, prepareResult.api || {}); + var userParams = { + // The life cycle of context: current round of rendering. + // The global life cycle is probably not necessary, because + // user can store global status by themselves. + context: {}, + seriesId: customSeries.id, + seriesName: customSeries.name, + seriesIndex: customSeries.seriesIndex, + coordSys: prepareResult.coordSys, + dataInsideLength: data.count(), + encode: wrapEncodeDef(customSeries.getData()) + }; // If someday intending to refactor them to a class, should consider do not + // break change: currently these attribute member are encapsulated in a closure + // so that do not need to force user to call these method with a scope. + // Do not support call `api` asynchronously without dataIndexInside input. + + var currDataIndexInside; + var currItemModel; + var currItemStyleModels = {}; + var currLabelModels = {}; + var seriesItemStyleModels = {}; + var seriesLabelModels = {}; + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + seriesItemStyleModels[stateName] = customSeries.getModel(PATH_ITEM_STYLE[stateName]); + seriesLabelModels[stateName] = customSeries.getModel(PATH_LABEL[stateName]); + } + + function getItemModel(dataIndexInside) { + return dataIndexInside === currDataIndexInside ? currItemModel || (currItemModel = data.getItemModel(dataIndexInside)) : data.getItemModel(dataIndexInside); + } + + function getItemStyleModel(dataIndexInside, state) { + return !data.hasItemOption ? seriesItemStyleModels[state] : dataIndexInside === currDataIndexInside ? currItemStyleModels[state] || (currItemStyleModels[state] = getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state])) : getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state]); + } + + function getLabelModel(dataIndexInside, state) { + return !data.hasItemOption ? seriesLabelModels[state] : dataIndexInside === currDataIndexInside ? currLabelModels[state] || (currLabelModels[state] = getItemModel(dataIndexInside).getModel(PATH_LABEL[state])) : getItemModel(dataIndexInside).getModel(PATH_LABEL[state]); + } + + return function (dataIndexInside, payload) { + currDataIndexInside = dataIndexInside; + currItemModel = null; + currItemStyleModels = {}; + currLabelModels = {}; + return renderItem && renderItem(defaults({ + dataIndexInside: dataIndexInside, + dataIndex: data.getRawIndex(dataIndexInside), + // Can be used for optimization when zoom or roam. + actionType: payload ? payload.type : null + }, userParams), userAPI); + }; + + /** + * @public + * @param dim by default 0. + * @param dataIndexInside by default `currDataIndexInside`. + */ + + function value(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + return data.getStore().get(data.getDimensionIndex(dim || 0), dataIndexInside); + } + + /** + * @public + * @param dim by default 0. + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function ordinalRawValue(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + dim = dim || 0; + var dimInfo = data.getDimensionInfo(dim); + + if (!dimInfo) { + var dimIndex = data.getDimensionIndex(dim); + return dimIndex >= 0 ? data.getStore().get(dimIndex, dataIndexInside) : undefined; + } + + var val = data.get(dimInfo.name, dataIndexInside); + var ordinalMeta = dimInfo && dimInfo.ordinalMeta; + return ordinalMeta ? ordinalMeta.categories[val] : val; + } + + /** + * @deprecated The orgininal intention of `api.style` is enable to set itemStyle + * like other series. But it not necessary and not easy to give a strict definition + * of what it return. And since echarts5 it needs to be make compat work. So + * deprecates it since echarts5. + * + * By default, `visual` is applied to style (to support visualMap). + * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`, + * it can be implemented as: + * `api.style({stroke: api.visual('color'), fill: null})`; + * + * [Compat]: since ec5, RectText has been separated from its hosts el. + * so `api.style()` will only return the style from `itemStyle` but not handle `label` + * any more. But `series.label` config is never published in doc. + * We still compat it in `api.style()`. But not encourage to use it and will still not + * to pulish it to doc. + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function style(userProps, dataIndexInside) { + if ("development" !== 'production') { + warnDeprecated('api.style', 'Please write literal style directly instead.'); + } + + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var style = data.getItemVisual(dataIndexInside, 'style'); + var visualColor = style && style.fill; + var opacity = style && style.opacity; + var itemStyle = getItemStyleModel(dataIndexInside, NORMAL).getItemStyle(); + visualColor != null && (itemStyle.fill = visualColor); + opacity != null && (itemStyle.opacity = opacity); + var opt = { + inheritColor: isString(visualColor) ? visualColor : '#000' + }; + var labelModel = getLabelModel(dataIndexInside, NORMAL); // Now that the feture of "auto adjust text fill/stroke" has been migrated to zrender + // since ec5, we should set `isAttached` as `false` here and make compat in + // `convertToEC4StyleForCustomSerise`. + + var textStyle = createTextStyle(labelModel, null, opt, false, true); + textStyle.text = labelModel.getShallow('show') ? retrieve2(customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; + var textConfig = createTextConfig(labelModel, opt, false); + preFetchFromExtra(userProps, itemStyle); + itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); + userProps && applyUserPropsAfter(itemStyle, userProps); + itemStyle.legacy = true; + return itemStyle; + } + + /** + * @deprecated The reason see `api.style()` + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function styleEmphasis(userProps, dataIndexInside) { + if ("development" !== 'production') { + warnDeprecated('api.styleEmphasis', 'Please write literal style directly instead.'); + } + + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + var itemStyle = getItemStyleModel(dataIndexInside, EMPHASIS).getItemStyle(); + var labelModel = getLabelModel(dataIndexInside, EMPHASIS); + var textStyle = createTextStyle(labelModel, null, null, true, true); + textStyle.text = labelModel.getShallow('show') ? retrieve3(customSeries.getFormattedLabel(dataIndexInside, EMPHASIS), customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null; + var textConfig = createTextConfig(labelModel, null, true); + preFetchFromExtra(userProps, itemStyle); + itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig); + userProps && applyUserPropsAfter(itemStyle, userProps); + itemStyle.legacy = true; + return itemStyle; + } + + function applyUserPropsAfter(itemStyle, extra) { + for (var key in extra) { + if (hasOwn(extra, key)) { + itemStyle[key] = extra[key]; + } + } + } + + function preFetchFromExtra(extra, itemStyle) { + // A trick to retrieve those props firstly, which are used to + // apply auto inside fill/stroke in `convertToEC4StyleForCustomSerise`. + // (It's not reasonable but only for a degree of compat) + if (extra) { + extra.textFill && (itemStyle.textFill = extra.textFill); + extra.textPosition && (itemStyle.textPosition = extra.textPosition); + } + } + + /** + * @public + * @param dataIndexInside by default `currDataIndexInside`. + */ + + + function visual(visualType, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + + if (hasOwn(STYLE_VISUAL_TYPE, visualType)) { + var style_1 = data.getItemVisual(dataIndexInside, 'style'); + return style_1 ? style_1[STYLE_VISUAL_TYPE[visualType]] : null; + } // Only support these visuals. Other visual might be inner tricky + // for performance (like `style`), do not expose to users. + + + if (hasOwn(NON_STYLE_VISUAL_PROPS, visualType)) { + return data.getItemVisual(dataIndexInside, visualType); + } + } + + /** + * @public + * @return If not support, return undefined. + */ + + + function barLayout(opt) { + if (coordSys.type === 'cartesian2d') { + var baseAxis = coordSys.getBaseAxis(); + return getLayoutOnAxis(defaults({ + axis: baseAxis + }, opt)); + } + } + + /** + * @public + */ + + + function currentSeriesIndices() { + return ecModel.getCurrentSeriesIndices(); + } + + /** + * @public + * @return font string + */ + + + function font(opt) { + return getFont(opt, ecModel); + } + } + + function wrapEncodeDef(data) { + var encodeDef = {}; + each(data.dimensions, function (dimName) { + var dimInfo = data.getDimensionInfo(dimName); + + if (!dimInfo.isExtraCoord) { + var coordDim = dimInfo.coordDim; + var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || []; + dataDims[dimInfo.coordDimIndex] = data.getDimensionIndex(dimName); + } + }); + return encodeDef; + } + + function createOrUpdateItem(api, existsEl, dataIndex, elOption, seriesModel, group, data) { + // [Rule] + // If `renderItem` returns `null`/`undefined`/`false`, remove the previous el if existing. + // (It seems that violate the "merge" principle, but most of users probably intuitively + // regard "return;" as "show nothing element whatever", so make a exception to meet the + // most cases.) + // The rule or "merge" see [STRATEGY_MERGE]. + // If `elOption` is `null`/`undefined`/`false` (when `renderItem` returns nothing). + if (!elOption) { + group.remove(existsEl); + return; + } + + var el = doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group); + el && data.setItemGraphicEl(dataIndex, el); + el && toggleHoverEmphasis(el, elOption.focus, elOption.blurScope, elOption.emphasisDisabled); + return el; + } + + function doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group) { + if ("development" !== 'production') { + assert(elOption, 'should not have an null/undefined element setting'); + } + + var toBeReplacedIdx = -1; + var oldEl = existsEl; + + if (existsEl && doesElNeedRecreate(existsEl, elOption, seriesModel) // || ( + // // PENDING: even in one-to-one mapping case, if el is marked as morph, + // // do not sure whether the el will be mapped to another el with different + // // hierarchy in Group tree. So always recreate el rather than reuse the el. + // morphHelper && morphHelper.isOneToOneFrom(el) + // ) + ) { + // Should keep at the original index, otherwise "merge by index" will be incorrect. + toBeReplacedIdx = indexOf(group.childrenRef(), existsEl); + existsEl = null; + } + + var isInit = !existsEl; + var el = existsEl; + + if (!el) { + el = createEl(elOption); + + if (oldEl) { + copyElement(oldEl, el); + } + } else { + // FIMXE:NEXT unified clearState? + // If in some case the performance issue arised, consider + // do not clearState but update cached normal state directly. + el.clearStates(); + } // Need to set morph: false explictly to disable automatically morphing. + + + if (elOption.morph === false) { + el.disableMorphing = true; + } else if (el.disableMorphing) { + el.disableMorphing = false; + } + + attachedTxInfoTmp.normal.cfg = attachedTxInfoTmp.normal.conOpt = attachedTxInfoTmp.emphasis.cfg = attachedTxInfoTmp.emphasis.conOpt = attachedTxInfoTmp.blur.cfg = attachedTxInfoTmp.blur.conOpt = attachedTxInfoTmp.select.cfg = attachedTxInfoTmp.select.conOpt = null; + attachedTxInfoTmp.isLegacy = false; + doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfoTmp); + doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit); + updateElNormal(api, el, dataIndex, elOption, attachedTxInfoTmp, seriesModel, isInit); // `elOption.info` enables user to mount some info on + // elements and use them in event handlers. + // Update them only when user specified, otherwise, remain. + + hasOwn(elOption, 'info') && (customInnerStore(el).info = elOption.info); + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + + if (stateName !== NORMAL) { + var otherStateOpt = retrieveStateOption(elOption, stateName); + var otherStyleOpt = retrieveStyleOptionOnState(elOption, otherStateOpt, stateName); + updateElOnState(stateName, el, otherStateOpt, otherStyleOpt, attachedTxInfoTmp); + } + } + + updateZ$1(el, elOption, seriesModel); + + if (elOption.type === 'group') { + mergeChildren(api, el, dataIndex, elOption, seriesModel); + } + + if (toBeReplacedIdx >= 0) { + group.replaceAt(el, toBeReplacedIdx); + } else { + group.add(el); + } + + return el; + } // `el` must not be null/undefined. + + + function doesElNeedRecreate(el, elOption, seriesModel) { + var elInner = customInnerStore(el); + var elOptionType = elOption.type; + var elOptionShape = elOption.shape; + var elOptionStyle = elOption.style; + return (// Always create new if universal transition is enabled. + // Because we do transition after render. It needs to know what old element is. Replacement will loose it. + seriesModel.isUniversalTransitionEnabled() // If `elOptionType` is `null`, follow the merge principle. + || elOptionType != null && elOptionType !== elInner.customGraphicType || elOptionType === 'path' && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== elInner.customPathData || elOptionType === 'image' && hasOwn(elOptionStyle, 'image') && elOptionStyle.image !== elInner.customImagePath // // FIXME test and remove this restriction? + // || (elOptionType === 'text' + // && hasOwn(elOptionStyle, 'text') + // && (elOptionStyle as TextStyleProps).text !== elInner.customText + // ) + + ); + } + + function doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit) { + // Based on the "merge" principle, if no clipPath provided, + // do nothing. The exists clip will be totally removed only if + // `el.clipPath` is `false`. Otherwise it will be merged/replaced. + var clipPathOpt = elOption.clipPath; + + if (clipPathOpt === false) { + if (el && el.getClipPath()) { + el.removeClipPath(); + } + } else if (clipPathOpt) { + var clipPath = el.getClipPath(); + + if (clipPath && doesElNeedRecreate(clipPath, clipPathOpt, seriesModel)) { + clipPath = null; + } + + if (!clipPath) { + clipPath = createEl(clipPathOpt); + + if ("development" !== 'production') { + assert(isPath$1(clipPath), 'Only any type of `path` can be used in `clipPath`, rather than ' + clipPath.type + '.'); + } + + el.setClipPath(clipPath); + } + + updateElNormal(null, clipPath, dataIndex, clipPathOpt, null, seriesModel, isInit); + } // If not define `clipPath` in option, do nothing unnecessary. + + } + + function doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfo) { + // group do not support textContent temporarily untill necessary. + if (el.isGroup) { + return; + } // Normal must be called before emphasis, for `isLegacy` detection. + + + processTxInfo(elOption, null, attachedTxInfo); + processTxInfo(elOption, EMPHASIS, attachedTxInfo); // If `elOption.textConfig` or `elOption.textContent` is null/undefined, it does not make sence. + // So for simplicity, if "elOption hasOwnProperty of them but be null/undefined", we do not + // trade them as set to null to el. + // Especially: + // `elOption.textContent: false` means remove textContent. + // `elOption.textContent.emphasis.style: false` means remove the style from emphasis state. + + var txConOptNormal = attachedTxInfo.normal.conOpt; + var txConOptEmphasis = attachedTxInfo.emphasis.conOpt; + var txConOptBlur = attachedTxInfo.blur.conOpt; + var txConOptSelect = attachedTxInfo.select.conOpt; + + if (txConOptNormal != null || txConOptEmphasis != null || txConOptSelect != null || txConOptBlur != null) { + var textContent = el.getTextContent(); + + if (txConOptNormal === false) { + textContent && el.removeTextContent(); + } else { + txConOptNormal = attachedTxInfo.normal.conOpt = txConOptNormal || { + type: 'text' + }; + + if (!textContent) { + textContent = createEl(txConOptNormal); + el.setTextContent(textContent); + } else { + // If in some case the performance issue arised, consider + // do not clearState but update cached normal state directly. + textContent.clearStates(); + } + + updateElNormal(null, textContent, dataIndex, txConOptNormal, null, seriesModel, isInit); + var txConStlOptNormal = txConOptNormal && txConOptNormal.style; + + for (var i = 0; i < STATES.length; i++) { + var stateName = STATES[i]; + + if (stateName !== NORMAL) { + var txConOptOtherState = attachedTxInfo[stateName].conOpt; + updateElOnState(stateName, textContent, txConOptOtherState, retrieveStyleOptionOnState(txConOptNormal, txConOptOtherState, stateName), null); + } + } + + txConStlOptNormal ? textContent.dirty() : textContent.markRedraw(); + } + } + } + + function processTxInfo(elOption, state, attachedTxInfo) { + var stateOpt = !state ? elOption : retrieveStateOption(elOption, state); + var styleOpt = !state ? elOption.style : retrieveStyleOptionOnState(elOption, stateOpt, EMPHASIS); + var elType = elOption.type; + var txCfg = stateOpt ? stateOpt.textConfig : null; + var txConOptNormal = elOption.textContent; + var txConOpt = !txConOptNormal ? null : !state ? txConOptNormal : retrieveStateOption(txConOptNormal, state); + + if (styleOpt && ( // Because emphasis style has little info to detect legacy, + // if normal is legacy, emphasis is trade as legacy. + attachedTxInfo.isLegacy || isEC4CompatibleStyle(styleOpt, elType, !!txCfg, !!txConOpt))) { + attachedTxInfo.isLegacy = true; + var convertResult = convertFromEC4CompatibleStyle(styleOpt, elType, !state); // Explicitly specified `textConfig` and `textContent` has higher priority than + // the ones generated by legacy style. Otherwise if users use them and `api.style` + // at the same time, they not both work and hardly to known why. + + if (!txCfg && convertResult.textConfig) { + txCfg = convertResult.textConfig; + } + + if (!txConOpt && convertResult.textContent) { + txConOpt = convertResult.textContent; + } + } + + if (!state && txConOpt) { + var txConOptNormal_1 = txConOpt; // `textContent: {type: 'text'}`, the "type" is easy to be missing. So we tolerate it. + + !txConOptNormal_1.type && (txConOptNormal_1.type = 'text'); + + if ("development" !== 'production') { + // Do not tolerate incorret type for forward compat. + assert(txConOptNormal_1.type === 'text', 'textContent.type must be "text"'); + } + } + + var info = !state ? attachedTxInfo.normal : attachedTxInfo[state]; + info.cfg = txCfg; + info.conOpt = txConOpt; + } + + function retrieveStateOption(elOption, state) { + return !state ? elOption : elOption ? elOption[state] : null; + } + + function retrieveStyleOptionOnState(stateOptionNormal, stateOption, state) { + var style = stateOption && stateOption.style; + + if (style == null && state === EMPHASIS && stateOptionNormal) { + style = stateOptionNormal.styleEmphasis; + } + + return style; + } // Usage: + // (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates that + // the existing children will not be removed, and enables the feature that + // update some of the props of some of the children simply by construct + // the returned children of `renderItem` like: + // `var children = group.children = []; children[3] = {opacity: 0.5};` + // (2) If `elOption.$mergeChildren` is `'byName'`, add/update/remove children + // by child.name. But that might be lower performance. + // (3) If `elOption.$mergeChildren` is `false`, the existing children will be + // replaced totally. + // (4) If `!elOption.children`, following the "merge" principle, nothing will happen. + // + // For implementation simpleness, do not provide a direct way to remove sinlge + // child (otherwise the total indicies of the children array have to be modified). + // User can remove a single child by set its `ignore` as `true`. + + + function mergeChildren(api, el, dataIndex, elOption, seriesModel) { + var newChildren = elOption.children; + var newLen = newChildren ? newChildren.length : 0; + var mergeChildren = elOption.$mergeChildren; // `diffChildrenByName` has been deprecated. + + var byName = mergeChildren === 'byName' || elOption.diffChildrenByName; + var notMerge = mergeChildren === false; // For better performance on roam update, only enter if necessary. + + if (!newLen && !byName && !notMerge) { + return; + } + + if (byName) { + diffGroupChildren({ + api: api, + oldChildren: el.children() || [], + newChildren: newChildren || [], + dataIndex: dataIndex, + seriesModel: seriesModel, + group: el + }); + return; + } + + notMerge && el.removeAll(); // Mapping children of a group simply by index, which + // might be better performance. + + var index = 0; + + for (; index < newLen; index++) { + newChildren[index] && doCreateOrUpdateEl(api, el.childAt(index), dataIndex, newChildren[index], seriesModel, el); + } + + for (var i = el.childCount() - 1; i >= index; i--) { + // Do not supprot leave elements that are not mentioned in the latest + // `renderItem` return. Otherwise users may not have a clear and simple + // concept that how to contorl all of the elements. + var child = el.childAt(i); + applyLeaveTransition(child, customInnerStore(el).option, seriesModel); + } + } + + function diffGroupChildren(context) { + new DataDiffer(context.oldChildren, context.newChildren, getKey, getKey, context).add(processAddUpdate).update(processAddUpdate).remove(processRemove).execute(); + } + + function getKey(item, idx) { + var name = item && item.name; + return name != null ? name : GROUP_DIFF_PREFIX + idx; + } + + function processAddUpdate(newIndex, oldIndex) { + var context = this.context; + var childOption = newIndex != null ? context.newChildren[newIndex] : null; + var child = oldIndex != null ? context.oldChildren[oldIndex] : null; + doCreateOrUpdateEl(context.api, child, context.dataIndex, childOption, context.seriesModel, context.group); + } + + function processRemove(oldIndex) { + var context = this.context; + var child = context.oldChildren[oldIndex]; + applyLeaveTransition(child, customInnerStore(child).option, context.seriesModel); + } + + /** + * @return SVG Path data. + */ + + + function getPathData(shape) { + // "d" follows the SVG convention. + return shape && (shape.pathData || shape.d); + } + + function hasOwnPathData(shape) { + return shape && (hasOwn(shape, 'pathData') || hasOwn(shape, 'd')); + } + + function install$r(registers) { + registers.registerChartView(CustomChartView); + registers.registerSeriesModel(CustomSeriesModel); + } + + var inner$a = makeInner(); + var clone$3 = clone; + var bind$1 = bind; + /** + * Base axis pointer class in 2D. + */ + + var BaseAxisPointer = + /** @class */ + function () { + function BaseAxisPointer() { + this._dragging = false; + /** + * In px, arbitrary value. Do not set too small, + * no animation is ok for most cases. + */ + + this.animationThreshold = 15; + } + + /** + * @implement + */ + + + BaseAxisPointer.prototype.render = function (axisModel, axisPointerModel, api, forceRender) { + var value = axisPointerModel.get('value'); + var status = axisPointerModel.get('status'); // Bind them to `this`, not in closure, otherwise they will not + // be replaced when user calling setOption in not merge mode. + + this._axisModel = axisModel; + this._axisPointerModel = axisPointerModel; + this._api = api; // Optimize: `render` will be called repeatly during mouse move. + // So it is power consuming if performing `render` each time, + // especially on mobile device. + + if (!forceRender && this._lastValue === value && this._lastStatus === status) { + return; + } + + this._lastValue = value; + this._lastStatus = status; + var group = this._group; + var handle = this._handle; + + if (!status || status === 'hide') { + // Do not clear here, for animation better. + group && group.hide(); + handle && handle.hide(); + return; + } + + group && group.show(); + handle && handle.show(); // Otherwise status is 'show' + + var elOption = {}; + this.makeElOption(elOption, value, axisModel, axisPointerModel, api); // Enable change axis pointer type. + + var graphicKey = elOption.graphicKey; + + if (graphicKey !== this._lastGraphicKey) { + this.clear(api); + } + + this._lastGraphicKey = graphicKey; + var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel); + + if (!group) { + group = this._group = new Group(); + this.createPointerEl(group, elOption, axisModel, axisPointerModel); + this.createLabelEl(group, elOption, axisModel, axisPointerModel); + api.getZr().add(group); + } else { + var doUpdateProps = curry(updateProps$1, axisPointerModel, moveAnimation); + this.updatePointerEl(group, elOption, doUpdateProps); + this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel); + } + + updateMandatoryProps(group, axisPointerModel, true); + + this._renderHandle(value); + }; + /** + * @implement + */ + + + BaseAxisPointer.prototype.remove = function (api) { + this.clear(api); + }; + /** + * @implement + */ + + + BaseAxisPointer.prototype.dispose = function (api) { + this.clear(api); + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.determineAnimation = function (axisModel, axisPointerModel) { + var animation = axisPointerModel.get('animation'); + var axis = axisModel.axis; + var isCategoryAxis = axis.type === 'category'; + var useSnap = axisPointerModel.get('snap'); // Value axis without snap always do not snap. + + if (!useSnap && !isCategoryAxis) { + return false; + } + + if (animation === 'auto' || animation == null) { + var animationThreshold = this.animationThreshold; + + if (isCategoryAxis && axis.getBandWidth() > animationThreshold) { + return true; + } // It is important to auto animation when snap used. Consider if there is + // a dataZoom, animation will be disabled when too many points exist, while + // it will be enabled for better visual effect when little points exist. + + + if (useSnap) { + var seriesDataCount = getAxisInfo(axisModel).seriesDataCount; + var axisExtent = axis.getExtent(); // Approximate band width + + return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold; + } + + return false; + } + + return animation === true; + }; + /** + * add {pointer, label, graphicKey} to elOption + * @protected + */ + + + BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {// Shoule be implemenented by sub-class. + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.createPointerEl = function (group, elOption, axisModel, axisPointerModel) { + var pointerOption = elOption.pointer; + + if (pointerOption) { + var pointerEl = inner$a(group).pointerEl = new graphic[pointerOption.type](clone$3(elOption.pointer)); + group.add(pointerEl); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.createLabelEl = function (group, elOption, axisModel, axisPointerModel) { + if (elOption.label) { + var labelEl = inner$a(group).labelEl = new ZRText(clone$3(elOption.label)); + group.add(labelEl); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.updatePointerEl = function (group, elOption, updateProps) { + var pointerEl = inner$a(group).pointerEl; + + if (pointerEl && elOption.pointer) { + pointerEl.setStyle(elOption.pointer.style); + updateProps(pointerEl, { + shape: elOption.pointer.shape + }); + } + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.updateLabelEl = function (group, elOption, updateProps, axisPointerModel) { + var labelEl = inner$a(group).labelEl; + + if (labelEl) { + labelEl.setStyle(elOption.label.style); + updateProps(labelEl, { + // Consider text length change in vertical axis, animation should + // be used on shape, otherwise the effect will be weird. + // TODOTODO + // shape: elOption.label.shape, + x: elOption.label.x, + y: elOption.label.y + }); + updateLabelShowHide(labelEl, axisPointerModel); + } + }; + /** + * @private + */ + + + BaseAxisPointer.prototype._renderHandle = function (value) { + if (this._dragging || !this.updateHandleTransform) { + return; + } + + var axisPointerModel = this._axisPointerModel; + + var zr = this._api.getZr(); + + var handle = this._handle; + var handleModel = axisPointerModel.getModel('handle'); + var status = axisPointerModel.get('status'); + + if (!handleModel.get('show') || !status || status === 'hide') { + handle && zr.remove(handle); + this._handle = null; + return; + } + + var isInit; + + if (!this._handle) { + isInit = true; + handle = this._handle = createIcon(handleModel.get('icon'), { + cursor: 'move', + draggable: true, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + onmousedown: bind$1(this._onHandleDragMove, this, 0, 0), + drift: bind$1(this._onHandleDragMove, this), + ondragend: bind$1(this._onHandleDragEnd, this) + }); + zr.add(handle); + } + + updateMandatoryProps(handle, axisPointerModel, false); // update style + + handle.setStyle(handleModel.getItemStyle(null, ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'])); // update position + + var handleSize = handleModel.get('size'); + + if (!isArray(handleSize)) { + handleSize = [handleSize, handleSize]; + } + + handle.scaleX = handleSize[0] / 2; + handle.scaleY = handleSize[1] / 2; + createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate'); + + this._moveHandleToValue(value, isInit); + }; + + BaseAxisPointer.prototype._moveHandleToValue = function (value, isInit) { + updateProps$1(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel))); + }; + + BaseAxisPointer.prototype._onHandleDragMove = function (dx, dy) { + var handle = this._handle; + + if (!handle) { + return; + } + + this._dragging = true; // Persistent for throttle. + + var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel); + this._payloadInfo = trans; + handle.stopAnimation(); + handle.attr(getHandleTransProps(trans)); + inner$a(handle).lastProp = null; + + this._doDispatchAxisPointer(); + }; + /** + * Throttled method. + */ + + + BaseAxisPointer.prototype._doDispatchAxisPointer = function () { + var handle = this._handle; + + if (!handle) { + return; + } + + var payloadInfo = this._payloadInfo; + var axisModel = this._axisModel; + + this._api.dispatchAction({ + type: 'updateAxisPointer', + x: payloadInfo.cursorPoint[0], + y: payloadInfo.cursorPoint[1], + tooltipOption: payloadInfo.tooltipOption, + axesInfo: [{ + axisDim: axisModel.axis.dim, + axisIndex: axisModel.componentIndex + }] + }); + }; + + BaseAxisPointer.prototype._onHandleDragEnd = function () { + this._dragging = false; + var handle = this._handle; + + if (!handle) { + return; + } + + var value = this._axisPointerModel.get('value'); // Consider snap or categroy axis, handle may be not consistent with + // axisPointer. So move handle to align the exact value position when + // drag ended. + + + this._moveHandleToValue(value); // For the effect: tooltip will be shown when finger holding on handle + // button, and will be hidden after finger left handle button. + + + this._api.dispatchAction({ + type: 'hideTip' + }); + }; + /** + * @private + */ + + + BaseAxisPointer.prototype.clear = function (api) { + this._lastValue = null; + this._lastStatus = null; + var zr = api.getZr(); + var group = this._group; + var handle = this._handle; + + if (zr && group) { + this._lastGraphicKey = null; + group && zr.remove(group); + handle && zr.remove(handle); + this._group = null; + this._handle = null; + this._payloadInfo = null; + } + + clear(this, '_doDispatchAxisPointer'); + }; + /** + * @protected + */ + + + BaseAxisPointer.prototype.doClear = function () {// Implemented by sub-class if necessary. + }; + + BaseAxisPointer.prototype.buildLabel = function (xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + }; + + return BaseAxisPointer; + }(); + + function updateProps$1(animationModel, moveAnimation, el, props) { + // Animation optimize. + if (!propsEqual(inner$a(el).lastProp, props)) { + inner$a(el).lastProp = props; + moveAnimation ? updateProps(el, props, animationModel) : (el.stopAnimation(), el.attr(props)); + } + } + + function propsEqual(lastProps, newProps) { + if (isObject(lastProps) && isObject(newProps)) { + var equals_1 = true; + each(newProps, function (item, key) { + equals_1 = equals_1 && propsEqual(lastProps[key], item); + }); + return !!equals_1; + } else { + return lastProps === newProps; + } + } + + function updateLabelShowHide(labelEl, axisPointerModel) { + labelEl[axisPointerModel.get(['label', 'show']) ? 'show' : 'hide'](); + } + + function getHandleTransProps(trans) { + return { + x: trans.x || 0, + y: trans.y || 0, + rotation: trans.rotation || 0 + }; + } + + function updateMandatoryProps(group, axisPointerModel, silent) { + var z = axisPointerModel.get('z'); + var zlevel = axisPointerModel.get('zlevel'); + group && group.traverse(function (el) { + if (el.type !== 'group') { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + el.silent = silent; + } + }); + } + + function buildElStyle(axisPointerModel) { + var axisPointerType = axisPointerModel.get('type'); + var styleModel = axisPointerModel.getModel(axisPointerType + 'Style'); + var style; + + if (axisPointerType === 'line') { + style = styleModel.getLineStyle(); + style.fill = null; + } else if (axisPointerType === 'shadow') { + style = styleModel.getAreaStyle(); + style.stroke = null; + } + + return style; + } + + /** + * @param {Function} labelPos {align, verticalAlign, position} + */ + + function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) { + var value = axisPointerModel.get('value'); + var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }); + var labelModel = axisPointerModel.getModel('label'); + var paddings = normalizeCssArray$1(labelModel.get('padding') || 0); + var font = labelModel.getFont(); + var textRect = getBoundingRect(text, font); + var position = labelPos.position; + var width = textRect.width + paddings[1] + paddings[3]; + var height = textRect.height + paddings[0] + paddings[2]; // Adjust by align. + + var align = labelPos.align; + align === 'right' && (position[0] -= width); + align === 'center' && (position[0] -= width / 2); + var verticalAlign = labelPos.verticalAlign; + verticalAlign === 'bottom' && (position[1] -= height); + verticalAlign === 'middle' && (position[1] -= height / 2); // Not overflow ec container + + confineInContainer(position, width, height, api); + var bgColor = labelModel.get('backgroundColor'); + + if (!bgColor || bgColor === 'auto') { + bgColor = axisModel.get(['axisLine', 'lineStyle', 'color']); + } + + elOption.label = { + // shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')}, + x: position[0], + y: position[1], + style: createTextStyle(labelModel, { + text: text, + font: font, + fill: labelModel.getTextColor(), + padding: paddings, + backgroundColor: bgColor + }), + // Lable should be over axisPointer. + z2: 10 + }; + } // Do not overflow ec container + + function confineInContainer(position, width, height, api) { + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + position[0] = Math.min(position[0] + width, viewWidth) - width; + position[1] = Math.min(position[1] + height, viewHeight) - height; + position[0] = Math.max(position[0], 0); + position[1] = Math.max(position[1], 0); + } + + function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) { + value = axis.scale.parse(value); + var text = axis.scale.getLabel({ + value: value + }, { + // If `precision` is set, width can be fixed (like '12.00500'), which + // helps to debounce when when moving label. + precision: opt.precision + }); + var formatter = opt.formatter; + + if (formatter) { + var params_1 = { + value: getAxisRawValue(axis, { + value: value + }), + axisDimension: axis.dim, + axisIndex: axis.index, + seriesData: [] + }; + each(seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var dataParams = series && series.getDataParams(dataIndex); + dataParams && params_1.seriesData.push(dataParams); + }); + + if (isString(formatter)) { + text = formatter.replace('{value}', text); + } else if (isFunction(formatter)) { + text = formatter(params_1); + } + } + + return text; + } + + function getTransformedPosition(axis, value, layoutInfo) { + var transform = create$1(); + rotate(transform, transform, layoutInfo.rotation); + translate(transform, transform, layoutInfo.position); + return applyTransform$1([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform); + } + + function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) { + // @ts-ignore + var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection); + layoutInfo.labelMargin = axisPointerModel.get(['label', 'margin']); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, { + position: getTransformedPosition(axisModel.axis, value, layoutInfo), + align: textLayout.textAlign, + verticalAlign: textLayout.textVerticalAlign + }); + } + + function makeLineShape(p1, p2, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x1: p1[xDimIndex], + y1: p1[1 - xDimIndex], + x2: p2[xDimIndex], + y2: p2[1 - xDimIndex] + }; + } + + function makeRectShape(xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + } + + function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) { + return { + cx: cx, + cy: cy, + r0: r0, + r: r, + startAngle: startAngle, + endAngle: endAngle, + clockwise: true + }; + } + + var CartesianAxisPointer = + /** @class */ + function (_super) { + __extends(CartesianAxisPointer, _super); + + function CartesianAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + + /** + * @override + */ + + + CartesianAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisPointerType = axisPointerModel.get('type'); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true)); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$1(grid.model, axisModel); + buildCartesianSingleLabelElOption( // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + + + CartesianAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$1(axisModel.axis.grid.model, axisModel, { + labelInside: false + }); // @ts-ignore + + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var pos = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: pos[0], + y: pos[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + + + CartesianAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisExtent = axis.getGlobalExtent(true); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var dimIndex = axis.dim === 'x' ? 0 : 1; + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; // Make tooltip do not overlap axisPointer and in the middle of the grid. + + var tooltipOptions = [{ + verticalAlign: 'middle' + }, { + align: 'center' + }]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: tooltipOptions[dimIndex] + }; + }; + + return CartesianAxisPointer; + }(BaseAxisPointer); + + function getCartesian(grid, axis) { + var opt = {}; + opt[axis.dim + 'AxisIndex'] = axis.index; + return grid.getCartesian(opt); + } + + var pointerShapeBuilder = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis)) + }; + } + }; + + function getAxisDimIndex(axis) { + return axis.dim === 'x' ? 0 : 1; + } + + var AxisPointerModel = + /** @class */ + function (_super) { + __extends(AxisPointerModel, _super); + + function AxisPointerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisPointerModel.type; + return _this; + } + + AxisPointerModel.type = 'axisPointer'; + AxisPointerModel.defaultOption = { + // 'auto' means that show when triggered by tooltip or handle. + show: 'auto', + // zlevel: 0, + z: 50, + type: 'line', + // axispointer triggered by tootip determine snap automatically, + // see `modelHelper`. + snap: false, + triggerTooltip: true, + value: null, + status: null, + link: [], + // Do not set 'auto' here, otherwise global animation: false + // will not effect at this axispointer. + animation: null, + animationDurationUpdate: 200, + lineStyle: { + color: '#B9BEC9', + width: 1, + type: 'dashed' + }, + shadowStyle: { + color: 'rgba(210,219,238,0.2)' + }, + label: { + show: true, + formatter: null, + precision: 'auto', + margin: 3, + color: '#fff', + padding: [5, 7, 5, 7], + backgroundColor: 'auto', + borderColor: null, + borderWidth: 0, + borderRadius: 3 + }, + handle: { + show: false, + // eslint-disable-next-line + icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', + size: 45, + // handle margin is from symbol center to axis, which is stable when circular move. + margin: 50, + // color: '#1b8bbd' + // color: '#2f4554' + color: '#333', + shadowBlur: 3, + shadowColor: '#aaa', + shadowOffsetX: 0, + shadowOffsetY: 2, + // For mobile performance + throttle: 40 + } + }; + return AxisPointerModel; + }(ComponentModel); + + var inner$b = makeInner(); + var each$7 = each; + + /** + * @param {string} key + * @param {module:echarts/ExtensionAPI} api + * @param {Function} handler + * param: {string} currTrigger + * param: {Array.} point + */ + + function register(key, api, handler) { + if (env.node) { + return; + } + + var zr = api.getZr(); + inner$b(zr).records || (inner$b(zr).records = {}); + initGlobalListeners(zr, api); + var record = inner$b(zr).records[key] || (inner$b(zr).records[key] = {}); + record.handler = handler; + } + + function initGlobalListeners(zr, api) { + if (inner$b(zr).initialized) { + return; + } + + inner$b(zr).initialized = true; + useHandler('click', curry(doEnter, 'click')); + useHandler('mousemove', curry(doEnter, 'mousemove')); // useHandler('mouseout', onLeave); + + useHandler('globalout', onLeave); + + function useHandler(eventType, cb) { + zr.on(eventType, function (e) { + var dis = makeDispatchAction(api); + each$7(inner$b(zr).records, function (record) { + record && cb(record, e, dis.dispatchAction); + }); + dispatchTooltipFinally(dis.pendings, api); + }); + } + } + + function dispatchTooltipFinally(pendings, api) { + var showLen = pendings.showTip.length; + var hideLen = pendings.hideTip.length; + var actuallyPayload; + + if (showLen) { + actuallyPayload = pendings.showTip[showLen - 1]; + } else if (hideLen) { + actuallyPayload = pendings.hideTip[hideLen - 1]; + } + + if (actuallyPayload) { + actuallyPayload.dispatchAction = null; + api.dispatchAction(actuallyPayload); + } + } + + function onLeave(record, e, dispatchAction) { + record.handler('leave', null, dispatchAction); + } + + function doEnter(currTrigger, record, e, dispatchAction) { + record.handler(currTrigger, e, dispatchAction); + } + + function makeDispatchAction(api) { + var pendings = { + showTip: [], + hideTip: [] + }; // FIXME + // better approach? + // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip, + // which may be conflict, (axisPointer call showTip but tooltip call hideTip); + // So we have to add "final stage" to merge those dispatched actions. + + var dispatchAction = function (payload) { + var pendingList = pendings[payload.type]; + + if (pendingList) { + pendingList.push(payload); + } else { + payload.dispatchAction = dispatchAction; + api.dispatchAction(payload); + } + }; + + return { + dispatchAction: dispatchAction, + pendings: pendings + }; + } + + function unregister(key, api) { + if (env.node) { + return; + } + + var zr = api.getZr(); + var record = (inner$b(zr).records || {})[key]; + + if (record) { + inner$b(zr).records[key] = null; + } + } + + var AxisPointerView = + /** @class */ + function (_super) { + __extends(AxisPointerView, _super); + + function AxisPointerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AxisPointerView.type; + return _this; + } + + AxisPointerView.prototype.render = function (globalAxisPointerModel, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var triggerOn = globalAxisPointerModel.get('triggerOn') || globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click'; // Register global listener in AxisPointerView to enable + // AxisPointerView to be independent to Tooltip. + + register('axisPointer', api, function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none' && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)) { + dispatchAction({ + type: 'updateAxisPointer', + currTrigger: currTrigger, + x: e && e.offsetX, + y: e && e.offsetY + }); + } + }); + }; + + AxisPointerView.prototype.remove = function (ecModel, api) { + unregister('axisPointer', api); + }; + + AxisPointerView.prototype.dispose = function (ecModel, api) { + unregister('axisPointer', api); + }; + + AxisPointerView.type = 'axisPointer'; + return AxisPointerView; + }(ComponentView); + + /** + * @param finder contains {seriesIndex, dataIndex, dataIndexInside} + * @param ecModel + * @return {point: [x, y], el: ...} point Will not be null. + */ + + function findPointFromSeries(finder, ecModel) { + var point = []; + var seriesIndex = finder.seriesIndex; + var seriesModel; + + if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) { + return { + point: [] + }; + } + + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, finder); + + if (dataIndex == null || dataIndex < 0 || isArray(dataIndex)) { + return { + point: [] + }; + } + + var el = data.getItemGraphicEl(dataIndex); + var coordSys = seriesModel.coordinateSystem; + + if (seriesModel.getTooltipPosition) { + point = seriesModel.getTooltipPosition(dataIndex) || []; + } else if (coordSys && coordSys.dataToPoint) { + if (finder.isStacked) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueAxisDim = valueAxis.dim; + var baseAxisDim = baseAxis.dim; + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + var baseDim = data.mapDimension(baseAxisDim); + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseDim, dataIndex); + stackedData[1 - baseDataOffset] = data.get(data.getCalculationInfo('stackResultDimension'), dataIndex); + point = coordSys.dataToPoint(stackedData) || []; + } else { + point = coordSys.dataToPoint(data.getValues(map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }), dataIndex)) || []; + } + } else if (el) { + // Use graphic bounding rect + var rect = el.getBoundingRect().clone(); + rect.applyTransform(el.transform); + point = [rect.x + rect.width / 2, rect.y + rect.height / 2]; + } + + return { + point: point, + el: el + }; + } + + var inner$c = makeInner(); + + /** + * Basic logic: check all axis, if they do not demand show/highlight, + * then hide/downplay them. + * + * @return content of event obj for echarts.connect. + */ + + function axisTrigger(payload, ecModel, api) { + var currTrigger = payload.currTrigger; + var point = [payload.x, payload.y]; + var finder = payload; + var dispatchAction = payload.dispatchAction || bind(api.dispatchAction, api); + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; // Pending + // See #6121. But we are not able to reproduce it yet. + + if (!coordSysAxesInfo) { + return; + } + + if (illegalPoint(point)) { + // Used in the default behavior of `connection`: use the sample seriesIndex + // and dataIndex. And also used in the tooltipView trigger. + point = findPointFromSeries({ + seriesIndex: finder.seriesIndex, + // Do not use dataIndexInside from other ec instance. + // FIXME: auto detect it? + dataIndex: finder.dataIndex + }, ecModel).point; + } + + var isIllegalPoint = illegalPoint(point); // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}). + // Notice: In this case, it is difficult to get the `point` (which is necessary to show + // tooltip, so if point is not given, we just use the point found by sample seriesIndex + // and dataIndex. + + var inputAxesInfo = finder.axesInfo; + var axesInfo = coordSysAxesInfo.axesInfo; + var shouldHide = currTrigger === 'leave' || illegalPoint(point); + var outputPayload = {}; + var showValueMap = {}; + var dataByCoordSys = { + list: [], + map: {} + }; + var updaters = { + showPointer: curry(showPointer, showValueMap), + showTooltip: curry(showTooltip, dataByCoordSys) + }; // Process for triggered axes. + + each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) { + // If a point given, it must be contained by the coordinate system. + var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point); + each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) { + var axis = axisInfo.axis; + var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); // If no inputAxesInfo, no axis is restricted. + + if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) { + var val = inputAxisInfo && inputAxisInfo.value; + + if (val == null && !isIllegalPoint) { + val = axis.pointToData(point); + } + + val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload); + } + }); + }); // Process for linked axes. + + var linkTriggers = {}; + each(axesInfo, function (tarAxisInfo, tarKey) { + var linkGroup = tarAxisInfo.linkGroup; // If axis has been triggered in the previous stage, it should not be triggered by link. + + if (linkGroup && !showValueMap[tarKey]) { + each(linkGroup.axesInfo, function (srcAxisInfo, srcKey) { + var srcValItem = showValueMap[srcKey]; // If srcValItem exist, source axis is triggered, so link to target axis. + + if (srcAxisInfo !== tarAxisInfo && srcValItem) { + var val = srcValItem.value; + linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo)))); + linkTriggers[tarAxisInfo.key] = val; + } + }); + } + }); + each(linkTriggers, function (val, tarKey) { + processOnAxis(axesInfo[tarKey], val, updaters, true, outputPayload); + }); + updateModelActually(showValueMap, axesInfo, outputPayload); + dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction); + dispatchHighDownActually(axesInfo, dispatchAction, api); + return outputPayload; + } + + function processOnAxis(axisInfo, newValue, updaters, noSnap, outputFinder) { + var axis = axisInfo.axis; + + if (axis.scale.isBlank() || !axis.containData(newValue)) { + return; + } + + if (!axisInfo.involveSeries) { + updaters.showPointer(axisInfo, newValue); + return; + } // Heavy calculation. So put it after axis.containData checking. + + + var payloadInfo = buildPayloadsBySeries(newValue, axisInfo); + var payloadBatch = payloadInfo.payloadBatch; + var snapToValue = payloadInfo.snapToValue; // Fill content of event obj for echarts.connect. + // By default use the first involved series data as a sample to connect. + + if (payloadBatch[0] && outputFinder.seriesIndex == null) { + extend(outputFinder, payloadBatch[0]); + } // If no linkSource input, this process is for collecting link + // target, where snap should not be accepted. + + + if (!noSnap && axisInfo.snap) { + if (axis.containData(snapToValue) && snapToValue != null) { + newValue = snapToValue; + } + } + + updaters.showPointer(axisInfo, newValue, payloadBatch); // Tooltip should always be snapToValue, otherwise there will be + // incorrect "axis value ~ series value" mapping displayed in tooltip. + + updaters.showTooltip(axisInfo, payloadInfo, snapToValue); + } + + function buildPayloadsBySeries(value, axisInfo) { + var axis = axisInfo.axis; + var dim = axis.dim; + var snapToValue = value; + var payloadBatch = []; + var minDist = Number.MAX_VALUE; + var minDiff = -1; + each(axisInfo.seriesModels, function (series, idx) { + var dataDim = series.getData().mapDimensionsAll(dim); + var seriesNestestValue; + var dataIndices; + + if (series.getAxisTooltipData) { + var result = series.getAxisTooltipData(dataDim, value, axis); + dataIndices = result.dataIndices; + seriesNestestValue = result.nestestValue; + } else { + dataIndices = series.getData().indicesOfNearest(dataDim[0], value, // Add a threshold to avoid find the wrong dataIndex + // when data length is not same. + // false, + axis.type === 'category' ? 0.5 : null); + + if (!dataIndices.length) { + return; + } + + seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]); + } + + if (seriesNestestValue == null || !isFinite(seriesNestestValue)) { + return; + } + + var diff = value - seriesNestestValue; + var dist = Math.abs(diff); // Consider category case + + if (dist <= minDist) { + if (dist < minDist || diff >= 0 && minDiff < 0) { + minDist = dist; + minDiff = diff; + snapToValue = seriesNestestValue; + payloadBatch.length = 0; + } + + each(dataIndices, function (dataIndex) { + payloadBatch.push({ + seriesIndex: series.seriesIndex, + dataIndexInside: dataIndex, + dataIndex: series.getData().getRawIndex(dataIndex) + }); + }); + } + }); + return { + payloadBatch: payloadBatch, + snapToValue: snapToValue + }; + } + + function showPointer(showValueMap, axisInfo, value, payloadBatch) { + showValueMap[axisInfo.key] = { + value: value, + payloadBatch: payloadBatch + }; + } + + function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) { + var payloadBatch = payloadInfo.payloadBatch; + var axis = axisInfo.axis; + var axisModel = axis.model; + var axisPointerModel = axisInfo.axisPointerModel; // If no data, do not create anything in dataByCoordSys, + // whose length will be used to judge whether dispatch action. + + if (!axisInfo.triggerTooltip || !payloadBatch.length) { + return; + } + + var coordSysModel = axisInfo.coordSys.model; + var coordSysKey = makeKey(coordSysModel); + var coordSysItem = dataByCoordSys.map[coordSysKey]; + + if (!coordSysItem) { + coordSysItem = dataByCoordSys.map[coordSysKey] = { + coordSysId: coordSysModel.id, + coordSysIndex: coordSysModel.componentIndex, + coordSysType: coordSysModel.type, + coordSysMainType: coordSysModel.mainType, + dataByAxis: [] + }; + dataByCoordSys.list.push(coordSysItem); + } + + coordSysItem.dataByAxis.push({ + axisDim: axis.dim, + axisIndex: axisModel.componentIndex, + axisType: axisModel.type, + axisId: axisModel.id, + value: value, + // Caustion: viewHelper.getValueLabel is actually on "view stage", which + // depends that all models have been updated. So it should not be performed + // here. Considering axisPointerModel used here is volatile, which is hard + // to be retrieve in TooltipView, we prepare parameters here. + valueLabelOpt: { + precision: axisPointerModel.get(['label', 'precision']), + formatter: axisPointerModel.get(['label', 'formatter']) + }, + seriesDataIndices: payloadBatch.slice() + }); + } + + function updateModelActually(showValueMap, axesInfo, outputPayload) { + var outputAxesInfo = outputPayload.axesInfo = []; // Basic logic: If no 'show' required, 'hide' this axisPointer. + + each(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + var valItem = showValueMap[key]; + + if (valItem) { + !axisInfo.useHandle && (option.status = 'show'); + option.value = valItem.value; // For label formatter param and highlight. + + option.seriesDataIndices = (valItem.payloadBatch || []).slice(); + } // When always show (e.g., handle used), remain + // original value and status. + else { + // If hide, value still need to be set, consider + // click legend to toggle axis blank. + !axisInfo.useHandle && (option.status = 'hide'); + } // If status is 'hide', should be no info in payload. + + + option.status === 'show' && outputAxesInfo.push({ + axisDim: axisInfo.axis.dim, + axisIndex: axisInfo.axis.model.componentIndex, + value: option.value + }); + }); + } + + function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) { + // Basic logic: If no showTip required, hideTip will be dispatched. + if (illegalPoint(point) || !dataByCoordSys.list.length) { + dispatchAction({ + type: 'hideTip' + }); + return; + } // In most case only one axis (or event one series is used). It is + // convinient to fetch payload.seriesIndex and payload.dataIndex + // dirtectly. So put the first seriesIndex and dataIndex of the first + // axis on the payload. + + + var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; + dispatchAction({ + type: 'showTip', + escapeConnect: true, + x: point[0], + y: point[1], + tooltipOption: payload.tooltipOption, + position: payload.position, + dataIndexInside: sampleItem.dataIndexInside, + dataIndex: sampleItem.dataIndex, + seriesIndex: sampleItem.seriesIndex, + dataByCoordSys: dataByCoordSys.list + }); + } + + function dispatchHighDownActually(axesInfo, dispatchAction, api) { + // FIXME + // highlight status modification shoule be a stage of main process? + // (Consider confilct (e.g., legend and axisPointer) and setOption) + var zr = api.getZr(); + var highDownKey = 'axisPointerLastHighlights'; + var lastHighlights = inner$c(zr)[highDownKey] || {}; + var newHighlights = inner$c(zr)[highDownKey] = {}; // Update highlight/downplay status according to axisPointer model. + // Build hash map and remove duplicate incidentally. + + each(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + option.status === 'show' && each(option.seriesDataIndices, function (batchItem) { + var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex; + newHighlights[key] = batchItem; + }); + }); // Diff. + + var toHighlight = []; + var toDownplay = []; + each(lastHighlights, function (batchItem, key) { + !newHighlights[key] && toDownplay.push(batchItem); + }); + each(newHighlights, function (batchItem, key) { + !lastHighlights[key] && toHighlight.push(batchItem); + }); + toDownplay.length && api.dispatchAction({ + type: 'downplay', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toDownplay + }); + toHighlight.length && api.dispatchAction({ + type: 'highlight', + escapeConnect: true, + // Not blur others when highlight in axisPointer. + notBlur: true, + batch: toHighlight + }); + } + + function findInputAxisInfo(inputAxesInfo, axisInfo) { + for (var i = 0; i < (inputAxesInfo || []).length; i++) { + var inputAxisInfo = inputAxesInfo[i]; + + if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) { + return inputAxisInfo; + } + } + } + + function makeMapperParam(axisInfo) { + var axisModel = axisInfo.axis.model; + var item = {}; + var dim = item.axisDim = axisInfo.axis.dim; + item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex; + item.axisName = item[dim + 'AxisName'] = axisModel.name; + item.axisId = item[dim + 'AxisId'] = axisModel.id; + return item; + } + + function illegalPoint(point) { + return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]); + } + + function install$s(registers) { + // CartesianAxisPointer is not supposed to be required here. But consider + // echarts.simple.js and online build tooltip, which only require gridSimple, + // CartesianAxisPointer should be able to required somewhere. + AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer); + registers.registerComponentModel(AxisPointerModel); + registers.registerComponentView(AxisPointerView); + registers.registerPreprocessor(function (option) { + // Always has a global axisPointerModel for default setting. + if (option) { + (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {}); + var link = option.axisPointer.link; // Normalize to array to avoid object mergin. But if link + // is not set, remain null/undefined, otherwise it will + // override existent link setting. + + if (link && !isArray(link)) { + option.axisPointer.link = [link]; + } + } + }); // This process should proformed after coordinate systems created + // and series data processed. So put it on statistic processing stage. + + registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) { + // Build axisPointerModel, mergin tooltip.axisPointer model for each axis. + // allAxesInfo should be updated when setOption performed. + ecModel.getComponent('axisPointer').coordSysAxesInfo = collect(ecModel, api); + }); // Broadcast to all views. + + registers.registerAction({ + type: 'updateAxisPointer', + event: 'updateAxisPointer', + update: ':updateAxisPointer' + }, axisTrigger); + } + + function install$t(registers) { + use(install$5); + use(install$s); + } + + var PolarAxisPointer = + /** @class */ + function (_super) { + __extends(PolarAxisPointer, _super); + + function PolarAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + + /** + * @override + */ + + + PolarAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + + if (axis.dim === 'angle') { + this.animationThreshold = Math.PI / 18; + } + + var polar = axis.polar; + var otherAxis = polar.getOtherAxis(axis); + var otherExtent = otherAxis.getExtent(); + var coordValue = axis.dataToCoord(value); + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$1[axisPointerType](axis, polar, coordValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var labelMargin = axisPointerModel.get(['label', 'margin']); + var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos); + }; + + return PolarAxisPointer; + }(BaseAxisPointer); + + function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) { + var axis = axisModel.axis; + var coord = axis.dataToCoord(value); + var axisAngle = polar.getAngleAxis().getExtent()[0]; + axisAngle = axisAngle / 180 * Math.PI; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var position; + var align; + var verticalAlign; + + if (axis.dim === 'radius') { + var transform = create$1(); + rotate(transform, transform, axisAngle); + translate(transform, transform, [polar.cx, polar.cy]); + position = applyTransform$1([coord, -labelMargin], transform); + var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0; // @ts-ignore + + var labelLayout = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1); + align = labelLayout.textAlign; + verticalAlign = labelLayout.textVerticalAlign; + } else { + // angle axis + var r = radiusExtent[1]; + position = polar.coordToPoint([r + labelMargin, coord]); + var cx = polar.cx; + var cy = polar.cy; + align = Math.abs(position[0] - cx) / r < 0.3 ? 'center' : position[0] > cx ? 'left' : 'right'; + verticalAlign = Math.abs(position[1] - cy) / r < 0.3 ? 'middle' : position[1] > cy ? 'top' : 'bottom'; + } + + return { + position: position, + align: align, + verticalAlign: verticalAlign + }; + } + + var pointerShapeBuilder$1 = { + line: function (axis, polar, coordValue, otherExtent) { + return axis.dim === 'angle' ? { + type: 'Line', + shape: makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue])) + } : { + type: 'Circle', + shape: { + cx: polar.cx, + cy: polar.cy, + r: coordValue + } + }; + }, + shadow: function (axis, polar, coordValue, otherExtent) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var radian = Math.PI / 180; + return axis.dim === 'angle' ? { + type: 'Sector', + shape: makeSectorShape(polar.cx, polar.cy, otherExtent[0], otherExtent[1], // In ECharts y is negative if angle is positive + (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian) + } : { + type: 'Sector', + shape: makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2) + }; + } + }; + + var PolarModel = + /** @class */ + function (_super) { + __extends(PolarModel, _super); + + function PolarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PolarModel.type; + return _this; + } + + PolarModel.prototype.findAxisModel = function (axisType) { + var foundAxisModel; + var ecModel = this.ecModel; + ecModel.eachComponent(axisType, function (axisModel) { + if (axisModel.getCoordSysModel() === this) { + foundAxisModel = axisModel; + } + }, this); + return foundAxisModel; + }; + + PolarModel.type = 'polar'; + PolarModel.dependencies = ['radiusAxis', 'angleAxis']; + PolarModel.defaultOption = { + // zlevel: 0, + z: 0, + center: ['50%', '50%'], + radius: '80%' + }; + return PolarModel; + }(ComponentModel); + + var PolarAxisModel = + /** @class */ + function (_super) { + __extends(PolarAxisModel, _super); + + function PolarAxisModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + + PolarAxisModel.prototype.getCoordSysModel = function () { + return this.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + }; + + PolarAxisModel.type = 'polarAxis'; + return PolarAxisModel; + }(ComponentModel); + + mixin(PolarAxisModel, AxisModelCommonMixin); + + var AngleAxisModel = + /** @class */ + function (_super) { + __extends(AngleAxisModel, _super); + + function AngleAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AngleAxisModel.type; + return _this; + } + + AngleAxisModel.type = 'angleAxis'; + return AngleAxisModel; + }(PolarAxisModel); + + var RadiusAxisModel = + /** @class */ + function (_super) { + __extends(RadiusAxisModel, _super); + + function RadiusAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadiusAxisModel.type; + return _this; + } + + RadiusAxisModel.type = 'radiusAxis'; + return RadiusAxisModel; + }(PolarAxisModel); + + var RadiusAxis = + /** @class */ + function (_super) { + __extends(RadiusAxis, _super); + + function RadiusAxis(scale, radiusExtent) { + return _super.call(this, 'radius', scale, radiusExtent) || this; + } + + RadiusAxis.prototype.pointToData = function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }; + + return RadiusAxis; + }(Axis); + + RadiusAxis.prototype.dataToRadius = Axis.prototype.dataToCoord; + RadiusAxis.prototype.radiusToData = Axis.prototype.coordToData; + + var inner$d = makeInner(); + + var AngleAxis = + /** @class */ + function (_super) { + __extends(AngleAxis, _super); + + function AngleAxis(scale, angleExtent) { + return _super.call(this, 'angle', scale, angleExtent || [0, 360]) || this; + } + + AngleAxis.prototype.pointToData = function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }; + /** + * Only be called in category axis. + * Angle axis uses text height to decide interval + * + * @override + * @return {number} Auto interval for cateogry axis tick and label + */ + + + AngleAxis.prototype.calculateCategoryInterval = function () { + var axis = this; + var labelModel = axis.getLabelModel(); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitH = Math.abs(unitSpan); // Not precise, just use height as text width + // and each distance from axis line yet. + + var rect = getBoundingRect(tickValue == null ? '' : tickValue + '', labelModel.getFont(), 'center', 'top'); + var maxH = Math.max(rect.height, 7); + var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity. + + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(dh)); + var cache = inner$d(axis.model); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + + if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval) { + interval = lastAutoInterval; + } // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + } + + return interval; + }; + + return AngleAxis; + }(Axis); + + AngleAxis.prototype.dataToAngle = Axis.prototype.dataToCoord; + AngleAxis.prototype.angleToData = Axis.prototype.coordToData; + + var polarDimensions = ['radius', 'angle']; + + var Polar = + /** @class */ + function () { + function Polar(name) { + this.dimensions = polarDimensions; + this.type = 'polar'; + /** + * x of polar center + */ + + this.cx = 0; + /** + * y of polar center + */ + + this.cy = 0; + this._radiusAxis = new RadiusAxis(); + this._angleAxis = new AngleAxis(); + this.axisPointerEnabled = true; + this.name = name || ''; + this._radiusAxis.polar = this._angleAxis.polar = this; + } + + /** + * If contain coord + */ + + + Polar.prototype.containPoint = function (point) { + var coord = this.pointToCoord(point); + return this._radiusAxis.contain(coord[0]) && this._angleAxis.contain(coord[1]); + }; + /** + * If contain data + */ + + + Polar.prototype.containData = function (data) { + return this._radiusAxis.containData(data[0]) && this._angleAxis.containData(data[1]); + }; + + Polar.prototype.getAxis = function (dim) { + var key = '_' + dim + 'Axis'; + return this[key]; + }; + + Polar.prototype.getAxes = function () { + return [this._radiusAxis, this._angleAxis]; + }; + /** + * Get axes by type of scale + */ + + + Polar.prototype.getAxesByScale = function (scaleType) { + var axes = []; + var angleAxis = this._angleAxis; + var radiusAxis = this._radiusAxis; + angleAxis.scale.type === scaleType && axes.push(angleAxis); + radiusAxis.scale.type === scaleType && axes.push(radiusAxis); + return axes; + }; + + Polar.prototype.getAngleAxis = function () { + return this._angleAxis; + }; + + Polar.prototype.getRadiusAxis = function () { + return this._radiusAxis; + }; + + Polar.prototype.getOtherAxis = function (axis) { + var angleAxis = this._angleAxis; + return axis === angleAxis ? this._radiusAxis : angleAxis; + }; + /** + * Base axis will be used on stacking. + * + */ + + + Polar.prototype.getBaseAxis = function () { + return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAngleAxis(); + }; + + Polar.prototype.getTooltipAxes = function (dim) { + var baseAxis = dim != null && dim !== 'auto' ? this.getAxis(dim) : this.getBaseAxis(); + return { + baseAxes: [baseAxis], + otherAxes: [this.getOtherAxis(baseAxis)] + }; + }; + /** + * Convert a single data item to (x, y) point. + * Parameter data is an array which the first element is radius and the second is angle + */ + + + Polar.prototype.dataToPoint = function (data, clamp) { + return this.coordToPoint([this._radiusAxis.dataToRadius(data[0], clamp), this._angleAxis.dataToAngle(data[1], clamp)]); + }; + /** + * Convert a (x, y) point to data + */ + + + Polar.prototype.pointToData = function (point, clamp) { + var coord = this.pointToCoord(point); + return [this._radiusAxis.radiusToData(coord[0], clamp), this._angleAxis.angleToData(coord[1], clamp)]; + }; + /** + * Convert a (x, y) point to (radius, angle) coord + */ + + + Polar.prototype.pointToCoord = function (point) { + var dx = point[0] - this.cx; + var dy = point[1] - this.cy; + var angleAxis = this.getAngleAxis(); + var extent = angleAxis.getExtent(); + var minAngle = Math.min(extent[0], extent[1]); + var maxAngle = Math.max(extent[0], extent[1]); // Fix fixed extent in polarCreator + // FIXME + + angleAxis.inverse ? minAngle = maxAngle - 360 : maxAngle = minAngle + 360; + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + var radian = Math.atan2(-dy, dx) / Math.PI * 180; // move to angleExtent + + var dir = radian < minAngle ? 1 : -1; + + while (radian < minAngle || radian > maxAngle) { + radian += dir * 360; + } + + return [radius, radian]; + }; + /** + * Convert a (radius, angle) coord to (x, y) point + */ + + + Polar.prototype.coordToPoint = function (coord) { + var radius = coord[0]; + var radian = coord[1] / 180 * Math.PI; + var x = Math.cos(radian) * radius + this.cx; // Inverse the y + + var y = -Math.sin(radian) * radius + this.cy; + return [x, y]; + }; + /** + * Get ring area of cartesian. + * Area will have a contain function to determine if a point is in the coordinate system. + */ + + + Polar.prototype.getArea = function () { + var angleAxis = this.getAngleAxis(); + var radiusAxis = this.getRadiusAxis(); + var radiusExtent = radiusAxis.getExtent().slice(); + radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse(); + var angleExtent = angleAxis.getExtent(); + var RADIAN = Math.PI / 180; + return { + cx: this.cx, + cy: this.cy, + r0: radiusExtent[0], + r: radiusExtent[1], + startAngle: -angleExtent[0] * RADIAN, + endAngle: -angleExtent[1] * RADIAN, + clockwise: angleAxis.inverse, + contain: function (x, y) { + // It's a ring shape. + // Start angle and end angle don't matter + var dx = x - this.cx; + var dy = y - this.cy; // minus a tiny value 1e-4 to avoid being clipped unexpectedly + + var d2 = dx * dx + dy * dy - 1e-4; + var r = this.r; + var r0 = this.r0; + return d2 <= r * r && d2 >= r0 * r0; + } + }; + }; + + Polar.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$2(finder); + return coordSys === this ? this.dataToPoint(value) : null; + }; + + Polar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$2(finder); + return coordSys === this ? this.pointToData(pixel) : null; + }; + + return Polar; + }(); + + function getCoordSys$2(finder) { + var seriesModel = finder.seriesModel; + var polarModel = finder.polarModel; + return polarModel && polarModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; + } + + /** + * Resize method bound to the polar + */ + + function resizePolar(polar, polarModel, api) { + var center = polarModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + polar.cx = parsePercent$1(center[0], width); + polar.cy = parsePercent$1(center[1], height); + var radiusAxis = polar.getRadiusAxis(); + var size = Math.min(width, height) / 2; + var radius = polarModel.get('radius'); + + if (radius == null) { + radius = [0, '100%']; + } else if (!isArray(radius)) { + // r0 = 0 + radius = [0, radius]; + } + + var parsedRadius = [parsePercent$1(radius[0], size), parsePercent$1(radius[1], size)]; + radiusAxis.inverse ? radiusAxis.setExtent(parsedRadius[1], parsedRadius[0]) : radiusAxis.setExtent(parsedRadius[0], parsedRadius[1]); + } + + /** + * Update polar + */ + + + function updatePolarScale(ecModel, api) { + var polar = this; + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); // Reset scale + + angleAxis.scale.setExtent(Infinity, -Infinity); + radiusAxis.scale.setExtent(Infinity, -Infinity); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === polar) { + var data_1 = seriesModel.getData(); + each(getDataDimensionsOnAxis(data_1, 'radius'), function (dim) { + radiusAxis.scale.unionExtentFromData(data_1, dim); + }); + each(getDataDimensionsOnAxis(data_1, 'angle'), function (dim) { + angleAxis.scale.unionExtentFromData(data_1, dim); + }); + } + }); + niceScaleExtent(angleAxis.scale, angleAxis.model); + niceScaleExtent(radiusAxis.scale, radiusAxis.model); // Fix extent of category angle axis + + if (angleAxis.type === 'category' && !angleAxis.onBand) { + var extent = angleAxis.getExtent(); + var diff = 360 / angleAxis.scale.count(); + angleAxis.inverse ? extent[1] += diff : extent[1] -= diff; + angleAxis.setExtent(extent[0], extent[1]); + } + } + + function isAngleAxisModel(axisModel) { + return axisModel.mainType === 'angleAxis'; + } + + /** + * Set common axis properties + */ + + + function setAxis(axis, axisModel) { + axis.type = axisModel.get('type'); + axis.scale = createScaleByModel(axisModel); + axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category'; + axis.inverse = axisModel.get('inverse'); + + if (isAngleAxisModel(axisModel)) { + axis.inverse = axis.inverse !== axisModel.get('clockwise'); + var startAngle = axisModel.get('startAngle'); + axis.setExtent(startAngle, startAngle + (axis.inverse ? -360 : 360)); + } // Inject axis instance + + + axisModel.axis = axis; + axis.model = axisModel; + } + + var polarCreator = { + dimensions: polarDimensions, + create: function (ecModel, api) { + var polarList = []; + ecModel.eachComponent('polar', function (polarModel, idx) { + var polar = new Polar(idx + ''); // Inject resize and update method + + polar.update = updatePolarScale; + var radiusAxis = polar.getRadiusAxis(); + var angleAxis = polar.getAngleAxis(); + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + setAxis(radiusAxis, radiusAxisModel); + setAxis(angleAxis, angleAxisModel); + resizePolar(polar, polarModel, api); + polarList.push(polar); + polarModel.coordinateSystem = polar; + polar.model = polarModel; + }); // Inject coordinateSystem to series + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'polar') { + var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0]; + + if ("development" !== 'production') { + if (!polarModel) { + throw new Error('Polar "' + retrieve(seriesModel.get('polarIndex'), seriesModel.get('polarId'), 0) + '" not found'); + } + } + + seriesModel.coordinateSystem = polarModel.coordinateSystem; + } + }); + return polarList; + } + }; + + var elementList$1 = ['axisLine', 'axisLabel', 'axisTick', 'minorTick', 'splitLine', 'minorSplitLine', 'splitArea']; + + function getAxisLineShape(polar, rExtent, angle) { + rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse()); + var start = polar.coordToPoint([rExtent[0], angle]); + var end = polar.coordToPoint([rExtent[1], angle]); + return { + x1: start[0], + y1: start[1], + x2: end[0], + y2: end[1] + }; + } + + function getRadiusIdx(polar) { + var radiusAxis = polar.getRadiusAxis(); + return radiusAxis.inverse ? 0 : 1; + } // Remove the last tick which will overlap the first tick + + + function fixAngleOverlap(list) { + var firstItem = list[0]; + var lastItem = list[list.length - 1]; + + if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) { + list.pop(); + } + } + + var AngleAxisView = + /** @class */ + function (_super) { + __extends(AngleAxisView, _super); + + function AngleAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = AngleAxisView.type; + _this.axisPointerClass = 'PolarAxisPointer'; + return _this; + } + + AngleAxisView.prototype.render = function (angleAxisModel, ecModel) { + this.group.removeAll(); + + if (!angleAxisModel.get('show')) { + return; + } + + var angleAxis = angleAxisModel.axis; + var polar = angleAxis.polar; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var ticksAngles = angleAxis.getTicksCoords(); + var minorTickAngles = angleAxis.getMinorTicksCoords(); + var labels = map(angleAxis.getViewLabels(), function (labelItem) { + labelItem = clone(labelItem); + var scale = angleAxis.scale; + var tickValue = scale.type === 'ordinal' ? scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue; + labelItem.coord = angleAxis.dataToCoord(tickValue); + return labelItem; + }); + fixAngleOverlap(labels); + fixAngleOverlap(ticksAngles); + each(elementList$1, function (name) { + if (angleAxisModel.get([name, 'show']) && (!angleAxis.scale.isBlank() || name === 'axisLine')) { + angelAxisElementsBuilders[name](this.group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels); + } + }, this); + }; + + AngleAxisView.type = 'angleAxis'; + return AngleAxisView; + }(AxisView); + + var angelAxisElementsBuilders = { + axisLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var lineStyleModel = angleAxisModel.getModel(['axisLine', 'lineStyle']); // extent id of the axis radius (r0 and r) + + var rId = getRadiusIdx(polar); + var r0Id = rId ? 0 : 1; + var shape; + + if (radiusExtent[r0Id] === 0) { + shape = new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[rId] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + } else { + shape = new Ring({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[rId], + r0: radiusExtent[r0Id] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + } + + shape.style.fill = null; + group.add(shape); + }, + axisTick: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var tickModel = angleAxisModel.getModel('axisTick'); + var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + var lines = map(ticksAngles, function (tickAngleItem) { + return new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord) + }); + }); + group.add(mergePath$1(lines, { + style: defaults(tickModel.getModel('lineStyle').getLineStyle(), { + stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) + }) + })); + }, + minorTick: function (group, angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) { + if (!minorTickAngles.length) { + return; + } + + var tickModel = angleAxisModel.getModel('axisTick'); + var minorTickModel = angleAxisModel.getModel('minorTick'); + var tickLen = (tickModel.get('inside') ? -1 : 1) * minorTickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + var lines = []; + + for (var i = 0; i < minorTickAngles.length; i++) { + for (var k = 0; k < minorTickAngles[i].length; k++) { + lines.push(new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord) + })); + } + } + + group.add(mergePath$1(lines, { + style: defaults(minorTickModel.getModel('lineStyle').getLineStyle(), defaults(tickModel.getLineStyle(), { + stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color']) + })) + })); + }, + axisLabel: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) { + var rawCategoryData = angleAxisModel.getCategories(true); + var commonLabelModel = angleAxisModel.getModel('axisLabel'); + var labelMargin = commonLabelModel.get('margin'); + var triggerEvent = angleAxisModel.get('triggerEvent'); // Use length of ticksAngles because it may remove the last tick to avoid overlapping + + each(labels, function (labelItem, idx) { + var labelModel = commonLabelModel; + var tickValue = labelItem.tickValue; + var r = radiusExtent[getRadiusIdx(polar)]; + var p = polar.coordToPoint([r + labelMargin, labelItem.coord]); + var cx = polar.cx; + var cy = polar.cy; + var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 ? 'center' : p[0] > cx ? 'left' : 'right'; + var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? 'middle' : p[1] > cy ? 'top' : 'bottom'; + + if (rawCategoryData && rawCategoryData[tickValue]) { + var rawCategoryItem = rawCategoryData[tickValue]; + + if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) { + labelModel = new Model(rawCategoryItem.textStyle, commonLabelModel, commonLabelModel.ecModel); + } + } + + var textEl = new ZRText({ + silent: AxisBuilder.isLabelSilent(angleAxisModel), + style: createTextStyle(labelModel, { + x: p[0], + y: p[1], + fill: labelModel.getTextColor() || angleAxisModel.get(['axisLine', 'lineStyle', 'color']), + text: labelItem.formattedLabel, + align: labelTextAlign, + verticalAlign: labelTextVerticalAlign + }) + }); + group.add(textEl); // Pack data for mouse event + + if (triggerEvent) { + var eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel); + eventData.targetType = 'axisLabel'; + eventData.value = labelItem.rawLabel; + getECData(textEl).eventData = eventData; + } + }, this); + }, + splitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + var splitLineModel = angleAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var splitLines = []; + + for (var i = 0; i < ticksAngles.length; i++) { + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Line({ + shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord) + })); + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitLines.length; i++) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyleModel.getLineStyle()), + silent: true, + z: angleAxisModel.get('z') + })); + } + }, + minorSplitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + if (!minorTickAngles.length) { + return; + } + + var minorSplitLineModel = angleAxisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var lines = []; + + for (var i = 0; i < minorTickAngles.length; i++) { + for (var k = 0; k < minorTickAngles[i].length; k++) { + lines.push(new Line({ + shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord) + })); + } + } + + group.add(mergePath$1(lines, { + style: lineStyleModel.getLineStyle(), + silent: true, + z: angleAxisModel.get('z') + })); + }, + splitArea: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) { + if (!ticksAngles.length) { + return; + } + + var splitAreaModel = angleAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + var splitAreas = []; + var RADIAN = Math.PI / 180; + var prevAngle = -ticksAngles[0].coord * RADIAN; + var r0 = Math.min(radiusExtent[0], radiusExtent[1]); + var r1 = Math.max(radiusExtent[0], radiusExtent[1]); + var clockwise = angleAxisModel.get('clockwise'); + + for (var i = 1, len = ticksAngles.length; i <= len; i++) { + var coord = i === len ? ticksAngles[0].coord : ticksAngles[i].coord; + var colorIndex = lineCount++ % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: r0, + r: r1, + startAngle: prevAngle, + endAngle: -coord * RADIAN, + clockwise: clockwise + }, + silent: true + })); + prevAngle = -coord * RADIAN; + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitAreas.length; i++) { + group.add(mergePath$1(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }; + + var axisBuilderAttrs$2 = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs$1 = ['splitLine', 'splitArea', 'minorSplitLine']; + + var RadiusAxisView = + /** @class */ + function (_super) { + __extends(RadiusAxisView, _super); + + function RadiusAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = RadiusAxisView.type; + _this.axisPointerClass = 'PolarAxisPointer'; + return _this; + } + + RadiusAxisView.prototype.render = function (radiusAxisModel, ecModel) { + this.group.removeAll(); + + if (!radiusAxisModel.get('show')) { + return; + } + + var oldAxisGroup = this._axisGroup; + var newAxisGroup = this._axisGroup = new Group(); + this.group.add(newAxisGroup); + var radiusAxis = radiusAxisModel.axis; + var polar = radiusAxis.polar; + var angleAxis = polar.getAngleAxis(); + var ticksCoords = radiusAxis.getTicksCoords(); + var minorTicksCoords = radiusAxis.getMinorTicksCoords(); + var axisAngle = angleAxis.getExtent()[0]; + var radiusExtent = radiusAxis.getExtent(); + var layout = layoutAxis(polar, radiusAxisModel, axisAngle); + var axisBuilder = new AxisBuilder(radiusAxisModel, layout); + each(axisBuilderAttrs$2, axisBuilder.add, axisBuilder); + newAxisGroup.add(axisBuilder.getGroup()); + groupTransition(oldAxisGroup, newAxisGroup, radiusAxisModel); + each(selfBuilderAttrs$1, function (name) { + if (radiusAxisModel.get([name, 'show']) && !radiusAxis.scale.isBlank()) { + axisElementBuilders$1[name](this.group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords); + } + }, this); + }; + + RadiusAxisView.type = 'radiusAxis'; + return RadiusAxisView; + }(AxisView); + + var axisElementBuilders$1 = { + splitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + var splitLineModel = radiusAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var splitLines = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + // ensure circle radius >= 0 + r: Math.max(ticksCoords[i].coord, 0) + } + })); + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitLines.length; i++) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length], + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + } + }, + minorSplitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords) { + if (!minorTicksCoords.length) { + return; + } + + var minorSplitLineModel = radiusAxisModel.getModel('minorSplitLine'); + var lineStyleModel = minorSplitLineModel.getModel('lineStyle'); + var lines = []; + + for (var i = 0; i < minorTicksCoords.length; i++) { + for (var k = 0; k < minorTicksCoords[i].length; k++) { + lines.push(new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: minorTicksCoords[i][k].coord + } + })); + } + } + + group.add(mergePath$1(lines, { + style: defaults({ + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + }, + splitArea: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + if (!ticksCoords.length) { + return; + } + + var splitAreaModel = radiusAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + var splitAreas = []; + var prevRadius = ticksCoords[0].coord; + + for (var i = 1; i < ticksCoords.length; i++) { + var colorIndex = lineCount++ % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: prevRadius, + r: ticksCoords[i].coord, + startAngle: 0, + endAngle: Math.PI * 2 + }, + silent: true + })); + prevRadius = ticksCoords[i].coord; + } // Simple optimization + // Batching the lines if color are the same + + + for (var i = 0; i < splitAreas.length; i++) { + group.add(mergePath$1(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }; + + /** + * @inner + */ + + function layoutAxis(polar, radiusAxisModel, axisAngle) { + return { + position: [polar.cx, polar.cy], + rotation: axisAngle / 180 * Math.PI, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1, + labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'), + // Over splitLine and splitArea + z2: 1 + }; + } + + function getSeriesStackId$1(seriesModel) { + return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex; + } + + function getAxisKey$1(polar, axis) { + return axis.dim + polar.model.componentIndex; + } + + function barLayoutPolar(seriesType, ecModel, api) { + var lastStackCoords = {}; + var barWidthAndOffset = calRadialBar(filter(ecModel.getSeriesByType(seriesType), function (seriesModel) { + return !ecModel.isSeriesFiltered(seriesModel) && seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'polar'; + })); + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for polar only + if (seriesModel.coordinateSystem.type !== 'polar') { + return; + } + + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + var axisKey = getAxisKey$1(polar, baseAxis); + var stackId = getSeriesStackId$1(seriesModel); + var columnLayoutInfo = barWidthAndOffset[axisKey][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = polar.getOtherAxis(baseAxis); + var cx = seriesModel.coordinateSystem.cx; + var cy = seriesModel.coordinateSystem.cy; + var barMinHeight = seriesModel.get('barMinHeight') || 0; + var barMinAngle = seriesModel.get('barMinAngle') || 0; + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var stacked = isDimensionStacked(data, valueDim + /*, baseDim*/ + ); + var clampLayout = baseAxis.dim !== 'radius' || !seriesModel.get('roundCap', true); + var valueAxisStart = valueAxis.dataToCoord(0); + + for (var idx = 0, len = data.count(); idx < len; idx++) { + var value = data.get(valueDim, idx); + var baseValue = data.get(baseDim, idx); + var sign = value >= 0 ? 'p' : 'n'; + var baseCoord = valueAxisStart; // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + // Only ordinal axis can be stacked. + + if (stacked) { + if (!lastStackCoords[stackId][baseValue]) { + lastStackCoords[stackId][baseValue] = { + p: valueAxisStart, + n: valueAxisStart // Negative stack + + }; + } // Should also consider #4243 + + + baseCoord = lastStackCoords[stackId][baseValue][sign]; + } + + var r0 = void 0; + var r = void 0; + var startAngle = void 0; + var endAngle = void 0; // radial sector + + if (valueAxis.dim === 'radius') { + var radiusSpan = valueAxis.dataToCoord(value) - valueAxisStart; + var angle = baseAxis.dataToCoord(baseValue); + + if (Math.abs(radiusSpan) < barMinHeight) { + radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight; + } + + r0 = baseCoord; + r = baseCoord + radiusSpan; + startAngle = angle - columnOffset; + endAngle = startAngle - columnWidth; + stacked && (lastStackCoords[stackId][baseValue][sign] = r); + } // tangential sector + else { + var angleSpan = valueAxis.dataToCoord(value, clampLayout) - valueAxisStart; + var radius = baseAxis.dataToCoord(baseValue); + + if (Math.abs(angleSpan) < barMinAngle) { + angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle; + } + + r0 = radius + columnOffset; + r = r0 + columnWidth; + startAngle = baseCoord; + endAngle = baseCoord + angleSpan; // if the previous stack is at the end of the ring, + // add a round to differentiate it from origin + // let extent = angleAxis.getExtent(); + // let stackCoord = angle; + // if (stackCoord === extent[0] && value > 0) { + // stackCoord = extent[1]; + // } + // else if (stackCoord === extent[1] && value < 0) { + // stackCoord = extent[0]; + // } + + stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle); + } + + data.setItemLayout(idx, { + cx: cx, + cy: cy, + r0: r0, + r: r, + // Consider that positive angle is anti-clockwise, + // while positive radian of sector is clockwise + startAngle: -startAngle * Math.PI / 180, + endAngle: -endAngle * Math.PI / 180, + + /** + * Keep the same logic with bar in catesion: use end value to + * control direction. Notice that if clockwise is true (by + * default), the sector will always draw clockwisely, no matter + * whether endAngle is greater or less than startAngle. + */ + clockwise: startAngle >= endAngle + }); + } + }); + } + + /** + * Calculate bar width and offset for radial bar charts + */ + + + function calRadialBar(barSeries) { + // Columns info on each category axis. Key is polar name + var columnsMap = {}; + each(barSeries, function (seriesModel, idx) { + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + var axisKey = getAxisKey$1(polar, baseAxis); + var axisExtent = baseAxis.getExtent(); + var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count(); + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + var stackId = getSeriesStackId$1(seriesModel); + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth); + var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + + if (barWidth && !stacks[stackId].width) { + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + stacks[stackId].width = barWidth; + columnsOnAxis.remainedWidth -= barWidth; + } + + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + barGap != null && (columnsOnAxis.gap = barGap); + barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap); + }); + var result = {}; + each(columnsMap, function (columnsOnAxis, coordSysName) { + result[coordSysName] = {}; + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1); + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); // Find if any auto calculated bar exceeded maxBarWidth + + each(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + + if (maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + + if (column.width) { + maxWidth = Math.min(maxWidth, column.width); + } + + remainedWidth -= maxWidth; + column.width = maxWidth; + autoWidthCount--; + } + }); // Recalculate width again + + autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + var widthSum = 0; + var lastColumn; + each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + offset += column.width * (1 + barGapPercent); + }); + }); + return result; + } + + var angleAxisExtraOption = { + startAngle: 90, + clockwise: true, + splitNumber: 12, + axisLabel: { + rotate: 0 + } + }; + var radiusAxisExtraOption = { + splitNumber: 5 + }; + + var PolarView = + /** @class */ + function (_super) { + __extends(PolarView, _super); + + function PolarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PolarView.type; + return _this; + } + + PolarView.type = 'polar'; + return PolarView; + }(ComponentView); + + function install$u(registers) { + use(install$s); + AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer); + registers.registerCoordinateSystem('polar', polarCreator); + registers.registerComponentModel(PolarModel); + registers.registerComponentView(PolarView); // Model and view for angleAxis and radiusAxis + + axisModelCreator(registers, 'angle', AngleAxisModel, angleAxisExtraOption); + axisModelCreator(registers, 'radius', RadiusAxisModel, radiusAxisExtraOption); + registers.registerComponentView(AngleAxisView); + registers.registerComponentView(RadiusAxisView); + registers.registerLayout(curry(barLayoutPolar, 'bar')); + } + + function layout$2(axisModel, opt) { + opt = opt || {}; + var single = axisModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var axisPosition = axis.position; + var orient = axis.orient; + var rect = single.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var positionMap = { + horizontal: { + top: rectBound[2], + bottom: rectBound[3] + }, + vertical: { + left: rectBound[0], + right: rectBound[1] + } + }; + layout.position = [orient === 'vertical' ? positionMap.vertical[axisPosition] : rectBound[0], orient === 'horizontal' ? positionMap.horizontal[axisPosition] : rectBound[3]]; + var r = { + horizontal: 0, + vertical: 1 + }; + layout.rotation = Math.PI / 2 * r[orient]; + var directionMap = { + top: -1, + bottom: 1, + right: 1, + left: -1 + }; + layout.labelDirection = layout.tickDirection = layout.nameDirection = directionMap[axisPosition]; + + if (axisModel.get(['axisTick', 'inside'])) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) { + layout.labelDirection = -layout.labelDirection; + } + + var labelRotation = opt.rotate; + labelRotation == null && (labelRotation = axisModel.get(['axisLabel', 'rotate'])); + layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation; + layout.z2 = 1; + return layout; + } + + var axisBuilderAttrs$3 = ['axisLine', 'axisTickLabel', 'axisName']; + var selfBuilderAttrs$2 = ['splitArea', 'splitLine']; + + var SingleAxisView = + /** @class */ + function (_super) { + __extends(SingleAxisView, _super); + + function SingleAxisView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleAxisView.type; + _this.axisPointerClass = 'SingleAxisPointer'; + return _this; + } + + SingleAxisView.prototype.render = function (axisModel, ecModel, api, payload) { + var group = this.group; + group.removeAll(); + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + var layout = layout$2(axisModel); + var axisBuilder = new AxisBuilder(axisModel, layout); + each(axisBuilderAttrs$3, axisBuilder.add, axisBuilder); + group.add(this._axisGroup); + group.add(axisBuilder.getGroup()); + each(selfBuilderAttrs$2, function (name) { + if (axisModel.get([name, 'show'])) { + axisElementBuilders$2[name](this, this.group, this._axisGroup, axisModel); + } + }, this); + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + + _super.prototype.render.call(this, axisModel, ecModel, api, payload); + }; + + SingleAxisView.prototype.remove = function () { + rectCoordAxisHandleRemove(this); + }; + + SingleAxisView.type = 'singleAxis'; + return SingleAxisView; + }(AxisView); + + var axisElementBuilders$2 = { + splitLine: function (axisView, group, axisGroup, axisModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + var gridRect = axisModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + var splitLines = []; + var lineCount = 0; + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + var p1 = []; + var p2 = []; + + for (var i = 0; i < ticksCoords.length; ++i) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = lineCount++ % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Line({ + subPixelOptimize: true, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + silent: true + })); + } + + var lineStyle = lineStyleModel.getLineStyle(['color']); + + for (var i = 0; i < splitLines.length; ++i) { + group.add(mergePath$1(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyle), + silent: true + })); + } + }, + splitArea: function (axisView, group, axisGroup, axisModel) { + rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel); + } + }; + + var SingleAxisModel = + /** @class */ + function (_super) { + __extends(SingleAxisModel, _super); + + function SingleAxisModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleAxisModel.type; + return _this; + } + + SingleAxisModel.prototype.getCoordSysModel = function () { + return this; + }; + + SingleAxisModel.type = 'singleAxis'; + SingleAxisModel.layoutMode = 'box'; + SingleAxisModel.defaultOption = { + left: '5%', + top: '5%', + right: '5%', + bottom: '5%', + type: 'value', + position: 'bottom', + orient: 'horizontal', + axisLine: { + show: true, + lineStyle: { + width: 1, + type: 'solid' + } + }, + // Single coordinate system and single axis is the, + // which is used as the parent tooltip model. + // same model, so we set default tooltip show as true. + tooltip: { + show: true + }, + axisTick: { + show: true, + length: 6, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + interval: 'auto' + }, + splitLine: { + show: true, + lineStyle: { + type: 'dashed', + opacity: 0.2 + } + } + }; + return SingleAxisModel; + }(ComponentModel); + + mixin(SingleAxisModel, AxisModelCommonMixin.prototype); + + var SingleAxis = + /** @class */ + function (_super) { + __extends(SingleAxis, _super); + + function SingleAxis(dim, scale, coordExtent, axisType, position) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + _this.position = position || 'bottom'; + return _this; + } + + /** + * Judge the orient of the axis. + */ + + + SingleAxis.prototype.isHorizontal = function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }; + + SingleAxis.prototype.pointToData = function (point, clamp) { + return this.coordinateSystem.pointToData(point)[0]; + }; + + return SingleAxis; + }(Axis); + + var singleDimensions = ['single']; + /** + * Create a single coordinates system. + */ + + var Single = + /** @class */ + function () { + function Single(axisModel, ecModel, api) { + this.type = 'single'; + this.dimension = 'single'; + /** + * Add it just for draw tooltip. + */ + + this.dimensions = singleDimensions; + this.axisPointerEnabled = true; + this.model = axisModel; + + this._init(axisModel, ecModel, api); + } + + /** + * Initialize single coordinate system. + */ + + + Single.prototype._init = function (axisModel, ecModel, api) { + var dim = this.dimension; + var axis = new SingleAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisModel.get('position')); + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + axis.orient = axisModel.get('orient'); + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = this; + this._axis = axis; + }; + /** + * Update axis scale after data processed + */ + + + Single.prototype.update = function (ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === this) { + var data_1 = seriesModel.getData(); + each(data_1.mapDimensionsAll(this.dimension), function (dim) { + this._axis.scale.unionExtentFromData(data_1, dim); + }, this); + niceScaleExtent(this._axis.scale, this._axis.model); + } + }, this); + }; + /** + * Resize the single coordinate system. + */ + + + Single.prototype.resize = function (axisModel, api) { + this._rect = getLayoutRect({ + left: axisModel.get('left'), + top: axisModel.get('top'), + right: axisModel.get('right'), + bottom: axisModel.get('bottom'), + width: axisModel.get('width'), + height: axisModel.get('height') + }, { + width: api.getWidth(), + height: api.getHeight() + }); + + this._adjustAxis(); + }; + + Single.prototype.getRect = function () { + return this._rect; + }; + + Single.prototype._adjustAxis = function () { + var rect = this._rect; + var axis = this._axis; + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, rect.width] : [0, rect.height]; + var idx = axis.reverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + + this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y); + }; + + Single.prototype._updateAxisTransform = function (axis, coordBase) { + var axisExtent = axis.getExtent(); + var extentSum = axisExtent[0] + axisExtent[1]; + var isHorizontal = axis.isHorizontal(); + axis.toGlobalCoord = isHorizontal ? function (coord) { + return coord + coordBase; + } : function (coord) { + return extentSum - coord + coordBase; + }; + axis.toLocalCoord = isHorizontal ? function (coord) { + return coord - coordBase; + } : function (coord) { + return extentSum - coord + coordBase; + }; + }; + /** + * Get axis. + */ + + + Single.prototype.getAxis = function () { + return this._axis; + }; + /** + * Get axis, add it just for draw tooltip. + */ + + + Single.prototype.getBaseAxis = function () { + return this._axis; + }; + + Single.prototype.getAxes = function () { + return [this._axis]; + }; + + Single.prototype.getTooltipAxes = function () { + return { + baseAxes: [this.getAxis()], + // Empty otherAxes + otherAxes: [] + }; + }; + /** + * If contain point. + */ + + + Single.prototype.containPoint = function (point) { + var rect = this.getRect(); + var axis = this.getAxis(); + var orient = axis.orient; + + if (orient === 'horizontal') { + return axis.contain(axis.toLocalCoord(point[0])) && point[1] >= rect.y && point[1] <= rect.y + rect.height; + } else { + return axis.contain(axis.toLocalCoord(point[1])) && point[0] >= rect.y && point[0] <= rect.y + rect.height; + } + }; + + Single.prototype.pointToData = function (point) { + var axis = this.getAxis(); + return [axis.coordToData(axis.toLocalCoord(point[axis.orient === 'horizontal' ? 0 : 1]))]; + }; + /** + * Convert the series data to concrete point. + * Can be [val] | val + */ + + + Single.prototype.dataToPoint = function (val) { + var axis = this.getAxis(); + var rect = this.getRect(); + var pt = []; + var idx = axis.orient === 'horizontal' ? 0 : 1; + + if (val instanceof Array) { + val = val[0]; + } + + pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val)); + pt[1 - idx] = idx === 0 ? rect.y + rect.height / 2 : rect.x + rect.width / 2; + return pt; + }; + + Single.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$3(finder); + return coordSys === this ? this.dataToPoint(value) : null; + }; + + Single.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$3(finder); + return coordSys === this ? this.pointToData(pixel) : null; + }; + + return Single; + }(); + + function getCoordSys$3(finder) { + var seriesModel = finder.seriesModel; + var singleModel = finder.singleAxisModel; + return singleModel && singleModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem; + } + + /** + * Create single coordinate system and inject it into seriesModel. + */ + + function create$2(ecModel, api) { + var singles = []; + ecModel.eachComponent('singleAxis', function (axisModel, idx) { + var single = new Single(axisModel, ecModel, api); + single.name = 'single_' + idx; + single.resize(axisModel, api); + axisModel.coordinateSystem = single; + singles.push(single); + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'singleAxis') { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0]; + seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem; + } + }); + return singles; + } + + var singleCreator = { + create: create$2, + dimensions: singleDimensions + }; + + var XY = ['x', 'y']; + var WH = ['width', 'height']; + + var SingleAxisPointer = + /** @class */ + function (_super) { + __extends(SingleAxisPointer, _super); + + function SingleAxisPointer() { + return _super !== null && _super.apply(this, arguments) || this; + } + + /** + * @override + */ + + + SingleAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis)); + var pixelValue = coordSys.dataToPoint(value)[0]; + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$2[axisPointerType](axis, pixelValue, otherExtent); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$2(axisModel); + buildCartesianSingleLabelElOption( // @ts-ignore + value, elOption, layoutInfo, axisModel, axisPointerModel, api); + }; + /** + * @override + */ + + + SingleAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$2(axisModel, { + labelInside: false + }); // @ts-ignore + + layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']); + var position = getTransformedPosition(axisModel.axis, value, layoutInfo); + return { + x: position[0], + y: position[1], + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }; + /** + * @override + */ + + + SingleAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var dimIndex = getPointDimIndex(axis); + var axisExtent = getGlobalExtent(coordSys, dimIndex); + var currPosition = [transform.x, transform.y]; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; + return { + x: currPosition[0], + y: currPosition[1], + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: { + verticalAlign: 'middle' + } + }; + }; + + return SingleAxisPointer; + }(BaseAxisPointer); + + var pointerShapeBuilder$2 = { + line: function (axis, pixelValue, otherExtent) { + var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getPointDimIndex(axis)); + return { + type: 'Line', + subPixelOptimize: true, + shape: targetShape + }; + }, + shadow: function (axis, pixelValue, otherExtent) { + var bandWidth = axis.getBandWidth(); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getPointDimIndex(axis)) + }; + } + }; + + function getPointDimIndex(axis) { + return axis.isHorizontal() ? 0 : 1; + } + + function getGlobalExtent(coordSys, dimIndex) { + var rect = coordSys.getRect(); + return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]]; + } + + var SingleView = + /** @class */ + function (_super) { + __extends(SingleView, _super); + + function SingleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SingleView.type; + return _this; + } + + SingleView.type = 'single'; + return SingleView; + }(ComponentView); + + function install$v(registers) { + use(install$s); + AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer); + registers.registerComponentView(SingleView); // Axis + + registers.registerComponentView(SingleAxisView); + registers.registerComponentModel(SingleAxisModel); + axisModelCreator(registers, 'single', SingleAxisModel, SingleAxisModel.defaultOption); + registers.registerCoordinateSystem('single', singleCreator); + } + + var CalendarModel = + /** @class */ + function (_super) { + __extends(CalendarModel, _super); + + function CalendarModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CalendarModel.type; + return _this; + } + + /** + * @override + */ + + + CalendarModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + + _super.prototype.init.apply(this, arguments); + + mergeAndNormalizeLayoutParams(option, inputPositionParams); + }; + /** + * @override + */ + + + CalendarModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + mergeAndNormalizeLayoutParams(this.option, option); + }; + + CalendarModel.prototype.getCellSize = function () { + // Has been normalized + return this.option.cellSize; + }; + + CalendarModel.type = 'calendar'; + CalendarModel.defaultOption = { + // zlevel: 0, + z: 2, + left: 80, + top: 60, + cellSize: 20, + // horizontal vertical + orient: 'horizontal', + // month separate line style + splitLine: { + show: true, + lineStyle: { + color: '#000', + width: 1, + type: 'solid' + } + }, + // rect style temporarily unused emphasis + itemStyle: { + color: '#fff', + borderWidth: 1, + borderColor: '#ccc' + }, + // week text style + dayLabel: { + show: true, + firstDay: 0, + // start end + position: 'start', + margin: '50%', + color: '#000' + }, + // month text style + monthLabel: { + show: true, + // start end + position: 'start', + margin: 5, + // center or left + align: 'center', + formatter: null, + color: '#000' + }, + // year text style + yearLabel: { + show: true, + // top bottom left right + position: null, + margin: 30, + formatter: null, + color: '#ccc', + fontFamily: 'sans-serif', + fontWeight: 'bolder', + fontSize: 20 + } + }; + return CalendarModel; + }(ComponentModel); + + function mergeAndNormalizeLayoutParams(target, raw) { + // Normalize cellSize + var cellSize = target.cellSize; + var cellSizeArr; + + if (!isArray(cellSize)) { + cellSizeArr = target.cellSize = [cellSize, cellSize]; + } else { + cellSizeArr = cellSize; + } + + if (cellSizeArr.length === 1) { + cellSizeArr[1] = cellSizeArr[0]; + } + + var ignoreSize = map([0, 1], function (hvIdx) { + // If user have set `width` or both `left` and `right`, cellSizeArr + // will be automatically set to 'auto', otherwise the default + // setting of cellSizeArr will make `width` setting not work. + if (sizeCalculable(raw, hvIdx)) { + cellSizeArr[hvIdx] = 'auto'; + } + + return cellSizeArr[hvIdx] != null && cellSizeArr[hvIdx] !== 'auto'; + }); + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: ignoreSize + }); + } + + var CalendarView = + /** @class */ + function (_super) { + __extends(CalendarView, _super); + + function CalendarView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = CalendarView.type; + return _this; + } + + CalendarView.prototype.render = function (calendarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + var coordSys = calendarModel.coordinateSystem; // range info + + var rangeData = coordSys.getRangeInfo(); + var orient = coordSys.getOrient(); // locale + + var localeModel = ecModel.getLocaleModel(); + + this._renderDayRect(calendarModel, rangeData, group); // _renderLines must be called prior to following function + + + this._renderLines(calendarModel, rangeData, orient, group); + + this._renderYearText(calendarModel, rangeData, orient, group); + + this._renderMonthText(calendarModel, localeModel, orient, group); + + this._renderWeekText(calendarModel, localeModel, rangeData, orient, group); + }; // render day rect + + + CalendarView.prototype._renderDayRect = function (calendarModel, rangeData, group) { + var coordSys = calendarModel.coordinateSystem; + var itemRectStyleModel = calendarModel.getModel('itemStyle').getItemStyle(); + var sw = coordSys.getCellWidth(); + var sh = coordSys.getCellHeight(); + + for (var i = rangeData.start.time; i <= rangeData.end.time; i = coordSys.getNextNDay(i, 1).time) { + var point = coordSys.dataToRect([i], false).tl; // every rect + + var rect = new Rect({ + shape: { + x: point[0], + y: point[1], + width: sw, + height: sh + }, + cursor: 'default', + style: itemRectStyleModel + }); + group.add(rect); + } + }; // render separate line + + + CalendarView.prototype._renderLines = function (calendarModel, rangeData, orient, group) { + var self = this; + var coordSys = calendarModel.coordinateSystem; + var lineStyleModel = calendarModel.getModel(['splitLine', 'lineStyle']).getLineStyle(); + var show = calendarModel.get(['splitLine', 'show']); + var lineWidth = lineStyleModel.lineWidth; + this._tlpoints = []; + this._blpoints = []; + this._firstDayOfMonth = []; + this._firstDayPoints = []; + var firstDay = rangeData.start; + + for (var i = 0; firstDay.time <= rangeData.end.time; i++) { + addPoints(firstDay.formatedDate); + + if (i === 0) { + firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m); + } + + var date = firstDay.date; + date.setMonth(date.getMonth() + 1); + firstDay = coordSys.getDateInfo(date); + } + + addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate); + + function addPoints(date) { + self._firstDayOfMonth.push(coordSys.getDateInfo(date)); + + self._firstDayPoints.push(coordSys.dataToRect([date], false).tl); + + var points = self._getLinePointsOfOneWeek(calendarModel, date, orient); + + self._tlpoints.push(points[0]); + + self._blpoints.push(points[points.length - 1]); + + show && self._drawSplitline(points, lineStyleModel, group); + } // render top/left line + + + show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group); // render bottom/right line + + show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group); + }; // get points at both ends + + + CalendarView.prototype._getEdgesPoints = function (points, lineWidth, orient) { + var rs = [points[0].slice(), points[points.length - 1].slice()]; + var idx = orient === 'horizontal' ? 0 : 1; // both ends of the line are extend half lineWidth + + rs[0][idx] = rs[0][idx] - lineWidth / 2; + rs[1][idx] = rs[1][idx] + lineWidth / 2; + return rs; + }; // render split line + + + CalendarView.prototype._drawSplitline = function (points, lineStyle, group) { + var poyline = new Polyline({ + z2: 20, + shape: { + points: points + }, + style: lineStyle + }); + group.add(poyline); + }; // render month line of one week points + + + CalendarView.prototype._getLinePointsOfOneWeek = function (calendarModel, date, orient) { + var coordSys = calendarModel.coordinateSystem; + var parsedDate = coordSys.getDateInfo(date); + var points = []; + + for (var i = 0; i < 7; i++) { + var tmpD = coordSys.getNextNDay(parsedDate.time, i); + var point = coordSys.dataToRect([tmpD.time], false); + points[2 * tmpD.day] = point.tl; + points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr']; + } + + return points; + }; + + CalendarView.prototype._formatterLabel = function (formatter, params) { + if (isString(formatter) && formatter) { + return formatTplSimple(formatter, params); + } + + if (isFunction(formatter)) { + return formatter(params); + } + + return params.nameMap; + }; + + CalendarView.prototype._yearTextPositionControl = function (textEl, point, orient, position, margin) { + var x = point[0]; + var y = point[1]; + var aligns = ['center', 'bottom']; + + if (position === 'bottom') { + y += margin; + aligns = ['center', 'top']; + } else if (position === 'left') { + x -= margin; + } else if (position === 'right') { + x += margin; + aligns = ['center', 'top']; + } else { + // top + y -= margin; + } + + var rotate = 0; + + if (position === 'left' || position === 'right') { + rotate = Math.PI / 2; + } + + return { + rotation: rotate, + x: x, + y: y, + style: { + align: aligns[0], + verticalAlign: aligns[1] + } + }; + }; // render year + + + CalendarView.prototype._renderYearText = function (calendarModel, rangeData, orient, group) { + var yearLabel = calendarModel.getModel('yearLabel'); + + if (!yearLabel.get('show')) { + return; + } + + var margin = yearLabel.get('margin'); + var pos = yearLabel.get('position'); + + if (!pos) { + pos = orient !== 'horizontal' ? 'top' : 'left'; + } + + var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]]; + var xc = (points[0][0] + points[1][0]) / 2; + var yc = (points[0][1] + points[1][1]) / 2; + var idx = orient === 'horizontal' ? 0 : 1; + var posPoints = { + top: [xc, points[idx][1]], + bottom: [xc, points[1 - idx][1]], + left: [points[1 - idx][0], yc], + right: [points[idx][0], yc] + }; + var name = rangeData.start.y; + + if (+rangeData.end.y > +rangeData.start.y) { + name = name + '-' + rangeData.end.y; + } + + var formatter = yearLabel.get('formatter'); + var params = { + start: rangeData.start.y, + end: rangeData.end.y, + nameMap: name + }; + + var content = this._formatterLabel(formatter, params); + + var yearText = new ZRText({ + z2: 30, + style: createTextStyle(yearLabel, { + text: content + }) + }); + yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin)); + group.add(yearText); + }; + + CalendarView.prototype._monthTextPositionControl = function (point, isCenter, orient, position, margin) { + var align = 'left'; + var vAlign = 'top'; + var x = point[0]; + var y = point[1]; + + if (orient === 'horizontal') { + y = y + margin; + + if (isCenter) { + align = 'center'; + } + + if (position === 'start') { + vAlign = 'bottom'; + } + } else { + x = x + margin; + + if (isCenter) { + vAlign = 'middle'; + } + + if (position === 'start') { + align = 'right'; + } + } + + return { + x: x, + y: y, + align: align, + verticalAlign: vAlign + }; + }; // render month and year text + + + CalendarView.prototype._renderMonthText = function (calendarModel, localeModel, orient, group) { + var monthLabel = calendarModel.getModel('monthLabel'); + + if (!monthLabel.get('show')) { + return; + } + + var nameMap = monthLabel.get('nameMap'); + var margin = monthLabel.get('margin'); + var pos = monthLabel.get('position'); + var align = monthLabel.get('align'); + var termPoints = [this._tlpoints, this._blpoints]; + + if (!nameMap || isString(nameMap)) { + if (nameMap) { + // case-sensitive + localeModel = getLocaleModel(nameMap) || localeModel; + } // PENDING + // for ZH locale, original form is `一月` but current form is `1月` + + + nameMap = localeModel.get(['time', 'monthAbbr']) || []; + } + + var idx = pos === 'start' ? 0 : 1; + var axis = orient === 'horizontal' ? 0 : 1; + margin = pos === 'start' ? -margin : margin; + var isCenter = align === 'center'; + + for (var i = 0; i < termPoints[idx].length - 1; i++) { + var tmp = termPoints[idx][i].slice(); + var firstDay = this._firstDayOfMonth[i]; + + if (isCenter) { + var firstDayPoints = this._firstDayPoints[i]; + tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2; + } + + var formatter = monthLabel.get('formatter'); + var name_1 = nameMap[+firstDay.m - 1]; + var params = { + yyyy: firstDay.y, + yy: (firstDay.y + '').slice(2), + MM: firstDay.m, + M: +firstDay.m, + nameMap: name_1 + }; + + var content = this._formatterLabel(formatter, params); + + var monthText = new ZRText({ + z2: 30, + style: extend(createTextStyle(monthLabel, { + text: content + }), this._monthTextPositionControl(tmp, isCenter, orient, pos, margin)) + }); + group.add(monthText); + } + }; + + CalendarView.prototype._weekTextPositionControl = function (point, orient, position, margin, cellSize) { + var align = 'center'; + var vAlign = 'middle'; + var x = point[0]; + var y = point[1]; + var isStart = position === 'start'; + + if (orient === 'horizontal') { + x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2; + align = isStart ? 'right' : 'left'; + } else { + y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2; + vAlign = isStart ? 'bottom' : 'top'; + } + + return { + x: x, + y: y, + align: align, + verticalAlign: vAlign + }; + }; // render weeks + + + CalendarView.prototype._renderWeekText = function (calendarModel, localeModel, rangeData, orient, group) { + var dayLabel = calendarModel.getModel('dayLabel'); + + if (!dayLabel.get('show')) { + return; + } + + var coordSys = calendarModel.coordinateSystem; + var pos = dayLabel.get('position'); + var nameMap = dayLabel.get('nameMap'); + var margin = dayLabel.get('margin'); + var firstDayOfWeek = coordSys.getFirstDayOfWeek(); + + if (!nameMap || isString(nameMap)) { + if (nameMap) { + // case-sensitive + localeModel = getLocaleModel(nameMap) || localeModel; + } // Use the first letter of `dayOfWeekAbbr` if `dayOfWeekShort` doesn't exist in the locale file + + + var dayOfWeekShort = localeModel.get(['time', 'dayOfWeekShort']); + nameMap = dayOfWeekShort || map(localeModel.get(['time', 'dayOfWeekAbbr']), function (val) { + return val[0]; + }); + } + + var start = coordSys.getNextNDay(rangeData.end.time, 7 - rangeData.lweek).time; + var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()]; + margin = parsePercent$1(margin, Math.min(cellSize[1], cellSize[0])); + + if (pos === 'start') { + start = coordSys.getNextNDay(rangeData.start.time, -(7 + rangeData.fweek)).time; + margin = -margin; + } + + for (var i = 0; i < 7; i++) { + var tmpD = coordSys.getNextNDay(start, i); + var point = coordSys.dataToRect([tmpD.time], false).center; + var day = i; + day = Math.abs((i + firstDayOfWeek) % 7); + var weekText = new ZRText({ + z2: 30, + style: extend(createTextStyle(dayLabel, { + text: nameMap[day] + }), this._weekTextPositionControl(point, orient, pos, margin, cellSize)) + }); + group.add(weekText); + } + }; + + CalendarView.type = 'calendar'; + return CalendarView; + }(ComponentView); + + var PROXIMATE_ONE_DAY = 86400000; + + var Calendar = + /** @class */ + function () { + function Calendar(calendarModel, ecModel, api) { + this.type = 'calendar'; + this.dimensions = Calendar.dimensions; // Required in createListFromData + + this.getDimensionsInfo = Calendar.getDimensionsInfo; + this._model = calendarModel; + } + + Calendar.getDimensionsInfo = function () { + return [{ + name: 'time', + type: 'time' + }, 'value']; + }; + + Calendar.prototype.getRangeInfo = function () { + return this._rangeInfo; + }; + + Calendar.prototype.getModel = function () { + return this._model; + }; + + Calendar.prototype.getRect = function () { + return this._rect; + }; + + Calendar.prototype.getCellWidth = function () { + return this._sw; + }; + + Calendar.prototype.getCellHeight = function () { + return this._sh; + }; + + Calendar.prototype.getOrient = function () { + return this._orient; + }; + /** + * getFirstDayOfWeek + * + * @example + * 0 : start at Sunday + * 1 : start at Monday + * + * @return {number} + */ + + + Calendar.prototype.getFirstDayOfWeek = function () { + return this._firstDayOfWeek; + }; + /** + * get date info + * } + */ + + + Calendar.prototype.getDateInfo = function (date) { + date = parseDate(date); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + var mStr = m < 10 ? '0' + m : '' + m; + var d = date.getDate(); + var dStr = d < 10 ? '0' + d : '' + d; + var day = date.getDay(); + day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7); + return { + y: y + '', + m: mStr, + d: dStr, + day: day, + time: date.getTime(), + formatedDate: y + '-' + mStr + '-' + dStr, + date: date + }; + }; + + Calendar.prototype.getNextNDay = function (date, n) { + n = n || 0; + + if (n === 0) { + return this.getDateInfo(date); + } + + date = new Date(this.getDateInfo(date).time); + date.setDate(date.getDate() + n); + return this.getDateInfo(date); + }; + + Calendar.prototype.update = function (ecModel, api) { + this._firstDayOfWeek = +this._model.getModel('dayLabel').get('firstDay'); + this._orient = this._model.get('orient'); + this._lineWidth = this._model.getModel('itemStyle').getItemStyle().lineWidth || 0; + this._rangeInfo = this._getRangeInfo(this._initRangeOption()); + var weeks = this._rangeInfo.weeks || 1; + var whNames = ['width', 'height']; + + var cellSize = this._model.getCellSize().slice(); + + var layoutParams = this._model.getBoxLayoutParams(); + + var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks]; + each([0, 1], function (idx) { + if (cellSizeSpecified(cellSize, idx)) { + layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx]; + } + }); + var whGlobal = { + width: api.getWidth(), + height: api.getHeight() + }; + var calendarRect = this._rect = getLayoutRect(layoutParams, whGlobal); + each([0, 1], function (idx) { + if (!cellSizeSpecified(cellSize, idx)) { + cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx]; + } + }); + + function cellSizeSpecified(cellSize, idx) { + return cellSize[idx] != null && cellSize[idx] !== 'auto'; + } // Has been calculated out number. + + + this._sw = cellSize[0]; + this._sh = cellSize[1]; + }; + /** + * Convert a time data(time, value) item to (x, y) point. + */ + // TODO Clamp of calendar is not same with cartesian coordinate systems. + // It will return NaN if data exceeds. + + + Calendar.prototype.dataToPoint = function (data, clamp) { + isArray(data) && (data = data[0]); + clamp == null && (clamp = true); + var dayInfo = this.getDateInfo(data); + var range = this._rangeInfo; + var date = dayInfo.formatedDate; // if not in range return [NaN, NaN] + + if (clamp && !(dayInfo.time >= range.start.time && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY)) { + return [NaN, NaN]; + } + + var week = dayInfo.day; + + var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek; + + if (this._orient === 'vertical') { + return [this._rect.x + week * this._sw + this._sw / 2, this._rect.y + nthWeek * this._sh + this._sh / 2]; + } + + return [this._rect.x + nthWeek * this._sw + this._sw / 2, this._rect.y + week * this._sh + this._sh / 2]; + }; + /** + * Convert a (x, y) point to time data + */ + + + Calendar.prototype.pointToData = function (point) { + var date = this.pointToDate(point); + return date && date.time; + }; + /** + * Convert a time date item to (x, y) four point. + */ + + + Calendar.prototype.dataToRect = function (data, clamp) { + var point = this.dataToPoint(data, clamp); + return { + contentShape: { + x: point[0] - (this._sw - this._lineWidth) / 2, + y: point[1] - (this._sh - this._lineWidth) / 2, + width: this._sw - this._lineWidth, + height: this._sh - this._lineWidth + }, + center: point, + tl: [point[0] - this._sw / 2, point[1] - this._sh / 2], + tr: [point[0] + this._sw / 2, point[1] - this._sh / 2], + br: [point[0] + this._sw / 2, point[1] + this._sh / 2], + bl: [point[0] - this._sw / 2, point[1] + this._sh / 2] + }; + }; + /** + * Convert a (x, y) point to time date + * + * @param {Array} point point + * @return {Object} date + */ + + + Calendar.prototype.pointToDate = function (point) { + var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1; + var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1; + var range = this._rangeInfo.range; + + if (this._orient === 'vertical') { + return this._getDateByWeeksAndDay(nthY, nthX - 1, range); + } + + return this._getDateByWeeksAndDay(nthX, nthY - 1, range); + }; + + Calendar.prototype.convertToPixel = function (ecModel, finder, value) { + var coordSys = getCoordSys$4(finder); + return coordSys === this ? coordSys.dataToPoint(value) : null; + }; + + Calendar.prototype.convertFromPixel = function (ecModel, finder, pixel) { + var coordSys = getCoordSys$4(finder); + return coordSys === this ? coordSys.pointToData(pixel) : null; + }; + + Calendar.prototype.containPoint = function (point) { + console.warn('Not implemented.'); + return false; + }; + /** + * initRange + * Normalize to an [start, end] array + */ + + + Calendar.prototype._initRangeOption = function () { + var range = this._model.get('range'); + + var normalizedRange; // Convert [1990] to 1990 + + if (isArray(range) && range.length === 1) { + range = range[0]; + } + + if (!isArray(range)) { + var rangeStr = range.toString(); // One year. + + if (/^\d{4}$/.test(rangeStr)) { + normalizedRange = [rangeStr + '-01-01', rangeStr + '-12-31']; + } // One month + + + if (/^\d{4}[\/|-]\d{1,2}$/.test(rangeStr)) { + var start = this.getDateInfo(rangeStr); + var firstDay = start.date; + firstDay.setMonth(firstDay.getMonth() + 1); + var end = this.getNextNDay(firstDay, -1); + normalizedRange = [start.formatedDate, end.formatedDate]; + } // One day + + + if (/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(rangeStr)) { + normalizedRange = [rangeStr, rangeStr]; + } + } else { + normalizedRange = range; + } + + if (!normalizedRange) { + if ("development" !== 'production') { + logError('Invalid date range.'); + } // Not handling it. + + + return range; + } + + var tmp = this._getRangeInfo(normalizedRange); + + if (tmp.start.time > tmp.end.time) { + normalizedRange.reverse(); + } + + return normalizedRange; + }; + /** + * range info + * + * @private + * @param {Array} range range ['2017-01-01', '2017-07-08'] + * If range[0] > range[1], they will not be reversed. + * @return {Object} obj + */ + + + Calendar.prototype._getRangeInfo = function (range) { + var parsedRange = [this.getDateInfo(range[0]), this.getDateInfo(range[1])]; + var reversed; + + if (parsedRange[0].time > parsedRange[1].time) { + reversed = true; + parsedRange.reverse(); + } + + var allDay = Math.floor(parsedRange[1].time / PROXIMATE_ONE_DAY) - Math.floor(parsedRange[0].time / PROXIMATE_ONE_DAY) + 1; // Consider case1 (#11677 #10430): + // Set the system timezone as "UK", set the range to `['2016-07-01', '2016-12-31']` + // Consider case2: + // Firstly set system timezone as "Time Zone: America/Toronto", + // ``` + // let first = new Date(1478412000000 - 3600 * 1000 * 2.5); + // let second = new Date(1478412000000); + // let allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1; + // ``` + // will get wrong result because of DST. So we should fix it. + + var date = new Date(parsedRange[0].time); + var startDateNum = date.getDate(); + var endDateNum = parsedRange[1].date.getDate(); + date.setDate(startDateNum + allDay - 1); // The bias can not over a month, so just compare date. + + var dateNum = date.getDate(); + + if (dateNum !== endDateNum) { + var sign = date.getTime() - parsedRange[1].time > 0 ? 1 : -1; + + while ((dateNum = date.getDate()) !== endDateNum && (date.getTime() - parsedRange[1].time) * sign > 0) { + allDay -= sign; + date.setDate(dateNum - sign); + } + } + + var weeks = Math.floor((allDay + parsedRange[0].day + 6) / 7); + var nthWeek = reversed ? -weeks + 1 : weeks - 1; + reversed && parsedRange.reverse(); + return { + range: [parsedRange[0].formatedDate, parsedRange[1].formatedDate], + start: parsedRange[0], + end: parsedRange[1], + allDay: allDay, + weeks: weeks, + // From 0. + nthWeek: nthWeek, + fweek: parsedRange[0].day, + lweek: parsedRange[1].day + }; + }; + /** + * get date by nthWeeks and week day in range + * + * @private + * @param {number} nthWeek the week + * @param {number} day the week day + * @param {Array} range [d1, d2] + * @return {Object} + */ + + + Calendar.prototype._getDateByWeeksAndDay = function (nthWeek, day, range) { + var rangeInfo = this._getRangeInfo(range); + + if (nthWeek > rangeInfo.weeks || nthWeek === 0 && day < rangeInfo.fweek || nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) { + return null; + } + + var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day; + var date = new Date(rangeInfo.start.time); + date.setDate(+rangeInfo.start.d + nthDay); + return this.getDateInfo(date); + }; + + Calendar.create = function (ecModel, api) { + var calendarList = []; + ecModel.eachComponent('calendar', function (calendarModel) { + var calendar = new Calendar(calendarModel, ecModel, api); + calendarList.push(calendar); + calendarModel.coordinateSystem = calendar; + }); + ecModel.eachSeries(function (calendarSeries) { + if (calendarSeries.get('coordinateSystem') === 'calendar') { + // Inject coordinate system + calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0]; + } + }); + return calendarList; + }; + + Calendar.dimensions = ['time', 'value']; + return Calendar; + }(); + + function getCoordSys$4(finder) { + var calendarModel = finder.calendarModel; + var seriesModel = finder.seriesModel; + var coordSys = calendarModel ? calendarModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null; + return coordSys; + } + + function install$w(registers) { + registers.registerComponentModel(CalendarModel); + registers.registerComponentView(CalendarView); + registers.registerCoordinateSystem('calendar', Calendar); + } + + function setKeyInfoToNewElOption(resultItem, newElOption) { + var existElOption = resultItem.existing; // Set id and type after id assigned. + + newElOption.id = resultItem.keyInfo.id; + !newElOption.type && existElOption && (newElOption.type = existElOption.type); // Set parent id if not specified + + if (newElOption.parentId == null) { + var newElParentOption = newElOption.parentOption; + + if (newElParentOption) { + newElOption.parentId = newElParentOption.id; + } else if (existElOption) { + newElOption.parentId = existElOption.parentId; + } + } // Clear + + + newElOption.parentOption = null; + } + + function isSetLoc(obj, props) { + var isSet; + each(props, function (prop) { + obj[prop] != null && obj[prop] !== 'auto' && (isSet = true); + }); + return isSet; + } + + function mergeNewElOptionToExist(existList, index, newElOption) { + // Update existing options, for `getOption` feature. + var newElOptCopy = extend({}, newElOption); + var existElOption = existList[index]; + var $action = newElOption.$action || 'merge'; + + if ($action === 'merge') { + if (existElOption) { + if ("development" !== 'production') { + var newType = newElOption.type; + assert(!newType || existElOption.type === newType, 'Please set $action: "replace" to change `type`'); + } // We can ensure that newElOptCopy and existElOption are not + // the same object, so `merge` will not change newElOptCopy. + + + merge(existElOption, newElOptCopy, true); // Rigid body, use ignoreSize. + + mergeLayoutParam(existElOption, newElOptCopy, { + ignoreSize: true + }); // Will be used in render. + + copyLayoutParams(newElOption, existElOption); // Copy transition info to new option so it can be used in the transition. + // DO IT AFTER merge + + copyTransitionInfo(newElOption, existElOption); + copyTransitionInfo(newElOption, existElOption, 'shape'); + copyTransitionInfo(newElOption, existElOption, 'style'); + copyTransitionInfo(newElOption, existElOption, 'extra'); // Copy clipPath + + newElOption.clipPath = existElOption.clipPath; + } else { + existList[index] = newElOptCopy; + } + } else if ($action === 'replace') { + existList[index] = newElOptCopy; + } else if ($action === 'remove') { + // null will be cleaned later. + existElOption && (existList[index] = null); + } + } + + var TRANSITION_PROPS_TO_COPY = ['transition', 'enterFrom', 'leaveTo']; + var ROOT_TRANSITION_PROPS_TO_COPY = TRANSITION_PROPS_TO_COPY.concat(['enterAnimation', 'updateAnimation', 'leaveAnimation']); + + function copyTransitionInfo(target, source, targetProp) { + if (targetProp) { + if (!target[targetProp] && source[targetProp]) { + // TODO avoid creating this empty object when there is no transition configuration. + target[targetProp] = {}; + } + + target = target[targetProp]; + source = source[targetProp]; + } + + if (!target || !source) { + return; + } + + var props = targetProp ? TRANSITION_PROPS_TO_COPY : ROOT_TRANSITION_PROPS_TO_COPY; + + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + + if (target[prop] == null && source[prop] != null) { + target[prop] = source[prop]; + } + } + } + + function setLayoutInfoToExist(existItem, newElOption) { + if (!existItem) { + return; + } + + existItem.hv = newElOption.hv = [// Rigid body, dont care `width`. + isSetLoc(newElOption, ['left', 'right']), // Rigid body, dont care `height`. + isSetLoc(newElOption, ['top', 'bottom'])]; // Give default group size. Otherwise layout error may occur. + + if (existItem.type === 'group') { + var existingGroupOpt = existItem; + var newGroupOpt = newElOption; + existingGroupOpt.width == null && (existingGroupOpt.width = newGroupOpt.width = 0); + existingGroupOpt.height == null && (existingGroupOpt.height = newGroupOpt.height = 0); + } + } + + var GraphicComponentModel = + /** @class */ + function (_super) { + __extends(GraphicComponentModel, _super); + + function GraphicComponentModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphicComponentModel.type; + _this.preventAutoZ = true; + return _this; + } + + GraphicComponentModel.prototype.mergeOption = function (option, ecModel) { + // Prevent default merge to elements + var elements = this.option.elements; + this.option.elements = null; + + _super.prototype.mergeOption.call(this, option, ecModel); + + this.option.elements = elements; + }; + + GraphicComponentModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + var newList = (isInit ? thisOption : newOption).elements; + var existList = thisOption.elements = isInit ? [] : thisOption.elements; + var flattenedList = []; + + this._flatten(newList, flattenedList, null); + + var mappingResult = mappingToExists(existList, flattenedList, 'normalMerge'); // Clear elOptionsToUpdate + + var elOptionsToUpdate = this._elOptionsToUpdate = []; + each(mappingResult, function (resultItem, index) { + var newElOption = resultItem.newOption; + + if ("development" !== 'production') { + assert(isObject(newElOption) || resultItem.existing, 'Empty graphic option definition'); + } + + if (!newElOption) { + return; + } + + elOptionsToUpdate.push(newElOption); + setKeyInfoToNewElOption(resultItem, newElOption); + mergeNewElOptionToExist(existList, index, newElOption); + setLayoutInfoToExist(existList[index], newElOption); + }, this); // Clean + + thisOption.elements = filter(existList, function (item) { + // $action should be volatile, otherwise option gotten from + // `getOption` will contain unexpected $action. + item && delete item.$action; + return item != null; + }); + }; + /** + * Convert + * [{ + * type: 'group', + * id: 'xx', + * children: [{type: 'circle'}, {type: 'polygon'}] + * }] + * to + * [ + * {type: 'group', id: 'xx'}, + * {type: 'circle', parentId: 'xx'}, + * {type: 'polygon', parentId: 'xx'} + * ] + */ + + + GraphicComponentModel.prototype._flatten = function (optionList, result, parentOption) { + each(optionList, function (option) { + if (!option) { + return; + } + + if (parentOption) { + option.parentOption = parentOption; + } + + result.push(option); + var children = option.children; + + if (option.type === 'group' && children) { + this._flatten(children, result, option); + } // Deleting for JSON output, and for not affecting group creation. + + + delete option.children; + }, this); + }; // FIXME + // Pass to view using payload? setOption has a payload? + + + GraphicComponentModel.prototype.useElOptionsToUpdate = function () { + var els = this._elOptionsToUpdate; // Clear to avoid render duplicately when zooming. + + this._elOptionsToUpdate = null; + return els; + }; + + GraphicComponentModel.type = 'graphic'; + GraphicComponentModel.defaultOption = { + elements: [] // parentId: null + + }; + return GraphicComponentModel; + }(ComponentModel); + + var nonShapeGraphicElements = { + // Reserved but not supported in graphic component. + path: null, + compoundPath: null, + // Supported in graphic component. + group: Group, + image: ZRImage, + text: ZRText + }; + var inner$e = makeInner(); // ------------------------ + // View + // ------------------------ + + var GraphicComponentView = + /** @class */ + function (_super) { + __extends(GraphicComponentView, _super); + + function GraphicComponentView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = GraphicComponentView.type; + return _this; + } + + GraphicComponentView.prototype.init = function () { + this._elMap = createHashMap(); + }; + + GraphicComponentView.prototype.render = function (graphicModel, ecModel, api) { + // Having leveraged between use cases and algorithm complexity, a very + // simple layout mechanism is used: + // The size(width/height) can be determined by itself or its parent (not + // implemented yet), but can not by its children. (Top-down travel) + // The location(x/y) can be determined by the bounding rect of itself + // (can including its descendants or not) and the size of its parent. + // (Bottom-up travel) + // When `chart.clear()` or `chart.setOption({...}, true)` with the same id, + // view will be reused. + if (graphicModel !== this._lastGraphicModel) { + this._clear(); + } + + this._lastGraphicModel = graphicModel; + + this._updateElements(graphicModel); + + this._relocate(graphicModel, api); + }; + /** + * Update graphic elements. + */ + + + GraphicComponentView.prototype._updateElements = function (graphicModel) { + var elOptionsToUpdate = graphicModel.useElOptionsToUpdate(); + + if (!elOptionsToUpdate) { + return; + } + + var elMap = this._elMap; + var rootGroup = this.group; + var globalZ = graphicModel.get('z'); + var globalZLevel = graphicModel.get('zlevel'); // Top-down tranverse to assign graphic settings to each elements. + + each(elOptionsToUpdate, function (elOption) { + var id = convertOptionIdName(elOption.id, null); + var elExisting = id != null ? elMap.get(id) : null; + var parentId = convertOptionIdName(elOption.parentId, null); + var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup; + var elType = elOption.type; + var elOptionStyle = elOption.style; + + if (elType === 'text' && elOptionStyle) { + // In top/bottom mode, textVerticalAlign should not be used, which cause + // inaccurately locating. + if (elOption.hv && elOption.hv[1]) { + elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = elOptionStyle.verticalAlign = elOptionStyle.align = null; + } + } + + var textContentOption = elOption.textContent; + var textConfig = elOption.textConfig; + + if (elOptionStyle && isEC4CompatibleStyle(elOptionStyle, elType, !!textConfig, !!textContentOption)) { + var convertResult = convertFromEC4CompatibleStyle(elOptionStyle, elType, true); + + if (!textConfig && convertResult.textConfig) { + textConfig = elOption.textConfig = convertResult.textConfig; + } + + if (!textContentOption && convertResult.textContent) { + textContentOption = convertResult.textContent; + } + } // Remove unnecessary props to avoid potential problems. + + + var elOptionCleaned = getCleanedElOption(elOption); // For simple, do not support parent change, otherwise reorder is needed. + + if ("development" !== 'production') { + elExisting && assert(targetElParent === elExisting.parent, 'Changing parent is not supported.'); + } + + var $action = elOption.$action || 'merge'; + var isMerge = $action === 'merge'; + var isReplace = $action === 'replace'; + + if (isMerge) { + var isInit = !elExisting; + var el_1 = elExisting; + + if (isInit) { + el_1 = createEl$1(id, targetElParent, elOption.type, elMap); + } else { + el_1 && (inner$e(el_1).isNew = false); // Stop and restore before update any other attributes. + + stopPreviousKeyframeAnimationAndRestore(el_1); + } + + if (el_1) { + applyUpdateTransition(el_1, elOptionCleaned, graphicModel, { + isInit: isInit + }); + updateCommonAttrs(el_1, elOption, globalZ, globalZLevel); + } + } else if (isReplace) { + removeEl(elExisting, elOption, elMap, graphicModel); + var el_2 = createEl$1(id, targetElParent, elOption.type, elMap); + + if (el_2) { + applyUpdateTransition(el_2, elOptionCleaned, graphicModel, { + isInit: true + }); + updateCommonAttrs(el_2, elOption, globalZ, globalZLevel); + } + } else if ($action === 'remove') { + updateLeaveTo(elExisting, elOption); + removeEl(elExisting, elOption, elMap, graphicModel); + } + + var el = elMap.get(id); + + if (el && textContentOption) { + if (isMerge) { + var textContentExisting = el.getTextContent(); + textContentExisting ? textContentExisting.attr(textContentOption) : el.setTextContent(new ZRText(textContentOption)); + } else if (isReplace) { + el.setTextContent(new ZRText(textContentOption)); + } + } + + if (el) { + var clipPathOption = elOption.clipPath; + + if (clipPathOption) { + var clipPathType = clipPathOption.type; + var clipPath = void 0; + var isInit = false; + + if (isMerge) { + var oldClipPath = el.getClipPath(); + isInit = !oldClipPath || inner$e(oldClipPath).type !== clipPathType; + clipPath = isInit ? newEl(clipPathType) : oldClipPath; + } else if (isReplace) { + isInit = true; + clipPath = newEl(clipPathType); + } + + el.setClipPath(clipPath); + applyUpdateTransition(clipPath, clipPathOption, graphicModel, { + isInit: isInit + }); + applyKeyframeAnimation(clipPath, clipPathOption.keyframeAnimation, graphicModel); + } + + var elInner = inner$e(el); + el.setTextConfig(textConfig); + elInner.option = elOption; + setEventData(el, graphicModel, elOption); + setTooltipConfig({ + el: el, + componentModel: graphicModel, + itemName: el.name, + itemTooltipOption: elOption.tooltip + }); + applyKeyframeAnimation(el, elOption.keyframeAnimation, graphicModel); + } + }); + }; + /** + * Locate graphic elements. + */ + + + GraphicComponentView.prototype._relocate = function (graphicModel, api) { + var elOptions = graphicModel.option.elements; + var rootGroup = this.group; + var elMap = this._elMap; + var apiWidth = api.getWidth(); + var apiHeight = api.getHeight(); + var xy = ['x', 'y']; // Top-down to calculate percentage width/height of group + + for (var i = 0; i < elOptions.length; i++) { + var elOption = elOptions[i]; + var id = convertOptionIdName(elOption.id, null); + var el = id != null ? elMap.get(id) : null; + + if (!el || !el.isGroup) { + continue; + } + + var parentEl = el.parent; + var isParentRoot = parentEl === rootGroup; // Like 'position:absolut' in css, default 0. + + var elInner = inner$e(el); + var parentElInner = inner$e(parentEl); + elInner.width = parsePercent$1(elInner.option.width, isParentRoot ? apiWidth : parentElInner.width) || 0; + elInner.height = parsePercent$1(elInner.option.height, isParentRoot ? apiHeight : parentElInner.height) || 0; + } // Bottom-up tranvese all elements (consider ec resize) to locate elements. + + + for (var i = elOptions.length - 1; i >= 0; i--) { + var elOption = elOptions[i]; + var id = convertOptionIdName(elOption.id, null); + var el = id != null ? elMap.get(id) : null; + + if (!el) { + continue; + } + + var parentEl = el.parent; + var parentElInner = inner$e(parentEl); + var containerInfo = parentEl === rootGroup ? { + width: apiWidth, + height: apiHeight + } : { + width: parentElInner.width, + height: parentElInner.height + }; // PENDING + // Currently, when `bounding: 'all'`, the union bounding rect of the group + // does not include the rect of [0, 0, group.width, group.height], which + // is probably weird for users. Should we make a break change for it? + + var layoutPos = {}; + var layouted = positionElement(el, elOption, containerInfo, null, { + hv: elOption.hv, + boundingMode: elOption.bounding + }, layoutPos); + + if (!inner$e(el).isNew && layouted) { + var transition = elOption.transition; + var animatePos = {}; + + for (var k = 0; k < xy.length; k++) { + var key = xy[k]; + var val = layoutPos[key]; + + if (transition && (isTransitionAll(transition) || indexOf(transition, key) >= 0)) { + animatePos[key] = val; + } else { + el[key] = val; + } + } + + updateProps(el, animatePos, graphicModel, 0); + } else { + el.attr(layoutPos); + } + } + }; + /** + * Clear all elements. + */ + + + GraphicComponentView.prototype._clear = function () { + var _this = this; + + var elMap = this._elMap; + elMap.each(function (el) { + removeEl(el, inner$e(el).option, elMap, _this._lastGraphicModel); + }); + this._elMap = createHashMap(); + }; + + GraphicComponentView.prototype.dispose = function () { + this._clear(); + }; + + GraphicComponentView.type = 'graphic'; + return GraphicComponentView; + }(ComponentView); + + function newEl(graphicType) { + if ("development" !== 'production') { + assert(graphicType, 'graphic type MUST be set'); + } + + var Clz = hasOwn(nonShapeGraphicElements, graphicType) // Those graphic elements are not shapes. They should not be + // overwritten by users, so do them first. + ? nonShapeGraphicElements[graphicType] : getShapeClass(graphicType); + + if ("development" !== 'production') { + assert(Clz, "graphic type " + graphicType + " can not be found"); + } + + var el = new Clz({}); + inner$e(el).type = graphicType; + return el; + } + + function createEl$1(id, targetElParent, graphicType, elMap) { + var el = newEl(graphicType); + targetElParent.add(el); + elMap.set(id, el); + inner$e(el).id = id; + inner$e(el).isNew = true; + return el; + } + + function removeEl(elExisting, elOption, elMap, graphicModel) { + var existElParent = elExisting && elExisting.parent; + + if (existElParent) { + elExisting.type === 'group' && elExisting.traverse(function (el) { + removeEl(el, elOption, elMap, graphicModel); + }); + applyLeaveTransition(elExisting, elOption, graphicModel); + elMap.removeKey(inner$e(elExisting).id); + } + } + + function updateCommonAttrs(el, elOption, defaultZ, defaultZlevel) { + if (!el.isGroup) { + var elDisplayable = el; + elDisplayable.cursor = retrieve2(elOption.cursor, Displayable.prototype.cursor); // We should not support configure z and zlevel in the element level. + // But seems we didn't limit it previously. So here still use it to avoid breaking. + + elDisplayable.z = retrieve2(elOption.z, defaultZ || 0); + elDisplayable.zlevel = retrieve2(elOption.zlevel, defaultZlevel || 0); // z2 must not be null/undefined, otherwise sort error may occur. + + var optZ2 = elOption.z2; + optZ2 != null && (elDisplayable.z2 = optZ2 || 0); + } + + each(keys(elOption), function (key) { + var val = elOption[key]; // Assign event handlers. + // PENDING: should enumerate all event names or use pattern matching? + + if (key.indexOf('on') === 0 && isFunction(val)) { + el[key] = val; + } + }); + el.draggable = elOption.draggable; // Other attributes + + elOption.name != null && (el.name = elOption.name); + elOption.id != null && (el.id = elOption.id); + } // Remove unnecessary props to avoid potential problems. + + + function getCleanedElOption(elOption) { + elOption = extend({}, elOption); + each(['id', 'parentId', '$action', 'hv', 'bounding', 'textContent', 'clipPath'].concat(LOCATION_PARAMS), function (name) { + delete elOption[name]; + }); + return elOption; + } + + function setEventData(el, graphicModel, elOption) { + var eventData = getECData(el).eventData; // Simple optimize for large amount of elements that no need event. + + if (!el.silent && !el.ignore && !eventData) { + eventData = getECData(el).eventData = { + componentType: 'graphic', + componentIndex: graphicModel.componentIndex, + name: el.name + }; + } // `elOption.info` enables user to mount some info on + // elements and use them in event handlers. + + + if (eventData) { + eventData.info = elOption.info; + } + } + + function install$x(registers) { + registers.registerComponentModel(GraphicComponentModel); + registers.registerComponentView(GraphicComponentView); + registers.registerPreprocessor(function (option) { + var graphicOption = option.graphic; // Convert + // {graphic: [{left: 10, type: 'circle'}, ...]} + // or + // {graphic: {left: 10, type: 'circle'}} + // to + // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]} + + if (isArray(graphicOption)) { + if (!graphicOption[0] || !graphicOption[0].elements) { + option.graphic = [{ + elements: graphicOption + }]; + } else { + // Only one graphic instance can be instantiated. (We dont + // want that too many views are created in echarts._viewMap) + option.graphic = [option.graphic[0]]; + } + } else if (graphicOption && !graphicOption.elements) { + option.graphic = [{ + elements: [graphicOption] + }]; + } + }); + } + + var DATA_ZOOM_AXIS_DIMENSIONS = ['x', 'y', 'radius', 'angle', 'single']; // Supported coords. + // FIXME: polar has been broken (but rarely used). + + var SERIES_COORDS = ['cartesian2d', 'polar', 'singleAxis']; + + function isCoordSupported(seriesModel) { + var coordType = seriesModel.get('coordinateSystem'); + return indexOf(SERIES_COORDS, coordType) >= 0; + } + + function getAxisMainType(axisDim) { + if ("development" !== 'production') { + assert(axisDim); + } + + return axisDim + 'Axis'; + } + + /** + * If two dataZoomModels has the same axis controlled, we say that they are 'linked'. + * This function finds all linked dataZoomModels start from the given payload. + */ + + function findEffectedDataZooms(ecModel, payload) { + // Key: `DataZoomAxisDimension` + var axisRecords = createHashMap(); + var effectedModels = []; // Key: uid of dataZoomModel + + var effectedModelMap = createHashMap(); // Find the dataZooms specified by payload. + + ecModel.eachComponent({ + mainType: 'dataZoom', + query: payload + }, function (dataZoomModel) { + if (!effectedModelMap.get(dataZoomModel.uid)) { + addToEffected(dataZoomModel); + } + }); // Start from the given dataZoomModels, travel the graph to find + // all of the linked dataZoom models. + + var foundNewLink; + + do { + foundNewLink = false; + ecModel.eachComponent('dataZoom', processSingle); + } while (foundNewLink); + + function processSingle(dataZoomModel) { + if (!effectedModelMap.get(dataZoomModel.uid) && isLinked(dataZoomModel)) { + addToEffected(dataZoomModel); + foundNewLink = true; + } + } + + function addToEffected(dataZoom) { + effectedModelMap.set(dataZoom.uid, true); + effectedModels.push(dataZoom); + markAxisControlled(dataZoom); + } + + function isLinked(dataZoomModel) { + var isLink = false; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisIdxArr = axisRecords.get(axisDim); + + if (axisIdxArr && axisIdxArr[axisIndex]) { + isLink = true; + } + }); + return isLink; + } + + function markAxisControlled(dataZoomModel) { + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + (axisRecords.get(axisDim) || axisRecords.set(axisDim, []))[axisIndex] = true; + }); + } + + return effectedModels; + } + + /** + * Find the first target coordinate system. + * Available after model built. + * + * @return Like { + * grid: [ + * {model: coord0, axisModels: [axis1, axis3], coordIndex: 1}, + * {model: coord1, axisModels: [axis0, axis2], coordIndex: 0}, + * ... + * ], // cartesians must not be null/undefined. + * polar: [ + * {model: coord0, axisModels: [axis4], coordIndex: 0}, + * ... + * ], // polars must not be null/undefined. + * singleAxis: [ + * {model: coord0, axisModels: [], coordIndex: 0} + * ] + * } + */ + + function collectReferCoordSysModelInfo(dataZoomModel) { + var ecModel = dataZoomModel.ecModel; + var coordSysInfoWrap = { + infoList: [], + infoMap: createHashMap() + }; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + + if (!axisModel) { + return; + } + + var coordSysModel = axisModel.getCoordSysModel(); + + if (!coordSysModel) { + return; + } + + var coordSysUid = coordSysModel.uid; + var coordSysInfo = coordSysInfoWrap.infoMap.get(coordSysUid); + + if (!coordSysInfo) { + coordSysInfo = { + model: coordSysModel, + axisModels: [] + }; + coordSysInfoWrap.infoList.push(coordSysInfo); + coordSysInfoWrap.infoMap.set(coordSysUid, coordSysInfo); + } + + coordSysInfo.axisModels.push(axisModel); + }); + return coordSysInfoWrap; + } + + var DataZoomAxisInfo = + /** @class */ + function () { + function DataZoomAxisInfo() { + this.indexList = []; + this.indexMap = []; + } + + DataZoomAxisInfo.prototype.add = function (axisCmptIdx) { + // Remove duplication. + if (!this.indexMap[axisCmptIdx]) { + this.indexList.push(axisCmptIdx); + this.indexMap[axisCmptIdx] = true; + } + }; + + return DataZoomAxisInfo; + }(); + + var DataZoomModel = + /** @class */ + function (_super) { + __extends(DataZoomModel, _super); + + function DataZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = DataZoomModel.type; + _this._autoThrottle = true; + _this._noTarget = true; + /** + * It is `[rangeModeForMin, rangeModeForMax]`. + * The optional values for `rangeMode`: + * + `'value'` mode: the axis extent will always be determined by + * `dataZoom.startValue` and `dataZoom.endValue`, despite + * how data like and how `axis.min` and `axis.max` are. + * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`, + * where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`, + * and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`. + * Axis extent will be determined by the result of the percent of `[dMin, dMax]`. + * + * For example, when users are using dynamic data (update data periodically via `setOption`), + * if in `'value`' mode, the window will be kept in a fixed value range despite how + * data are appended, while if in `'percent'` mode, whe window range will be changed alone with + * the appended data (suppose `axis.min` and `axis.max` are not specified). + */ + + _this._rangePropMode = ['percent', 'percent']; + return _this; + } + + DataZoomModel.prototype.init = function (option, parentModel, ecModel) { + var inputRawOption = retrieveRawOption(option); + /** + * Suppose a "main process" start at the point that model prepared (that is, + * model initialized or merged or method called in `action`). + * We should keep the `main process` idempotent, that is, given a set of values + * on `option`, we get the same result. + * + * But sometimes, values on `option` will be updated for providing users + * a "final calculated value" (`dataZoomProcessor` will do that). Those value + * should not be the base/input of the `main process`. + * + * So in that case we should save and keep the input of the `main process` + * separately, called `settledOption`. + * + * For example, consider the case: + * (Step_1) brush zoom the grid by `toolbox.dataZoom`, + * where the original input `option.startValue`, `option.endValue` are earsed by + * calculated value. + * (Step)2) click the legend to hide and show a series, + * where the new range is calculated by the earsed `startValue` and `endValue`, + * which brings incorrect result. + */ + + this.settledOption = inputRawOption; + this.mergeDefaultAndTheme(option, ecModel); + + this._doInit(inputRawOption); + }; + + DataZoomModel.prototype.mergeOption = function (newOption) { + var inputRawOption = retrieveRawOption(newOption); //FIX #2591 + + merge(this.option, newOption, true); + merge(this.settledOption, inputRawOption, true); + + this._doInit(inputRawOption); + }; + + DataZoomModel.prototype._doInit = function (inputRawOption) { + var thisOption = this.option; + + this._setDefaultThrottle(inputRawOption); + + this._updateRangeUse(inputRawOption); + + var settledOption = this.settledOption; + each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + // start/end has higher priority over startValue/endValue if they + // both set, but we should make chart.setOption({endValue: 1000}) + // effective, rather than chart.setOption({endValue: 1000, end: null}). + if (this._rangePropMode[index] === 'value') { + thisOption[names[0]] = settledOption[names[0]] = null; + } // Otherwise do nothing and use the merge result. + + }, this); + + this._resetTarget(); + }; + + DataZoomModel.prototype._resetTarget = function () { + var optionOrient = this.get('orient', true); + var targetAxisIndexMap = this._targetAxisInfoMap = createHashMap(); + + var hasAxisSpecified = this._fillSpecifiedTargetAxis(targetAxisIndexMap); + + if (hasAxisSpecified) { + this._orient = optionOrient || this._makeAutoOrientByTargetAxis(); + } else { + this._orient = optionOrient || 'horizontal'; + + this._fillAutoTargetAxisByOrient(targetAxisIndexMap, this._orient); + } + + this._noTarget = true; + targetAxisIndexMap.each(function (axisInfo) { + if (axisInfo.indexList.length) { + this._noTarget = false; + } + }, this); + }; + + DataZoomModel.prototype._fillSpecifiedTargetAxis = function (targetAxisIndexMap) { + var hasAxisSpecified = false; + each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { + var refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING); // When user set axisIndex as a empty array, we think that user specify axisIndex + // but do not want use auto mode. Because empty array may be encountered when + // some error occured. + + if (!refering.specified) { + return; + } + + hasAxisSpecified = true; + var axisInfo = new DataZoomAxisInfo(); + each(refering.models, function (axisModel) { + axisInfo.add(axisModel.componentIndex); + }); + targetAxisIndexMap.set(axisDim, axisInfo); + }, this); + return hasAxisSpecified; + }; + + DataZoomModel.prototype._fillAutoTargetAxisByOrient = function (targetAxisIndexMap, orient) { + var ecModel = this.ecModel; + var needAuto = true; // Find axis that parallel to dataZoom as default. + + if (needAuto) { + var axisDim = orient === 'vertical' ? 'y' : 'x'; + var axisModels = ecModel.findComponents({ + mainType: axisDim + 'Axis' + }); + setParallelAxis(axisModels, axisDim); + } // Find axis that parallel to dataZoom as default. + + + if (needAuto) { + var axisModels = ecModel.findComponents({ + mainType: 'singleAxis', + filter: function (axisModel) { + return axisModel.get('orient', true) === orient; + } + }); + setParallelAxis(axisModels, 'single'); + } + + function setParallelAxis(axisModels, axisDim) { + // At least use the first parallel axis as the target axis. + var axisModel = axisModels[0]; + + if (!axisModel) { + return; + } + + var axisInfo = new DataZoomAxisInfo(); + axisInfo.add(axisModel.componentIndex); + targetAxisIndexMap.set(axisDim, axisInfo); + needAuto = false; // Find parallel axes in the same grid. + + if (axisDim === 'x' || axisDim === 'y') { + var gridModel_1 = axisModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]; + gridModel_1 && each(axisModels, function (axModel) { + if (axisModel.componentIndex !== axModel.componentIndex && gridModel_1 === axModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]) { + axisInfo.add(axModel.componentIndex); + } + }); + } + } + + if (needAuto) { + // If no parallel axis, find the first category axis as default. (Also consider polar). + each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) { + if (!needAuto) { + return; + } + + var axisModels = ecModel.findComponents({ + mainType: getAxisMainType(axisDim), + filter: function (axisModel) { + return axisModel.get('type', true) === 'category'; + } + }); + + if (axisModels[0]) { + var axisInfo = new DataZoomAxisInfo(); + axisInfo.add(axisModels[0].componentIndex); + targetAxisIndexMap.set(axisDim, axisInfo); + needAuto = false; + } + }, this); + } + }; + + DataZoomModel.prototype._makeAutoOrientByTargetAxis = function () { + var dim; // Find the first axis + + this.eachTargetAxis(function (axisDim) { + !dim && (dim = axisDim); + }, this); + return dim === 'y' ? 'vertical' : 'horizontal'; + }; + + DataZoomModel.prototype._setDefaultThrottle = function (inputRawOption) { + // When first time user set throttle, auto throttle ends. + if (inputRawOption.hasOwnProperty('throttle')) { + this._autoThrottle = false; + } + + if (this._autoThrottle) { + var globalOption = this.ecModel.option; + this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20; + } + }; + + DataZoomModel.prototype._updateRangeUse = function (inputRawOption) { + var rangePropMode = this._rangePropMode; + var rangeModeInOption = this.get('rangeMode'); + each([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + var percentSpecified = inputRawOption[names[0]] != null; + var valueSpecified = inputRawOption[names[1]] != null; + + if (percentSpecified && !valueSpecified) { + rangePropMode[index] = 'percent'; + } else if (!percentSpecified && valueSpecified) { + rangePropMode[index] = 'value'; + } else if (rangeModeInOption) { + rangePropMode[index] = rangeModeInOption[index]; + } else if (percentSpecified) { + // percentSpecified && valueSpecified + rangePropMode[index] = 'percent'; + } // else remain its original setting. + + }); + }; + + DataZoomModel.prototype.noTarget = function () { + return this._noTarget; + }; + + DataZoomModel.prototype.getFirstTargetAxisModel = function () { + var firstAxisModel; + this.eachTargetAxis(function (axisDim, axisIndex) { + if (firstAxisModel == null) { + firstAxisModel = this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + } + }, this); + return firstAxisModel; + }; + /** + * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel + */ + + + DataZoomModel.prototype.eachTargetAxis = function (callback, context) { + this._targetAxisInfoMap.each(function (axisInfo, axisDim) { + each(axisInfo.indexList, function (axisIndex) { + callback.call(context, axisDim, axisIndex); + }); + }); + }; + /** + * @return If not found, return null/undefined. + */ + + + DataZoomModel.prototype.getAxisProxy = function (axisDim, axisIndex) { + var axisModel = this.getAxisModel(axisDim, axisIndex); + + if (axisModel) { + return axisModel.__dzAxisProxy; + } + }; + /** + * @return If not found, return null/undefined. + */ + + + DataZoomModel.prototype.getAxisModel = function (axisDim, axisIndex) { + if ("development" !== 'production') { + assert(axisDim && axisIndex != null); + } + + var axisInfo = this._targetAxisInfoMap.get(axisDim); + + if (axisInfo && axisInfo.indexMap[axisIndex]) { + return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + } + }; + /** + * If not specified, set to undefined. + */ + + + DataZoomModel.prototype.setRawRange = function (opt) { + var thisOption = this.option; + var settledOption = this.settledOption; + each([['start', 'startValue'], ['end', 'endValue']], function (names) { + // Consider the pair : + // If one has value and the other one is `null/undefined`, we both set them + // to `settledOption`. This strategy enables the feature to clear the original + // value in `settledOption` to `null/undefined`. + // But if both of them are `null/undefined`, we do not set them to `settledOption` + // and keep `settledOption` with the original value. This strategy enables users to + // only set but not set when calling + // `dispatchAction`. + // The pair is treated in the same way. + if (opt[names[0]] != null || opt[names[1]] != null) { + thisOption[names[0]] = settledOption[names[0]] = opt[names[0]]; + thisOption[names[1]] = settledOption[names[1]] = opt[names[1]]; + } + }, this); + + this._updateRangeUse(opt); + }; + + DataZoomModel.prototype.setCalculatedRange = function (opt) { + var option = this.option; + each(['start', 'startValue', 'end', 'endValue'], function (name) { + option[name] = opt[name]; + }); + }; + + DataZoomModel.prototype.getPercentRange = function () { + var axisProxy = this.findRepresentativeAxisProxy(); + + if (axisProxy) { + return axisProxy.getDataPercentWindow(); + } + }; + /** + * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0); + * + * @return [startValue, endValue] value can only be '-' or finite number. + */ + + + DataZoomModel.prototype.getValueRange = function (axisDim, axisIndex) { + if (axisDim == null && axisIndex == null) { + var axisProxy = this.findRepresentativeAxisProxy(); + + if (axisProxy) { + return axisProxy.getDataValueWindow(); + } + } else { + return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow(); + } + }; + /** + * @param axisModel If axisModel given, find axisProxy + * corresponding to the axisModel + */ + + + DataZoomModel.prototype.findRepresentativeAxisProxy = function (axisModel) { + if (axisModel) { + return axisModel.__dzAxisProxy; + } // Find the first hosted axisProxy + + + var firstProxy; + + var axisDimList = this._targetAxisInfoMap.keys(); + + for (var i = 0; i < axisDimList.length; i++) { + var axisDim = axisDimList[i]; + + var axisInfo = this._targetAxisInfoMap.get(axisDim); + + for (var j = 0; j < axisInfo.indexList.length; j++) { + var proxy = this.getAxisProxy(axisDim, axisInfo.indexList[j]); + + if (proxy.hostedBy(this)) { + return proxy; + } + + if (!firstProxy) { + firstProxy = proxy; + } + } + } // If no hosted proxy found, still need to return a proxy. + // This case always happens in toolbox dataZoom, where axes are all hosted by + // other dataZooms. + + + return firstProxy; + }; + + DataZoomModel.prototype.getRangePropMode = function () { + return this._rangePropMode.slice(); + }; + + DataZoomModel.prototype.getOrient = function () { + if ("development" !== 'production') { + // Should not be called before initialized. + assert(this._orient); + } + + return this._orient; + }; + + DataZoomModel.type = 'dataZoom'; + DataZoomModel.dependencies = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series', 'toolbox']; + DataZoomModel.defaultOption = { + // zlevel: 0, + z: 4, + filterMode: 'filter', + start: 0, + end: 100 + }; + return DataZoomModel; + }(ComponentModel); + + /** + * Retrieve the those raw params from option, which will be cached separately. + * becasue they will be overwritten by normalized/calculated values in the main + * process. + */ + + + function retrieveRawOption(option) { + var ret = {}; + each(['start', 'end', 'startValue', 'endValue', 'throttle'], function (name) { + option.hasOwnProperty(name) && (ret[name] = option[name]); + }); + return ret; + } + + var SelectDataZoomModel = + /** @class */ + function (_super) { + __extends(SelectDataZoomModel, _super); + + function SelectDataZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SelectDataZoomModel.type; + return _this; + } + + SelectDataZoomModel.type = 'dataZoom.select'; + return SelectDataZoomModel; + }(DataZoomModel); + + var DataZoomView = + /** @class */ + function (_super) { + __extends(DataZoomView, _super); + + function DataZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = DataZoomView.type; + return _this; + } + + DataZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) { + this.dataZoomModel = dataZoomModel; + this.ecModel = ecModel; + this.api = api; + }; + + DataZoomView.type = 'dataZoom'; + return DataZoomView; + }(ComponentView); + + var SelectDataZoomView = + /** @class */ + function (_super) { + __extends(SelectDataZoomView, _super); + + function SelectDataZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SelectDataZoomView.type; + return _this; + } + + SelectDataZoomView.type = 'dataZoom.select'; + return SelectDataZoomView; + }(DataZoomView); + + var each$8 = each; + var asc$1 = asc; + /** + * Operate single axis. + * One axis can only operated by one axis operator. + * Different dataZoomModels may be defined to operate the same axis. + * (i.e. 'inside' data zoom and 'slider' data zoom components) + * So dataZoomModels share one axisProxy in that case. + */ + + var AxisProxy = + /** @class */ + function () { + function AxisProxy(dimName, axisIndex, dataZoomModel, ecModel) { + this._dimName = dimName; + this._axisIndex = axisIndex; + this.ecModel = ecModel; + this._dataZoomModel = dataZoomModel; // /** + // * @readOnly + // * @private + // */ + // this.hasSeriesStacked; + } + + /** + * Whether the axisProxy is hosted by dataZoomModel. + */ + + + AxisProxy.prototype.hostedBy = function (dataZoomModel) { + return this._dataZoomModel === dataZoomModel; + }; + /** + * @return Value can only be NaN or finite value. + */ + + + AxisProxy.prototype.getDataValueWindow = function () { + return this._valueWindow.slice(); + }; + /** + * @return {Array.} + */ + + + AxisProxy.prototype.getDataPercentWindow = function () { + return this._percentWindow.slice(); + }; + + AxisProxy.prototype.getTargetSeriesModels = function () { + var seriesModels = []; + this.ecModel.eachSeries(function (seriesModel) { + if (isCoordSupported(seriesModel)) { + var axisMainType = getAxisMainType(this._dimName); + var axisModel = seriesModel.getReferringComponents(axisMainType, SINGLE_REFERRING).models[0]; + + if (axisModel && this._axisIndex === axisModel.componentIndex) { + seriesModels.push(seriesModel); + } + } + }, this); + return seriesModels; + }; + + AxisProxy.prototype.getAxisModel = function () { + return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex); + }; + + AxisProxy.prototype.getMinMaxSpan = function () { + return clone(this._minMaxSpan); + }; + /** + * Only calculate by given range and this._dataExtent, do not change anything. + */ + + + AxisProxy.prototype.calculateDataWindow = function (opt) { + var dataExtent = this._dataExtent; + var axisModel = this.getAxisModel(); + var scale = axisModel.axis.scale; + + var rangePropMode = this._dataZoomModel.getRangePropMode(); + + var percentExtent = [0, 100]; + var percentWindow = []; + var valueWindow = []; + var hasPropModeValue; + each$8(['start', 'end'], function (prop, idx) { + var boundPercent = opt[prop]; + var boundValue = opt[prop + 'Value']; // Notice: dataZoom is based either on `percentProp` ('start', 'end') or + // on `valueProp` ('startValue', 'endValue'). (They are based on the data extent + // but not min/max of axis, which will be calculated by data window then). + // The former one is suitable for cases that a dataZoom component controls multiple + // axes with different unit or extent, and the latter one is suitable for accurate + // zoom by pixel (e.g., in dataZoomSelect). + // we use `getRangePropMode()` to mark which prop is used. `rangePropMode` is updated + // only when setOption or dispatchAction, otherwise it remains its original value. + // (Why not only record `percentProp` and always map to `valueProp`? Because + // the map `valueProp` -> `percentProp` -> `valueProp` probably not the original + // `valueProp`. consider two axes constrolled by one dataZoom. They have different + // data extent. All of values that are overflow the `dataExtent` will be calculated + // to percent '100%'). + + if (rangePropMode[idx] === 'percent') { + boundPercent == null && (boundPercent = percentExtent[idx]); // Use scale.parse to math round for category or time axis. + + boundValue = scale.parse(linearMap(boundPercent, percentExtent, dataExtent)); + } else { + hasPropModeValue = true; + boundValue = boundValue == null ? dataExtent[idx] : scale.parse(boundValue); // Calculating `percent` from `value` may be not accurate, because + // This calculation can not be inversed, because all of values that + // are overflow the `dataExtent` will be calculated to percent '100%' + + boundPercent = linearMap(boundValue, dataExtent, percentExtent); + } // valueWindow[idx] = round(boundValue); + // percentWindow[idx] = round(boundPercent); + + + valueWindow[idx] = boundValue; + percentWindow[idx] = boundPercent; + }); + asc$1(valueWindow); + asc$1(percentWindow); // The windows from user calling of `dispatchAction` might be out of the extent, + // or do not obey the `min/maxSpan`, `min/maxValueSpan`. But we dont restrict window + // by `zoomLock` here, because we see `zoomLock` just as a interaction constraint, + // where API is able to initialize/modify the window size even though `zoomLock` + // specified. + + var spans = this._minMaxSpan; + hasPropModeValue ? restrictSet(valueWindow, percentWindow, dataExtent, percentExtent, false) : restrictSet(percentWindow, valueWindow, percentExtent, dataExtent, true); + + function restrictSet(fromWindow, toWindow, fromExtent, toExtent, toValue) { + var suffix = toValue ? 'Span' : 'ValueSpan'; + sliderMove(0, fromWindow, fromExtent, 'all', spans['min' + suffix], spans['max' + suffix]); + + for (var i = 0; i < 2; i++) { + toWindow[i] = linearMap(fromWindow[i], fromExtent, toExtent, true); + toValue && (toWindow[i] = scale.parse(toWindow[i])); + } + } + + return { + valueWindow: valueWindow, + percentWindow: percentWindow + }; + }; + /** + * Notice: reset should not be called before series.restoreData() called, + * so it is recommanded to be called in "process stage" but not "model init + * stage". + */ + + + AxisProxy.prototype.reset = function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var targetSeries = this.getTargetSeriesModels(); // Culculate data window and data extent, and record them. + + this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries); // `calculateDataWindow` uses min/maxSpan. + + this._updateMinMaxSpan(); + + var dataWindow = this.calculateDataWindow(dataZoomModel.settledOption); + this._valueWindow = dataWindow.valueWindow; + this._percentWindow = dataWindow.percentWindow; // Update axis setting then. + + this._setAxisModel(); + }; + + AxisProxy.prototype.filterData = function (dataZoomModel, api) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var axisDim = this._dimName; + var seriesModels = this.getTargetSeriesModels(); + var filterMode = dataZoomModel.get('filterMode'); + var valueWindow = this._valueWindow; + + if (filterMode === 'none') { + return; + } // FIXME + // Toolbox may has dataZoom injected. And if there are stacked bar chart + // with NaN data, NaN will be filtered and stack will be wrong. + // So we need to force the mode to be set empty. + // In fect, it is not a big deal that do not support filterMode-'filter' + // when using toolbox#dataZoom, utill tooltip#dataZoom support "single axis + // selection" some day, which might need "adapt to data extent on the + // otherAxis", which is disabled by filterMode-'empty'. + // But currently, stack has been fixed to based on value but not index, + // so this is not an issue any more. + // let otherAxisModel = this.getOtherAxisModel(); + // if (dataZoomModel.get('$fromToolbox') + // && otherAxisModel + // && otherAxisModel.hasSeriesStacked + // ) { + // filterMode = 'empty'; + // } + // TODO + // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet. + + + each$8(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + var dataDims = seriesData.mapDimensionsAll(axisDim); + + if (!dataDims.length) { + return; + } + + if (filterMode === 'weakFilter') { + var store_1 = seriesData.getStore(); + var dataDimIndices_1 = map(dataDims, function (dim) { + return seriesData.getDimensionIndex(dim); + }, seriesData); + seriesData.filterSelf(function (dataIndex) { + var leftOut; + var rightOut; + var hasValue; + + for (var i = 0; i < dataDims.length; i++) { + var value = store_1.get(dataDimIndices_1[i], dataIndex); + var thisHasValue = !isNaN(value); + var thisLeftOut = value < valueWindow[0]; + var thisRightOut = value > valueWindow[1]; + + if (thisHasValue && !thisLeftOut && !thisRightOut) { + return true; + } + + thisHasValue && (hasValue = true); + thisLeftOut && (leftOut = true); + thisRightOut && (rightOut = true); + } // If both left out and right out, do not filter. + + + return hasValue && leftOut && rightOut; + }); + } else { + each$8(dataDims, function (dim) { + if (filterMode === 'empty') { + seriesModel.setData(seriesData = seriesData.map(dim, function (value) { + return !isInWindow(value) ? NaN : value; + })); + } else { + var range = {}; + range[dim] = valueWindow; // console.time('select'); + + seriesData.selectRange(range); // console.timeEnd('select'); + } + }); + } + + each$8(dataDims, function (dim) { + seriesData.setApproximateExtent(valueWindow, dim); + }); + }); + + function isInWindow(value) { + return value >= valueWindow[0] && value <= valueWindow[1]; + } + }; + + AxisProxy.prototype._updateMinMaxSpan = function () { + var minMaxSpan = this._minMaxSpan = {}; + var dataZoomModel = this._dataZoomModel; + var dataExtent = this._dataExtent; + each$8(['min', 'max'], function (minMax) { + var percentSpan = dataZoomModel.get(minMax + 'Span'); + var valueSpan = dataZoomModel.get(minMax + 'ValueSpan'); + valueSpan != null && (valueSpan = this.getAxisModel().axis.scale.parse(valueSpan)); // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan + + if (valueSpan != null) { + percentSpan = linearMap(dataExtent[0] + valueSpan, dataExtent, [0, 100], true); + } else if (percentSpan != null) { + valueSpan = linearMap(percentSpan, [0, 100], dataExtent, true) - dataExtent[0]; + } + + minMaxSpan[minMax + 'Span'] = percentSpan; + minMaxSpan[minMax + 'ValueSpan'] = valueSpan; + }, this); + }; + + AxisProxy.prototype._setAxisModel = function () { + var axisModel = this.getAxisModel(); + var percentWindow = this._percentWindow; + var valueWindow = this._valueWindow; + + if (!percentWindow) { + return; + } // [0, 500]: arbitrary value, guess axis extent. + + + var precision = getPixelPrecision(valueWindow, [0, 500]); + precision = Math.min(precision, 20); // For value axis, if min/max/scale are not set, we just use the extent obtained + // by series data, which may be a little different from the extent calculated by + // `axisHelper.getScaleExtent`. But the different just affects the experience a + // little when zooming. So it will not be fixed until some users require it strongly. + + var rawExtentInfo = axisModel.axis.scale.rawExtentInfo; + + if (percentWindow[0] !== 0) { + rawExtentInfo.setDeterminedMinMax('min', +valueWindow[0].toFixed(precision)); + } + + if (percentWindow[1] !== 100) { + rawExtentInfo.setDeterminedMinMax('max', +valueWindow[1].toFixed(precision)); + } + + rawExtentInfo.freeze(); + }; + + return AxisProxy; + }(); + + function calculateDataExtent(axisProxy, axisDim, seriesModels) { + var dataExtent = [Infinity, -Infinity]; + each$8(seriesModels, function (seriesModel) { + unionAxisExtentFromData(dataExtent, seriesModel.getData(), axisDim); + }); // It is important to get "consistent" extent when more then one axes is + // controlled by a `dataZoom`, otherwise those axes will not be synchronized + // when zooming. But it is difficult to know what is "consistent", considering + // axes have different type or even different meanings (For example, two + // time axes are used to compare data of the same date in different years). + // So basically dataZoom just obtains extent by series.data (in category axis + // extent can be obtained from axis.data). + // Nevertheless, user can set min/max/scale on axes to make extent of axes + // consistent. + + var axisModel = axisProxy.getAxisModel(); + var rawExtentResult = ensureScaleRawExtentInfo(axisModel.axis.scale, axisModel, dataExtent).calculate(); + return [rawExtentResult.min, rawExtentResult.max]; + } + + var dataZoomProcessor = { + // `dataZoomProcessor` will only be performed in needed series. Consider if + // there is a line series and a pie series, it is better not to update the + // line series if only pie series is needed to be updated. + getTargetSeries: function (ecModel) { + function eachAxisModel(cb) { + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex); + cb(axisDim, axisIndex, axisModel, dataZoomModel); + }); + }); + } // FIXME: it brings side-effect to `getTargetSeries`. + // Prepare axis proxies. + + + eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) { + // dispose all last axis proxy, in case that some axis are deleted. + axisModel.__dzAxisProxy = null; + }); + var proxyList = []; + eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) { + // Different dataZooms may constrol the same axis. In that case, + // an axisProxy serves both of them. + if (!axisModel.__dzAxisProxy) { + // Use the first dataZoomModel as the main model of axisProxy. + axisModel.__dzAxisProxy = new AxisProxy(axisDim, axisIndex, dataZoomModel, ecModel); + proxyList.push(axisModel.__dzAxisProxy); + } + }); + var seriesModelMap = createHashMap(); + each(proxyList, function (axisProxy) { + each(axisProxy.getTargetSeriesModels(), function (seriesModel) { + seriesModelMap.set(seriesModel.uid, seriesModel); + }); + }); + return seriesModelMap; + }, + // Consider appendData, where filter should be performed. Because data process is + // in block mode currently, it is not need to worry about that the overallProgress + // execute every frame. + overallReset: function (ecModel, api) { + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // We calculate window and reset axis here but not in model + // init stage and not after action dispatch handler, because + // reset should be called after seriesData.restoreData. + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + dataZoomModel.getAxisProxy(axisDim, axisIndex).reset(dataZoomModel); + }); // Caution: data zoom filtering is order sensitive when using + // percent range and no min/max/scale set on axis. + // For example, we have dataZoom definition: + // [ + // {xAxisIndex: 0, start: 30, end: 70}, + // {yAxisIndex: 0, start: 20, end: 80} + // ] + // In this case, [20, 80] of y-dataZoom should be based on data + // that have filtered by x-dataZoom using range of [30, 70], + // but should not be based on full raw data. Thus sliding + // x-dataZoom will change both ranges of xAxis and yAxis, + // while sliding y-dataZoom will only change the range of yAxis. + // So we should filter x-axis after reset x-axis immediately, + // and then reset y-axis and filter y-axis. + + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + dataZoomModel.getAxisProxy(axisDim, axisIndex).filterData(dataZoomModel, api); + }); + }); + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // Fullfill all of the range props so that user + // is able to get them from chart.getOption(). + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + + if (axisProxy) { + var percentRange = axisProxy.getDataPercentWindow(); + var valueRange = axisProxy.getDataValueWindow(); + dataZoomModel.setCalculatedRange({ + start: percentRange[0], + end: percentRange[1], + startValue: valueRange[0], + endValue: valueRange[1] + }); + } + }); + } + }; + + function installDataZoomAction(registers) { + registers.registerAction('dataZoom', function (payload, ecModel) { + var effectedModels = findEffectedDataZooms(ecModel, payload); + each(effectedModels, function (dataZoomModel) { + dataZoomModel.setRawRange({ + start: payload.start, + end: payload.end, + startValue: payload.startValue, + endValue: payload.endValue + }); + }); + }); + } + + var installed = false; + + function installCommon(registers) { + if (installed) { + return; + } + + installed = true; + registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, dataZoomProcessor); + installDataZoomAction(registers); + registers.registerSubTypeDefaulter('dataZoom', function () { + // Default 'slider' when no type specified. + return 'slider'; + }); + } + + function install$y(registers) { + registers.registerComponentModel(SelectDataZoomModel); + registers.registerComponentView(SelectDataZoomView); + installCommon(registers); + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + var ToolboxFeature = + /** @class */ + function () { + function ToolboxFeature() { + } + + return ToolboxFeature; + }(); + var features = {}; + + function registerFeature(name, ctor) { + features[name] = ctor; + } + + function getFeature(name) { + return features[name]; + } + + var ToolboxModel = + /** @class */ + function (_super) { + __extends(ToolboxModel, _super); + + function ToolboxModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ToolboxModel.type; + return _this; + } + + ToolboxModel.prototype.optionUpdated = function () { + _super.prototype.optionUpdated.apply(this, arguments); + + var ecModel = this.ecModel; + each(this.option.feature, function (featureOpt, featureName) { + var Feature = getFeature(featureName); + + if (Feature) { + if (Feature.getDefaultOption) { + Feature.defaultOption = Feature.getDefaultOption(ecModel); + } + + merge(featureOpt, Feature.defaultOption); + } + }); + }; + + ToolboxModel.type = 'toolbox'; + ToolboxModel.layoutMode = { + type: 'box', + ignoreSize: true + }; + ToolboxModel.defaultOption = { + show: true, + z: 6, + // zlevel: 0, + orient: 'horizontal', + left: 'right', + top: 'top', + // right + // bottom + backgroundColor: 'transparent', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemSize: 15, + itemGap: 8, + showTitle: true, + iconStyle: { + borderColor: '#666', + color: 'none' + }, + emphasis: { + iconStyle: { + borderColor: '#3E98C5' + } + }, + // textStyle: {}, + // feature + tooltip: { + show: false, + position: 'bottom' + } + }; + return ToolboxModel; + }(ComponentModel); + + /** + * Layout list like component. + * It will box layout each items in group of component and then position the whole group in the viewport + * @param {module:zrender/group/Group} group + * @param {module:echarts/model/Component} componentModel + * @param {module:echarts/ExtensionAPI} + */ + + function layout$3(group, componentModel, api) { + var boxLayoutParams = componentModel.getBoxLayoutParams(); + var padding = componentModel.get('padding'); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var rect = getLayoutRect(boxLayoutParams, viewportSize, padding); + box(componentModel.get('orient'), group, componentModel.get('itemGap'), rect.width, rect.height); + positionElement(group, boxLayoutParams, viewportSize, padding); + } + + function makeBackground(rect, componentModel) { + var padding = normalizeCssArray$1(componentModel.get('padding')); + var style = componentModel.getItemStyle(['color', 'opacity']); + style.fill = componentModel.get('backgroundColor'); + rect = new Rect({ + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[1] + padding[3], + height: rect.height + padding[0] + padding[2], + r: componentModel.get('borderRadius') + }, + style: style, + silent: true, + z2: -1 + }); // FIXME + // `subPixelOptimizeRect` may bring some gap between edge of viewpart + // and background rect when setting like `left: 0`, `top: 0`. + // graphic.subPixelOptimizeRect(rect); + + return rect; + } + + var ToolboxView = + /** @class */ + function (_super) { + __extends(ToolboxView, _super); + + function ToolboxView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + ToolboxView.prototype.render = function (toolboxModel, ecModel, api, payload) { + var group = this.group; + group.removeAll(); + + if (!toolboxModel.get('show')) { + return; + } + + var itemSize = +toolboxModel.get('itemSize'); + var isVertical = toolboxModel.get('orient') === 'vertical'; + var featureOpts = toolboxModel.get('feature') || {}; + var features = this._features || (this._features = {}); + var featureNames = []; + each(featureOpts, function (opt, name) { + featureNames.push(name); + }); + new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(curry(processFeature, null)).execute(); // Keep for diff. + + this._featureNames = featureNames; + + function processFeature(newIndex, oldIndex) { + var featureName = featureNames[newIndex]; + var oldName = featureNames[oldIndex]; + var featureOpt = featureOpts[featureName]; + var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); + var feature; // FIX#11236, merge feature title from MagicType newOption. TODO: consider seriesIndex ? + + if (payload && payload.newTitle != null && payload.featureName === featureName) { + featureOpt.title = payload.newTitle; + } + + if (featureName && !oldName) { + // Create + if (isUserFeatureName(featureName)) { + feature = { + onclick: featureModel.option.onclick, + featureName: featureName + }; + } else { + var Feature = getFeature(featureName); + + if (!Feature) { + return; + } + + feature = new Feature(); + } + + features[featureName] = feature; + } else { + feature = features[oldName]; // If feature does not exsit. + + if (!feature) { + return; + } + } + + feature.uid = getUID('toolbox-feature'); + feature.model = featureModel; + feature.ecModel = ecModel; + feature.api = api; + var isToolboxFeature = feature instanceof ToolboxFeature; + + if (!featureName && oldName) { + isToolboxFeature && feature.dispose && feature.dispose(ecModel, api); + return; + } + + if (!featureModel.get('show') || isToolboxFeature && feature.unusable) { + isToolboxFeature && feature.remove && feature.remove(ecModel, api); + return; + } + + createIconPaths(featureModel, feature, featureName); + + featureModel.setIconStatus = function (iconName, status) { + var option = this.option; + var iconPaths = this.iconPaths; + option.iconStatus = option.iconStatus || {}; + option.iconStatus[iconName] = status; + + if (iconPaths[iconName]) { + (status === 'emphasis' ? enterEmphasis : leaveEmphasis)(iconPaths[iconName]); + } + }; + + if (feature instanceof ToolboxFeature) { + if (feature.render) { + feature.render(featureModel, ecModel, api, payload); + } + } + } + + function createIconPaths(featureModel, feature, featureName) { + var iconStyleModel = featureModel.getModel('iconStyle'); + var iconStyleEmphasisModel = featureModel.getModel(['emphasis', 'iconStyle']); // If one feature has mutiple icon. they are orginaized as + // { + // icon: { + // foo: '', + // bar: '' + // }, + // title: { + // foo: '', + // bar: '' + // } + // } + + var icons = feature instanceof ToolboxFeature && feature.getIcons ? feature.getIcons() : featureModel.get('icon'); + var titles = featureModel.get('title') || {}; + var iconsMap; + var titlesMap; + + if (isString(icons)) { + iconsMap = {}; + iconsMap[featureName] = icons; + } else { + iconsMap = icons; + } + + if (isString(titles)) { + titlesMap = {}; + titlesMap[featureName] = titles; + } else { + titlesMap = titles; + } + + var iconPaths = featureModel.iconPaths = {}; + each(iconsMap, function (iconStr, iconName) { + var path = createIcon(iconStr, {}, { + x: -itemSize / 2, + y: -itemSize / 2, + width: itemSize, + height: itemSize + }); // TODO handling image + + path.setStyle(iconStyleModel.getItemStyle()); + var pathEmphasisState = path.ensureState('emphasis'); + pathEmphasisState.style = iconStyleEmphasisModel.getItemStyle(); // Text position calculation + + var textContent = new ZRText({ + style: { + text: titlesMap[iconName], + align: iconStyleEmphasisModel.get('textAlign'), + borderRadius: iconStyleEmphasisModel.get('textBorderRadius'), + padding: iconStyleEmphasisModel.get('textPadding'), + fill: null + }, + ignore: true + }); + path.setTextContent(textContent); + setTooltipConfig({ + el: path, + componentModel: toolboxModel, + itemName: iconName, + formatterParamsExtra: { + title: titlesMap[iconName] + } + }); + path.__title = titlesMap[iconName]; + path.on('mouseover', function () { + // Should not reuse above hoverStyle, which might be modified. + var hoverStyle = iconStyleEmphasisModel.getItemStyle(); + var defaultTextPosition = isVertical ? toolboxModel.get('right') == null && toolboxModel.get('left') !== 'right' ? 'right' : 'left' : toolboxModel.get('bottom') == null && toolboxModel.get('top') !== 'bottom' ? 'bottom' : 'top'; + textContent.setStyle({ + fill: iconStyleEmphasisModel.get('textFill') || hoverStyle.fill || hoverStyle.stroke || '#000', + backgroundColor: iconStyleEmphasisModel.get('textBackgroundColor') + }); + path.setTextConfig({ + position: iconStyleEmphasisModel.get('textPosition') || defaultTextPosition + }); + textContent.ignore = !toolboxModel.get('showTitle'); // Use enterEmphasis and leaveEmphasis provide by ec. + // There are flags managed by the echarts. + + api.enterEmphasis(this); + }).on('mouseout', function () { + if (featureModel.get(['iconStatus', iconName]) !== 'emphasis') { + api.leaveEmphasis(this); + } + + textContent.hide(); + }); + (featureModel.get(['iconStatus', iconName]) === 'emphasis' ? enterEmphasis : leaveEmphasis)(path); + group.add(path); + path.on('click', bind(feature.onclick, feature, ecModel, api, iconName)); + iconPaths[iconName] = path; + }); + } + + layout$3(group, toolboxModel, api); // Render background after group is layout + // FIXME + + group.add(makeBackground(group.getBoundingRect(), toolboxModel)); // Adjust icon title positions to avoid them out of screen + + isVertical || group.eachChild(function (icon) { + var titleText = icon.__title; // const hoverStyle = icon.hoverStyle; + // TODO simplify code? + + var emphasisState = icon.ensureState('emphasis'); + var emphasisTextConfig = emphasisState.textConfig || (emphasisState.textConfig = {}); + var textContent = icon.getTextContent(); + var emphasisTextState = textContent && textContent.ensureState('emphasis'); // May be background element + + if (emphasisTextState && !isFunction(emphasisTextState) && titleText) { + var emphasisTextStyle = emphasisTextState.style || (emphasisTextState.style = {}); + var rect = getBoundingRect(titleText, ZRText.makeFont(emphasisTextStyle)); + var offsetX = icon.x + group.x; + var offsetY = icon.y + group.y + itemSize; + var needPutOnTop = false; + + if (offsetY + rect.height > api.getHeight()) { + emphasisTextConfig.position = 'top'; + needPutOnTop = true; + } + + var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 10; + + if (offsetX + rect.width / 2 > api.getWidth()) { + emphasisTextConfig.position = ['100%', topOffset]; + emphasisTextStyle.align = 'right'; + } else if (offsetX - rect.width / 2 < 0) { + emphasisTextConfig.position = [0, topOffset]; + emphasisTextStyle.align = 'left'; + } + } + }); + }; + + ToolboxView.prototype.updateView = function (toolboxModel, ecModel, api, payload) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.updateView && feature.updateView(feature.model, ecModel, api, payload); + }); + }; // updateLayout(toolboxModel, ecModel, api, payload) { + // zrUtil.each(this._features, function (feature) { + // feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload); + // }); + // }, + + + ToolboxView.prototype.remove = function (ecModel, api) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.remove && feature.remove(ecModel, api); + }); + this.group.removeAll(); + }; + + ToolboxView.prototype.dispose = function (ecModel, api) { + each(this._features, function (feature) { + feature instanceof ToolboxFeature && feature.dispose && feature.dispose(ecModel, api); + }); + }; + + ToolboxView.type = 'toolbox'; + return ToolboxView; + }(ComponentView); + + function isUserFeatureName(featureName) { + return featureName.indexOf('my') === 0; + } + + /* global window, document */ + + var SaveAsImage = + /** @class */ + function (_super) { + __extends(SaveAsImage, _super); + + function SaveAsImage() { + return _super !== null && _super.apply(this, arguments) || this; + } + + SaveAsImage.prototype.onclick = function (ecModel, api) { + var model = this.model; + var title = model.get('name') || ecModel.get('title.0.text') || 'echarts'; + var isSvg = api.getZr().painter.getType() === 'svg'; + var type = isSvg ? 'svg' : model.get('type', true) || 'png'; + var url = api.getConnectedDataURL({ + type: type, + backgroundColor: model.get('backgroundColor', true) || ecModel.get('backgroundColor') || '#fff', + connectedBackgroundColor: model.get('connectedBackgroundColor'), + excludeComponents: model.get('excludeComponents'), + pixelRatio: model.get('pixelRatio') + }); + var browser = env.browser; // Chrome, Firefox, New Edge + + if (isFunction(MouseEvent) && (browser.newEdge || !browser.ie && !browser.edge)) { + var $a = document.createElement('a'); + $a.download = title + '.' + type; + $a.target = '_blank'; + $a.href = url; + var evt = new MouseEvent('click', { + // some micro front-end framework, window maybe is a Proxy + view: document.defaultView, + bubbles: true, + cancelable: false + }); + $a.dispatchEvent(evt); + } // IE or old Edge + else { + // @ts-ignore + if (window.navigator.msSaveOrOpenBlob || isSvg) { + var parts = url.split(','); // data:[][;charset=][;base64], + + var base64Encoded = parts[0].indexOf('base64') > -1; + var bstr = isSvg // should decode the svg data uri first + ? decodeURIComponent(parts[1]) : parts[1]; // only `atob` when the data uri is encoded with base64 + // otherwise, like `svg` data uri exported by zrender, + // there will be an error, for it's not encoded with base64. + // (just a url-encoded string through `encodeURIComponent`) + + base64Encoded && (bstr = window.atob(bstr)); + var filename = title + '.' + type; // @ts-ignore + + if (window.navigator.msSaveOrOpenBlob) { + var n = bstr.length; + var u8arr = new Uint8Array(n); + + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + + var blob = new Blob([u8arr]); // @ts-ignore + + window.navigator.msSaveOrOpenBlob(blob, filename); + } else { + var frame = document.createElement('iframe'); + document.body.appendChild(frame); + var cw = frame.contentWindow; + var doc = cw.document; + doc.open('image/svg+xml', 'replace'); + doc.write(bstr); + doc.close(); + cw.focus(); + doc.execCommand('SaveAs', true, filename); + document.body.removeChild(frame); + } + } else { + var lang = model.get('lang'); + var html = '' + '' + '' + ''; + var tab = window.open(); + tab.document.write(html); + tab.document.title = title; + } + } + }; + + SaveAsImage.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0', + title: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'title']), + type: 'png', + // Default use option.backgroundColor + // backgroundColor: '#fff', + connectedBackgroundColor: '#fff', + name: '', + excludeComponents: ['toolbox'], + // use current pixel ratio of device by default + // pixelRatio: 1, + lang: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'lang']) + }; + return defaultOption; + }; + + return SaveAsImage; + }(ToolboxFeature); + + var INNER_STACK_KEYWORD = '__ec_magicType_stack__'; + var radioTypes = [['line', 'bar'], ['stack']]; + + var MagicType = + /** @class */ + function (_super) { + __extends(MagicType, _super); + + function MagicType() { + return _super !== null && _super.apply(this, arguments) || this; + } + + MagicType.prototype.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon'); + var icons = {}; + each(model.get('type'), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + MagicType.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + type: [], + // Icon group + icon: { + line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4', + bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7', + // eslint-disable-next-line + stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z' // jshint ignore:line + + }, + // `line`, `bar`, `stack`, `tiled` + title: ecModel.getLocaleModel().get(['toolbox', 'magicType', 'title']), + option: {}, + seriesIndex: {} + }; + return defaultOption; + }; + + MagicType.prototype.onclick = function (ecModel, api, type) { + var model = this.model; + var seriesIndex = model.get(['seriesIndex', type]); // Not supported magicType + + if (!seriesOptGenreator[type]) { + return; + } + + var newOption = { + series: [] + }; + + var generateNewSeriesTypes = function (seriesModel) { + var seriesType = seriesModel.subType; + var seriesId = seriesModel.id; + var newSeriesOpt = seriesOptGenreator[type](seriesType, seriesId, seriesModel, model); + + if (newSeriesOpt) { + // PENDING If merge original option? + defaults(newSeriesOpt, seriesModel.option); + newOption.series.push(newSeriesOpt); + } // Modify boundaryGap + + + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + + if (categoryAxis) { + var axisDim = categoryAxis.dim; + var axisType = axisDim + 'Axis'; + var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0]; + var axisIndex = axisModel.componentIndex; + newOption[axisType] = newOption[axisType] || []; + + for (var i = 0; i <= axisIndex; i++) { + newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {}; + } + + newOption[axisType][axisIndex].boundaryGap = type === 'bar'; + } + } + }; + + each(radioTypes, function (radio) { + if (indexOf(radio, type) >= 0) { + each(radio, function (item) { + model.setIconStatus(item, 'normal'); + }); + } + }); + model.setIconStatus(type, 'emphasis'); + ecModel.eachComponent({ + mainType: 'series', + query: seriesIndex == null ? null : { + seriesIndex: seriesIndex + } + }, generateNewSeriesTypes); + var newTitle; + var currentType = type; // Change title of stack + + if (type === 'stack') { + // use titles in model instead of ecModel + // as stack and tiled appears in pair, just flip them + // no need of checking stack state + newTitle = merge({ + stack: model.option.title.tiled, + tiled: model.option.title.stack + }, model.option.title); + + if (model.get(['iconStatus', type]) !== 'emphasis') { + currentType = 'tiled'; + } + } + + api.dispatchAction({ + type: 'changeMagicType', + currentType: currentType, + newOption: newOption, + newTitle: newTitle, + featureName: 'magicType' + }); + }; + + return MagicType; + }(ToolboxFeature); + + var seriesOptGenreator = { + 'line': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'bar') { + return merge({ + id: seriesId, + type: 'line', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get(['option', 'line']) || {}, true); + } + }, + 'bar': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line') { + return merge({ + id: seriesId, + type: 'bar', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get(['option', 'bar']) || {}, true); + } + }, + 'stack': function (seriesType, seriesId, seriesModel, model) { + var isStack = seriesModel.get('stack') === INNER_STACK_KEYWORD; + + if (seriesType === 'line' || seriesType === 'bar') { + model.setIconStatus('stack', isStack ? 'normal' : 'emphasis'); + return merge({ + id: seriesId, + stack: isStack ? '' : INNER_STACK_KEYWORD + }, model.get(['option', 'stack']) || {}, true); + } + } + }; // TODO: SELF REGISTERED. + + registerAction({ + type: 'changeMagicType', + event: 'magicTypeChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.mergeOption(payload.newOption); + }); + + /* global document */ + + var BLOCK_SPLITER = new Array(60).join('-'); + var ITEM_SPLITER = '\t'; + + /** + * Group series into two types + * 1. on category axis, like line, bar + * 2. others, like scatter, pie + */ + + function groupSeries(ecModel) { + var seriesGroupByCategoryAxis = {}; + var otherSeries = []; + var meta = []; + ecModel.eachRawSeries(function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) { + // TODO: TYPE Consider polar? Include polar may increase unecessary bundle size. + var baseAxis = coordSys.getBaseAxis(); + + if (baseAxis.type === 'category') { + var key = baseAxis.dim + '_' + baseAxis.index; + + if (!seriesGroupByCategoryAxis[key]) { + seriesGroupByCategoryAxis[key] = { + categoryAxis: baseAxis, + valueAxis: coordSys.getOtherAxis(baseAxis), + series: [] + }; + meta.push({ + axisDim: baseAxis.dim, + axisIndex: baseAxis.index + }); + } + + seriesGroupByCategoryAxis[key].series.push(seriesModel); + } else { + otherSeries.push(seriesModel); + } + } else { + otherSeries.push(seriesModel); + } + }); + return { + seriesGroupByCategoryAxis: seriesGroupByCategoryAxis, + other: otherSeries, + meta: meta + }; + } + + /** + * Assemble content of series on cateogory axis + * @inner + */ + + + function assembleSeriesWithCategoryAxis(groups) { + var tables = []; + each(groups, function (group, key) { + var categoryAxis = group.categoryAxis; + var valueAxis = group.valueAxis; + var valueAxisDim = valueAxis.dim; + var headers = [' '].concat(map(group.series, function (series) { + return series.name; + })); // @ts-ignore TODO Polar + + var columns = [categoryAxis.model.getCategories()]; + each(group.series, function (series) { + var rawData = series.getRawData(); + columns.push(series.getRawData().mapArray(rawData.mapDimension(valueAxisDim), function (val) { + return val; + })); + }); // Assemble table content + + var lines = [headers.join(ITEM_SPLITER)]; + + for (var i = 0; i < columns[0].length; i++) { + var items = []; + + for (var j = 0; j < columns.length; j++) { + items.push(columns[j][i]); + } + + lines.push(items.join(ITEM_SPLITER)); + } + + tables.push(lines.join('\n')); + }); + return tables.join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + + /** + * Assemble content of other series + */ + + + function assembleOtherSeries(series) { + return map(series, function (series) { + var data = series.getRawData(); + var lines = [series.name]; + var vals = []; + data.each(data.dimensions, function () { + var argLen = arguments.length; + var dataIndex = arguments[argLen - 1]; + var name = data.getName(dataIndex); + + for (var i = 0; i < argLen - 1; i++) { + vals[i] = arguments[i]; + } + + lines.push((name ? name + ITEM_SPLITER : '') + vals.join(ITEM_SPLITER)); + }); + return lines.join('\n'); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + + function getContentFromModel(ecModel) { + var result = groupSeries(ecModel); + return { + value: filter([assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), assembleOtherSeries(result.other)], function (str) { + return !!str.replace(/[\n\t\s]/g, ''); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'), + meta: result.meta + }; + } + + function trim$1(str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + + /** + * If a block is tsv format + */ + + + function isTSVFormat(block) { + // Simple method to find out if a block is tsv format + var firstLine = block.slice(0, block.indexOf('\n')); + + if (firstLine.indexOf(ITEM_SPLITER) >= 0) { + return true; + } + } + + var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g'); + + /** + * @param {string} tsv + * @return {Object} + */ + + function parseTSVContents(tsv) { + var tsvLines = tsv.split(/\n+/g); + var headers = trim$1(tsvLines.shift()).split(itemSplitRegex); + var categories = []; + var series = map(headers, function (header) { + return { + name: header, + data: [] + }; + }); + + for (var i = 0; i < tsvLines.length; i++) { + var items = trim$1(tsvLines[i]).split(itemSplitRegex); + categories.push(items.shift()); + + for (var j = 0; j < items.length; j++) { + series[j] && (series[j].data[i] = items[j]); + } + } + + return { + series: series, + categories: categories + }; + } + + function parseListContents(str) { + var lines = str.split(/\n+/g); + var seriesName = trim$1(lines.shift()); + var data = []; + + for (var i = 0; i < lines.length; i++) { + // if line is empty, ignore it. + // there is a case that a user forgot to delete `\n`. + var line = trim$1(lines[i]); + + if (!line) { + continue; + } + + var items = line.split(itemSplitRegex); + var name_1 = ''; + var value = void 0; + var hasName = false; + + if (isNaN(items[0])) { + // First item is name + hasName = true; + name_1 = items[0]; + items = items.slice(1); + data[i] = { + name: name_1, + value: [] + }; + value = data[i].value; + } else { + value = data[i] = []; + } + + for (var j = 0; j < items.length; j++) { + value.push(+items[j]); + } + + if (value.length === 1) { + hasName ? data[i].value = value[0] : data[i] = value[0]; + } + } + + return { + name: seriesName, + data: data + }; + } + + function parseContents(str, blockMetaList) { + var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g')); + var newOption = { + series: [] + }; + each(blocks, function (block, idx) { + if (isTSVFormat(block)) { + var result = parseTSVContents(block); + var blockMeta = blockMetaList[idx]; + var axisKey = blockMeta.axisDim + 'Axis'; + + if (blockMeta) { + newOption[axisKey] = newOption[axisKey] || []; + newOption[axisKey][blockMeta.axisIndex] = { + data: result.categories + }; + newOption.series = newOption.series.concat(result.series); + } + } else { + var result = parseListContents(block); + newOption.series.push(result); + } + }); + return newOption; + } + + var DataView = + /** @class */ + function (_super) { + __extends(DataView, _super); + + function DataView() { + return _super !== null && _super.apply(this, arguments) || this; + } + + DataView.prototype.onclick = function (ecModel, api) { + // FIXME: better way? + setTimeout(function () { + api.dispatchAction({ + type: 'hideTip' + }); + }); + var container = api.getDom(); + var model = this.model; + + if (this._dom) { + container.removeChild(this._dom); + } + + var root = document.createElement('div'); // use padding to avoid 5px whitespace + + root.style.cssText = 'position:absolute;top:0;bottom:0;left:0;right:0;padding:5px'; + root.style.backgroundColor = model.get('backgroundColor') || '#fff'; // Create elements + + var header = document.createElement('h4'); + var lang = model.get('lang') || []; + header.innerHTML = lang[0] || model.get('title'); + header.style.cssText = 'margin:10px 20px'; + header.style.color = model.get('textColor'); + var viewMain = document.createElement('div'); + var textarea = document.createElement('textarea'); + viewMain.style.cssText = 'overflow:auto'; + var optionToContent = model.get('optionToContent'); + var contentToOption = model.get('contentToOption'); + var result = getContentFromModel(ecModel); + + if (isFunction(optionToContent)) { + var htmlOrDom = optionToContent(api.getOption()); + + if (isString(htmlOrDom)) { + viewMain.innerHTML = htmlOrDom; + } else if (isDom(htmlOrDom)) { + viewMain.appendChild(htmlOrDom); + } + } else { + // Use default textarea + textarea.readOnly = model.get('readOnly'); + var style = textarea.style; // eslint-disable-next-line max-len + + style.cssText = 'display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none'; + style.color = model.get('textColor'); + style.borderColor = model.get('textareaBorderColor'); + style.backgroundColor = model.get('textareaColor'); + textarea.value = result.value; + viewMain.appendChild(textarea); + } + + var blockMetaList = result.meta; + var buttonContainer = document.createElement('div'); + buttonContainer.style.cssText = 'position:absolute;bottom:5px;left:0;right:0'; // eslint-disable-next-line max-len + + var buttonStyle = 'float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px'; + var closeButton = document.createElement('div'); + var refreshButton = document.createElement('div'); + buttonStyle += ';background-color:' + model.get('buttonColor'); + buttonStyle += ';color:' + model.get('buttonTextColor'); + var self = this; + + function close() { + container.removeChild(root); + self._dom = null; + } + + addEventListener(closeButton, 'click', close); + addEventListener(refreshButton, 'click', function () { + if (contentToOption == null && optionToContent != null || contentToOption != null && optionToContent == null) { + if ("development" !== 'production') { + // eslint-disable-next-line + warn('It seems you have just provided one of `contentToOption` and `optionToContent` functions but missed the other one. Data change is ignored.'); + } + + close(); + return; + } + + var newOption; + + try { + if (isFunction(contentToOption)) { + newOption = contentToOption(viewMain, api.getOption()); + } else { + newOption = parseContents(textarea.value, blockMetaList); + } + } catch (e) { + close(); + throw new Error('Data view format error ' + e); + } + + if (newOption) { + api.dispatchAction({ + type: 'changeDataView', + newOption: newOption + }); + } + + close(); + }); + closeButton.innerHTML = lang[1]; + refreshButton.innerHTML = lang[2]; + refreshButton.style.cssText = closeButton.style.cssText = buttonStyle; + !model.get('readOnly') && buttonContainer.appendChild(refreshButton); + buttonContainer.appendChild(closeButton); + root.appendChild(header); + root.appendChild(viewMain); + root.appendChild(buttonContainer); + viewMain.style.height = container.clientHeight - 80 + 'px'; + container.appendChild(root); + this._dom = root; + }; + + DataView.prototype.remove = function (ecModel, api) { + this._dom && api.getDom().removeChild(this._dom); + }; + + DataView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); + }; + + DataView.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + readOnly: false, + optionToContent: null, + contentToOption: null, + // eslint-disable-next-line + icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28', + title: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'title']), + lang: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'lang']), + backgroundColor: '#fff', + textColor: '#000', + textareaColor: '#fff', + textareaBorderColor: '#333', + buttonColor: '#c23531', + buttonTextColor: '#fff' + }; + return defaultOption; + }; + + return DataView; + }(ToolboxFeature); + + /** + * @inner + */ + + + function tryMergeDataOption(newData, originalData) { + return map(newData, function (newVal, idx) { + var original = originalData && originalData[idx]; + + if (isObject(original) && !isArray(original)) { + var newValIsObject = isObject(newVal) && !isArray(newVal); + + if (!newValIsObject) { + newVal = { + value: newVal + }; + } // original data has name but new data has no name + + + var shouldDeleteName = original.name != null && newVal.name == null; // Original data has option + + newVal = defaults(newVal, original); + shouldDeleteName && delete newVal.name; + return newVal; + } else { + return newVal; + } + }); + } // TODO: SELF REGISTERED. + + + registerAction({ + type: 'changeDataView', + event: 'dataViewChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + var newSeriesOptList = []; + each(payload.newOption.series, function (seriesOpt) { + var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; + + if (!seriesModel) { + // New created series + // Geuss the series type + newSeriesOptList.push(extend({ + // Default is scatter + type: 'scatter' + }, seriesOpt)); + } else { + var originalData = seriesModel.get('data'); + newSeriesOptList.push({ + name: seriesOpt.name, + data: tryMergeDataOption(seriesOpt.data, originalData) + }); + } + }); + ecModel.mergeOption(defaults({ + series: newSeriesOptList + }, payload.newOption)); + }); + + var each$9 = each; + var inner$f = makeInner(); + + /** + * @param ecModel + * @param newSnapshot key is dataZoomId + */ + + function push(ecModel, newSnapshot) { + var storedSnapshots = getStoreSnapshots(ecModel); // If previous dataZoom can not be found, + // complete an range with current range. + + each$9(newSnapshot, function (batchItem, dataZoomId) { + var i = storedSnapshots.length - 1; + + for (; i >= 0; i--) { + var snapshot = storedSnapshots[i]; + + if (snapshot[dataZoomId]) { + break; + } + } + + if (i < 0) { + // No origin range set, create one by current range. + var dataZoomModel = ecModel.queryComponents({ + mainType: 'dataZoom', + subType: 'select', + id: dataZoomId + })[0]; + + if (dataZoomModel) { + var percentRange = dataZoomModel.getPercentRange(); + storedSnapshots[0][dataZoomId] = { + dataZoomId: dataZoomId, + start: percentRange[0], + end: percentRange[1] + }; + } + } + }); + storedSnapshots.push(newSnapshot); + } + + function pop(ecModel) { + var storedSnapshots = getStoreSnapshots(ecModel); + var head = storedSnapshots[storedSnapshots.length - 1]; + storedSnapshots.length > 1 && storedSnapshots.pop(); // Find top for all dataZoom. + + var snapshot = {}; + each$9(head, function (batchItem, dataZoomId) { + for (var i = storedSnapshots.length - 1; i >= 0; i--) { + batchItem = storedSnapshots[i][dataZoomId]; + + if (batchItem) { + snapshot[dataZoomId] = batchItem; + break; + } + } + }); + return snapshot; + } + + function clear$1(ecModel) { + inner$f(ecModel).snapshots = null; + } + + function count(ecModel) { + return getStoreSnapshots(ecModel).length; + } + + /** + * History length of each dataZoom may be different. + * this._history[0] is used to store origin range. + */ + + function getStoreSnapshots(ecModel) { + var store = inner$f(ecModel); + + if (!store.snapshots) { + store.snapshots = [{}]; + } + + return store.snapshots; + } + + var RestoreOption = + /** @class */ + function (_super) { + __extends(RestoreOption, _super); + + function RestoreOption() { + return _super !== null && _super.apply(this, arguments) || this; + } + + RestoreOption.prototype.onclick = function (ecModel, api) { + clear$1(ecModel); + api.dispatchAction({ + type: 'restore', + from: this.uid + }); + }; + + RestoreOption.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + // eslint-disable-next-line + icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5', + title: ecModel.getLocaleModel().get(['toolbox', 'restore', 'title']) + }; + return defaultOption; + }; + + return RestoreOption; + }(ToolboxFeature); // TODO: SELF REGISTERED. + + + registerAction({ + type: 'restore', + event: 'restore', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.resetOption('recreate'); + }); + + // how to genarialize to more coordinate systems. + + var INCLUDE_FINDER_MAIN_TYPES = ['grid', 'xAxis', 'yAxis', 'geo', 'graph', 'polar', 'radiusAxis', 'angleAxis', 'bmap']; + + var BrushTargetManager = + /** @class */ + function () { + /** + * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid + * Each can be {number|Array.}. like: {xAxisIndex: [3, 4]} + * @param opt.include include coordinate system types. + */ + function BrushTargetManager(finder, ecModel, opt) { + var _this = this; + + this._targetInfoList = []; + var foundCpts = parseFinder$1(ecModel, finder); + each(targetInfoBuilders, function (builder, type) { + if (!opt || !opt.include || indexOf(opt.include, type) >= 0) { + builder(foundCpts, _this._targetInfoList); + } + }); + } + + BrushTargetManager.prototype.setOutputRanges = function (areas, ecModel) { + this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + (area.coordRanges || (area.coordRanges = [])).push(coordRange); // area.coordRange is the first of area.coordRanges + + if (!area.coordRange) { + area.coordRange = coordRange; // In 'category' axis, coord to pixel is not reversible, so we can not + // rebuild range by coordRange accrately, which may bring trouble when + // brushing only one item. So we use __rangeOffset to rebuilding range + // by coordRange. And this it only used in brush component so it is no + // need to be adapted to coordRanges. + + var result = coordConvert[area.brushType](0, coordSys, coordRange); + area.__rangeOffset = { + offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]), + xyMinMax: result.xyMinMax + }; + } + }); + return areas; + }; + + BrushTargetManager.prototype.matchOutputRanges = function (areas, ecModel, cb) { + each(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if (targetInfo && targetInfo !== true) { + each(targetInfo.coordSyses, function (coordSys) { + var result = coordConvert[area.brushType](1, coordSys, area.range, true); + cb(area, result.values, coordSys, ecModel); + }); + } + }, this); + }; + /** + * the `areas` is `BrushModel.areas`. + * Called in layout stage. + * convert `area.coordRange` to global range and set panelId to `area.range`. + */ + + + BrushTargetManager.prototype.setInputRanges = function (areas, ecModel) { + each(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if ("development" !== 'production') { + assert(!targetInfo || targetInfo === true || area.coordRange, 'coordRange must be specified when coord index specified.'); + assert(!targetInfo || targetInfo !== true || area.range, 'range must be specified in global brush.'); + } + + area.range = area.range || []; // convert coordRange to global range and set panelId. + + if (targetInfo && targetInfo !== true) { + area.panelId = targetInfo.panelId; // (1) area.range shoule always be calculate from coordRange but does + // not keep its original value, for the sake of the dataZoom scenario, + // where area.coordRange remains unchanged but area.range may be changed. + // (2) Only support converting one coordRange to pixel range in brush + // component. So do not consider `coordRanges`. + // (3) About __rangeOffset, see comment above. + + var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange); + var rangeOffset = area.__rangeOffset; + area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values; + } + }, this); + }; + + BrushTargetManager.prototype.makePanelOpts = function (api, getDefaultBrushType) { + return map(this._targetInfoList, function (targetInfo) { + var rect = targetInfo.getPanelRect(); + return { + panelId: targetInfo.panelId, + defaultBrushType: getDefaultBrushType ? getDefaultBrushType(targetInfo) : null, + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect) + }; + }); + }; + + BrushTargetManager.prototype.controlSeries = function (area, seriesModel, ecModel) { + // Check whether area is bound in coord, and series do not belong to that coord. + // If do not do this check, some brush (like lineX) will controll all axes. + var targetInfo = this.findTargetInfo(area, ecModel); + return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0; + }; + /** + * If return Object, a coord found. + * If reutrn true, global found. + * Otherwise nothing found. + */ + + + BrushTargetManager.prototype.findTargetInfo = function (area, ecModel) { + var targetInfoList = this._targetInfoList; + var foundCpts = parseFinder$1(ecModel, area); + + for (var i = 0; i < targetInfoList.length; i++) { + var targetInfo = targetInfoList[i]; + var areaPanelId = area.panelId; + + if (areaPanelId) { + if (targetInfo.panelId === areaPanelId) { + return targetInfo; + } + } else { + for (var j = 0; j < targetInfoMatchers.length; j++) { + if (targetInfoMatchers[j](foundCpts, targetInfo)) { + return targetInfo; + } + } + } + } + + return true; + }; + + return BrushTargetManager; + }(); + + function formatMinMax(minMax) { + minMax[0] > minMax[1] && minMax.reverse(); + return minMax; + } + + function parseFinder$1(ecModel, finder) { + return parseFinder(ecModel, finder, { + includeMainTypes: INCLUDE_FINDER_MAIN_TYPES + }); + } + + var targetInfoBuilders = { + grid: function (foundCpts, targetInfoList) { + var xAxisModels = foundCpts.xAxisModels; + var yAxisModels = foundCpts.yAxisModels; + var gridModels = foundCpts.gridModels; // Remove duplicated. + + var gridModelMap = createHashMap(); + var xAxesHas = {}; + var yAxesHas = {}; + + if (!xAxisModels && !yAxisModels && !gridModels) { + return; + } + + each(xAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + }); + each(yAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + yAxesHas[gridModel.id] = true; + }); + each(gridModels, function (gridModel) { + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + yAxesHas[gridModel.id] = true; + }); + gridModelMap.each(function (gridModel) { + var grid = gridModel.coordinateSystem; + var cartesians = []; + each(grid.getCartesians(), function (cartesian, index) { + if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0 || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0) { + cartesians.push(cartesian); + } + }); + targetInfoList.push({ + panelId: 'grid--' + gridModel.id, + gridModel: gridModel, + coordSysModel: gridModel, + // Use the first one as the representitive coordSys. + coordSys: cartesians[0], + coordSyses: cartesians, + getPanelRect: panelRectBuilders.grid, + xAxisDeclared: xAxesHas[gridModel.id], + yAxisDeclared: yAxesHas[gridModel.id] + }); + }); + }, + geo: function (foundCpts, targetInfoList) { + each(foundCpts.geoModels, function (geoModel) { + var coordSys = geoModel.coordinateSystem; + targetInfoList.push({ + panelId: 'geo--' + geoModel.id, + geoModel: geoModel, + coordSysModel: geoModel, + coordSys: coordSys, + coordSyses: [coordSys], + getPanelRect: panelRectBuilders.geo + }); + }); + } + }; + var targetInfoMatchers = [// grid + function (foundCpts, targetInfo) { + var xAxisModel = foundCpts.xAxisModel; + var yAxisModel = foundCpts.yAxisModel; + var gridModel = foundCpts.gridModel; + !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model); + !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model); + return gridModel && gridModel === targetInfo.gridModel; + }, // geo + function (foundCpts, targetInfo) { + var geoModel = foundCpts.geoModel; + return geoModel && geoModel === targetInfo.geoModel; + }]; + var panelRectBuilders = { + grid: function () { + // grid is not Transformable. + return this.coordSys.master.getRect().clone(); + }, + geo: function () { + var coordSys = this.coordSys; + var rect = coordSys.getBoundingRect().clone(); // geo roam and zoom transform + + rect.applyTransform(getTransform(coordSys)); + return rect; + } + }; + var coordConvert = { + lineX: curry(axisConvert, 0), + lineY: curry(axisConvert, 1), + rect: function (to, coordSys, rangeOrCoordRange, clamp) { + var xminymin = to ? coordSys.pointToData([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp); + var xmaxymax = to ? coordSys.pointToData([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp); + var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])]; + return { + values: values, + xyMinMax: values + }; + }, + polygon: function (to, coordSys, rangeOrCoordRange, clamp) { + var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]]; + var values = map(rangeOrCoordRange, function (item) { + var p = to ? coordSys.pointToData(item, clamp) : coordSys.dataToPoint(item, clamp); + xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]); + xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]); + xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]); + xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]); + return p; + }); + return { + values: values, + xyMinMax: xyMinMax + }; + } + }; + + function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) { + if ("development" !== 'production') { + assert(coordSys.type === 'cartesian2d', 'lineX/lineY brush is available only in cartesian2d.'); + } + + var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]); + var values = formatMinMax(map([0, 1], function (i) { + return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]), true) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i])); + })); + var xyMinMax = []; + xyMinMax[axisNameIndex] = values; + xyMinMax[1 - axisNameIndex] = [NaN, NaN]; + return { + values: values, + xyMinMax: xyMinMax + }; + } + + var diffProcessor = { + lineX: curry(axisDiffProcessor, 0), + lineY: curry(axisDiffProcessor, 1), + rect: function (values, refer, scales) { + return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]]; + }, + polygon: function (values, refer, scales) { + return map(values, function (item, idx) { + return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]]; + }); + } + }; + + function axisDiffProcessor(axisNameIndex, values, refer, scales) { + return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]]; + } // We have to process scale caused by dataZoom manually, + // although it might be not accurate. + // Return [0~1, 0~1] + + + function getScales(xyMinMaxCurr, xyMinMaxOrigin) { + var sizeCurr = getSize$1(xyMinMaxCurr); + var sizeOrigin = getSize$1(xyMinMaxOrigin); + var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]]; + isNaN(scales[0]) && (scales[0] = 1); + isNaN(scales[1]) && (scales[1] = 1); + return scales; + } + + function getSize$1(xyMinMax) { + return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN]; + } + + var each$a = each; + var DATA_ZOOM_ID_BASE = makeInternalComponentId('toolbox-dataZoom_'); + + var DataZoomFeature = + /** @class */ + function (_super) { + __extends(DataZoomFeature, _super); + + function DataZoomFeature() { + return _super !== null && _super.apply(this, arguments) || this; + } + + DataZoomFeature.prototype.render = function (featureModel, ecModel, api, payload) { + if (!this._brushController) { + this._brushController = new BrushController(api.getZr()); + + this._brushController.on('brush', bind(this._onBrush, this)).mount(); + } + + updateZoomBtnStatus(featureModel, ecModel, this, payload, api); + updateBackBtnStatus(featureModel, ecModel); + }; + + DataZoomFeature.prototype.onclick = function (ecModel, api, type) { + handlers$1[type].call(this); + }; + + DataZoomFeature.prototype.remove = function (ecModel, api) { + this._brushController && this._brushController.unmount(); + }; + + DataZoomFeature.prototype.dispose = function (ecModel, api) { + this._brushController && this._brushController.dispose(); + }; + + DataZoomFeature.prototype._onBrush = function (eventParam) { + var areas = eventParam.areas; + + if (!eventParam.isEnd || !areas.length) { + return; + } + + var snapshot = {}; + var ecModel = this.ecModel; + + this._brushController.updateCovers([]); // remove cover + + + var brushTargetManager = new BrushTargetManager(makeAxisFinder(this.model), ecModel, { + include: ['grid'] + }); + brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + if (coordSys.type !== 'cartesian2d') { + return; + } + + var brushType = area.brushType; + + if (brushType === 'rect') { + setBatch('x', coordSys, coordRange[0]); + setBatch('y', coordSys, coordRange[1]); + } else { + setBatch({ + lineX: 'x', + lineY: 'y' + }[brushType], coordSys, coordRange); + } + }); + push(ecModel, snapshot); + + this._dispatchZoomAction(snapshot); + + function setBatch(dimName, coordSys, minMax) { + var axis = coordSys.getAxis(dimName); + var axisModel = axis.model; + var dataZoomModel = findDataZoom(dimName, axisModel, ecModel); // Restrict range. + + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan(); + + if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) { + minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan); + } + + dataZoomModel && (snapshot[dataZoomModel.id] = { + dataZoomId: dataZoomModel.id, + startValue: minMax[0], + endValue: minMax[1] + }); + } + + function findDataZoom(dimName, axisModel, ecModel) { + var found; + ecModel.eachComponent({ + mainType: 'dataZoom', + subType: 'select' + }, function (dzModel) { + var has = dzModel.getAxisModel(dimName, axisModel.componentIndex); + has && (found = dzModel); + }); + return found; + } + }; + + DataZoomFeature.prototype._dispatchZoomAction = function (snapshot) { + var batch = []; // Convert from hash map to array. + + each$a(snapshot, function (batchItem, dataZoomId) { + batch.push(clone(batchItem)); + }); + batch.length && this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + batch: batch + }); + }; + + DataZoomFeature.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + filterMode: 'filter', + // Icon group + icon: { + zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1', + back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26' + }, + // `zoom`, `back` + title: ecModel.getLocaleModel().get(['toolbox', 'dataZoom', 'title']), + brushStyle: { + borderWidth: 0, + color: 'rgba(210,219,238,0.2)' + } + }; + return defaultOption; + }; + + return DataZoomFeature; + }(ToolboxFeature); + + var handlers$1 = { + zoom: function () { + var nextActive = !this._isZoomActive; + this.api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'dataZoomSelect', + dataZoomSelectActive: nextActive + }); + }, + back: function () { + this._dispatchZoomAction(pop(this.ecModel)); + } + }; + + function makeAxisFinder(dzFeatureModel) { + var setting = { + xAxisIndex: dzFeatureModel.get('xAxisIndex', true), + yAxisIndex: dzFeatureModel.get('yAxisIndex', true), + xAxisId: dzFeatureModel.get('xAxisId', true), + yAxisId: dzFeatureModel.get('yAxisId', true) + }; // If both `xAxisIndex` `xAxisId` not set, it means 'all'. + // If both `yAxisIndex` `yAxisId` not set, it means 'all'. + // Some old cases set like this below to close yAxis control but leave xAxis control: + // `{ feature: { dataZoom: { yAxisIndex: false } }`. + + if (setting.xAxisIndex == null && setting.xAxisId == null) { + setting.xAxisIndex = 'all'; + } + + if (setting.yAxisIndex == null && setting.yAxisId == null) { + setting.yAxisIndex = 'all'; + } + + return setting; + } + + function updateBackBtnStatus(featureModel, ecModel) { + featureModel.setIconStatus('back', count(ecModel) > 1 ? 'emphasis' : 'normal'); + } + + function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) { + var zoomActive = view._isZoomActive; + + if (payload && payload.type === 'takeGlobalCursor') { + zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false; + } + + view._isZoomActive = zoomActive; + featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal'); + var brushTargetManager = new BrushTargetManager(makeAxisFinder(featureModel), ecModel, { + include: ['grid'] + }); + var panels = brushTargetManager.makePanelOpts(api, function (targetInfo) { + return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect'; + }); + + view._brushController.setPanels(panels).enableBrush(zoomActive && panels.length ? { + brushType: 'auto', + brushStyle: featureModel.getModel('brushStyle').getItemStyle() + } : false); + } + + registerInternalOptionCreator('dataZoom', function (ecModel) { + var toolboxModel = ecModel.getComponent('toolbox', 0); + var featureDataZoomPath = ['feature', 'dataZoom']; + + if (!toolboxModel || toolboxModel.get(featureDataZoomPath) == null) { + return; + } + + var dzFeatureModel = toolboxModel.getModel(featureDataZoomPath); + var dzOptions = []; + var finder = makeAxisFinder(dzFeatureModel); + var finderResult = parseFinder(ecModel, finder); + each$a(finderResult.xAxisModels, function (axisModel) { + return buildInternalOptions(axisModel, 'xAxis', 'xAxisIndex'); + }); + each$a(finderResult.yAxisModels, function (axisModel) { + return buildInternalOptions(axisModel, 'yAxis', 'yAxisIndex'); + }); + + function buildInternalOptions(axisModel, axisMainType, axisIndexPropName) { + var axisIndex = axisModel.componentIndex; + var newOpt = { + type: 'select', + $fromToolbox: true, + // Default to be filter + filterMode: dzFeatureModel.get('filterMode', true) || 'filter', + // Id for merge mapping. + id: DATA_ZOOM_ID_BASE + axisMainType + axisIndex + }; + newOpt[axisIndexPropName] = axisIndex; + dzOptions.push(newOpt); + } + + return dzOptions; + }); + + function install$z(registers) { + registers.registerComponentModel(ToolboxModel); + registers.registerComponentView(ToolboxView); + registerFeature('saveAsImage', SaveAsImage); + registerFeature('magicType', MagicType); + registerFeature('dataView', DataView); + registerFeature('dataZoom', DataZoomFeature); + registerFeature('restore', RestoreOption); + use(install$y); + } + + var TooltipModel = + /** @class */ + function (_super) { + __extends(TooltipModel, _super); + + function TooltipModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TooltipModel.type; + return _this; + } + + TooltipModel.type = 'tooltip'; + TooltipModel.dependencies = ['axisPointer']; + TooltipModel.defaultOption = { + // zlevel: 0, + z: 60, + show: true, + // tooltip main content + showContent: true, + // 'trigger' only works on coordinate system. + // 'item' | 'axis' | 'none' + trigger: 'item', + // 'click' | 'mousemove' | 'none' + triggerOn: 'mousemove|click', + alwaysShowContent: false, + displayMode: 'single', + renderMode: 'auto', + // whether restraint content inside viewRect. + // If renderMode: 'richText', default true. + // If renderMode: 'html', defaut false (for backward compat). + confine: null, + showDelay: 0, + hideDelay: 100, + // Animation transition time, unit is second + transitionDuration: 0.4, + enterable: false, + backgroundColor: '#fff', + // box shadow + shadowBlur: 10, + shadowColor: 'rgba(0, 0, 0, .2)', + shadowOffsetX: 1, + shadowOffsetY: 2, + // tooltip border radius, unit is px, default is 4 + borderRadius: 4, + // tooltip border width, unit is px, default is 0 (no border) + borderWidth: 1, + // Tooltip inside padding, default is 5 for all direction + // Array is allowed to set up, right, bottom, left, same with css + // The default value: See `tooltip/tooltipMarkup.ts#getPaddingFromTooltipModel`. + padding: null, + // Extra css text + extraCssText: '', + // axis indicator, trigger by axis + axisPointer: { + // default is line + // legal values: 'line' | 'shadow' | 'cross' + type: 'line', + // Valid when type is line, appoint tooltip line locate on which line. Optional + // legal values: 'x' | 'y' | 'angle' | 'radius' | 'auto' + // default is 'auto', chose the axis which type is category. + // for multiply y axis, cartesian coord chose x axis, polar chose angle axis + axis: 'auto', + animation: 'auto', + animationDurationUpdate: 200, + animationEasingUpdate: 'exponentialOut', + crossStyle: { + color: '#999', + width: 1, + type: 'dashed', + // TODO formatter + textStyle: {} + } // lineStyle and shadowStyle should not be specified here, + // otherwise it will always override those styles on option.axisPointer. + + }, + textStyle: { + color: '#666', + fontSize: 14 + } + }; + return TooltipModel; + }(ComponentModel); + + /* global document */ + + function shouldTooltipConfine(tooltipModel) { + var confineOption = tooltipModel.get('confine'); + return confineOption != null ? !!confineOption // In richText mode, the outside part can not be visible. + : tooltipModel.get('renderMode') === 'richText'; + } + + function testStyle(styleProps) { + if (!env.domSupported) { + return; + } + + var style = document.documentElement.style; + + for (var i = 0, len = styleProps.length; i < len; i++) { + if (styleProps[i] in style) { + return styleProps[i]; + } + } + } + + var TRANSFORM_VENDOR = testStyle(['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + var TRANSITION_VENDOR = testStyle(['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + + function toCSSVendorPrefix(styleVendor, styleProp) { + if (!styleVendor) { + return styleProp; + } + + styleProp = toCamelCase(styleProp, true); + var idx = styleVendor.indexOf(styleProp); + styleVendor = idx === -1 ? styleProp : "-" + styleVendor.slice(0, idx) + "-" + styleProp; + return styleVendor.toLowerCase(); + } + + function getComputedStyle(el, style) { + var stl = el.currentStyle || document.defaultView && document.defaultView.getComputedStyle(el); + return stl ? style ? stl[style] : stl : null; + } + + /* global document, window */ + + var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, 'transition'); + var CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, 'transform'); // eslint-disable-next-line + + var gCssText = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (env.transform3dSupported ? 'will-change:transform;' : ''); + + function mirrorPos(pos) { + pos = pos === 'left' ? 'right' : pos === 'right' ? 'left' : pos === 'top' ? 'bottom' : 'top'; + return pos; + } + + function assembleArrow(tooltipModel, borderColor, arrowPosition) { + if (!isString(arrowPosition) || arrowPosition === 'inside') { + return ''; + } + + var backgroundColor = tooltipModel.get('backgroundColor'); + var borderWidth = tooltipModel.get('borderWidth'); + borderColor = convertToColorString(borderColor); + var arrowPos = mirrorPos(arrowPosition); + var arrowSize = Math.max(Math.round(borderWidth) * 1.5, 6); + var positionStyle = ''; + var transformStyle = CSS_TRANSFORM_VENDOR + ':'; + var rotateDeg; + + if (indexOf(['left', 'right'], arrowPos) > -1) { + positionStyle += 'top:50%'; + transformStyle += "translateY(-50%) rotate(" + (rotateDeg = arrowPos === 'left' ? -225 : -45) + "deg)"; + } else { + positionStyle += 'left:50%'; + transformStyle += "translateX(-50%) rotate(" + (rotateDeg = arrowPos === 'top' ? 225 : 45) + "deg)"; + } + + var rotateRadian = rotateDeg * Math.PI / 180; + var arrowWH = arrowSize + borderWidth; + var rotatedWH = arrowWH * Math.abs(Math.cos(rotateRadian)) + arrowWH * Math.abs(Math.sin(rotateRadian)); + var arrowOffset = Math.round(((rotatedWH - Math.SQRT2 * borderWidth) / 2 + Math.SQRT2 * borderWidth - (rotatedWH - arrowWH) / 2) * 100) / 100; + positionStyle += ";" + arrowPos + ":-" + arrowOffset + "px"; + var borderStyle = borderColor + " solid " + borderWidth + "px;"; + var styleCss = ["position:absolute;width:" + arrowSize + "px;height:" + arrowSize + "px;", positionStyle + ";" + transformStyle + ";", "border-bottom:" + borderStyle, "border-right:" + borderStyle, "background-color:" + backgroundColor + ";"]; + return "
            "; + } + + function assembleTransition(duration, onlyFade) { + var transitionCurve = 'cubic-bezier(0.23,1,0.32,1)'; + var transitionOption = " " + duration / 2 + "s " + transitionCurve; + var transitionText = "opacity" + transitionOption + ",visibility" + transitionOption; + + if (!onlyFade) { + transitionOption = " " + duration + "s " + transitionCurve; + transitionText += env.transformSupported ? "," + CSS_TRANSFORM_VENDOR + transitionOption : ",left" + transitionOption + ",top" + transitionOption; + } + + return CSS_TRANSITION_VENDOR + ':' + transitionText; + } + + function assembleTransform(x, y, toString) { + // If using float on style, the final width of the dom might + // keep changing slightly while mouse move. So `toFixed(0)` them. + var x0 = x.toFixed(0) + 'px'; + var y0 = y.toFixed(0) + 'px'; // not support transform, use `left` and `top` instead. + + if (!env.transformSupported) { + return toString ? "top:" + y0 + ";left:" + x0 + ";" : [['top', y0], ['left', x0]]; + } // support transform + + + var is3d = env.transform3dSupported; + var translate = "translate" + (is3d ? '3d' : '') + "(" + x0 + "," + y0 + (is3d ? ',0' : '') + ")"; + return toString ? 'top:0;left:0;' + CSS_TRANSFORM_VENDOR + ':' + translate + ';' : [['top', 0], ['left', 0], [TRANSFORM_VENDOR, translate]]; + } + + /** + * @param {Object} textStyle + * @return {string} + * @inner + */ + + + function assembleFont(textStyleModel) { + var cssText = []; + var fontSize = textStyleModel.get('fontSize'); + var color = textStyleModel.getTextColor(); + color && cssText.push('color:' + color); + cssText.push('font:' + textStyleModel.getFont()); + fontSize // @ts-ignore, leave it to the tooltip refactor. + && cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px'); + var shadowColor = textStyleModel.get('textShadowColor'); + var shadowBlur = textStyleModel.get('textShadowBlur') || 0; + var shadowOffsetX = textStyleModel.get('textShadowOffsetX') || 0; + var shadowOffsetY = textStyleModel.get('textShadowOffsetY') || 0; + shadowColor && shadowBlur && cssText.push('text-shadow:' + shadowOffsetX + 'px ' + shadowOffsetY + 'px ' + shadowBlur + 'px ' + shadowColor); + each(['decoration', 'align'], function (name) { + var val = textStyleModel.get(name); + val && cssText.push('text-' + name + ':' + val); + }); + return cssText.join(';'); + } + + function assembleCssText(tooltipModel, enableTransition, onlyFade) { + var cssText = []; + var transitionDuration = tooltipModel.get('transitionDuration'); + var backgroundColor = tooltipModel.get('backgroundColor'); + var shadowBlur = tooltipModel.get('shadowBlur'); + var shadowColor = tooltipModel.get('shadowColor'); + var shadowOffsetX = tooltipModel.get('shadowOffsetX'); + var shadowOffsetY = tooltipModel.get('shadowOffsetY'); + var textStyleModel = tooltipModel.getModel('textStyle'); + var padding = getPaddingFromTooltipModel(tooltipModel, 'html'); + var boxShadow = shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor; + cssText.push('box-shadow:' + boxShadow); // Animation transition. Do not animate when transitionDuration is 0. + + enableTransition && transitionDuration && cssText.push(assembleTransition(transitionDuration, onlyFade)); + + if (backgroundColor) { + cssText.push('background-color:' + backgroundColor); + } // Border style + + + each(['width', 'color', 'radius'], function (name) { + var borderName = 'border-' + name; + var camelCase = toCamelCase(borderName); + var val = tooltipModel.get(camelCase); + val != null && cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px')); + }); // Text style + + cssText.push(assembleFont(textStyleModel)); // Padding + + if (padding != null) { + cssText.push('padding:' + normalizeCssArray$1(padding).join('px ') + 'px'); + } + + return cssText.join(';') + ';'; + } // If not able to make, do not modify the input `out`. + + + function makeStyleCoord(out, zr, appendToBody, zrX, zrY) { + var zrPainter = zr && zr.painter; + + if (appendToBody) { + var zrViewportRoot = zrPainter && zrPainter.getViewportRoot(); + + if (zrViewportRoot) { + // Some APPs might use scale on body, so we support CSS transform here. + transformLocalCoord(out, zrViewportRoot, document.body, zrX, zrY); + } + } else { + out[0] = zrX; + out[1] = zrY; // xy should be based on canvas root. But tooltipContent is + // the sibling of canvas root. So padding of ec container + // should be considered here. + + var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset(); + + if (viewportRootOffset) { + out[0] += viewportRootOffset.offsetLeft; + out[1] += viewportRootOffset.offsetTop; + } + } + + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); + } + + var TooltipHTMLContent = + /** @class */ + function () { + function TooltipHTMLContent(container, api, opt) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._enterable = true; + this._firstShow = true; + this._longHide = true; + + if (env.wxa) { + return null; + } + + var el = document.createElement('div'); // TODO: TYPE + + el.domBelongToZr = true; + this.el = el; + var zr = this._zr = api.getZr(); + var appendToBody = this._appendToBody = opt && opt.appendToBody; + makeStyleCoord(this._styleCoord, zr, appendToBody, api.getWidth() / 2, api.getHeight() / 2); + + if (appendToBody) { + document.body.appendChild(el); + } else { + container.appendChild(el); + } + + this._container = container; // FIXME + // Is it needed to trigger zr event manually if + // the browser do not support `pointer-events: none`. + + var self = this; + + el.onmouseenter = function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + + self._inContent = true; + }; + + el.onmousemove = function (e) { + e = e || window.event; + + if (!self._enterable) { + // `pointer-events: none` is set to tooltip content div + // if `enterable` is set as `false`, and `el.onmousemove` + // can not be triggered. But in browser that do not + // support `pointer-events`, we need to do this: + // Try trigger zrender event to avoid mouse + // in and out shape too frequently + var handler = zr.handler; + var zrViewportRoot = zr.painter.getViewportRoot(); + normalizeEvent(zrViewportRoot, e, true); + handler.dispatch('mousemove', e); + } + }; + + el.onmouseleave = function () { + // set `_inContent` to `false` before `hideLater` + self._inContent = false; + + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + }; + } + + /** + * Update when tooltip is rendered + */ + + + TooltipHTMLContent.prototype.update = function (tooltipModel) { + // FIXME + // Move this logic to ec main? + var container = this._container; + var position = getComputedStyle(container, 'position'); + var domStyle = container.style; + + if (domStyle.position !== 'absolute' && position !== 'absolute') { + domStyle.position = 'relative'; + } // move tooltip if chart resized + + + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); // update className + + this.el.className = tooltipModel.get('className') || ''; // Hide the tooltip + // PENDING + // this.hide(); + }; + + TooltipHTMLContent.prototype.show = function (tooltipModel, nearPointColor) { + clearTimeout(this._hideTimeout); + clearTimeout(this._longHideTimeout); + var el = this.el; + var style = el.style; + var styleCoord = this._styleCoord; + + if (!el.innerHTML) { + style.display = 'none'; + } else { + style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide) // initial transform + + assembleTransform(styleCoord[0], styleCoord[1], true) + ("border-color:" + convertToColorString(nearPointColor) + ";") + (tooltipModel.get('extraCssText') || '') // If mouse occasionally move over the tooltip, a mouseout event will be + // triggered by canvas, and cause some unexpectable result like dragging + // stop, "unfocusAdjacency". Here `pointer-events: none` is used to solve + // it. Although it is not supported by IE8~IE10, fortunately it is a rare + // scenario. + + (";pointer-events:" + (this._enterable ? 'auto' : 'none')); + } + + this._show = true; + this._firstShow = false; + this._longHide = false; + }; + + TooltipHTMLContent.prototype.setContent = function (content, markers, tooltipModel, borderColor, arrowPosition) { + var el = this.el; + + if (content == null) { + el.innerHTML = ''; + return; + } + + var arrow = ''; + + if (isString(arrowPosition) && tooltipModel.get('trigger') === 'item' && !shouldTooltipConfine(tooltipModel)) { + arrow = assembleArrow(tooltipModel, borderColor, arrowPosition); + } + + if (isString(content)) { + el.innerHTML = content + arrow; + } else if (content) { + // Clear previous + el.innerHTML = ''; + + if (!isArray(content)) { + content = [content]; + } + + for (var i = 0; i < content.length; i++) { + if (isDom(content[i]) && content[i].parentNode !== el) { + el.appendChild(content[i]); + } + } // no arrow if empty + + + if (arrow && el.childNodes.length) { + // no need to create a new parent element, but it's not supported by IE 10 and older. + // const arrowEl = document.createRange().createContextualFragment(arrow); + var arrowEl = document.createElement('div'); + arrowEl.innerHTML = arrow; + el.appendChild(arrowEl); + } + } + }; + + TooltipHTMLContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + + TooltipHTMLContent.prototype.getSize = function () { + var el = this.el; + return [el.offsetWidth, el.offsetHeight]; + }; + + TooltipHTMLContent.prototype.moveTo = function (zrX, zrY) { + var styleCoord = this._styleCoord; + makeStyleCoord(styleCoord, this._zr, this._appendToBody, zrX, zrY); + + if (styleCoord[0] != null && styleCoord[1] != null) { + var style_1 = this.el.style; + var transforms = assembleTransform(styleCoord[0], styleCoord[1]); + each(transforms, function (transform) { + style_1[transform[0]] = transform[1]; + }); + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + + + TooltipHTMLContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; // The ratio of top to height + + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + + TooltipHTMLContent.prototype.hide = function () { + var _this = this; + + var style = this.el.style; + style.visibility = 'hidden'; + style.opacity = '0'; + env.transform3dSupported && (style.willChange = ''); + this._show = false; + this._longHideTimeout = setTimeout(function () { + return _this._longHide = true; + }, 500); + }; + + TooltipHTMLContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable)) { + if (time) { + this._hideDelay = time; // Set show false to avoid invoke hideLater multiple times + + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } else { + this.hide(); + } + } + }; + + TooltipHTMLContent.prototype.isShow = function () { + return this._show; + }; + + TooltipHTMLContent.prototype.dispose = function () { + this.el.parentNode.removeChild(this.el); + }; + + return TooltipHTMLContent; + }(); + + var TooltipRichContent = + /** @class */ + function () { + function TooltipRichContent(api) { + this._show = false; + this._styleCoord = [0, 0, 0, 0]; + this._enterable = true; + this._zr = api.getZr(); + makeStyleCoord$1(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2); + } + + /** + * Update when tooltip is rendered + */ + + + TooltipRichContent.prototype.update = function (tooltipModel) { + var alwaysShowContent = tooltipModel.get('alwaysShowContent'); + alwaysShowContent && this._moveIfResized(); + }; + + TooltipRichContent.prototype.show = function () { + if (this._hideTimeout) { + clearTimeout(this._hideTimeout); + } + + this.el.show(); + this._show = true; + }; + /** + * Set tooltip content + */ + + + TooltipRichContent.prototype.setContent = function (content, markupStyleCreator, tooltipModel, borderColor, arrowPosition) { + var _this = this; + + if (isObject(content)) { + throwError("development" !== 'production' ? 'Passing DOM nodes as content is not supported in richText tooltip!' : ''); + } + + if (this.el) { + this._zr.remove(this.el); + } + + var textStyleModel = tooltipModel.getModel('textStyle'); + this.el = new ZRText({ + style: { + rich: markupStyleCreator.richTextStyles, + text: content, + lineHeight: 22, + borderWidth: 1, + borderColor: borderColor, + textShadowColor: textStyleModel.get('textShadowColor'), + fill: tooltipModel.get(['textStyle', 'color']), + padding: getPaddingFromTooltipModel(tooltipModel, 'richText'), + verticalAlign: 'top', + align: 'left' + }, + z: tooltipModel.get('z') + }); + each(['backgroundColor', 'borderRadius', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'], function (propName) { + _this.el.style[propName] = tooltipModel.get(propName); + }); + each(['textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY'], function (propName) { + _this.el.style[propName] = textStyleModel.get(propName) || 0; + }); + + this._zr.add(this.el); + + var self = this; + this.el.on('mouseover', function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + + self._inContent = true; + }); + this.el.on('mouseout', function () { + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + + self._inContent = false; + }); + }; + + TooltipRichContent.prototype.setEnterable = function (enterable) { + this._enterable = enterable; + }; + + TooltipRichContent.prototype.getSize = function () { + var el = this.el; + var bounding = this.el.getBoundingRect(); // bounding rect does not include shadow. For renderMode richText, + // if overflow, it will be cut. So calculate them accurately. + + var shadowOuterSize = calcShadowOuterSize(el.style); + return [bounding.width + shadowOuterSize.left + shadowOuterSize.right, bounding.height + shadowOuterSize.top + shadowOuterSize.bottom]; + }; + + TooltipRichContent.prototype.moveTo = function (x, y) { + var el = this.el; + + if (el) { + var styleCoord = this._styleCoord; + makeStyleCoord$1(styleCoord, this._zr, x, y); + x = styleCoord[0]; + y = styleCoord[1]; + var style = el.style; + var borderWidth = mathMaxWith0(style.borderWidth || 0); + var shadowOuterSize = calcShadowOuterSize(style); // rich text x, y do not include border. + + el.x = x + borderWidth + shadowOuterSize.left; + el.y = y + borderWidth + shadowOuterSize.top; + el.markRedraw(); + } + }; + /** + * when `alwaysShowContent` is true, + * move the tooltip after chart resized + */ + + + TooltipRichContent.prototype._moveIfResized = function () { + // The ratio of left to width + var ratioX = this._styleCoord[2]; // The ratio of top to height + + var ratioY = this._styleCoord[3]; + this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight()); + }; + + TooltipRichContent.prototype.hide = function () { + if (this.el) { + this.el.hide(); + } + + this._show = false; + }; + + TooltipRichContent.prototype.hideLater = function (time) { + if (this._show && !(this._inContent && this._enterable)) { + if (time) { + this._hideDelay = time; // Set show false to avoid invoke hideLater multiple times + + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } else { + this.hide(); + } + } + }; + + TooltipRichContent.prototype.isShow = function () { + return this._show; + }; + + TooltipRichContent.prototype.dispose = function () { + this._zr.remove(this.el); + }; + + return TooltipRichContent; + }(); + + function mathMaxWith0(val) { + return Math.max(0, val); + } + + function calcShadowOuterSize(style) { + var shadowBlur = mathMaxWith0(style.shadowBlur || 0); + var shadowOffsetX = mathMaxWith0(style.shadowOffsetX || 0); + var shadowOffsetY = mathMaxWith0(style.shadowOffsetY || 0); + return { + left: mathMaxWith0(shadowBlur - shadowOffsetX), + right: mathMaxWith0(shadowBlur + shadowOffsetX), + top: mathMaxWith0(shadowBlur - shadowOffsetY), + bottom: mathMaxWith0(shadowBlur + shadowOffsetY) + }; + } + + function makeStyleCoord$1(out, zr, zrX, zrY) { + out[0] = zrX; + out[1] = zrY; + out[2] = out[0] / zr.getWidth(); + out[3] = out[1] / zr.getHeight(); + } + + var proxyRect = new Rect({ + shape: { + x: -1, + y: -1, + width: 2, + height: 2 + } + }); + + var TooltipView = + /** @class */ + function (_super) { + __extends(TooltipView, _super); + + function TooltipView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TooltipView.type; + return _this; + } + + TooltipView.prototype.init = function (ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + + var tooltipModel = ecModel.getComponent('tooltip'); + var renderMode = this._renderMode = getTooltipRenderMode(tooltipModel.get('renderMode')); + this._tooltipContent = renderMode === 'richText' ? new TooltipRichContent(api) : new TooltipHTMLContent(api.getDom(), api, { + appendToBody: tooltipModel.get('appendToBody', true) + }); + }; + + TooltipView.prototype.render = function (tooltipModel, ecModel, api) { + if (env.node || !api.getDom()) { + return; + } // Reset + + + this.group.removeAll(); + this._tooltipModel = tooltipModel; + this._ecModel = ecModel; + this._api = api; + /** + * @private + * @type {boolean} + */ + + this._alwaysShowContent = tooltipModel.get('alwaysShowContent'); + var tooltipContent = this._tooltipContent; + tooltipContent.update(tooltipModel); + tooltipContent.setEnterable(tooltipModel.get('enterable')); + + this._initGlobalListener(); + + this._keepShow(); // PENDING + // `mousemove` event will be triggered very frequently when the mouse moves fast, + // which causes that the `updatePosition` function was also called frequently. + // In Chrome with devtools open and Firefox, tooltip looks laggy and shakes. See #14695 #16101 + // To avoid frequent triggering, + // consider throttling it in 50ms when transition is enabled + + + if (this._renderMode !== 'richText' && tooltipModel.get('transitionDuration')) { + createOrUpdate(this, '_updatePosition', 50, 'fixRate'); + } else { + clear(this, '_updatePosition'); + } + }; + + TooltipView.prototype._initGlobalListener = function () { + var tooltipModel = this._tooltipModel; + var triggerOn = tooltipModel.get('triggerOn'); + register('itemTooltip', this._api, bind(function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none') { + if (triggerOn.indexOf(currTrigger) >= 0) { + this._tryShow(e, dispatchAction); + } else if (currTrigger === 'leave') { + this._hide(dispatchAction); + } + } + }, this)); + }; + + TooltipView.prototype._keepShow = function () { + var tooltipModel = this._tooltipModel; + var ecModel = this._ecModel; + var api = this._api; // Try to keep the tooltip show when refreshing + + if (this._lastX != null && this._lastY != null // When user is willing to control tooltip totally using API, + // self.manuallyShowTip({x, y}) might cause tooltip hide, + // which is not expected. + && tooltipModel.get('triggerOn') !== 'none') { + var self_1 = this; + clearTimeout(this._refreshUpdateTimeout); + this._refreshUpdateTimeout = setTimeout(function () { + // Show tip next tick after other charts are rendered + // In case highlight action has wrong result + // FIXME + !api.isDisposed() && self_1.manuallyShowTip(tooltipModel, ecModel, api, { + x: self_1._lastX, + y: self_1._lastY, + dataByCoordSys: self_1._lastDataByCoordSys + }); + }); + } + }; + /** + * Show tip manually by + * dispatchAction({ + * type: 'showTip', + * x: 10, + * y: 10 + * }); + * Or + * dispatchAction({ + * type: 'showTip', + * seriesIndex: 0, + * dataIndex or dataIndexInside or name + * }); + * + * TODO Batch + */ + + + TooltipView.prototype.manuallyShowTip = function (tooltipModel, ecModel, api, payload) { + if (payload.from === this.uid || env.node || !api.getDom()) { + return; + } + + var dispatchAction = makeDispatchAction$1(payload, api); // Reset ticket + + this._ticket = ''; // When triggered from axisPointer. + + var dataByCoordSys = payload.dataByCoordSys; + var cmptRef = findComponentReference(payload, ecModel, api); + + if (cmptRef) { + var rect = cmptRef.el.getBoundingRect().clone(); + rect.applyTransform(cmptRef.el.transform); + + this._tryShow({ + offsetX: rect.x + rect.width / 2, + offsetY: rect.y + rect.height / 2, + target: cmptRef.el, + position: payload.position, + // When manully trigger, the mouse is not on the el, so we'd better to + // position tooltip on the bottom of the el and display arrow is possible. + positionDefault: 'bottom' + }, dispatchAction); + } else if (payload.tooltip && payload.x != null && payload.y != null) { + var el = proxyRect; + el.x = payload.x; + el.y = payload.y; + el.update(); + getECData(el).tooltipConfig = { + name: null, + option: payload.tooltip + }; // Manually show tooltip while view is not using zrender elements. + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + target: el + }, dispatchAction); + } else if (dataByCoordSys) { + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + dataByCoordSys: dataByCoordSys, + tooltipOption: payload.tooltipOption + }, dispatchAction); + } else if (payload.seriesIndex != null) { + if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) { + return; + } + + var pointInfo = findPointFromSeries(payload, ecModel); + var cx = pointInfo.point[0]; + var cy = pointInfo.point[1]; + + if (cx != null && cy != null) { + this._tryShow({ + offsetX: cx, + offsetY: cy, + target: pointInfo.el, + position: payload.position, + // When manully trigger, the mouse is not on the el, so we'd better to + // position tooltip on the bottom of the el and display arrow is possible. + positionDefault: 'bottom' + }, dispatchAction); + } + } else if (payload.x != null && payload.y != null) { + // FIXME + // should wrap dispatchAction like `axisPointer/globalListener` ? + api.dispatchAction({ + type: 'updateAxisPointer', + x: payload.x, + y: payload.y + }); + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + target: api.getZr().findHover(payload.x, payload.y).target + }, dispatchAction); + } + }; + + TooltipView.prototype.manuallyHideTip = function (tooltipModel, ecModel, api, payload) { + var tooltipContent = this._tooltipContent; + + if (!this._alwaysShowContent && this._tooltipModel) { + tooltipContent.hideLater(this._tooltipModel.get('hideDelay')); + } + + this._lastX = this._lastY = this._lastDataByCoordSys = null; + + if (payload.from !== this.uid) { + this._hide(makeDispatchAction$1(payload, api)); + } + }; // Be compatible with previous design, that is, when tooltip.type is 'axis' and + // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer + // and tooltip. + + + TooltipView.prototype._manuallyAxisShowTip = function (tooltipModel, ecModel, api, payload) { + var seriesIndex = payload.seriesIndex; + var dataIndex = payload.dataIndex; // @ts-ignore + + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; + + if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) { + return; + } + + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + if (!seriesModel) { + return; + } + + var data = seriesModel.getData(); + var tooltipCascadedModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model], this._tooltipModel); + + if (tooltipCascadedModel.get('trigger') !== 'axis') { + return; + } + + api.dispatchAction({ + type: 'updateAxisPointer', + seriesIndex: seriesIndex, + dataIndex: dataIndex, + position: payload.position + }); + return true; + }; + + TooltipView.prototype._tryShow = function (e, dispatchAction) { + var el = e.target; + var tooltipModel = this._tooltipModel; + + if (!tooltipModel) { + return; + } // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed + + + this._lastX = e.offsetX; + this._lastY = e.offsetY; + var dataByCoordSys = e.dataByCoordSys; + + if (dataByCoordSys && dataByCoordSys.length) { + this._showAxisTooltip(dataByCoordSys, e); + } else if (el) { + this._lastDataByCoordSys = null; + var seriesDispatcher_1; + var cmptDispatcher_1; + findEventDispatcher(el, function (target) { + // Always show item tooltip if mouse is on the element with dataIndex + if (getECData(target).dataIndex != null) { + seriesDispatcher_1 = target; + return true; + } // Tooltip provided directly. Like legend. + + + if (getECData(target).tooltipConfig != null) { + cmptDispatcher_1 = target; + return true; + } + }, true); + + if (seriesDispatcher_1) { + this._showSeriesItemTooltip(e, seriesDispatcher_1, dispatchAction); + } else if (cmptDispatcher_1) { + this._showComponentItemTooltip(e, cmptDispatcher_1, dispatchAction); + } else { + this._hide(dispatchAction); + } + } else { + this._lastDataByCoordSys = null; + + this._hide(dispatchAction); + } + }; + + TooltipView.prototype._showOrMove = function (tooltipModel, cb) { + // showDelay is used in this case: tooltip.enterable is set + // as true. User intent to move mouse into tooltip and click + // something. `showDelay` makes it easier to enter the content + // but tooltip do not move immediately. + var delay = tooltipModel.get('showDelay'); + cb = bind(cb, this); + clearTimeout(this._showTimout); + delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb(); + }; + + TooltipView.prototype._showAxisTooltip = function (dataByCoordSys, e) { + var ecModel = this._ecModel; + var globalTooltipModel = this._tooltipModel; + var point = [e.offsetX, e.offsetY]; + var singleTooltipModel = buildTooltipModel([e.tooltipOption], globalTooltipModel); + var renderMode = this._renderMode; + var cbParamsList = []; + var articleMarkup = createTooltipMarkup('section', { + blocks: [], + noHeader: true + }); // Only for legacy: `Serise['formatTooltip']` returns a string. + + var markupTextArrLegacy = []; + var markupStyleCreator = new TooltipMarkupStyleCreator(); + each(dataByCoordSys, function (itemCoordSys) { + each(itemCoordSys.dataByAxis, function (axisItem) { + var axisModel = ecModel.getComponent(axisItem.axisDim + 'Axis', axisItem.axisIndex); + var axisValue = axisItem.value; + + if (!axisModel || axisValue == null) { + return; + } + + var axisValueLabel = getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt); + var axisSectionMarkup = createTooltipMarkup('section', { + header: axisValueLabel, + noHeader: !trim(axisValueLabel), + sortBlocks: true, + blocks: [] + }); + articleMarkup.blocks.push(axisSectionMarkup); + each(axisItem.seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var cbParams = series.getDataParams(dataIndex); // Can't find data. + + if (cbParams.dataIndex < 0) { + return; + } + + cbParams.axisDim = axisItem.axisDim; + cbParams.axisIndex = axisItem.axisIndex; + cbParams.axisType = axisItem.axisType; + cbParams.axisId = axisItem.axisId; + cbParams.axisValue = getAxisRawValue(axisModel.axis, { + value: axisValue + }); + cbParams.axisValueLabel = axisValueLabel; // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + + cbParams.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(cbParams.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(series.formatTooltip(dataIndex, true, null)); + var frag = seriesTooltipResult.frag; + + if (frag) { + var valueFormatter = buildTooltipModel([series], globalTooltipModel).get('valueFormatter'); + axisSectionMarkup.blocks.push(valueFormatter ? extend({ + valueFormatter: valueFormatter + }, frag) : frag); + } + + if (seriesTooltipResult.text) { + markupTextArrLegacy.push(seriesTooltipResult.text); + } + + cbParamsList.push(cbParams); + }); + }); + }); // In most cases, the second axis is displays upper on the first one. + // So we reverse it to look better. + + articleMarkup.blocks.reverse(); + markupTextArrLegacy.reverse(); + var positionExpr = e.position; + var orderMode = singleTooltipModel.get('order'); + var builtMarkupText = buildTooltipMarkup(articleMarkup, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), singleTooltipModel.get('textStyle')); + builtMarkupText && markupTextArrLegacy.unshift(builtMarkupText); + var blockBreak = renderMode === 'richText' ? '\n\n' : '
            '; + var allMarkupText = markupTextArrLegacy.join(blockBreak); + + this._showOrMove(singleTooltipModel, function () { + if (this._updateContentNotChangedOnAxis(dataByCoordSys, cbParamsList)) { + this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, cbParamsList); + } else { + this._showTooltipContent(singleTooltipModel, allMarkupText, cbParamsList, Math.random() + '', point[0], point[1], positionExpr, null, markupStyleCreator); + } + }); // Do not trigger events here, because this branch only be entered + // from dispatchAction. + + }; + + TooltipView.prototype._showSeriesItemTooltip = function (e, dispatcher, dispatchAction) { + var ecModel = this._ecModel; + var ecData = getECData(dispatcher); // Use dataModel in element if possible + // Used when mouseover on a element like markPoint or edge + // In which case, the data is not main data in series. + + var seriesIndex = ecData.seriesIndex; + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); // For example, graph link. + + var dataModel = ecData.dataModel || seriesModel; + var dataIndex = ecData.dataIndex; + var dataType = ecData.dataType; + var data = dataModel.getData(dataType); + var renderMode = this._renderMode; + var positionDefault = e.positionDefault; + var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model], this._tooltipModel, positionDefault ? { + position: positionDefault + } : null); + var tooltipTrigger = tooltipModel.get('trigger'); + + if (tooltipTrigger != null && tooltipTrigger !== 'item') { + return; + } + + var params = dataModel.getDataParams(dataIndex, dataType); + var markupStyleCreator = new TooltipMarkupStyleCreator(); // Pre-create marker style for makers. Users can assemble richText + // text in `formatter` callback and use those markers style. + + params.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(params.color), renderMode); + var seriesTooltipResult = normalizeTooltipFormatResult(dataModel.formatTooltip(dataIndex, false, dataType)); + var orderMode = tooltipModel.get('order'); + var valueFormatter = tooltipModel.get('valueFormatter'); + var frag = seriesTooltipResult.frag; + var markupText = frag ? buildTooltipMarkup(valueFormatter ? extend({ + valueFormatter: valueFormatter + }, frag) : frag, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), tooltipModel.get('textStyle')) : seriesTooltipResult.text; + var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex; + + this._showOrMove(tooltipModel, function () { + this._showTooltipContent(tooltipModel, markupText, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markupStyleCreator); + }); // FIXME + // duplicated showtip if manuallyShowTip is called from dispatchAction. + + + dispatchAction({ + type: 'showTip', + dataIndexInside: dataIndex, + dataIndex: data.getRawIndex(dataIndex), + seriesIndex: seriesIndex, + from: this.uid + }); + }; + + TooltipView.prototype._showComponentItemTooltip = function (e, el, dispatchAction) { + var ecData = getECData(el); + var tooltipConfig = ecData.tooltipConfig; + var tooltipOpt = tooltipConfig.option || {}; + + if (isString(tooltipOpt)) { + var content = tooltipOpt; + tooltipOpt = { + content: content, + // Fixed formatter + formatter: content + }; + } + + var tooltipModelCascade = [tooltipOpt]; + + var cmpt = this._ecModel.getComponent(ecData.componentMainType, ecData.componentIndex); + + if (cmpt) { + tooltipModelCascade.push(cmpt); + } // In most cases, component tooltip formatter has different params with series tooltip formatter, + // so that they can not share the same formatter. Since the global tooltip formatter is used for series + // by convension, we do not use it as the default formatter for component. + + + tooltipModelCascade.push({ + formatter: tooltipOpt.content + }); + var positionDefault = e.positionDefault; + var subTooltipModel = buildTooltipModel(tooltipModelCascade, this._tooltipModel, positionDefault ? { + position: positionDefault + } : null); + var defaultHtml = subTooltipModel.get('content'); + var asyncTicket = Math.random() + ''; // PENDING: this case do not support richText style yet. + + var markupStyleCreator = new TooltipMarkupStyleCreator(); // Do not check whether `trigger` is 'none' here, because `trigger` + // only works on coordinate system. In fact, we have not found case + // that requires setting `trigger` nothing on component yet. + + this._showOrMove(subTooltipModel, function () { + // Use formatterParams from element defined in component + // Avoid users modify it. + var formatterParams = clone(subTooltipModel.get('formatterParams') || {}); + + this._showTooltipContent(subTooltipModel, defaultHtml, formatterParams, asyncTicket, e.offsetX, e.offsetY, e.position, el, markupStyleCreator); + }); // If not dispatch showTip, tip may be hide triggered by axis. + + + dispatchAction({ + type: 'showTip', + from: this.uid + }); + }; + + TooltipView.prototype._showTooltipContent = function ( // Use Model insteadof TooltipModel because this model may be from series or other options. + // Instead of top level tooltip. + tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markupStyleCreator) { + // Reset ticket + this._ticket = ''; + + if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) { + return; + } + + var tooltipContent = this._tooltipContent; + tooltipContent.setEnterable(tooltipModel.get('enterable')); + var formatter = tooltipModel.get('formatter'); + positionExpr = positionExpr || tooltipModel.get('position'); + var html = defaultHtml; + + var nearPoint = this._getNearestPoint([x, y], params, tooltipModel.get('trigger'), tooltipModel.get('borderColor')); + + var nearPointColor = nearPoint.color; + + if (formatter) { + if (isString(formatter)) { + var useUTC = tooltipModel.ecModel.get('useUTC'); + var params0 = isArray(params) ? params[0] : params; + var isTimeAxis = params0 && params0.axisType && params0.axisType.indexOf('time') >= 0; + html = formatter; + + if (isTimeAxis) { + html = format(params0.axisValue, html, useUTC); + } + + html = formatTpl(html, params, true); + } else if (isFunction(formatter)) { + var callback = bind(function (cbTicket, html) { + if (cbTicket === this._ticket) { + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); + + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + } + }, this); + this._ticket = asyncTicket; + html = formatter(params, asyncTicket, callback); + } else { + html = formatter; + } + } + + tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr); + tooltipContent.show(tooltipModel, nearPointColor); + + this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el); + }; + + TooltipView.prototype._getNearestPoint = function (point, tooltipDataParams, trigger, borderColor) { + if (trigger === 'axis' || isArray(tooltipDataParams)) { + return { + color: borderColor || (this._renderMode === 'html' ? '#fff' : 'none') + }; + } + + if (!isArray(tooltipDataParams)) { + return { + color: borderColor || tooltipDataParams.color || tooltipDataParams.borderColor + }; + } + }; + + TooltipView.prototype._updatePosition = function (tooltipModel, positionExpr, x, // Mouse x + y, // Mouse y + content, params, el) { + var viewWidth = this._api.getWidth(); + + var viewHeight = this._api.getHeight(); + + positionExpr = positionExpr || tooltipModel.get('position'); + var contentSize = content.getSize(); + var align = tooltipModel.get('align'); + var vAlign = tooltipModel.get('verticalAlign'); + var rect = el && el.getBoundingRect().clone(); + el && rect.applyTransform(el.transform); + + if (isFunction(positionExpr)) { + // Callback of position can be an array or a string specify the position + positionExpr = positionExpr([x, y], params, content.el, rect, { + viewSize: [viewWidth, viewHeight], + contentSize: contentSize.slice() + }); + } + + if (isArray(positionExpr)) { + x = parsePercent$1(positionExpr[0], viewWidth); + y = parsePercent$1(positionExpr[1], viewHeight); + } else if (isObject(positionExpr)) { + var boxLayoutPosition = positionExpr; + boxLayoutPosition.width = contentSize[0]; + boxLayoutPosition.height = contentSize[1]; + var layoutRect = getLayoutRect(boxLayoutPosition, { + width: viewWidth, + height: viewHeight + }); + x = layoutRect.x; + y = layoutRect.y; + align = null; // When positionExpr is left/top/right/bottom, + // align and verticalAlign will not work. + + vAlign = null; + } // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element + else if (isString(positionExpr) && el) { + var pos = calcTooltipPosition(positionExpr, rect, contentSize, tooltipModel.get('borderWidth')); + x = pos[0]; + y = pos[1]; + } else { + var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20); + x = pos[0]; + y = pos[1]; + } + + align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0); + vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0); + + if (shouldTooltipConfine(tooltipModel)) { + var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight); + x = pos[0]; + y = pos[1]; + } + + content.moveTo(x, y); + }; // FIXME + // Should we remove this but leave this to user? + + + TooltipView.prototype._updateContentNotChangedOnAxis = function (dataByCoordSys, cbParamsList) { + var lastCoordSys = this._lastDataByCoordSys; + var lastCbParamsList = this._cbParamsList; + var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length; + contentNotChanged && each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) { + var lastDataByAxis = lastItemCoordSys.dataByAxis || []; + var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {}; + var thisDataByAxis = thisItemCoordSys.dataByAxis || []; + contentNotChanged = contentNotChanged && lastDataByAxis.length === thisDataByAxis.length; + contentNotChanged && each(lastDataByAxis, function (lastItem, indexAxis) { + var thisItem = thisDataByAxis[indexAxis] || {}; + var lastIndices = lastItem.seriesDataIndices || []; + var newIndices = thisItem.seriesDataIndices || []; + contentNotChanged = contentNotChanged && lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length; + contentNotChanged && each(lastIndices, function (lastIdxItem, j) { + var newIdxItem = newIndices[j]; + contentNotChanged = contentNotChanged && lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex; + }); // check is cbParams data value changed + + lastCbParamsList && each(lastItem.seriesDataIndices, function (idxItem) { + var seriesIdx = idxItem.seriesIndex; + var cbParams = cbParamsList[seriesIdx]; + var lastCbParams = lastCbParamsList[seriesIdx]; + + if (cbParams && lastCbParams && lastCbParams.data !== cbParams.data) { + contentNotChanged = false; + } + }); + }); + }); + this._lastDataByCoordSys = dataByCoordSys; + this._cbParamsList = cbParamsList; + return !!contentNotChanged; + }; + + TooltipView.prototype._hide = function (dispatchAction) { + // Do not directly hideLater here, because this behavior may be prevented + // in dispatchAction when showTip is dispatched. + // FIXME + // duplicated hideTip if manuallyHideTip is called from dispatchAction. + this._lastDataByCoordSys = null; + dispatchAction({ + type: 'hideTip', + from: this.uid + }); + }; + + TooltipView.prototype.dispose = function (ecModel, api) { + if (env.node || !api.getDom()) { + return; + } + + clear(this, '_updatePosition'); + + this._tooltipContent.dispose(); + + unregister('itemTooltip', api); + }; + + TooltipView.type = 'tooltip'; + return TooltipView; + }(ComponentView); + + /** + * From top to bottom. (the last one should be globalTooltipModel); + */ + + + function buildTooltipModel(modelCascade, globalTooltipModel, defaultTooltipOption) { + // Last is always tooltip model. + var ecModel = globalTooltipModel.ecModel; + var resultModel; + + if (defaultTooltipOption) { + resultModel = new Model(defaultTooltipOption, ecModel, ecModel); + resultModel = new Model(globalTooltipModel.option, resultModel, ecModel); + } else { + resultModel = globalTooltipModel; + } + + for (var i = modelCascade.length - 1; i >= 0; i--) { + var tooltipOpt = modelCascade[i]; + + if (tooltipOpt) { + if (tooltipOpt instanceof Model) { + tooltipOpt = tooltipOpt.get('tooltip', true); + } // In each data item tooltip can be simply write: + // { + // value: 10, + // tooltip: 'Something you need to know' + // } + + + if (isString(tooltipOpt)) { + tooltipOpt = { + formatter: tooltipOpt + }; + } + + if (tooltipOpt) { + resultModel = new Model(tooltipOpt, resultModel, ecModel); + } + } + } + + return resultModel; + } + + function makeDispatchAction$1(payload, api) { + return payload.dispatchAction || bind(api.dispatchAction, api); + } + + function refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) { + var size = content.getSize(); + var width = size[0]; + var height = size[1]; + + if (gapH != null) { + // Add extra 2 pixels for this case: + // At present the "values" in defaut tooltip are using CSS `float: right`. + // When the right edge of the tooltip box is on the right side of the + // viewport, the `float` layout might push the "values" to the second line. + if (x + width + gapH + 2 > viewWidth) { + x -= width + gapH; + } else { + x += gapH; + } + } + + if (gapV != null) { + if (y + height + gapV > viewHeight) { + y -= height + gapV; + } else { + y += gapV; + } + } + + return [x, y]; + } + + function confineTooltipPosition(x, y, content, viewWidth, viewHeight) { + var size = content.getSize(); + var width = size[0]; + var height = size[1]; + x = Math.min(x + width, viewWidth) - width; + y = Math.min(y + height, viewHeight) - height; + x = Math.max(x, 0); + y = Math.max(y, 0); + return [x, y]; + } + + function calcTooltipPosition(position, rect, contentSize, borderWidth) { + var domWidth = contentSize[0]; + var domHeight = contentSize[1]; + var offset = Math.ceil(Math.SQRT2 * borderWidth) + 8; + var x = 0; + var y = 0; + var rectWidth = rect.width; + var rectHeight = rect.height; + + switch (position) { + case 'inside': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + + case 'top': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y - domHeight - offset; + break; + + case 'bottom': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight + offset; + break; + + case 'left': + x = rect.x - domWidth - offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + + case 'right': + x = rect.x + rectWidth + offset; + y = rect.y + rectHeight / 2 - domHeight / 2; + } + + return [x, y]; + } + + function isCenterAlign(align) { + return align === 'center' || align === 'middle'; + } + + /** + * Find target component by payload like: + * ```js + * { legendId: 'some_id', name: 'xxx' } + * { toolboxIndex: 1, name: 'xxx' } + * { geoName: 'some_name', name: 'xxx' } + * ``` + * PENDING: at present only + * + * If not found, return null/undefined. + */ + + + function findComponentReference(payload, ecModel, api) { + var queryOptionMap = preParseFinder(payload).queryOptionMap; + var componentMainType = queryOptionMap.keys()[0]; + + if (!componentMainType || componentMainType === 'series') { + return; + } + + var queryResult = queryReferringComponents(ecModel, componentMainType, queryOptionMap.get(componentMainType), { + useDefault: false, + enableAll: false, + enableNone: false + }); + var model = queryResult.models[0]; + + if (!model) { + return; + } + + var view = api.getViewOfComponentModel(model); + var el; + view.group.traverse(function (subEl) { + var tooltipConfig = getECData(subEl).tooltipConfig; + + if (tooltipConfig && tooltipConfig.name === payload.name) { + el = subEl; + return true; // stop + } + }); + + if (el) { + return { + componentMainType: componentMainType, + componentIndex: model.componentIndex, + el: el + }; + } + } + + function install$A(registers) { + use(install$s); + registers.registerComponentModel(TooltipModel); + registers.registerComponentView(TooltipView); + /** + * @action + * @property {string} type + * @property {number} seriesIndex + * @property {number} dataIndex + * @property {number} [x] + * @property {number} [y] + */ + + registers.registerAction({ + type: 'showTip', + event: 'showTip', + update: 'tooltip:manuallyShowTip' + }, noop); + registers.registerAction({ + type: 'hideTip', + event: 'hideTip', + update: 'tooltip:manuallyHideTip' + }, noop); + } + + var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear']; + + function brushPreprocessor(option, isNew) { + var brushComponents = normalizeToArray(option ? option.brush : []); + + if (!brushComponents.length) { + return; + } + + var brushComponentSpecifiedBtns = []; + each(brushComponents, function (brushOpt) { + var tbs = brushOpt.hasOwnProperty('toolbox') ? brushOpt.toolbox : []; + + if (tbs instanceof Array) { + brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs); + } + }); + var toolbox = option && option.toolbox; + + if (isArray(toolbox)) { + toolbox = toolbox[0]; + } + + if (!toolbox) { + toolbox = { + feature: {} + }; + option.toolbox = [toolbox]; + } + + var toolboxFeature = toolbox.feature || (toolbox.feature = {}); + var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {}); + var brushTypes = toolboxBrush.type || (toolboxBrush.type = []); + brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns); + removeDuplicate(brushTypes); + + if (isNew && !brushTypes.length) { + brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS); + } + } + + function removeDuplicate(arr) { + var map = {}; + each(arr, function (val) { + map[val] = 1; + }); + arr.length = 0; + each(map, function (flag, val) { + arr.push(val); + }); + } + + var each$b = each; + + function hasKeys(obj) { + if (obj) { + for (var name_1 in obj) { + if (obj.hasOwnProperty(name_1)) { + return true; + } + } + } + } + + function createVisualMappings(option, stateList, supplementVisualOption) { + var visualMappings = {}; + each$b(stateList, function (state) { + var mappings = visualMappings[state] = createMappings(); + each$b(option[state], function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var mappingOption = { + type: visualType, + visual: visualData + }; + supplementVisualOption && supplementVisualOption(mappingOption, state); + mappings[visualType] = new VisualMapping(mappingOption); // Prepare a alpha for opacity, for some case that opacity + // is not supported, such as rendering using gradient color. + + if (visualType === 'opacity') { + mappingOption = clone(mappingOption); + mappingOption.type = 'colorAlpha'; + mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption); + } + }); + }); + return visualMappings; + + function createMappings() { + var Creater = function () { + }; // Make sure hidden fields will not be visited by + // object iteration (with hasOwnProperty checking). + + + Creater.prototype.__hidden = Creater.prototype; + var obj = new Creater(); + return obj; + } + } + + function replaceVisualOption(thisOption, newOption, keys) { + // Visual attributes merge is not supported, otherwise it + // brings overcomplicated merge logic. See #2853. So if + // newOption has anyone of these keys, all of these keys + // will be reset. Otherwise, all keys remain. + var has; + each(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + has = true; + } + }); + has && each(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + thisOption[key] = clone(newOption[key]); + } else { + delete thisOption[key]; + } + }); + } + + /** + * @param stateList + * @param visualMappings + * @param list + * @param getValueState param: valueOrIndex, return: state. + * @param scope Scope for getValueState + * @param dimension Concrete dimension, if used. + */ + // ???! handle brush? + + function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) { + var visualTypesMap = {}; + each(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + var dataIndex; + + function getVisual(key) { + return getItemVisualFromData(data, dataIndex, key); + } + + function setVisual(key, value) { + setItemVisualFromData(data, dataIndex, key, value); + } + + if (dimension == null) { + data.each(eachItem); + } else { + data.each([dimension], eachItem); + } + + function eachItem(valueOrIndex, index) { + dataIndex = dimension == null ? valueOrIndex // First argument is index + : index; + var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance + // @ts-ignore + + if (rawDataItem && rawDataItem.visualMap === false) { + return; + } + + var valueState = getValueState.call(scope, valueOrIndex); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual); + } + } + } + + /** + * @param data + * @param stateList + * @param visualMappings > + * @param getValueState param: valueOrIndex, return: state. + * @param dim dimension or dimension index. + */ + + function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) { + var visualTypesMap = {}; + each(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + return { + progress: function progress(params, data) { + var dimIndex; + + if (dim != null) { + dimIndex = data.getDimensionIndex(dim); + } + + function getVisual(key) { + return getItemVisualFromData(data, dataIndex, key); + } + + function setVisual(key, value) { + setItemVisualFromData(data, dataIndex, key, value); + } + + var dataIndex; + var store = data.getStore(); + + while ((dataIndex = params.next()) != null) { + var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance + // @ts-ignore + + if (rawDataItem && rawDataItem.visualMap === false) { + continue; + } + + var value = dim != null ? store.get(dimIndex, dataIndex) : dataIndex; + var valueState = getValueState(value); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual); + } + } + } + }; + } + + function makeBrushCommonSelectorForSeries(area) { + var brushType = area.brushType; // Do not use function binding or curry for performance. + + var selectors = { + point: function (itemLayout) { + return selector[brushType].point(itemLayout, selectors, area); + }, + rect: function (itemLayout) { + return selector[brushType].rect(itemLayout, selectors, area); + } + }; + return selectors; + } + + var selector = { + lineX: getLineSelectors(0), + lineY: getLineSelectors(1), + rect: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.intersect(itemLayout); + } + }, + polygon: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]) && contain$2(area.range, itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + var points = area.range; + + if (!itemLayout || points.length <= 1) { + return false; + } + + var x = itemLayout.x; + var y = itemLayout.y; + var width = itemLayout.width; + var height = itemLayout.height; + var p = points[0]; + + if (contain$2(points, x, y) || contain$2(points, x + width, y) || contain$2(points, x, y + height) || contain$2(points, x + width, y + height) || BoundingRect.create(itemLayout).contain(p[0], p[1]) || linePolygonIntersect(x, y, x + width, y, points) || linePolygonIntersect(x, y, x, y + height, points) || linePolygonIntersect(x + width, y, x + width, y + height, points) || linePolygonIntersect(x, y + height, x + width, y + height, points)) { + return true; + } + } + } + }; + + function getLineSelectors(xyIndex) { + var xy = ['x', 'y']; + var wh = ['width', 'height']; + return { + point: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var p = itemLayout[xyIndex]; + return inLineRange(p, range); + } + }, + rect: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var layoutRange = [itemLayout[xy[xyIndex]], itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]]; + layoutRange[1] < layoutRange[0] && layoutRange.reverse(); + return inLineRange(layoutRange[0], range) || inLineRange(layoutRange[1], range) || inLineRange(range[0], layoutRange) || inLineRange(range[1], layoutRange); + } + } + }; + } + + function inLineRange(p, range) { + return range[0] <= p && p <= range[1]; + } + + var STATE_LIST = ['inBrush', 'outOfBrush']; + var DISPATCH_METHOD = '__ecBrushSelect'; + var DISPATCH_FLAG = '__ecInBrushSelectEvent'; + + function layoutCovers(ecModel) { + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel); + brushTargetManager.setInputRanges(brushModel.areas, ecModel); + }); + } + + /** + * Register the visual encoding if this modules required. + */ + + function brushVisual(ecModel, api, payload) { + var brushSelected = []; + var throttleType; + var throttleDelay; + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(payload.key === 'brush' ? payload.brushOption : { + brushType: false + }); + }); + layoutCovers(ecModel); + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel, brushIndex) { + var thisBrushSelected = { + brushId: brushModel.id, + brushIndex: brushIndex, + brushName: brushModel.name, + areas: clone(brushModel.areas), + selected: [] + }; // Every brush component exists in event params, convenient + // for user to find by index. + + brushSelected.push(thisBrushSelected); + var brushOption = brushModel.option; + var brushLink = brushOption.brushLink; + var linkedSeriesMap = []; + var selectedDataIndexForLink = []; + var rangeInfoBySeries = []; + var hasBrushExists = false; + + if (!brushIndex) { + // Only the first throttle setting works. + throttleType = brushOption.throttleType; + throttleDelay = brushOption.throttleDelay; + } // Add boundingRect and selectors to range. + + + var areas = map(brushModel.areas, function (area) { + var builder = boundingRectBuilders[area.brushType]; + var selectableArea = defaults({ + boundingRect: builder ? builder(area) : void 0 + }, area); + selectableArea.selectors = makeBrushCommonSelectorForSeries(selectableArea); + return selectableArea; + }); + var visualMappings = createVisualMappings(brushModel.option, STATE_LIST, function (mappingOption) { + mappingOption.mappingMethod = 'fixed'; + }); + isArray(brushLink) && each(brushLink, function (seriesIndex) { + linkedSeriesMap[seriesIndex] = 1; + }); + + function linkOthers(seriesIndex) { + return brushLink === 'all' || !!linkedSeriesMap[seriesIndex]; + } // If no supported brush or no brush on the series, + // all visuals should be in original state. + + + function brushed(rangeInfoList) { + return !!rangeInfoList.length; + } + + /** + * Logic for each series: (If the logic has to be modified one day, do it carefully!) + * + * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers ) => StepA: ┬record, ┬ StepB: ┬visualByRecord. + * !brushed┘ ├hasBrushExist ┤ └nothing,┘ ├visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( !brushed && ┬hasBrushExist ┬ && linkOthers ) => StepA: nothing, StepB: ┬visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( brushed ┬ && !linkOthers ) => StepA: nothing, StepB: ┬visualByCheck. + * !brushed┘ └nothing. + * ( !brushed && !linkOthers ) => StepA: nothing, StepB: nothing. + */ + // Step A + + + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var rangeInfoList = rangeInfoBySeries[seriesIndex] = []; + seriesModel.subType === 'parallel' ? stepAParallel(seriesModel, seriesIndex) : stepAOthers(seriesModel, seriesIndex, rangeInfoList); + }); + + function stepAParallel(seriesModel, seriesIndex) { + var coordSys = seriesModel.coordinateSystem; + hasBrushExists = hasBrushExists || coordSys.hasAxisBrushed(); + linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function (activeState, dataIndex) { + activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1); + }); + } + + function stepAOthers(seriesModel, seriesIndex, rangeInfoList) { + if (!seriesModel.brushSelector || brushModelNotControll(brushModel, seriesIndex)) { + return; + } + + each(areas, function (area) { + if (brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)) { + rangeInfoList.push(area); + } + + hasBrushExists = hasBrushExists || brushed(rangeInfoList); + }); + + if (linkOthers(seriesIndex) && brushed(rangeInfoList)) { + var data_1 = seriesModel.getData(); + data_1.each(function (dataIndex) { + if (checkInRange(seriesModel, rangeInfoList, data_1, dataIndex)) { + selectedDataIndexForLink[dataIndex] = 1; + } + }); + } + } // Step B + + + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var seriesBrushSelected = { + seriesId: seriesModel.id, + seriesIndex: seriesIndex, + seriesName: seriesModel.name, + dataIndex: [] + }; // Every series exists in event params, convenient + // for user to find series by seriesIndex. + + thisBrushSelected.selected.push(seriesBrushSelected); + var rangeInfoList = rangeInfoBySeries[seriesIndex]; + var data = seriesModel.getData(); + var getValueState = linkOthers(seriesIndex) ? function (dataIndex) { + return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush'; + } : function (dataIndex) { + return checkInRange(seriesModel, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush'; + }; // If no supported brush or no brush, all visuals are in original state. + + (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && applyVisual(STATE_LIST, visualMappings, data, getValueState); + }); + }); + dispatchAction(api, throttleType, throttleDelay, brushSelected, payload); + } + + function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) { + // This event will not be triggered when `setOpion`, otherwise dead lock may + // triggered when do `setOption` in event listener, which we do not find + // satisfactory way to solve yet. Some considered resolutions: + // (a) Diff with prevoius selected data ant only trigger event when changed. + // But store previous data and diff precisely (i.e., not only by dataIndex, but + // also detect value changes in selected data) might bring complexity or fragility. + // (b) Use spectial param like `silent` to suppress event triggering. + // But such kind of volatile param may be weird in `setOption`. + if (!payload) { + return; + } + + var zr = api.getZr(); + + if (zr[DISPATCH_FLAG]) { + return; + } + + if (!zr[DISPATCH_METHOD]) { + zr[DISPATCH_METHOD] = doDispatch; + } + + var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType); + fn(api, brushSelected); + } + + function doDispatch(api, brushSelected) { + if (!api.isDisposed()) { + var zr = api.getZr(); + zr[DISPATCH_FLAG] = true; + api.dispatchAction({ + type: 'brushSelect', + batch: brushSelected + }); + zr[DISPATCH_FLAG] = false; + } + } + + function checkInRange(seriesModel, rangeInfoList, data, dataIndex) { + for (var i = 0, len = rangeInfoList.length; i < len; i++) { + var area = rangeInfoList[i]; + + if (seriesModel.brushSelector(dataIndex, data, area.selectors, area)) { + return true; + } + } + } + + function brushModelNotControll(brushModel, seriesIndex) { + var seriesIndices = brushModel.option.seriesIndex; + return seriesIndices != null && seriesIndices !== 'all' && (isArray(seriesIndices) ? indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices); + } + + var boundingRectBuilders = { + rect: function (area) { + return getBoundingRectFromMinMax(area.range); + }, + polygon: function (area) { + var minMax; + var range = area.range; + + for (var i = 0, len = range.length; i < len; i++) { + minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]]; + var rg = range[i]; + rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]); + rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]); + rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]); + rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]); + } + + return minMax && getBoundingRectFromMinMax(minMax); + } + }; + + function getBoundingRectFromMinMax(minMax) { + return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]); + } + + var BrushView = + /** @class */ + function (_super) { + __extends(BrushView, _super); + + function BrushView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BrushView.type; + return _this; + } + + BrushView.prototype.init = function (ecModel, api) { + this.ecModel = ecModel; + this.api = api; + this.model; + (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)).mount(); + }; + + BrushView.prototype.render = function (brushModel, ecModel, api, payload) { + this.model = brushModel; + + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateTransform = function (brushModel, ecModel, api, payload) { + // PENDING: `updateTransform` is a little tricky, whose layout need + // to be calculate mandatorily and other stages will not be performed. + // Take care the correctness of the logic. See #11754 . + layoutCovers(ecModel); + + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateVisual = function (brushModel, ecModel, api, payload) { + this.updateTransform(brushModel, ecModel, api, payload); + }; + + BrushView.prototype.updateView = function (brushModel, ecModel, api, payload) { + this._updateController(brushModel, ecModel, api, payload); + }; + + BrushView.prototype._updateController = function (brushModel, ecModel, api, payload) { + // Do not update controller when drawing. + (!payload || payload.$from !== brushModel.id) && this._brushController.setPanels(brushModel.brushTargetManager.makePanelOpts(api)).enableBrush(brushModel.brushOption).updateCovers(brushModel.areas.slice()); + }; // updateLayout: updateController, + // updateVisual: updateController, + + + BrushView.prototype.dispose = function () { + this._brushController.dispose(); + }; + + BrushView.prototype._onBrush = function (eventParam) { + var modelId = this.model.id; + var areas = this.model.brushTargetManager.setOutputRanges(eventParam.areas, this.ecModel); // Action is not dispatched on drag end, because the drag end + // emits the same params with the last drag move event, and + // may have some delay when using touch pad, which makes + // animation not smooth (when using debounce). + + (!eventParam.isEnd || eventParam.removeOnClick) && this.api.dispatchAction({ + type: 'brush', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + eventParam.isEnd && this.api.dispatchAction({ + type: 'brushEnd', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + }; + + BrushView.type = 'brush'; + return BrushView; + }(ComponentView); + + var DEFAULT_OUT_OF_BRUSH_COLOR = '#ddd'; + + var BrushModel = + /** @class */ + function (_super) { + __extends(BrushModel, _super); + + function BrushModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = BrushModel.type; + /** + * @readOnly + */ + + _this.areas = []; + /** + * Current brush painting area settings. + * @readOnly + */ + + _this.brushOption = {}; + return _this; + } + + BrushModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + !isInit && replaceVisualOption(thisOption, newOption, ['inBrush', 'outOfBrush']); + var inBrush = thisOption.inBrush = thisOption.inBrush || {}; // Always give default visual, consider setOption at the second time. + + thisOption.outOfBrush = thisOption.outOfBrush || { + color: DEFAULT_OUT_OF_BRUSH_COLOR + }; + + if (!inBrush.hasOwnProperty('liftZ')) { + // Bigger than the highlight z lift, otherwise it will + // be effected by the highlight z when brush. + inBrush.liftZ = 5; + } + }; + /** + * If `areas` is null/undefined, range state remain. + */ + + + BrushModel.prototype.setAreas = function (areas) { + if ("development" !== 'production') { + assert(isArray(areas)); + each(areas, function (area) { + assert(area.brushType, 'Illegal areas'); + }); + } // If areas is null/undefined, range state remain. + // This helps user to dispatchAction({type: 'brush'}) with no areas + // set but just want to get the current brush select info from a `brush` event. + + + if (!areas) { + return; + } + + this.areas = map(areas, function (area) { + return generateBrushOption(this.option, area); + }, this); + }; + /** + * Set the current painting brush option. + */ + + + BrushModel.prototype.setBrushOption = function (brushOption) { + this.brushOption = generateBrushOption(this.option, brushOption); + this.brushType = this.brushOption.brushType; + }; + + BrushModel.type = 'brush'; + BrushModel.dependencies = ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series']; + BrushModel.defaultOption = { + seriesIndex: 'all', + brushType: 'rect', + brushMode: 'single', + transformable: true, + brushStyle: { + borderWidth: 1, + color: 'rgba(210,219,238,0.3)', + borderColor: '#D2DBEE' + }, + throttleType: 'fixRate', + throttleDelay: 0, + removeOnClick: true, + z: 10000 + }; + return BrushModel; + }(ComponentModel); + + function generateBrushOption(option, brushOption) { + return merge({ + brushType: option.brushType, + brushMode: option.brushMode, + transformable: option.transformable, + brushStyle: new Model(option.brushStyle).getItemStyle(), + removeOnClick: option.removeOnClick, + z: option.z + }, brushOption, true); + } + + var ICON_TYPES = ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear']; + + var BrushFeature = + /** @class */ + function (_super) { + __extends(BrushFeature, _super); + + function BrushFeature() { + return _super !== null && _super.apply(this, arguments) || this; + } + + BrushFeature.prototype.render = function (featureModel, ecModel, api) { + var brushType; + var brushMode; + var isBrushed; + ecModel.eachComponent({ + mainType: 'brush' + }, function (brushModel) { + brushType = brushModel.brushType; + brushMode = brushModel.brushOption.brushMode || 'single'; + isBrushed = isBrushed || !!brushModel.areas.length; + }); + this._brushType = brushType; + this._brushMode = brushMode; + each(featureModel.get('type', true), function (type) { + featureModel.setIconStatus(type, (type === 'keep' ? brushMode === 'multiple' : type === 'clear' ? isBrushed : type === brushType) ? 'emphasis' : 'normal'); + }); + }; + + BrushFeature.prototype.updateView = function (featureModel, ecModel, api) { + this.render(featureModel, ecModel, api); + }; + + BrushFeature.prototype.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon', true); + var icons = {}; + each(model.get('type', true), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + BrushFeature.prototype.onclick = function (ecModel, api, type) { + var brushType = this._brushType; + var brushMode = this._brushMode; + + if (type === 'clear') { + // Trigger parallel action firstly + api.dispatchAction({ + type: 'axisAreaSelect', + intervals: [] + }); + api.dispatchAction({ + type: 'brush', + command: 'clear', + // Clear all areas of all brush components. + areas: [] + }); + } else { + api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'brush', + brushOption: { + brushType: type === 'keep' ? brushType : brushType === type ? false : type, + brushMode: type === 'keep' ? brushMode === 'multiple' ? 'single' : 'multiple' : brushMode + } + }); + } + }; + + BrushFeature.getDefaultOption = function (ecModel) { + var defaultOption = { + show: true, + type: ICON_TYPES.slice(), + icon: { + /* eslint-disable */ + rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13', + polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2', + lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4', + lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4', + keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z', + clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line + + /* eslint-enable */ + + }, + // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear` + title: ecModel.getLocaleModel().get(['toolbox', 'brush', 'title']) + }; + return defaultOption; + }; + + return BrushFeature; + }(ToolboxFeature); + + function install$B(registers) { + registers.registerComponentView(BrushView); + registers.registerComponentModel(BrushModel); + registers.registerPreprocessor(brushPreprocessor); + registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, brushVisual); + registers.registerAction({ + type: 'brush', + event: 'brush', + update: 'updateVisual' + }, function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'brush', + query: payload + }, function (brushModel) { + brushModel.setAreas(payload.areas); + }); + }); + /** + * payload: { + * brushComponents: [ + * { + * brushId, + * brushIndex, + * brushName, + * series: [ + * { + * seriesId, + * seriesIndex, + * seriesName, + * rawIndices: [21, 34, ...] + * }, + * ... + * ] + * }, + * ... + * ] + * } + */ + + registers.registerAction({ + type: 'brushSelect', + event: 'brushSelected', + update: 'none' + }, noop); + registers.registerAction({ + type: 'brushEnd', + event: 'brushEnd', + update: 'none' + }, noop); + registerFeature('brush', BrushFeature); + } + + var TitleModel = + /** @class */ + function (_super) { + __extends(TitleModel, _super); + + function TitleModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TitleModel.type; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + return _this; + } + + TitleModel.type = 'title'; + TitleModel.defaultOption = { + // zlevel: 0, + z: 6, + show: true, + text: '', + target: 'blank', + subtext: '', + subtarget: 'blank', + left: 0, + top: 0, + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderWidth: 0, + padding: 5, + itemGap: 10, + textStyle: { + fontSize: 18, + fontWeight: 'bold', + color: '#464646' + }, + subtextStyle: { + fontSize: 12, + color: '#6E7079' + } + }; + return TitleModel; + }(ComponentModel); // View + + + var TitleView = + /** @class */ + function (_super) { + __extends(TitleView, _super); + + function TitleView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TitleView.type; + return _this; + } + + TitleView.prototype.render = function (titleModel, ecModel, api) { + this.group.removeAll(); + + if (!titleModel.get('show')) { + return; + } + + var group = this.group; + var textStyleModel = titleModel.getModel('textStyle'); + var subtextStyleModel = titleModel.getModel('subtextStyle'); + var textAlign = titleModel.get('textAlign'); + var textVerticalAlign = retrieve2(titleModel.get('textBaseline'), titleModel.get('textVerticalAlign')); + var textEl = new ZRText({ + style: createTextStyle(textStyleModel, { + text: titleModel.get('text'), + fill: textStyleModel.getTextColor() + }, { + disableBox: true + }), + z2: 10 + }); + var textRect = textEl.getBoundingRect(); + var subText = titleModel.get('subtext'); + var subTextEl = new ZRText({ + style: createTextStyle(subtextStyleModel, { + text: subText, + fill: subtextStyleModel.getTextColor(), + y: textRect.height + titleModel.get('itemGap'), + verticalAlign: 'top' + }, { + disableBox: true + }), + z2: 10 + }); + var link = titleModel.get('link'); + var sublink = titleModel.get('sublink'); + var triggerEvent = titleModel.get('triggerEvent', true); + textEl.silent = !link && !triggerEvent; + subTextEl.silent = !sublink && !triggerEvent; + + if (link) { + textEl.on('click', function () { + windowOpen(link, '_' + titleModel.get('target')); + }); + } + + if (sublink) { + subTextEl.on('click', function () { + windowOpen(sublink, '_' + titleModel.get('subtarget')); + }); + } + + getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent ? { + componentType: 'title', + componentIndex: titleModel.componentIndex + } : null; + group.add(textEl); + subText && group.add(subTextEl); // If no subText, but add subTextEl, there will be an empty line. + + var groupRect = group.getBoundingRect(); + var layoutOption = titleModel.getBoxLayoutParams(); + layoutOption.width = groupRect.width; + layoutOption.height = groupRect.height; + var layoutRect = getLayoutRect(layoutOption, { + width: api.getWidth(), + height: api.getHeight() + }, titleModel.get('padding')); // Adjust text align based on position + + if (!textAlign) { + // Align left if title is on the left. center and right is same + textAlign = titleModel.get('left') || titleModel.get('right'); // @ts-ignore + + if (textAlign === 'middle') { + textAlign = 'center'; + } // Adjust layout by text align + + + if (textAlign === 'right') { + layoutRect.x += layoutRect.width; + } else if (textAlign === 'center') { + layoutRect.x += layoutRect.width / 2; + } + } + + if (!textVerticalAlign) { + textVerticalAlign = titleModel.get('top') || titleModel.get('bottom'); // @ts-ignore + + if (textVerticalAlign === 'center') { + textVerticalAlign = 'middle'; + } + + if (textVerticalAlign === 'bottom') { + layoutRect.y += layoutRect.height; + } else if (textVerticalAlign === 'middle') { + layoutRect.y += layoutRect.height / 2; + } + + textVerticalAlign = textVerticalAlign || 'top'; + } + + group.x = layoutRect.x; + group.y = layoutRect.y; + group.markRedraw(); + var alignStyle = { + align: textAlign, + verticalAlign: textVerticalAlign + }; + textEl.setStyle(alignStyle); + subTextEl.setStyle(alignStyle); // Render background + // Get groupRect again because textAlign has been changed + + groupRect = group.getBoundingRect(); + var padding = layoutRect.margin; + var style = titleModel.getItemStyle(['color', 'opacity']); + style.fill = titleModel.get('backgroundColor'); + var rect = new Rect({ + shape: { + x: groupRect.x - padding[3], + y: groupRect.y - padding[0], + width: groupRect.width + padding[1] + padding[3], + height: groupRect.height + padding[0] + padding[2], + r: titleModel.get('borderRadius') + }, + style: style, + subPixelOptimize: true, + silent: true + }); + group.add(rect); + }; + + TitleView.type = 'title'; + return TitleView; + }(ComponentView); + + function install$C(registers) { + registers.registerComponentModel(TitleModel); + registers.registerComponentView(TitleView); + } + + var TimelineModel = + /** @class */ + function (_super) { + __extends(TimelineModel, _super); + + function TimelineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TimelineModel.type; + _this.layoutMode = 'box'; + return _this; + } + + /** + * @override + */ + + + TimelineModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + + this._initData(); + }; + /** + * @override + */ + + + TimelineModel.prototype.mergeOption = function (option) { + _super.prototype.mergeOption.apply(this, arguments); + + this._initData(); + }; + + TimelineModel.prototype.setCurrentIndex = function (currentIndex) { + if (currentIndex == null) { + currentIndex = this.option.currentIndex; + } + + var count = this._data.count(); + + if (this.option.loop) { + currentIndex = (currentIndex % count + count) % count; + } else { + currentIndex >= count && (currentIndex = count - 1); + currentIndex < 0 && (currentIndex = 0); + } + + this.option.currentIndex = currentIndex; + }; + /** + * @return {number} currentIndex + */ + + + TimelineModel.prototype.getCurrentIndex = function () { + return this.option.currentIndex; + }; + /** + * @return {boolean} + */ + + + TimelineModel.prototype.isIndexMax = function () { + return this.getCurrentIndex() >= this._data.count() - 1; + }; + /** + * @param {boolean} state true: play, false: stop + */ + + + TimelineModel.prototype.setPlayState = function (state) { + this.option.autoPlay = !!state; + }; + /** + * @return {boolean} true: play, false: stop + */ + + + TimelineModel.prototype.getPlayState = function () { + return !!this.option.autoPlay; + }; + /** + * @private + */ + + + TimelineModel.prototype._initData = function () { + var thisOption = this.option; + var dataArr = thisOption.data || []; + var axisType = thisOption.axisType; + var names = this._names = []; + var processedDataArr; + + if (axisType === 'category') { + processedDataArr = []; + each(dataArr, function (item, index) { + var value = convertOptionIdName(getDataItemValue(item), ''); + var newItem; + + if (isObject(item)) { + newItem = clone(item); + newItem.value = index; + } else { + newItem = index; + } + + processedDataArr.push(newItem); + names.push(value); + }); + } else { + processedDataArr = dataArr; + } + + var dimType = { + category: 'ordinal', + time: 'time', + value: 'number' + }[axisType] || 'number'; + var data = this._data = new SeriesData([{ + name: 'value', + type: dimType + }], this); + data.initData(processedDataArr, names); + }; + + TimelineModel.prototype.getData = function () { + return this._data; + }; + /** + * @public + * @return {Array.} categoreis + */ + + + TimelineModel.prototype.getCategories = function () { + if (this.get('axisType') === 'category') { + return this._names.slice(); + } + }; + + TimelineModel.type = 'timeline'; + /** + * @protected + */ + + TimelineModel.defaultOption = { + // zlevel: 0, // 一级层叠 + z: 4, + show: true, + axisType: 'time', + realtime: true, + left: '20%', + top: null, + right: '20%', + bottom: 0, + width: null, + height: 40, + padding: 5, + controlPosition: 'left', + autoPlay: false, + rewind: false, + loop: true, + playInterval: 2000, + currentIndex: 0, + itemStyle: {}, + label: { + color: '#000' + }, + data: [] + }; + return TimelineModel; + }(ComponentModel); + + var SliderTimelineModel = + /** @class */ + function (_super) { + __extends(SliderTimelineModel, _super); + + function SliderTimelineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderTimelineModel.type; + return _this; + } + + SliderTimelineModel.type = 'timeline.slider'; + /** + * @protected + */ + + SliderTimelineModel.defaultOption = inheritDefaultOption(TimelineModel.defaultOption, { + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderWidth: 0, + orient: 'horizontal', + inverse: false, + tooltip: { + trigger: 'item' // data item may also have tootip attr. + + }, + symbol: 'circle', + symbolSize: 12, + lineStyle: { + show: true, + width: 2, + color: '#DAE1F5' + }, + label: { + position: 'auto', + // When using number, label position is not + // restricted by viewRect. + // positive: right/bottom, negative: left/top + show: true, + interval: 'auto', + rotate: 0, + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#A4B1D7' + }, + itemStyle: { + color: '#A4B1D7', + borderWidth: 1 + }, + checkpointStyle: { + symbol: 'circle', + symbolSize: 15, + color: '#316bf3', + borderColor: '#fff', + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0, 0, 0, 0.3)', + // borderColor: 'rgba(194,53,49, 0.5)', + animation: true, + animationDuration: 300, + animationEasing: 'quinticInOut' + }, + controlStyle: { + show: true, + showPlayBtn: true, + showPrevBtn: true, + showNextBtn: true, + itemSize: 24, + itemGap: 12, + position: 'left', + playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z', + stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z', + // eslint-disable-next-line max-len + nextIcon: 'M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z', + // eslint-disable-next-line max-len + prevIcon: 'M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z', + prevBtnSize: 18, + nextBtnSize: 18, + color: '#A4B1D7', + borderColor: '#A4B1D7', + borderWidth: 1 + }, + emphasis: { + label: { + show: true, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#6f778d' + }, + itemStyle: { + color: '#316BF3' + }, + controlStyle: { + color: '#316BF3', + borderColor: '#316BF3', + borderWidth: 2 + } + }, + progress: { + lineStyle: { + color: '#316BF3' + }, + itemStyle: { + color: '#316BF3' + }, + label: { + color: '#6f778d' + } + }, + data: [] + }); + return SliderTimelineModel; + }(TimelineModel); + + mixin(SliderTimelineModel, DataFormatMixin.prototype); + + var TimelineView = + /** @class */ + function (_super) { + __extends(TimelineView, _super); + + function TimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = TimelineView.type; + return _this; + } + + TimelineView.type = 'timeline'; + return TimelineView; + }(ComponentView); + + /** + * Extend axis 2d + */ + + var TimelineAxis = + /** @class */ + function (_super) { + __extends(TimelineAxis, _super); + + function TimelineAxis(dim, scale, coordExtent, axisType) { + var _this = _super.call(this, dim, scale, coordExtent) || this; + + _this.type = axisType || 'value'; + return _this; + } + + /** + * @override + */ + + + TimelineAxis.prototype.getLabelModel = function () { + // Force override + return this.model.getModel('label'); + }; + /** + * @override + */ + + + TimelineAxis.prototype.isHorizontal = function () { + return this.model.get('orient') === 'horizontal'; + }; + + return TimelineAxis; + }(Axis); + + var PI$8 = Math.PI; + var labelDataIndexStore = makeInner(); + + var SliderTimelineView = + /** @class */ + function (_super) { + __extends(SliderTimelineView, _super); + + function SliderTimelineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderTimelineView.type; + return _this; + } + + SliderTimelineView.prototype.init = function (ecModel, api) { + this.api = api; + }; + /** + * @override + */ + + + SliderTimelineView.prototype.render = function (timelineModel, ecModel, api) { + this.model = timelineModel; + this.api = api; + this.ecModel = ecModel; + this.group.removeAll(); + + if (timelineModel.get('show', true)) { + var layoutInfo_1 = this._layout(timelineModel, api); + + var mainGroup_1 = this._createGroup('_mainGroup'); + + var labelGroup = this._createGroup('_labelGroup'); + + var axis_1 = this._axis = this._createAxis(layoutInfo_1, timelineModel); + + timelineModel.formatTooltip = function (dataIndex) { + var name = axis_1.scale.getLabel({ + value: dataIndex + }); + return createTooltipMarkup('nameValue', { + noName: true, + value: name + }); + }; + + each(['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], function (name) { + this['_render' + name](layoutInfo_1, mainGroup_1, axis_1, timelineModel); + }, this); + + this._renderAxisLabel(layoutInfo_1, labelGroup, axis_1, timelineModel); + + this._position(layoutInfo_1, timelineModel); + } + + this._doPlayStop(); + + this._updateTicksStatus(); + }; + /** + * @override + */ + + + SliderTimelineView.prototype.remove = function () { + this._clearTimer(); + + this.group.removeAll(); + }; + /** + * @override + */ + + + SliderTimelineView.prototype.dispose = function () { + this._clearTimer(); + }; + + SliderTimelineView.prototype._layout = function (timelineModel, api) { + var labelPosOpt = timelineModel.get(['label', 'position']); + var orient = timelineModel.get('orient'); + var viewRect = getViewRect$5(timelineModel, api); + var parsedLabelPos; // Auto label offset. + + if (labelPosOpt == null || labelPosOpt === 'auto') { + parsedLabelPos = orient === 'horizontal' ? viewRect.y + viewRect.height / 2 < api.getHeight() / 2 ? '-' : '+' : viewRect.x + viewRect.width / 2 < api.getWidth() / 2 ? '+' : '-'; + } else if (isString(labelPosOpt)) { + parsedLabelPos = { + horizontal: { + top: '-', + bottom: '+' + }, + vertical: { + left: '-', + right: '+' + } + }[orient][labelPosOpt]; + } else { + // is number + parsedLabelPos = labelPosOpt; + } + + var labelAlignMap = { + horizontal: 'center', + vertical: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'left' : 'right' + }; + var labelBaselineMap = { + horizontal: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'top' : 'bottom', + vertical: 'middle' + }; + var rotationMap = { + horizontal: 0, + vertical: PI$8 / 2 + }; // Position + + var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width; + var controlModel = timelineModel.getModel('controlStyle'); + var showControl = controlModel.get('show', true); + var controlSize = showControl ? controlModel.get('itemSize') : 0; + var controlGap = showControl ? controlModel.get('itemGap') : 0; + var sizePlusGap = controlSize + controlGap; // Special label rotate. + + var labelRotation = timelineModel.get(['label', 'rotate']) || 0; + labelRotation = labelRotation * PI$8 / 180; // To radian. + + var playPosition; + var prevBtnPosition; + var nextBtnPosition; + var controlPosition = controlModel.get('position', true); + var showPlayBtn = showControl && controlModel.get('showPlayBtn', true); + var showPrevBtn = showControl && controlModel.get('showPrevBtn', true); + var showNextBtn = showControl && controlModel.get('showNextBtn', true); + var xLeft = 0; + var xRight = mainLength; // position[0] means left, position[1] means middle. + + if (controlPosition === 'left' || controlPosition === 'bottom') { + showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap); + showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } else { + // 'top' 'right' + showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } + + var axisExtent = [xLeft, xRight]; + + if (timelineModel.get('inverse')) { + axisExtent.reverse(); + } + + return { + viewRect: viewRect, + mainLength: mainLength, + orient: orient, + rotation: rotationMap[orient], + labelRotation: labelRotation, + labelPosOpt: parsedLabelPos, + labelAlign: timelineModel.get(['label', 'align']) || labelAlignMap[orient], + labelBaseline: timelineModel.get(['label', 'verticalAlign']) || timelineModel.get(['label', 'baseline']) || labelBaselineMap[orient], + // Based on mainGroup. + playPosition: playPosition, + prevBtnPosition: prevBtnPosition, + nextBtnPosition: nextBtnPosition, + axisExtent: axisExtent, + controlSize: controlSize, + controlGap: controlGap + }; + }; + + SliderTimelineView.prototype._position = function (layoutInfo, timelineModel) { + // Position is be called finally, because bounding rect is needed for + // adapt content to fill viewRect (auto adapt offset). + // Timeline may be not all in the viewRect when 'offset' is specified + // as a number, because it is more appropriate that label aligns at + // 'offset' but not the other edge defined by viewRect. + var mainGroup = this._mainGroup; + var labelGroup = this._labelGroup; + var viewRect = layoutInfo.viewRect; + + if (layoutInfo.orient === 'vertical') { + // transform to horizontal, inverse rotate by left-top point. + var m = create$1(); + var rotateOriginX = viewRect.x; + var rotateOriginY = viewRect.y + viewRect.height; + translate(m, m, [-rotateOriginX, -rotateOriginY]); + rotate(m, m, -PI$8 / 2); + translate(m, m, [rotateOriginX, rotateOriginY]); + viewRect = viewRect.clone(); + viewRect.applyTransform(m); + } + + var viewBound = getBound(viewRect); + var mainBound = getBound(mainGroup.getBoundingRect()); + var labelBound = getBound(labelGroup.getBoundingRect()); + var mainPosition = [mainGroup.x, mainGroup.y]; + var labelsPosition = [labelGroup.x, labelGroup.y]; + labelsPosition[0] = mainPosition[0] = viewBound[0][0]; + var labelPosOpt = layoutInfo.labelPosOpt; + + if (labelPosOpt == null || isString(labelPosOpt)) { + // '+' or '-' + var mainBoundIdx = labelPosOpt === '+' ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx); + } else { + var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + labelsPosition[1] = mainPosition[1] + labelPosOpt; + } + + mainGroup.setPosition(mainPosition); + labelGroup.setPosition(labelsPosition); + mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation; + setOrigin(mainGroup); + setOrigin(labelGroup); + + function setOrigin(targetGroup) { + targetGroup.originX = viewBound[0][0] - targetGroup.x; + targetGroup.originY = viewBound[1][0] - targetGroup.y; + } + + function getBound(rect) { + // [[xmin, xmax], [ymin, ymax]] + return [[rect.x, rect.x + rect.width], [rect.y, rect.y + rect.height]]; + } + + function toBound(fromPos, from, to, dimIdx, boundIdx) { + fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx]; + } + }; + + SliderTimelineView.prototype._createAxis = function (layoutInfo, timelineModel) { + var data = timelineModel.getData(); + var axisType = timelineModel.get('axisType'); + var scale = createScaleByModel$1(timelineModel, axisType); // Customize scale. The `tickValue` is `dataIndex`. + + scale.getTicks = function () { + return data.mapArray(['value'], function (value) { + return { + value: value + }; + }); + }; + + var dataExtent = data.getDataExtent('value'); + scale.setExtent(dataExtent[0], dataExtent[1]); + scale.calcNiceTicks(); + var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType); + axis.model = timelineModel; + return axis; + }; + + SliderTimelineView.prototype._createGroup = function (key) { + var newGroup = this[key] = new Group(); + this.group.add(newGroup); + return newGroup; + }; + + SliderTimelineView.prototype._renderAxisLine = function (layoutInfo, group, axis, timelineModel) { + var axisExtent = axis.getExtent(); + + if (!timelineModel.get(['lineStyle', 'show'])) { + return; + } + + var line = new Line({ + shape: { + x1: axisExtent[0], + y1: 0, + x2: axisExtent[1], + y2: 0 + }, + style: extend({ + lineCap: 'round' + }, timelineModel.getModel('lineStyle').getLineStyle()), + silent: true, + z2: 1 + }); + group.add(line); + var progressLine = this._progressLine = new Line({ + shape: { + x1: axisExtent[0], + x2: this._currentPointer ? this._currentPointer.x : axisExtent[0], + y1: 0, + y2: 0 + }, + style: defaults({ + lineCap: 'round', + lineWidth: line.style.lineWidth + }, timelineModel.getModel(['progress', 'lineStyle']).getLineStyle()), + silent: true, + z2: 1 + }); + group.add(progressLine); + }; + + SliderTimelineView.prototype._renderAxisTick = function (layoutInfo, group, axis, timelineModel) { + var _this = this; + + var data = timelineModel.getData(); // Show all ticks, despite ignoring strategy. + + var ticks = axis.scale.getTicks(); + this._tickSymbols = []; // The value is dataIndex, see the costomized scale. + + each(ticks, function (tick) { + var tickCoord = axis.dataToCoord(tick.value); + var itemModel = data.getItemModel(tick.value); + var itemStyleModel = itemModel.getModel('itemStyle'); + var hoverStyleModel = itemModel.getModel(['emphasis', 'itemStyle']); + var progressStyleModel = itemModel.getModel(['progress', 'itemStyle']); + var symbolOpt = { + x: tickCoord, + y: 0, + onclick: bind(_this._changeTimeline, _this, tick.value) + }; + var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt); + el.ensureState('emphasis').style = hoverStyleModel.getItemStyle(); + el.ensureState('progress').style = progressStyleModel.getItemStyle(); + enableHoverEmphasis(el); + var ecData = getECData(el); + + if (itemModel.get('tooltip')) { + ecData.dataIndex = tick.value; + ecData.dataModel = timelineModel; + } else { + ecData.dataIndex = ecData.dataModel = null; + } + + _this._tickSymbols.push(el); + }); + }; + + SliderTimelineView.prototype._renderAxisLabel = function (layoutInfo, group, axis, timelineModel) { + var _this = this; + + var labelModel = axis.getLabelModel(); + + if (!labelModel.get('show')) { + return; + } + + var data = timelineModel.getData(); + var labels = axis.getViewLabels(); + this._tickLabels = []; + each(labels, function (labelItem) { + // The tickValue is dataIndex, see the costomized scale. + var dataIndex = labelItem.tickValue; + var itemModel = data.getItemModel(dataIndex); + var normalLabelModel = itemModel.getModel('label'); + var hoverLabelModel = itemModel.getModel(['emphasis', 'label']); + var progressLabelModel = itemModel.getModel(['progress', 'label']); + var tickCoord = axis.dataToCoord(labelItem.tickValue); + var textEl = new ZRText({ + x: tickCoord, + y: 0, + rotation: layoutInfo.labelRotation - layoutInfo.rotation, + onclick: bind(_this._changeTimeline, _this, dataIndex), + silent: false, + style: createTextStyle(normalLabelModel, { + text: labelItem.formattedLabel, + align: layoutInfo.labelAlign, + verticalAlign: layoutInfo.labelBaseline + }) + }); + textEl.ensureState('emphasis').style = createTextStyle(hoverLabelModel); + textEl.ensureState('progress').style = createTextStyle(progressLabelModel); + group.add(textEl); + enableHoverEmphasis(textEl); + labelDataIndexStore(textEl).dataIndex = dataIndex; + + _this._tickLabels.push(textEl); + }); + }; + + SliderTimelineView.prototype._renderControl = function (layoutInfo, group, axis, timelineModel) { + var controlSize = layoutInfo.controlSize; + var rotation = layoutInfo.rotation; + var itemStyle = timelineModel.getModel('controlStyle').getItemStyle(); + var hoverStyle = timelineModel.getModel(['emphasis', 'controlStyle']).getItemStyle(); + var playState = timelineModel.getPlayState(); + var inverse = timelineModel.get('inverse', true); + makeBtn(layoutInfo.nextBtnPosition, 'next', bind(this._changeTimeline, this, inverse ? '-' : '+')); + makeBtn(layoutInfo.prevBtnPosition, 'prev', bind(this._changeTimeline, this, inverse ? '+' : '-')); + makeBtn(layoutInfo.playPosition, playState ? 'stop' : 'play', bind(this._handlePlayClick, this, !playState), true); + + function makeBtn(position, iconName, onclick, willRotate) { + if (!position) { + return; + } + + var iconSize = parsePercent(retrieve2(timelineModel.get(['controlStyle', iconName + 'BtnSize']), controlSize), controlSize); + var rect = [0, -iconSize / 2, iconSize, iconSize]; + var btn = makeControlIcon(timelineModel, iconName + 'Icon', rect, { + x: position[0], + y: position[1], + originX: controlSize / 2, + originY: 0, + rotation: willRotate ? -rotation : 0, + rectHover: true, + style: itemStyle, + onclick: onclick + }); + btn.ensureState('emphasis').style = hoverStyle; + group.add(btn); + enableHoverEmphasis(btn); + } + }; + + SliderTimelineView.prototype._renderCurrentPointer = function (layoutInfo, group, axis, timelineModel) { + var data = timelineModel.getData(); + var currentIndex = timelineModel.getCurrentIndex(); + var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle'); + var me = this; + var callback = { + onCreate: function (pointer) { + pointer.draggable = true; + pointer.drift = bind(me._handlePointerDrag, me); + pointer.ondragend = bind(me._handlePointerDragend, me); + pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel, true); + }, + onUpdate: function (pointer) { + pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel); + } + }; // Reuse when exists, for animation and drag. + + this._currentPointer = giveSymbol(pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback); + }; + + SliderTimelineView.prototype._handlePlayClick = function (nextState) { + this._clearTimer(); + + this.api.dispatchAction({ + type: 'timelinePlayChange', + playState: nextState, + from: this.uid + }); + }; + + SliderTimelineView.prototype._handlePointerDrag = function (dx, dy, e) { + this._clearTimer(); + + this._pointerChangeTimeline([e.offsetX, e.offsetY]); + }; + + SliderTimelineView.prototype._handlePointerDragend = function (e) { + this._pointerChangeTimeline([e.offsetX, e.offsetY], true); + }; + + SliderTimelineView.prototype._pointerChangeTimeline = function (mousePos, trigger) { + var toCoord = this._toAxisCoord(mousePos)[0]; + + var axis = this._axis; + var axisExtent = asc(axis.getExtent().slice()); + toCoord > axisExtent[1] && (toCoord = axisExtent[1]); + toCoord < axisExtent[0] && (toCoord = axisExtent[0]); + this._currentPointer.x = toCoord; + + this._currentPointer.markRedraw(); + + this._progressLine.shape.x2 = toCoord; + + this._progressLine.dirty(); + + var targetDataIndex = this._findNearestTick(toCoord); + + var timelineModel = this.model; + + if (trigger || targetDataIndex !== timelineModel.getCurrentIndex() && timelineModel.get('realtime')) { + this._changeTimeline(targetDataIndex); + } + }; + + SliderTimelineView.prototype._doPlayStop = function () { + var _this = this; + + this._clearTimer(); + + if (this.model.getPlayState()) { + this._timer = setTimeout(function () { + // Do not cache + var timelineModel = _this.model; + + _this._changeTimeline(timelineModel.getCurrentIndex() + (timelineModel.get('rewind', true) ? -1 : 1)); + }, this.model.get('playInterval')); + } + }; + + SliderTimelineView.prototype._toAxisCoord = function (vertex) { + var trans = this._mainGroup.getLocalTransform(); + + return applyTransform$1(vertex, trans, true); + }; + + SliderTimelineView.prototype._findNearestTick = function (axisCoord) { + var data = this.model.getData(); + var dist = Infinity; + var targetDataIndex; + var axis = this._axis; + data.each(['value'], function (value, dataIndex) { + var coord = axis.dataToCoord(value); + var d = Math.abs(coord - axisCoord); + + if (d < dist) { + dist = d; + targetDataIndex = dataIndex; + } + }); + return targetDataIndex; + }; + + SliderTimelineView.prototype._clearTimer = function () { + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + }; + + SliderTimelineView.prototype._changeTimeline = function (nextIndex) { + var currentIndex = this.model.getCurrentIndex(); + + if (nextIndex === '+') { + nextIndex = currentIndex + 1; + } else if (nextIndex === '-') { + nextIndex = currentIndex - 1; + } + + this.api.dispatchAction({ + type: 'timelineChange', + currentIndex: nextIndex, + from: this.uid + }); + }; + + SliderTimelineView.prototype._updateTicksStatus = function () { + var currentIndex = this.model.getCurrentIndex(); + var tickSymbols = this._tickSymbols; + var tickLabels = this._tickLabels; + + if (tickSymbols) { + for (var i = 0; i < tickSymbols.length; i++) { + tickSymbols && tickSymbols[i] && tickSymbols[i].toggleState('progress', i < currentIndex); + } + } + + if (tickLabels) { + for (var i = 0; i < tickLabels.length; i++) { + tickLabels && tickLabels[i] && tickLabels[i].toggleState('progress', labelDataIndexStore(tickLabels[i]).dataIndex <= currentIndex); + } + } + }; + + SliderTimelineView.type = 'timeline.slider'; + return SliderTimelineView; + }(TimelineView); + + function createScaleByModel$1(model, axisType) { + axisType = axisType || model.get('type'); + + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale({ + ordinalMeta: model.getCategories(), + extent: [Infinity, -Infinity] + }); + + case 'time': + return new TimeScale({ + locale: model.ecModel.getLocaleModel(), + useUTC: model.ecModel.get('useUTC') + }); + + default: + // default to be value + return new IntervalScale(); + } + } + } + + function getViewRect$5(model, api) { + return getLayoutRect(model.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }, model.get('padding')); + } + + function makeControlIcon(timelineModel, objPath, rect, opts) { + var style = opts.style; + var icon = createIcon(timelineModel.get(['controlStyle', objPath]), opts || {}, new BoundingRect(rect[0], rect[1], rect[2], rect[3])); // TODO createIcon won't use style in opt. + + if (style) { + icon.setStyle(style); + } + + return icon; + } + + /** + * Create symbol or update symbol + * opt: basic position and event handlers + */ + + + function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) { + var color = itemStyleModel.get('color'); + + if (!symbol) { + var symbolType = hostModel.get('symbol'); + symbol = createSymbol(symbolType, -1, -1, 2, 2, color); + symbol.setStyle('strokeNoScale', true); + group.add(symbol); + callback && callback.onCreate(symbol); + } else { + symbol.setColor(color); + group.add(symbol); // Group may be new, also need to add. + + callback && callback.onUpdate(symbol); + } // Style + + + var itemStyle = itemStyleModel.getItemStyle(['color']); + symbol.setStyle(itemStyle); // Transform and events. + + opt = merge({ + rectHover: true, + z2: 100 + }, opt, true); + var symbolSize = normalizeSymbolSize(hostModel.get('symbolSize')); + opt.scaleX = symbolSize[0] / 2; + opt.scaleY = symbolSize[1] / 2; + var symbolOffset = normalizeSymbolOffset(hostModel.get('symbolOffset'), symbolSize); + + if (symbolOffset) { + opt.x = (opt.x || 0) + symbolOffset[0]; + opt.y = (opt.y || 0) + symbolOffset[1]; + } + + var symbolRotate = hostModel.get('symbolRotate'); + opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + symbol.attr(opt); // FIXME + // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed, + // getBoundingRect will return wrong result. + // (This is supposed to be resolved in zrender, but it is a little difficult to + // leverage performance and auto updateTransform) + // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol. + + symbol.updateTransform(); + return symbol; + } + + function pointerMoveTo(pointer, progressLine, dataIndex, axis, timelineModel, noAnimation) { + if (pointer.dragging) { + return; + } + + var pointerModel = timelineModel.getModel('checkpointStyle'); + var toCoord = axis.dataToCoord(timelineModel.getData().get('value', dataIndex)); + + if (noAnimation || !pointerModel.get('animation', true)) { + pointer.attr({ + x: toCoord, + y: 0 + }); + progressLine && progressLine.attr({ + shape: { + x2: toCoord + } + }); + } else { + var animationCfg = { + duration: pointerModel.get('animationDuration', true), + easing: pointerModel.get('animationEasing', true) + }; + pointer.stopAnimation(null, true); + pointer.animateTo({ + x: toCoord, + y: 0 + }, animationCfg); + progressLine && progressLine.animateTo({ + shape: { + x2: toCoord + } + }, animationCfg); + } + } + + function installTimelineAction(registers) { + registers.registerAction({ + type: 'timelineChange', + event: 'timelineChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel, api) { + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel && payload.currentIndex != null) { + timelineModel.setCurrentIndex(payload.currentIndex); + + if (!timelineModel.get('loop', true) && timelineModel.isIndexMax() && timelineModel.getPlayState()) { + timelineModel.setPlayState(false); // The timeline has played to the end, trigger event + + api.dispatchAction({ + type: 'timelinePlayChange', + playState: false, + from: payload.from + }); + } + } // Set normalized currentIndex to payload. + + + ecModel.resetOption('timeline', { + replaceMerge: timelineModel.get('replaceMerge', true) + }); + return defaults({ + currentIndex: timelineModel.option.currentIndex + }, payload); + }); + registers.registerAction({ + type: 'timelinePlayChange', + event: 'timelinePlayChanged', + update: 'update' + }, function (payload, ecModel) { + var timelineModel = ecModel.getComponent('timeline'); + + if (timelineModel && payload.playState != null) { + timelineModel.setPlayState(payload.playState); + } + }); + } + + function timelinePreprocessor(option) { + var timelineOpt = option && option.timeline; + + if (!isArray(timelineOpt)) { + timelineOpt = timelineOpt ? [timelineOpt] : []; + } + + each(timelineOpt, function (opt) { + if (!opt) { + return; + } + + compatibleEC2(opt); + }); + } + + function compatibleEC2(opt) { + var type = opt.type; + var ec2Types = { + 'number': 'value', + 'time': 'time' + }; // Compatible with ec2 + + if (ec2Types[type]) { + opt.axisType = ec2Types[type]; + delete opt.type; + } + + transferItem(opt); + + if (has(opt, 'controlPosition')) { + var controlStyle = opt.controlStyle || (opt.controlStyle = {}); + + if (!has(controlStyle, 'position')) { + controlStyle.position = opt.controlPosition; + } + + if (controlStyle.position === 'none' && !has(controlStyle, 'show')) { + controlStyle.show = false; + delete controlStyle.position; + } + + delete opt.controlPosition; + } + + each(opt.data || [], function (dataItem) { + if (isObject(dataItem) && !isArray(dataItem)) { + if (!has(dataItem, 'value') && has(dataItem, 'name')) { + // In ec2, using name as value. + dataItem.value = dataItem.name; + } + + transferItem(dataItem); + } + }); + } + + function transferItem(opt) { + var itemStyle = opt.itemStyle || (opt.itemStyle = {}); + var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {}); // Transfer label out + + var label = opt.label || opt.label || {}; + var labelNormal = label.normal || (label.normal = {}); + var excludeLabelAttr = { + normal: 1, + emphasis: 1 + }; + each(label, function (value, name) { + if (!excludeLabelAttr[name] && !has(labelNormal, name)) { + labelNormal[name] = value; + } + }); + + if (itemStyleEmphasis.label && !has(label, 'emphasis')) { + label.emphasis = itemStyleEmphasis.label; + delete itemStyleEmphasis.label; + } + } + + function has(obj, attr) { + return obj.hasOwnProperty(attr); + } + + function install$D(registers) { + registers.registerComponentModel(SliderTimelineModel); + registers.registerComponentView(SliderTimelineView); + registers.registerSubTypeDefaulter('timeline', function () { + // Only slider now. + return 'slider'; + }); + installTimelineAction(registers); + registers.registerPreprocessor(timelinePreprocessor); + } + + function checkMarkerInSeries(seriesOpts, markerType) { + if (!seriesOpts) { + return false; + } + + var seriesOptArr = isArray(seriesOpts) ? seriesOpts : [seriesOpts]; + + for (var idx = 0; idx < seriesOptArr.length; idx++) { + if (seriesOptArr[idx] && seriesOptArr[idx][markerType]) { + return true; + } + } + + return false; + } + + function fillLabel(opt) { + defaultEmphasis(opt, 'label', ['show']); + } // { [componentType]: MarkerModel } + + + var inner$g = makeInner(); + + var MarkerModel = + /** @class */ + function (_super) { + __extends(MarkerModel, _super); + + function MarkerModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkerModel.type; + /** + * If marker model is created by self from series + */ + + _this.createdBySelf = false; + return _this; + } + + /** + * @overrite + */ + + + MarkerModel.prototype.init = function (option, parentModel, ecModel) { + if ("development" !== 'production') { + if (this.type === 'marker') { + throw new Error('Marker component is abstract component. Use markLine, markPoint, markArea instead.'); + } + } + + this.mergeDefaultAndTheme(option, ecModel); + + this._mergeOption(option, ecModel, false, true); + }; + + MarkerModel.prototype.isAnimationEnabled = function () { + if (env.node) { + return false; + } + + var hostSeries = this.__hostSeries; + return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled(); + }; + /** + * @overrite + */ + + + MarkerModel.prototype.mergeOption = function (newOpt, ecModel) { + this._mergeOption(newOpt, ecModel, false, false); + }; + + MarkerModel.prototype._mergeOption = function (newOpt, ecModel, createdBySelf, isInit) { + var componentType = this.mainType; + + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + // mainType can be markPoint, markLine, markArea + var markerOpt = seriesModel.get(this.mainType, true); + var markerModel = inner$g(seriesModel)[componentType]; + + if (!markerOpt || !markerOpt.data) { + inner$g(seriesModel)[componentType] = null; + return; + } + + if (!markerModel) { + if (isInit) { + // Default label emphasis `position` and `show` + fillLabel(markerOpt); + } + + each(markerOpt.data, function (item) { + // FIXME Overwrite fillLabel method ? + if (item instanceof Array) { + fillLabel(item[0]); + fillLabel(item[1]); + } else { + fillLabel(item); + } + }); + markerModel = this.createMarkerModelFromSeries(markerOpt, this, ecModel); // markerModel = new ImplementedMarkerModel( + // markerOpt, this, ecModel + // ); + + extend(markerModel, { + mainType: this.mainType, + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }); + markerModel.__hostSeries = seriesModel; + } else { + markerModel._mergeOption(markerOpt, ecModel, true); + } + + inner$g(seriesModel)[componentType] = markerModel; + }, this); + } + }; + + MarkerModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var itemName = data.getName(dataIndex); + return createTooltipMarkup('section', { + header: this.name, + blocks: [createTooltipMarkup('nameValue', { + name: itemName, + value: value, + noName: !itemName, + noValue: value == null + })] + }); + }; + + MarkerModel.prototype.getData = function () { + return this._data; + }; + + MarkerModel.prototype.setData = function (data) { + this._data = data; + }; + + MarkerModel.getMarkerModelFromSeries = function (seriesModel, // Support three types of markers. Strict check. + componentType) { + return inner$g(seriesModel)[componentType]; + }; + + MarkerModel.type = 'marker'; + MarkerModel.dependencies = ['series', 'grid', 'polar', 'geo']; + return MarkerModel; + }(ComponentModel); + + mixin(MarkerModel, DataFormatMixin.prototype); + + var MarkPointModel = + /** @class */ + function (_super) { + __extends(MarkPointModel, _super); + + function MarkPointModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkPointModel.type; + return _this; + } + + MarkPointModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkPointModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkPointModel.type = 'markPoint'; + MarkPointModel.defaultOption = { + // zlevel: 0, + z: 5, + symbol: 'pin', + symbolSize: 50, + //symbolRotate: 0, + //symbolOffset: [0, 0] + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'inside' + }, + itemStyle: { + borderWidth: 2 + }, + emphasis: { + label: { + show: true + } + } + }; + return MarkPointModel; + }(MarkerModel); + + function hasXOrY(item) { + return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y))); + } + + function hasXAndY(item) { + return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y)); + } + + function markerTypeCalculatorWithExtent(markerType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex) { + var coordArr = []; + var stacked = isDimensionStacked(data, targetDataDim + /*, otherDataDim*/ + ); + var calcDataDim = stacked ? data.getCalculationInfo('stackResultDimension') : targetDataDim; + var value = numCalculate(data, calcDataDim, markerType); + var dataIndex = data.indicesOfNearest(calcDataDim, value)[0]; + coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex); + coordArr[targetCoordIndex] = data.get(calcDataDim, dataIndex); + var coordArrValue = data.get(targetDataDim, dataIndex); // Make it simple, do not visit all stacked value to count precision. + + var precision = getPrecision(data.get(targetDataDim, dataIndex)); + precision = Math.min(precision, 20); + + if (precision >= 0) { + coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision); + } + + return [coordArr, coordArrValue]; + } // TODO Specified percent + + + var markerTypeCalculator = { + min: curry(markerTypeCalculatorWithExtent, 'min'), + max: curry(markerTypeCalculatorWithExtent, 'max'), + average: curry(markerTypeCalculatorWithExtent, 'average'), + median: curry(markerTypeCalculatorWithExtent, 'median') + }; + + /** + * Transform markPoint data item to format used in List by do the following + * 1. Calculate statistic like `max`, `min`, `average` + * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array + */ + + function dataTransform(seriesModel, item) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; // 1. If not specify the position with pixel directly + // 2. If `coord` is not a data array. Which uses `xAxis`, + // `yAxis` to specify the coord on each dimension + // parseFloat first because item.x and item.y can be percent string like '20%' + + if (item && !hasXAndY(item) && !isArray(item.coord) && coordSys) { + var dims = coordSys.dimensions; + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); // Clone the option + // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value + + item = clone(item); + + if (item.type && markerTypeCalculator[item.type] && axisInfo.baseAxis && axisInfo.valueAxis) { + var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim); + var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim); + var coordInfo = markerTypeCalculator[item.type](data, axisInfo.baseDataDim, axisInfo.valueDataDim, otherCoordIndex, targetCoordIndex); + item.coord = coordInfo[0]; // Force to use the value of calculated value. + // let item use the value without stack. + + item.value = coordInfo[1]; + } else { + // FIXME Only has one of xAxis and yAxis. + var coord = [item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis]; // Each coord support max, min, average + + for (var i = 0; i < 2; i++) { + if (markerTypeCalculator[coord[i]]) { + coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]); + } + } + + item.coord = coord; + } + } + + return item; + } + + function getAxisInfo$1(item, data, coordSys, seriesModel) { + var ret = {}; + + if (item.valueIndex != null || item.valueDim != null) { + ret.valueDataDim = item.valueIndex != null ? data.getDimension(item.valueIndex) : item.valueDim; + ret.valueAxis = coordSys.getAxis(dataDimToCoordDim(seriesModel, ret.valueDataDim)); + ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + } else { + ret.baseAxis = seriesModel.getBaseAxis(); + ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + ret.valueDataDim = data.mapDimension(ret.valueAxis.dim); + } + + return ret; + } + + function dataDimToCoordDim(seriesModel, dataDim) { + var dimItem = seriesModel.getData().getDimensionInfo(dataDim); + return dimItem && dimItem.coordDim; + } + + /** + * Filter data which is out of coordinateSystem range + * [dataFilter description] + */ + + + function dataFilter$1( // Currently only polar and cartesian has containData. + coordSys, item) { + // Alwalys return true if there is no coordSys + return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true; + } + + function createMarkerDimValueGetter(inCoordSys, dims) { + return inCoordSys ? function (item, dimName, dataIndex, dimIndex) { + var rawVal = dimIndex < 2 // x, y, radius, angle + ? item.coord && item.coord[dimIndex] : item.value; + return parseDataValue(rawVal, dims[dimIndex]); + } : function (item, dimName, dataIndex, dimIndex) { + return parseDataValue(item.value, dims[dimIndex]); + }; + } + + function numCalculate(data, valueDataDim, type) { + if (type === 'average') { + var sum_1 = 0; + var count_1 = 0; + data.each(valueDataDim, function (val, idx) { + if (!isNaN(val)) { + sum_1 += val; + count_1++; + } + }); + return sum_1 / count_1; + } else if (type === 'median') { + return data.getMedian(valueDataDim); + } else { + // max & min + return data.getDataExtent(valueDataDim)[type === 'max' ? 1 : 0]; + } + } + + var inner$h = makeInner(); + + var MarkerView = + /** @class */ + function (_super) { + __extends(MarkerView, _super); + + function MarkerView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkerView.type; + return _this; + } + + MarkerView.prototype.init = function () { + this.markerGroupMap = createHashMap(); + }; + + MarkerView.prototype.render = function (markerModel, ecModel, api) { + var _this = this; + + var markerGroupMap = this.markerGroupMap; + markerGroupMap.each(function (item) { + inner$h(item).keep = false; + }); + ecModel.eachSeries(function (seriesModel) { + var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); + markerModel && _this.renderSeries(seriesModel, markerModel, ecModel, api); + }); + markerGroupMap.each(function (item) { + !inner$h(item).keep && _this.group.remove(item.group); + }); + }; + + MarkerView.prototype.markKeep = function (drawGroup) { + inner$h(drawGroup).keep = true; + }; + + MarkerView.prototype.toggleBlurSeries = function (seriesModelList, isBlur) { + var _this = this; + + each(seriesModelList, function (seriesModel) { + var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type); + + if (markerModel) { + var data = markerModel.getData(); + data.eachItemGraphicEl(function (el) { + if (el) { + isBlur ? enterBlur(el) : leaveBlur(el); + } + }); + } + }); + }; + + MarkerView.type = 'marker'; + return MarkerView; + }(ComponentView); + + function updateMarkerLayout(mpData, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } // Chart like bar may have there own marker positioning logic + else if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition(mpData.getValues(mpData.dimensions, idx)); + } else if (coordSys) { + var x = mpData.get(coordSys.dimensions[0], idx); + var y = mpData.get(coordSys.dimensions[1], idx); + point = coordSys.dataToPoint([x, y]); + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + + mpData.setItemLayout(idx, point); + }); + } + + var MarkPointView = + /** @class */ + function (_super) { + __extends(MarkPointView, _super); + + function MarkPointView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkPointView.type; + return _this; + } + + MarkPointView.prototype.updateTransform = function (markPointModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mpModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markPoint'); + + if (mpModel) { + updateMarkerLayout(mpModel.getData(), seriesModel, api); + this.markerGroupMap.get(seriesModel.id).updateLayout(); + } + }, this); + }; + + MarkPointView.prototype.renderSeries = function (seriesModel, mpModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var symbolDrawMap = this.markerGroupMap; + var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw()); + var mpData = createData(coordSys, seriesModel, mpModel); // FIXME + + mpModel.setData(mpData); + updateMarkerLayout(mpModel.getData(), seriesModel, api); + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var symbol = itemModel.getShallow('symbol'); + var symbolSize = itemModel.getShallow('symbolSize'); + var symbolRotate = itemModel.getShallow('symbolRotate'); + var symbolOffset = itemModel.getShallow('symbolOffset'); + var symbolKeepAspect = itemModel.getShallow('symbolKeepAspect'); // TODO: refactor needed: single data item should not support callback function + + if (isFunction(symbol) || isFunction(symbolSize) || isFunction(symbolRotate) || isFunction(symbolOffset)) { + var rawIdx = mpModel.getRawValue(idx); + var dataParams = mpModel.getDataParams(idx); + + if (isFunction(symbol)) { + symbol = symbol(rawIdx, dataParams); + } + + if (isFunction(symbolSize)) { + // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据? + symbolSize = symbolSize(rawIdx, dataParams); + } + + if (isFunction(symbolRotate)) { + symbolRotate = symbolRotate(rawIdx, dataParams); + } + + if (isFunction(symbolOffset)) { + symbolOffset = symbolOffset(rawIdx, dataParams); + } + } + + var style = itemModel.getModel('itemStyle').getItemStyle(); + var color = getVisualFromData(seriesData, 'color'); + + if (!style.fill) { + style.fill = color; + } + + mpData.setItemVisual(idx, { + symbol: symbol, + symbolSize: symbolSize, + symbolRotate: symbolRotate, + symbolOffset: symbolOffset, + symbolKeepAspect: symbolKeepAspect, + style: style + }); + }); // TODO Text are wrong + + symbolDraw.updateData(mpData); + this.group.add(symbolDraw.group); // Set host model for tooltip + // FIXME + + mpData.eachItemGraphicEl(function (el) { + el.traverse(function (child) { + getECData(child).dataModel = mpModel; + }); + }); + this.markKeep(symbolDraw); + symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent'); + }; + + MarkPointView.type = 'markPoint'; + return MarkPointView; + }(MarkerView); + + function createData(coordSys, seriesModel, mpModel) { + var coordDimsInfos; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + } else { + coordDimsInfos = [{ + name: 'value', + type: 'float' + }]; + } + + var mpData = new SeriesData(coordDimsInfos, mpModel); + var dataOpt = map(mpModel.get('data'), curry(dataTransform, seriesModel)); + + if (coordSys) { + dataOpt = filter(dataOpt, curry(dataFilter$1, coordSys)); + } + + var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos); + mpData.initData(dataOpt, null, dimValueGetter); + return mpData; + } + + function install$E(registers) { + registers.registerComponentModel(MarkPointModel); + registers.registerComponentView(MarkPointView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markPoint')) { + // Make sure markPoint component is enabled + opt.markPoint = opt.markPoint || {}; + } + }); + } + + var MarkLineModel = + /** @class */ + function (_super) { + __extends(MarkLineModel, _super); + + function MarkLineModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkLineModel.type; + return _this; + } + + MarkLineModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkLineModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkLineModel.type = 'markLine'; + MarkLineModel.defaultOption = { + // zlevel: 0, + z: 5, + symbol: ['circle', 'arrow'], + symbolSize: [8, 16], + //symbolRotate: 0, + symbolOffset: 0, + precision: 2, + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'end', + distance: 5 + }, + lineStyle: { + type: 'dashed' + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + width: 3 + } + }, + animationEasing: 'linear' + }; + return MarkLineModel; + }(MarkerModel); + + var inner$i = makeInner(); + + var markLineTransform = function (seriesModel, coordSys, mlModel, item) { + var data = seriesModel.getData(); + var itemArray; + + if (!isArray(item)) { + // Special type markLine like 'min', 'max', 'average', 'median' + var mlType = item.type; + + if (mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median' // In case + // data: [{ + // yAxis: 10 + // }] + || item.xAxis != null || item.yAxis != null) { + var valueAxis = void 0; + var value = void 0; + + if (item.yAxis != null || item.xAxis != null) { + valueAxis = coordSys.getAxis(item.yAxis != null ? 'y' : 'x'); + value = retrieve(item.yAxis, item.xAxis); + } else { + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); + valueAxis = axisInfo.valueAxis; + var valueDataDim = getStackedDimension(data, axisInfo.valueDataDim); + value = numCalculate(data, valueDataDim, mlType); + } + + var valueIndex = valueAxis.dim === 'x' ? 0 : 1; + var baseIndex = 1 - valueIndex; // Normized to 2d data with start and end point + + var mlFrom = clone(item); + var mlTo = { + coord: [] + }; + mlFrom.type = null; + mlFrom.coord = []; + mlFrom.coord[baseIndex] = -Infinity; + mlTo.coord[baseIndex] = Infinity; + var precision = mlModel.get('precision'); + + if (precision >= 0 && isNumber(value)) { + value = +value.toFixed(Math.min(precision, 20)); + } + + mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value; + itemArray = [mlFrom, mlTo, { + type: mlType, + valueIndex: item.valueIndex, + // Force to use the value of calculated value. + value: value + }]; + } else { + // Invalid data + if ("development" !== 'production') { + logError('Invalid markLine data.'); + } + + itemArray = []; + } + } else { + itemArray = item; + } + + var normalizedItem = [dataTransform(seriesModel, itemArray[0]), dataTransform(seriesModel, itemArray[1]), extend({}, itemArray[2])]; // Avoid line data type is extended by from(to) data type + + normalizedItem[2].type = normalizedItem[2].type || null; // Merge from option and to option into line option + + merge(normalizedItem[2], normalizedItem[0]); + merge(normalizedItem[2], normalizedItem[1]); + return normalizedItem; + }; + + function isInifinity(val) { + return !isNaN(val) && !isFinite(val); + } // If a markLine has one dim + + + function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + var dimName = coordSys.dimensions[dimIndex]; + return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]); + } + + function markLineFilter(coordSys, item) { + if (coordSys.type === 'cartesian2d') { + var fromCoord = item[0].coord; + var toCoord = item[1].coord; // In case + // { + // markLine: { + // data: [{ yAxis: 2 }] + // } + // } + + if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) { + return true; + } + } + + return dataFilter$1(coordSys, item[0]) && dataFilter$1(coordSys, item[1]); + } + + function updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition(data.getValues(data.dimensions, idx)); + } else { + var dims = coordSys.dimensions; + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + point = coordSys.dataToPoint([x, y]); + } // Expand line to the edge of grid if value on one axis is Inifnity + // In case + // markLine: { + // data: [{ + // yAxis: 2 + // // or + // type: 'average' + // }] + // } + + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var dims = coordSys.dimensions; + + if (isInifinity(data.get(dims[0], idx))) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]); + } else if (isInifinity(data.get(dims[1], idx))) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]); + } + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + data.setItemLayout(idx, point); + } + + var MarkLineView = + /** @class */ + function (_super) { + __extends(MarkLineView, _super); + + function MarkLineView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkLineView.type; + return _this; + } + + MarkLineView.prototype.updateTransform = function (markLineModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mlModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markLine'); + + if (mlModel) { + var mlData_1 = mlModel.getData(); + var fromData_1 = inner$i(mlModel).from; + var toData_1 = inner$i(mlModel).to; // Update visual and layout of from symbol and to symbol + + fromData_1.each(function (idx) { + updateSingleMarkerEndLayout(fromData_1, idx, true, seriesModel, api); + updateSingleMarkerEndLayout(toData_1, idx, false, seriesModel, api); + }); // Update layout of line + + mlData_1.each(function (idx) { + mlData_1.setItemLayout(idx, [fromData_1.getItemLayout(idx), toData_1.getItemLayout(idx)]); + }); + this.markerGroupMap.get(seriesModel.id).updateLayout(); + } + }, this); + }; + + MarkLineView.prototype.renderSeries = function (seriesModel, mlModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var lineDrawMap = this.markerGroupMap; + var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw()); + this.group.add(lineDraw.group); + var mlData = createList$1(coordSys, seriesModel, mlModel); + var fromData = mlData.from; + var toData = mlData.to; + var lineData = mlData.line; + inner$i(mlModel).from = fromData; + inner$i(mlModel).to = toData; // Line data for tooltip and formatter + + mlModel.setData(lineData); // TODO + // Functionally, `symbolSize` & `symbolOffset` can also be 2D array now. + // But the related logic and type definition are not finished yet. + // Finish it if required + + var symbolType = mlModel.get('symbol'); + var symbolSize = mlModel.get('symbolSize'); + var symbolRotate = mlModel.get('symbolRotate'); + var symbolOffset = mlModel.get('symbolOffset'); // TODO: support callback function like markPoint + + if (!isArray(symbolType)) { + symbolType = [symbolType, symbolType]; + } + + if (!isArray(symbolSize)) { + symbolSize = [symbolSize, symbolSize]; + } + + if (!isArray(symbolRotate)) { + symbolRotate = [symbolRotate, symbolRotate]; + } + + if (!isArray(symbolOffset)) { + symbolOffset = [symbolOffset, symbolOffset]; + } // Update visual and layout of from symbol and to symbol + + + mlData.from.each(function (idx) { + updateDataVisualAndLayout(fromData, idx, true); + updateDataVisualAndLayout(toData, idx, false); + }); // Update visual and layout of line + + lineData.each(function (idx) { + var lineStyle = lineData.getItemModel(idx).getModel('lineStyle').getLineStyle(); // lineData.setItemVisual(idx, { + // color: lineColor || fromData.getItemVisual(idx, 'color') + // }); + + lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]); + + if (lineStyle.stroke == null) { + lineStyle.stroke = fromData.getItemVisual(idx, 'style').fill; + } + + lineData.setItemVisual(idx, { + fromSymbolKeepAspect: fromData.getItemVisual(idx, 'symbolKeepAspect'), + fromSymbolOffset: fromData.getItemVisual(idx, 'symbolOffset'), + fromSymbolRotate: fromData.getItemVisual(idx, 'symbolRotate'), + fromSymbolSize: fromData.getItemVisual(idx, 'symbolSize'), + fromSymbol: fromData.getItemVisual(idx, 'symbol'), + toSymbolKeepAspect: toData.getItemVisual(idx, 'symbolKeepAspect'), + toSymbolOffset: toData.getItemVisual(idx, 'symbolOffset'), + toSymbolRotate: toData.getItemVisual(idx, 'symbolRotate'), + toSymbolSize: toData.getItemVisual(idx, 'symbolSize'), + toSymbol: toData.getItemVisual(idx, 'symbol'), + style: lineStyle + }); + }); + lineDraw.updateData(lineData); // Set host model for tooltip + // FIXME + + mlData.line.eachItemGraphicEl(function (el, idx) { + el.traverse(function (child) { + getECData(child).dataModel = mlModel; + }); + }); + + function updateDataVisualAndLayout(data, idx, isFrom) { + var itemModel = data.getItemModel(idx); + updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api); + var style = itemModel.getModel('itemStyle').getItemStyle(); + + if (style.fill == null) { + style.fill = getVisualFromData(seriesData, 'color'); + } + + data.setItemVisual(idx, { + symbolKeepAspect: itemModel.get('symbolKeepAspect'), + // `0` should be considered as a valid value, so use `retrieve2` instead of `||` + symbolOffset: retrieve2(itemModel.get('symbolOffset', true), symbolOffset[isFrom ? 0 : 1]), + symbolRotate: retrieve2(itemModel.get('symbolRotate', true), symbolRotate[isFrom ? 0 : 1]), + // TODO: when 2d array is supported, it should ignore parent + symbolSize: retrieve2(itemModel.get('symbolSize'), symbolSize[isFrom ? 0 : 1]), + symbol: retrieve2(itemModel.get('symbol', true), symbolType[isFrom ? 0 : 1]), + style: style + }); + } + + this.markKeep(lineDraw); + lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent'); + }; + + MarkLineView.type = 'markLine'; + return MarkLineView; + }(MarkerView); + + function createList$1(coordSys, seriesModel, mlModel) { + var coordDimsInfos; + + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + } else { + coordDimsInfos = [{ + name: 'value', + type: 'float' + }]; + } + + var fromData = new SeriesData(coordDimsInfos, mlModel); + var toData = new SeriesData(coordDimsInfos, mlModel); // No dimensions + + var lineData = new SeriesData([], mlModel); + var optData = map(mlModel.get('data'), curry(markLineTransform, seriesModel, coordSys, mlModel)); + + if (coordSys) { + optData = filter(optData, curry(markLineFilter, coordSys)); + } + + var dimValueGetter = createMarkerDimValueGetter(!!coordSys, coordDimsInfos); + fromData.initData(map(optData, function (item) { + return item[0]; + }), null, dimValueGetter); + toData.initData(map(optData, function (item) { + return item[1]; + }), null, dimValueGetter); + lineData.initData(map(optData, function (item) { + return item[2]; + })); + lineData.hasItemOption = true; + return { + from: fromData, + to: toData, + line: lineData + }; + } + + function install$F(registers) { + registers.registerComponentModel(MarkLineModel); + registers.registerComponentView(MarkLineView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markLine')) { + // Make sure markLine component is enabled + opt.markLine = opt.markLine || {}; + } + }); + } + + var MarkAreaModel = + /** @class */ + function (_super) { + __extends(MarkAreaModel, _super); + + function MarkAreaModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkAreaModel.type; + return _this; + } + + MarkAreaModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) { + return new MarkAreaModel(markerOpt, masterMarkerModel, ecModel); + }; + + MarkAreaModel.type = 'markArea'; + MarkAreaModel.defaultOption = { + // zlevel: 0, + // PENDING + z: 1, + tooltip: { + trigger: 'item' + }, + // markArea should fixed on the coordinate system + animation: false, + label: { + show: true, + position: 'top' + }, + itemStyle: { + // color and borderColor default to use color from series + // color: 'auto' + // borderColor: 'auto' + borderWidth: 0 + }, + emphasis: { + label: { + show: true, + position: 'top' + } + } + }; + return MarkAreaModel; + }(MarkerModel); + + var inner$j = makeInner(); + + var markAreaTransform = function (seriesModel, coordSys, maModel, item) { + var lt = dataTransform(seriesModel, item[0]); + var rb = dataTransform(seriesModel, item[1]); // FIXME make sure lt is less than rb + + var ltCoord = lt.coord; + var rbCoord = rb.coord; + ltCoord[0] = retrieve(ltCoord[0], -Infinity); + ltCoord[1] = retrieve(ltCoord[1], -Infinity); + rbCoord[0] = retrieve(rbCoord[0], Infinity); + rbCoord[1] = retrieve(rbCoord[1], Infinity); // Merge option into one + + var result = mergeAll([{}, lt, rb]); + result.coord = [lt.coord, rb.coord]; + result.x0 = lt.x; + result.y0 = lt.y; + result.x1 = rb.x; + result.y1 = rb.y; + return result; + }; + + function isInifinity$1(val) { + return !isNaN(val) && !isFinite(val); + } // If a markArea has one dim + + + function ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + return isInifinity$1(fromCoord[otherDimIndex]) && isInifinity$1(toCoord[otherDimIndex]); + } + + function markAreaFilter(coordSys, item) { + var fromCoord = item.coord[0]; + var toCoord = item.coord[1]; + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // In case + // { + // markArea: { + // data: [{ yAxis: 2 }] + // } + // } + if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord))) { + return true; + } + } + + return dataFilter$1(coordSys, { + coord: fromCoord, + x: item.x0, + y: item.y0 + }) || dataFilter$1(coordSys, { + coord: toCoord, + x: item.x1, + y: item.y1 + }); + } // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0'] + + + function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get(dims[0]), api.getWidth()); + var yPx = parsePercent$1(itemModel.get(dims[1]), api.getHeight()); + + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition(data.getValues(dims, idx)); + } else { + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + var pt = [x, y]; + coordSys.clampData && coordSys.clampData(pt, pt); + point = coordSys.dataToPoint(pt, true); + } + + if (isCoordinateSystemType(coordSys, 'cartesian2d')) { + // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + + if (isInifinity$1(x)) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]); + } else if (isInifinity$1(y)) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]); + } + } // Use x, y if has any + + + if (!isNaN(xPx)) { + point[0] = xPx; + } + + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + return point; + } + + var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']]; + + var MarkAreaView = + /** @class */ + function (_super) { + __extends(MarkAreaView, _super); + + function MarkAreaView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = MarkAreaView.type; + return _this; + } + + MarkAreaView.prototype.updateTransform = function (markAreaModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markArea'); + + if (maModel) { + var areaData_1 = maModel.getData(); + areaData_1.each(function (idx) { + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api); + }); // Layout + + areaData_1.setItemLayout(idx, points); + var el = areaData_1.getItemGraphicEl(idx); + el.setShape('points', points); + }); + } + }, this); + }; + + MarkAreaView.prototype.renderSeries = function (seriesModel, maModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + var areaGroupMap = this.markerGroupMap; + var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, { + group: new Group() + }); + this.group.add(polygonGroup.group); + this.markKeep(polygonGroup); + var areaData = createList$2(coordSys, seriesModel, maModel); // Line data for tooltip and formatter + + maModel.setData(areaData); // Update visual and layout of line + + areaData.each(function (idx) { + // Layout + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); + }); + var xAxisScale = coordSys.getAxis('x').scale; + var yAxisScale = coordSys.getAxis('y').scale; + var xAxisExtent = xAxisScale.getExtent(); + var yAxisExtent = yAxisScale.getExtent(); + var xPointExtent = [xAxisScale.parse(areaData.get('x0', idx)), xAxisScale.parse(areaData.get('x1', idx))]; + var yPointExtent = [yAxisScale.parse(areaData.get('y0', idx)), yAxisScale.parse(areaData.get('y1', idx))]; + asc(xPointExtent); + asc(yPointExtent); + var overlapped = !(xAxisExtent[0] > xPointExtent[1] || xAxisExtent[1] < xPointExtent[0] || yAxisExtent[0] > yPointExtent[1] || yAxisExtent[1] < yPointExtent[0]); // If none of the area is inside coordSys, allClipped is set to be true + // in layout so that label will not be displayed. See #12591 + + var allClipped = !overlapped; + areaData.setItemLayout(idx, { + points: points, + allClipped: allClipped + }); + var style = areaData.getItemModel(idx).getModel('itemStyle').getItemStyle(); + var color$1 = getVisualFromData(seriesData, 'color'); + + if (!style.fill) { + style.fill = color$1; + + if (isString(style.fill)) { + style.fill = modifyAlpha(style.fill, 0.4); + } + } + + if (!style.stroke) { + style.stroke = color$1; + } // Visual + + + areaData.setItemVisual(idx, 'style', style); + }); + areaData.diff(inner$j(polygonGroup).data).add(function (idx) { + var layout = areaData.getItemLayout(idx); + + if (!layout.allClipped) { + var polygon = new Polygon({ + shape: { + points: layout.points + } + }); + areaData.setItemGraphicEl(idx, polygon); + polygonGroup.group.add(polygon); + } + }).update(function (newIdx, oldIdx) { + var polygon = inner$j(polygonGroup).data.getItemGraphicEl(oldIdx); + var layout = areaData.getItemLayout(newIdx); + + if (!layout.allClipped) { + if (polygon) { + updateProps(polygon, { + shape: { + points: layout.points + } + }, maModel, newIdx); + } else { + polygon = new Polygon({ + shape: { + points: layout.points + } + }); + } + + areaData.setItemGraphicEl(newIdx, polygon); + polygonGroup.group.add(polygon); + } else if (polygon) { + polygonGroup.group.remove(polygon); + } + }).remove(function (idx) { + var polygon = inner$j(polygonGroup).data.getItemGraphicEl(idx); + polygonGroup.group.remove(polygon); + }).execute(); + areaData.eachItemGraphicEl(function (polygon, idx) { + var itemModel = areaData.getItemModel(idx); + var style = areaData.getItemVisual(idx, 'style'); + polygon.useStyle(areaData.getItemVisual(idx, 'style')); + setLabelStyle(polygon, getLabelStatesModels(itemModel), { + labelFetcher: maModel, + labelDataIndex: idx, + defaultText: areaData.getName(idx) || '', + inheritColor: isString(style.fill) ? modifyAlpha(style.fill, 1) : '#000' + }); + setStatesStylesFromModel(polygon, itemModel); + toggleHoverEmphasis(polygon, null, null, itemModel.get(['emphasis', 'disabled'])); + getECData(polygon).dataModel = maModel; + }); + inner$j(polygonGroup).data = areaData; + polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent'); + }; + + MarkAreaView.type = 'markArea'; + return MarkAreaView; + }(MarkerView); + + function createList$2(coordSys, seriesModel, maModel) { + var areaData; + var dataDims; + var dims = ['x0', 'y0', 'x1', 'y1']; + + if (coordSys) { + var coordDimsInfos_1 = map(coordSys && coordSys.dimensions, function (coordDim) { + var data = seriesModel.getData(); + var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + + return extend(extend({}, info), { + name: coordDim, + // DON'T use ordinalMeta to parse and collect ordinal. + ordinalMeta: null + }); + }); + dataDims = map(dims, function (dim, idx) { + return { + name: dim, + type: coordDimsInfos_1[idx % 2].type + }; + }); + areaData = new SeriesData(dataDims, maModel); + } else { + dataDims = [{ + name: 'value', + type: 'float' + }]; + areaData = new SeriesData(dataDims, maModel); + } + + var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel)); + + if (coordSys) { + optData = filter(optData, curry(markAreaFilter, coordSys)); + } + + var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) { + // TODO should convert to ParsedValue? + var rawVal = item.coord[Math.floor(dimIndex / 2)][dimIndex % 2]; + return parseDataValue(rawVal, dataDims[dimIndex]); + } : function (item, dimName, dataIndex, dimIndex) { + return parseDataValue(item.value, dataDims[dimIndex]); + }; + areaData.initData(optData, null, dimValueGetter); + areaData.hasItemOption = true; + return areaData; + } + + function install$G(registers) { + registers.registerComponentModel(MarkAreaModel); + registers.registerComponentView(MarkAreaView); + registers.registerPreprocessor(function (opt) { + if (checkMarkerInSeries(opt.series, 'markArea')) { + // Make sure markArea component is enabled + opt.markArea = opt.markArea || {}; + } + }); + } + + var getDefaultSelectorOptions = function (ecModel, type) { + if (type === 'all') { + return { + type: 'all', + title: ecModel.getLocaleModel().get(['legend', 'selector', 'all']) + }; + } else if (type === 'inverse') { + return { + type: 'inverse', + title: ecModel.getLocaleModel().get(['legend', 'selector', 'inverse']) + }; + } + }; + + var LegendModel = + /** @class */ + function (_super) { + __extends(LegendModel, _super); + + function LegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LegendModel.type; + _this.layoutMode = { + type: 'box', + // legend.width/height are maxWidth/maxHeight actually, + // whereas realy width/height is calculated by its content. + // (Setting {left: 10, right: 10} does not make sense). + // So consider the case: + // `setOption({legend: {left: 10});` + // then `setOption({legend: {right: 10});` + // The previous `left` should be cleared by setting `ignoreSize`. + ignoreSize: true + }; + return _this; + } + + LegendModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + option.selected = option.selected || {}; + + this._updateSelector(option); + }; + + LegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + + this._updateSelector(option); + }; + + LegendModel.prototype._updateSelector = function (option) { + var selector = option.selector; + var ecModel = this.ecModel; + + if (selector === true) { + selector = option.selector = ['all', 'inverse']; + } + + if (isArray(selector)) { + each(selector, function (item, index) { + isString(item) && (item = { + type: item + }); + selector[index] = merge(item, getDefaultSelectorOptions(ecModel, item.type)); + }); + } + }; + + LegendModel.prototype.optionUpdated = function () { + this._updateData(this.ecModel); + + var legendData = this._data; // If selectedMode is single, try to select one + + if (legendData[0] && this.get('selectedMode') === 'single') { + var hasSelected = false; // If has any selected in option.selected + + for (var i = 0; i < legendData.length; i++) { + var name_1 = legendData[i].get('name'); + + if (this.isSelected(name_1)) { + // Force to unselect others + this.select(name_1); + hasSelected = true; + break; + } + } // Try select the first if selectedMode is single + + + !hasSelected && this.select(legendData[0].get('name')); + } + }; + + LegendModel.prototype._updateData = function (ecModel) { + var potentialData = []; + var availableNames = []; + ecModel.eachRawSeries(function (seriesModel) { + var seriesName = seriesModel.name; + availableNames.push(seriesName); + var isPotential; + + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + var names = provider.getAllNames(); + + if (!ecModel.isSeriesFiltered(seriesModel)) { + availableNames = availableNames.concat(names); + } + + if (names.length) { + potentialData = potentialData.concat(names); + } else { + isPotential = true; + } + } else { + isPotential = true; + } + + if (isPotential && isNameSpecified(seriesModel)) { + potentialData.push(seriesModel.name); + } + }); + /** + * @type {Array.} + * @private + */ + + this._availableNames = availableNames; // If legend.data not specified in option, use availableNames as data, + // which is convinient for user preparing option. + + var rawData = this.get('data') || potentialData; + var legendData = map(rawData, function (dataItem) { + // Can be string or number + if (isString(dataItem) || isNumber(dataItem)) { + dataItem = { + name: dataItem + }; + } + + return new Model(dataItem, this, this.ecModel); + }, this); + /** + * @type {Array.} + * @private + */ + + this._data = legendData; + }; + + LegendModel.prototype.getData = function () { + return this._data; + }; + + LegendModel.prototype.select = function (name) { + var selected = this.option.selected; + var selectedMode = this.get('selectedMode'); + + if (selectedMode === 'single') { + var data = this._data; + each(data, function (dataItem) { + selected[dataItem.get('name')] = false; + }); + } + + selected[name] = true; + }; + + LegendModel.prototype.unSelect = function (name) { + if (this.get('selectedMode') !== 'single') { + this.option.selected[name] = false; + } + }; + + LegendModel.prototype.toggleSelected = function (name) { + var selected = this.option.selected; // Default is true + + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + + this[selected[name] ? 'unSelect' : 'select'](name); + }; + + LegendModel.prototype.allSelect = function () { + var data = this._data; + var selected = this.option.selected; + each(data, function (dataItem) { + selected[dataItem.get('name', true)] = true; + }); + }; + + LegendModel.prototype.inverseSelect = function () { + var data = this._data; + var selected = this.option.selected; + each(data, function (dataItem) { + var name = dataItem.get('name', true); // Initially, default value is true + + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + + selected[name] = !selected[name]; + }); + }; + + LegendModel.prototype.isSelected = function (name) { + var selected = this.option.selected; + return !(selected.hasOwnProperty(name) && !selected[name]) && indexOf(this._availableNames, name) >= 0; + }; + + LegendModel.prototype.getOrient = function () { + return this.get('orient') === 'vertical' ? { + index: 1, + name: 'vertical' + } : { + index: 0, + name: 'horizontal' + }; + }; + + LegendModel.type = 'legend.plain'; + LegendModel.dependencies = ['series']; + LegendModel.defaultOption = { + // zlevel: 0, + z: 4, + show: true, + orient: 'horizontal', + left: 'center', + // right: 'center', + top: 0, + // bottom: null, + align: 'auto', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + borderRadius: 0, + borderWidth: 0, + padding: 5, + itemGap: 10, + itemWidth: 25, + itemHeight: 14, + symbolRotate: 'inherit', + symbolKeepAspect: true, + inactiveColor: '#ccc', + inactiveBorderColor: '#ccc', + inactiveBorderWidth: 'auto', + itemStyle: { + color: 'inherit', + opacity: 'inherit', + borderColor: 'inherit', + borderWidth: 'auto', + borderCap: 'inherit', + borderJoin: 'inherit', + borderDashOffset: 'inherit', + borderMiterLimit: 'inherit' + }, + lineStyle: { + width: 'auto', + color: 'inherit', + inactiveColor: '#ccc', + inactiveWidth: 2, + opacity: 'inherit', + type: 'inherit', + cap: 'inherit', + join: 'inherit', + dashOffset: 'inherit', + miterLimit: 'inherit' + }, + textStyle: { + color: '#333' + }, + selectedMode: true, + selector: false, + selectorLabel: { + show: true, + borderRadius: 10, + padding: [3, 5, 3, 5], + fontSize: 12, + fontFamily: 'sans-serif', + color: '#666', + borderWidth: 1, + borderColor: '#666' + }, + emphasis: { + selectorLabel: { + show: true, + color: '#eee', + backgroundColor: '#666' + } + }, + selectorPosition: 'auto', + selectorItemGap: 7, + selectorButtonGap: 10, + tooltip: { + show: false + } + }; + return LegendModel; + }(ComponentModel); + + var curry$1 = curry; + var each$c = each; + var Group$2 = Group; + + var LegendView = + /** @class */ + function (_super) { + __extends(LegendView, _super); + + function LegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = LegendView.type; + _this.newlineDisabled = false; + return _this; + } + + LegendView.prototype.init = function () { + this.group.add(this._contentGroup = new Group$2()); + this.group.add(this._selectorGroup = new Group$2()); + this._isFirstRender = true; + }; + /** + * @protected + */ + + + LegendView.prototype.getContentGroup = function () { + return this._contentGroup; + }; + /** + * @protected + */ + + + LegendView.prototype.getSelectorGroup = function () { + return this._selectorGroup; + }; + /** + * @override + */ + + + LegendView.prototype.render = function (legendModel, ecModel, api) { + var isFirstRender = this._isFirstRender; + this._isFirstRender = false; + this.resetInner(); + + if (!legendModel.get('show', true)) { + return; + } + + var itemAlign = legendModel.get('align'); + var orient = legendModel.get('orient'); + + if (!itemAlign || itemAlign === 'auto') { + itemAlign = legendModel.get('left') === 'right' && orient === 'vertical' ? 'right' : 'left'; + } // selector has been normalized to an array in model + + + var selector = legendModel.get('selector', true); + var selectorPosition = legendModel.get('selectorPosition', true); + + if (selector && (!selectorPosition || selectorPosition === 'auto')) { + selectorPosition = orient === 'horizontal' ? 'end' : 'start'; + } + + this.renderInner(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); // Perform layout. + + var positionInfo = legendModel.getBoxLayoutParams(); + var viewportSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var padding = legendModel.get('padding'); + var maxSize = getLayoutRect(positionInfo, viewportSize, padding); + var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition); // Place mainGroup, based on the calculated `mainRect`. + + var layoutRect = getLayoutRect(defaults({ + width: mainRect.width, + height: mainRect.height + }, positionInfo), viewportSize, padding); + this.group.x = layoutRect.x - mainRect.x; + this.group.y = layoutRect.y - mainRect.y; + this.group.markRedraw(); // Render background after group is layout. + + this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel)); + }; + + LegendView.prototype.resetInner = function () { + this.getContentGroup().removeAll(); + this._backgroundEl && this.group.remove(this._backgroundEl); + this.getSelectorGroup().removeAll(); + }; + + LegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var contentGroup = this.getContentGroup(); + var legendDrawnMap = createHashMap(); + var selectMode = legendModel.get('selectedMode'); + var excludeSeriesId = []; + ecModel.eachRawSeries(function (seriesModel) { + !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id); + }); + each$c(legendModel.getData(), function (legendItemModel, dataIndex) { + var name = legendItemModel.get('name'); // Use empty string or \n as a newline string + + if (!this.newlineDisabled && (name === '' || name === '\n')) { + var g = new Group$2(); // @ts-ignore + + g.newline = true; + contentGroup.add(g); + return; + } // Representitive series. + + + var seriesModel = ecModel.getSeriesByName(name)[0]; + + if (legendDrawnMap.get(name)) { + // Have been drawed + return; + } // Legend to control series. + + + if (seriesModel) { + var data = seriesModel.getData(); + var lineVisualStyle = data.getVisual('legendLineStyle') || {}; + var legendIcon = data.getVisual('legendIcon'); + /** + * `data.getVisual('style')` may be the color from the register + * in series. For example, for line series, + */ + + var style = data.getVisual('style'); + + var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode); + + itemGroup.on('click', curry$1(dispatchSelectAction, name, null, api, excludeSeriesId)).on('mouseover', curry$1(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId)); + legendDrawnMap.set(name, true); + } else { + // Legend to control data. In pie and funnel. + ecModel.eachRawSeries(function (seriesModel) { + // In case multiple series has same data name + if (legendDrawnMap.get(name)) { + return; + } + + if (seriesModel.legendVisualProvider) { + var provider = seriesModel.legendVisualProvider; + + if (!provider.containName(name)) { + return; + } + + var idx = provider.indexOfName(name); + var style = provider.getItemVisual(idx, 'style'); + var legendIcon = provider.getItemVisual(idx, 'legendIcon'); + var colorArr = parse(style.fill); // Color may be set to transparent in visualMap when data is out of range. + // Do not show nothing. + + if (colorArr && colorArr[3] === 0) { + colorArr[3] = 0.2; // TODO color is set to 0, 0, 0, 0. Should show correct RGBA + + style = extend(extend({}, style), { + fill: stringify(colorArr, 'rgba') + }); + } + + var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style, legendIcon, selectMode); // FIXME: consider different series has items with the same name. + + + itemGroup.on('click', curry$1(dispatchSelectAction, null, name, api, excludeSeriesId)) // Should not specify the series name, consider legend controls + // more than one pie series. + .on('mouseover', curry$1(dispatchHighlightAction, null, name, api, excludeSeriesId)).on('mouseout', curry$1(dispatchDownplayAction, null, name, api, excludeSeriesId)); + legendDrawnMap.set(name, true); + } + }, this); + } + + if ("development" !== 'production') { + if (!legendDrawnMap.get(name)) { + console.warn(name + ' series not exists. Legend data should be same with series name or data name.'); + } + } + }, this); + + if (selector) { + this._createSelector(selector, legendModel, api, orient, selectorPosition); + } + }; + + LegendView.prototype._createSelector = function (selector, legendModel, api, orient, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + each$c(selector, function createSelectorButton(selectorItem) { + var type = selectorItem.type; + var labelText = new ZRText({ + style: { + x: 0, + y: 0, + align: 'center', + verticalAlign: 'middle' + }, + onclick: function () { + api.dispatchAction({ + type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect' + }); + } + }); + selectorGroup.add(labelText); + var labelModel = legendModel.getModel('selectorLabel'); + var emphasisLabelModel = legendModel.getModel(['emphasis', 'selectorLabel']); + setLabelStyle(labelText, { + normal: labelModel, + emphasis: emphasisLabelModel + }, { + defaultText: selectorItem.title + }); + enableHoverEmphasis(labelText); + }); + }; + + LegendView.prototype._createItem = function (seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode) { + var drawType = seriesModel.visualDrawType; + var itemWidth = legendModel.get('itemWidth'); + var itemHeight = legendModel.get('itemHeight'); + var isSelected = legendModel.isSelected(name); + var iconRotate = legendItemModel.get('symbolRotate'); + var symbolKeepAspect = legendItemModel.get('symbolKeepAspect'); + var legendIconType = legendItemModel.get('icon'); + legendIcon = legendIconType || legendIcon || 'roundRect'; + var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected); + var itemGroup = new Group$2(); + var textStyleModel = legendItemModel.getModel('textStyle'); + + if (isFunction(seriesModel.getLegendIcon) && (!legendIconType || legendIconType === 'inherit')) { + // Series has specific way to define legend icon + itemGroup.add(seriesModel.getLegendIcon({ + itemWidth: itemWidth, + itemHeight: itemHeight, + icon: legendIcon, + iconRotate: iconRotate, + itemStyle: style.itemStyle, + lineStyle: style.lineStyle, + symbolKeepAspect: symbolKeepAspect + })); + } else { + // Use default legend icon policy for most series + var rotate = legendIconType === 'inherit' && seriesModel.getData().getVisual('symbol') ? iconRotate === 'inherit' ? seriesModel.getData().getVisual('symbolRotate') : iconRotate : 0; // No rotation for no icon + + itemGroup.add(getDefaultLegendIcon({ + itemWidth: itemWidth, + itemHeight: itemHeight, + icon: legendIcon, + iconRotate: rotate, + itemStyle: style.itemStyle, + lineStyle: style.lineStyle, + symbolKeepAspect: symbolKeepAspect + })); + } + + var textX = itemAlign === 'left' ? itemWidth + 5 : -5; + var textAlign = itemAlign; + var formatter = legendModel.get('formatter'); + var content = name; + + if (isString(formatter) && formatter) { + content = formatter.replace('{name}', name != null ? name : ''); + } else if (isFunction(formatter)) { + content = formatter(name); + } + + var inactiveColor = legendItemModel.get('inactiveColor'); + itemGroup.add(new ZRText({ + style: createTextStyle(textStyleModel, { + text: content, + x: textX, + y: itemHeight / 2, + fill: isSelected ? textStyleModel.getTextColor() : inactiveColor, + align: textAlign, + verticalAlign: 'middle' + }) + })); // Add a invisible rect to increase the area of mouse hover + + var hitRect = new Rect({ + shape: itemGroup.getBoundingRect(), + invisible: true + }); + var tooltipModel = legendItemModel.getModel('tooltip'); + + if (tooltipModel.get('show')) { + setTooltipConfig({ + el: hitRect, + componentModel: legendModel, + itemName: name, + itemTooltipOption: tooltipModel.option + }); + } + + itemGroup.add(hitRect); + itemGroup.eachChild(function (child) { + child.silent = true; + }); + hitRect.silent = !selectMode; + this.getContentGroup().add(itemGroup); + enableHoverEmphasis(itemGroup); // @ts-ignore + + itemGroup.__legendDataIndex = dataIndex; + return itemGroup; + }; + + LegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var contentGroup = this.getContentGroup(); + var selectorGroup = this.getSelectorGroup(); // Place items in contentGroup. + + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), maxSize.width, maxSize.height); + var contentRect = contentGroup.getBoundingRect(); + var contentPos = [-contentRect.x, -contentRect.y]; + selectorGroup.markRedraw(); + contentGroup.markRedraw(); + + if (selector) { + // Place buttons in selectorGroup + box( // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var orientIdx = legendModel.getOrient().index; + var wh = orientIdx === 0 ? 'width' : 'height'; + var hw = orientIdx === 0 ? 'height' : 'width'; + var yx = orientIdx === 0 ? 'y' : 'x'; + + if (selectorPosition === 'end') { + selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap; + } else { + contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap; + } //Always align selector to content as 'middle' + + + selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2; + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + var mainRect = { + x: 0, + y: 0 + }; + mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]); + return mainRect; + } else { + contentGroup.x = contentPos[0]; + contentGroup.y = contentPos[1]; + return this.group.getBoundingRect(); + } + }; + /** + * @protected + */ + + + LegendView.prototype.remove = function () { + this.getContentGroup().removeAll(); + this._isFirstRender = true; + }; + + LegendView.type = 'legend.plain'; + return LegendView; + }(ComponentView); + + function getLegendStyle(iconType, legendModel, lineVisualStyle, itemVisualStyle, drawType, isSelected) { + /** + * Use series style if is inherit; + * elsewise, use legend style + */ + function handleCommonProps(style, visualStyle) { + // If lineStyle.width is 'auto', it is set to be 2 if series has border + if (style.lineWidth === 'auto') { + style.lineWidth = visualStyle.lineWidth > 0 ? 2 : 0; + } + + each$c(style, function (propVal, propName) { + style[propName] === 'inherit' && (style[propName] = visualStyle[propName]); + }); + } // itemStyle + + + var legendItemModel = legendModel.getModel('itemStyle'); + var itemStyle = legendItemModel.getItemStyle(); + var iconBrushType = iconType.lastIndexOf('empty', 0) === 0 ? 'fill' : 'stroke'; + itemStyle.decal = itemVisualStyle.decal; + + if (itemStyle.fill === 'inherit') { + /** + * Series with visualDrawType as 'stroke' should have + * series stroke as legend fill + */ + itemStyle.fill = itemVisualStyle[drawType]; + } + + if (itemStyle.stroke === 'inherit') { + /** + * icon type with "emptyXXX" should use fill color + * in visual style + */ + itemStyle.stroke = itemVisualStyle[iconBrushType]; + } + + if (itemStyle.opacity === 'inherit') { + /** + * Use lineStyle.opacity if drawType is stroke + */ + itemStyle.opacity = (drawType === 'fill' ? itemVisualStyle : lineVisualStyle).opacity; + } + + handleCommonProps(itemStyle, itemVisualStyle); // lineStyle + + var legendLineModel = legendModel.getModel('lineStyle'); + var lineStyle = legendLineModel.getLineStyle(); + handleCommonProps(lineStyle, lineVisualStyle); // Fix auto color to real color + + itemStyle.fill === 'auto' && (itemStyle.fill = itemVisualStyle.fill); + itemStyle.stroke === 'auto' && (itemStyle.stroke = itemVisualStyle.fill); + lineStyle.stroke === 'auto' && (lineStyle.stroke = itemVisualStyle.fill); + + if (!isSelected) { + var borderWidth = legendModel.get('inactiveBorderWidth'); + /** + * Since stroke is set to be inactiveBorderColor, it may occur that + * there is no border in series but border in legend, so we need to + * use border only when series has border if is set to be auto + */ + + var visualHasBorder = itemStyle[iconBrushType]; + itemStyle.lineWidth = borderWidth === 'auto' ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth; + itemStyle.fill = legendModel.get('inactiveColor'); + itemStyle.stroke = legendModel.get('inactiveBorderColor'); + lineStyle.stroke = legendLineModel.get('inactiveColor'); + lineStyle.lineWidth = legendLineModel.get('inactiveWidth'); + } + + return { + itemStyle: itemStyle, + lineStyle: lineStyle + }; + } + + function getDefaultLegendIcon(opt) { + var symboType = opt.icon || 'roundRect'; + var icon = createSymbol(symboType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill, opt.symbolKeepAspect); + icon.setStyle(opt.itemStyle); + icon.rotation = (opt.iconRotate || 0) * Math.PI / 180; + icon.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]); + + if (symboType.indexOf('empty') > -1) { + icon.style.stroke = icon.style.fill; + icon.style.fill = '#fff'; + icon.style.lineWidth = 2; + } + + return icon; + } + + function dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) { + // downplay before unselect + dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId); + api.dispatchAction({ + type: 'legendToggleSelect', + name: seriesName != null ? seriesName : dataName + }); // highlight after select + // TODO higlight immediately may cause animation loss. + + dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId); + } + + function isUseHoverLayer(api) { + var list = api.getZr().storage.getDisplayList(); + var emphasisState; + var i = 0; + var len = list.length; + + while (i < len && !(emphasisState = list[i].states.emphasis)) { + i++; + } + + return emphasisState && emphasisState.hoverLayer; + } + + function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: 'highlight', + seriesName: seriesName, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } + } + + function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + if (!isUseHoverLayer(api)) { + api.dispatchAction({ + type: 'downplay', + seriesName: seriesName, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function legendFilter(ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + + if (legendModels && legendModels.length) { + ecModel.filterSeries(function (series) { + // If in any legend component the status is not selected. + // Because in legend series is assumed selected when it is not in the legend data. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(series.name)) { + return false; + } + } + + return true; + }); + } + } + + function legendSelectActionHandler(methodName, payload, ecModel) { + var selectedMap = {}; + var isToggleSelect = methodName === 'toggleSelected'; + var isSelected; // Update all legend components + + ecModel.eachComponent('legend', function (legendModel) { + if (isToggleSelect && isSelected != null) { + // Force other legend has same selected status + // Or the first is toggled to true and other are toggled to false + // In the case one legend has some item unSelected in option. And if other legend + // doesn't has the item, they will assume it is selected. + legendModel[isSelected ? 'select' : 'unSelect'](payload.name); + } else if (methodName === 'allSelect' || methodName === 'inverseSelect') { + legendModel[methodName](); + } else { + legendModel[methodName](payload.name); + isSelected = legendModel.isSelected(payload.name); + } + + var legendData = legendModel.getData(); + each(legendData, function (model) { + var name = model.get('name'); // Wrap element + + if (name === '\n' || name === '') { + return; + } + + var isItemSelected = legendModel.isSelected(name); + + if (selectedMap.hasOwnProperty(name)) { + // Unselected if any legend is unselected + selectedMap[name] = selectedMap[name] && isItemSelected; + } else { + selectedMap[name] = isItemSelected; + } + }); + }); // Return the event explicitly + + return methodName === 'allSelect' || methodName === 'inverseSelect' ? { + selected: selectedMap + } : { + name: payload.name, + selected: selectedMap + }; + } + + function installLegendAction(registers) { + /** + * @event legendToggleSelect + * @type {Object} + * @property {string} type 'legendToggleSelect' + * @property {string} [from] + * @property {string} name Series name or data item name + */ + registers.registerAction('legendToggleSelect', 'legendselectchanged', curry(legendSelectActionHandler, 'toggleSelected')); + registers.registerAction('legendAllSelect', 'legendselectall', curry(legendSelectActionHandler, 'allSelect')); + registers.registerAction('legendInverseSelect', 'legendinverseselect', curry(legendSelectActionHandler, 'inverseSelect')); + /** + * @event legendSelect + * @type {Object} + * @property {string} type 'legendSelect' + * @property {string} name Series name or data item name + */ + + registers.registerAction('legendSelect', 'legendselected', curry(legendSelectActionHandler, 'select')); + /** + * @event legendUnSelect + * @type {Object} + * @property {string} type 'legendUnSelect' + * @property {string} name Series name or data item name + */ + + registers.registerAction('legendUnSelect', 'legendunselected', curry(legendSelectActionHandler, 'unSelect')); + } + + function install$H(registers) { + registers.registerComponentModel(LegendModel); + registers.registerComponentView(LegendView); + registers.registerProcessor(registers.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter); + registers.registerSubTypeDefaulter('legend', function () { + return 'plain'; + }); + installLegendAction(registers); + } + + var ScrollableLegendModel = + /** @class */ + function (_super) { + __extends(ScrollableLegendModel, _super); + + function ScrollableLegendModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScrollableLegendModel.type; + return _this; + } + + /** + * @param {number} scrollDataIndex + */ + + + ScrollableLegendModel.prototype.setScrollDataIndex = function (scrollDataIndex) { + this.option.scrollDataIndex = scrollDataIndex; + }; + + ScrollableLegendModel.prototype.init = function (option, parentModel, ecModel) { + var inputPositionParams = getLayoutParams(option); + + _super.prototype.init.call(this, option, parentModel, ecModel); + + mergeAndNormalizeLayoutParams$1(this, option, inputPositionParams); + }; + /** + * @override + */ + + + ScrollableLegendModel.prototype.mergeOption = function (option, ecModel) { + _super.prototype.mergeOption.call(this, option, ecModel); + + mergeAndNormalizeLayoutParams$1(this, this.option, option); + }; + + ScrollableLegendModel.type = 'legend.scroll'; + ScrollableLegendModel.defaultOption = inheritDefaultOption(LegendModel.defaultOption, { + scrollDataIndex: 0, + pageButtonItemGap: 5, + pageButtonGap: null, + pageButtonPosition: 'end', + pageFormatter: '{current}/{total}', + pageIcons: { + horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'], + vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z'] + }, + pageIconColor: '#2f4554', + pageIconInactiveColor: '#aaa', + pageIconSize: 15, + pageTextStyle: { + color: '#333' + }, + animationDurationUpdate: 800 + }); + return ScrollableLegendModel; + }(LegendModel); + + function mergeAndNormalizeLayoutParams$1(legendModel, target, raw) { + var orient = legendModel.getOrient(); + var ignoreSize = [1, 1]; + ignoreSize[orient.index] = 0; + mergeLayoutParam(target, raw, { + type: 'box', + ignoreSize: !!ignoreSize + }); + } + + var Group$3 = Group; + var WH$1 = ['width', 'height']; + var XY$1 = ['x', 'y']; + + var ScrollableLegendView = + /** @class */ + function (_super) { + __extends(ScrollableLegendView, _super); + + function ScrollableLegendView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ScrollableLegendView.type; + _this.newlineDisabled = true; + _this._currentIndex = 0; + return _this; + } + + ScrollableLegendView.prototype.init = function () { + _super.prototype.init.call(this); + + this.group.add(this._containerGroup = new Group$3()); + + this._containerGroup.add(this.getContentGroup()); + + this.group.add(this._controllerGroup = new Group$3()); + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.resetInner = function () { + _super.prototype.resetInner.call(this); + + this._controllerGroup.removeAll(); + + this._containerGroup.removeClipPath(); + + this._containerGroup.__rectSize = null; + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) { + var self = this; // Render content items. + + _super.prototype.renderInner.call(this, itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition); + + var controllerGroup = this._controllerGroup; // FIXME: support be 'auto' adapt to size number text length, + // e.g., '3/12345' should not overlap with the control arrow button. + + var pageIconSize = legendModel.get('pageIconSize', true); + var pageIconSizeArr = isArray(pageIconSize) ? pageIconSize : [pageIconSize, pageIconSize]; + createPageButton('pagePrev', 0); + var pageTextStyleModel = legendModel.getModel('pageTextStyle'); + controllerGroup.add(new ZRText({ + name: 'pageText', + style: { + // Placeholder to calculate a proper layout. + text: 'xx/xx', + fill: pageTextStyleModel.getTextColor(), + font: pageTextStyleModel.getFont(), + verticalAlign: 'middle', + align: 'center' + }, + silent: true + })); + createPageButton('pageNext', 1); + + function createPageButton(name, iconIdx) { + var pageDataIndexName = name + 'DataIndex'; + var icon = createIcon(legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], { + // Buttons will be created in each render, so we do not need + // to worry about avoiding using legendModel kept in scope. + onclick: bind(self._pageGo, self, pageDataIndexName, legendModel, api) + }, { + x: -pageIconSizeArr[0] / 2, + y: -pageIconSizeArr[1] / 2, + width: pageIconSizeArr[0], + height: pageIconSizeArr[1] + }); + icon.name = name; + controllerGroup.add(icon); + } + }; + /** + * @override + */ + + + ScrollableLegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) { + var selectorGroup = this.getSelectorGroup(); + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var xy = XY$1[orientIdx]; + var hw = WH$1[1 - orientIdx]; + var yx = XY$1[1 - orientIdx]; + selector && box( // Buttons in selectorGroup always layout horizontally + 'horizontal', selectorGroup, legendModel.get('selectorItemGap', true)); + var selectorButtonGap = legendModel.get('selectorButtonGap', true); + var selectorRect = selectorGroup.getBoundingRect(); + var selectorPos = [-selectorRect.x, -selectorRect.y]; + var processMaxSize = clone(maxSize); + selector && (processMaxSize[wh] = maxSize[wh] - selectorRect[wh] - selectorButtonGap); + + var mainRect = this._layoutContentAndController(legendModel, isFirstRender, processMaxSize, orientIdx, wh, hw, yx, xy); + + if (selector) { + if (selectorPosition === 'end') { + selectorPos[orientIdx] += mainRect[wh] + selectorButtonGap; + } else { + var offset = selectorRect[wh] + selectorButtonGap; + selectorPos[orientIdx] -= offset; + mainRect[xy] -= offset; + } + + mainRect[wh] += selectorRect[wh] + selectorButtonGap; + selectorPos[1 - orientIdx] += mainRect[yx] + mainRect[hw] / 2 - selectorRect[hw] / 2; + mainRect[hw] = Math.max(mainRect[hw], selectorRect[hw]); + mainRect[yx] = Math.min(mainRect[yx], selectorRect[yx] + selectorPos[1 - orientIdx]); + selectorGroup.x = selectorPos[0]; + selectorGroup.y = selectorPos[1]; + selectorGroup.markRedraw(); + } + + return mainRect; + }; + + ScrollableLegendView.prototype._layoutContentAndController = function (legendModel, isFirstRender, maxSize, orientIdx, wh, hw, yx, xy) { + var contentGroup = this.getContentGroup(); + var containerGroup = this._containerGroup; + var controllerGroup = this._controllerGroup; // Place items in contentGroup. + + box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height); + box( // Buttons in controller are layout always horizontally. + 'horizontal', controllerGroup, legendModel.get('pageButtonItemGap', true)); + var contentRect = contentGroup.getBoundingRect(); + var controllerRect = controllerGroup.getBoundingRect(); + var showController = this._showController = contentRect[wh] > maxSize[wh]; // In case that the inner elements of contentGroup layout do not based on [0, 0] + + var contentPos = [-contentRect.x, -contentRect.y]; // Remain contentPos when scroll animation perfroming. + // If first rendering, `contentGroup.position` is [0, 0], which + // does not make sense and may cause unexepcted animation if adopted. + + if (!isFirstRender) { + contentPos[orientIdx] = contentGroup[xy]; + } // Layout container group based on 0. + + + var containerPos = [0, 0]; + var controllerPos = [-controllerRect.x, -controllerRect.y]; + var pageButtonGap = retrieve2(legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true)); // Place containerGroup and controllerGroup and contentGroup. + + if (showController) { + var pageButtonPosition = legendModel.get('pageButtonPosition', true); // controller is on the right / bottom. + + if (pageButtonPosition === 'end') { + controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh]; + } // controller is on the left / top. + else { + containerPos[orientIdx] += controllerRect[wh] + pageButtonGap; + } + } // Always align controller to content as 'middle'. + + + controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2; + contentGroup.setPosition(contentPos); + containerGroup.setPosition(containerPos); + controllerGroup.setPosition(controllerPos); // Calculate `mainRect` and set `clipPath`. + // mainRect should not be calculated by `this.group.getBoundingRect()` + // for sake of the overflow. + + var mainRect = { + x: 0, + y: 0 + }; // Consider content may be overflow (should be clipped). + + mainRect[wh] = showController ? maxSize[wh] : contentRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]); // `containerRect[yx] + containerPos[1 - orientIdx]` is 0. + + mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]); + containerGroup.__rectSize = maxSize[wh]; + + if (showController) { + var clipShape = { + x: 0, + y: 0 + }; + clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0); + clipShape[hw] = mainRect[hw]; + containerGroup.setClipPath(new Rect({ + shape: clipShape + })); // Consider content may be larger than container, container rect + // can not be obtained from `containerGroup.getBoundingRect()`. + + containerGroup.__rectSize = clipShape[wh]; + } else { + // Do not remove or ignore controller. Keep them set as placeholders. + controllerGroup.eachChild(function (child) { + child.attr({ + invisible: true, + silent: true + }); + }); + } // Content translate animation. + + + var pageInfo = this._getPageInfo(legendModel); + + pageInfo.pageIndex != null && updateProps(contentGroup, { + x: pageInfo.contentPosition[0], + y: pageInfo.contentPosition[1] + }, // When switch from "show controller" to "not show controller", view should be + // updated immediately without animation, otherwise causes weird effect. + showController ? legendModel : null); + + this._updatePageInfoView(legendModel, pageInfo); + + return mainRect; + }; + + ScrollableLegendView.prototype._pageGo = function (to, legendModel, api) { + var scrollDataIndex = this._getPageInfo(legendModel)[to]; + + scrollDataIndex != null && api.dispatchAction({ + type: 'legendScroll', + scrollDataIndex: scrollDataIndex, + legendId: legendModel.id + }); + }; + + ScrollableLegendView.prototype._updatePageInfoView = function (legendModel, pageInfo) { + var controllerGroup = this._controllerGroup; + each(['pagePrev', 'pageNext'], function (name) { + var key = name + 'DataIndex'; + var canJump = pageInfo[key] != null; + var icon = controllerGroup.childOfName(name); + + if (icon) { + icon.setStyle('fill', canJump ? legendModel.get('pageIconColor', true) : legendModel.get('pageIconInactiveColor', true)); + icon.cursor = canJump ? 'pointer' : 'default'; + } + }); + var pageText = controllerGroup.childOfName('pageText'); + var pageFormatter = legendModel.get('pageFormatter'); + var pageIndex = pageInfo.pageIndex; + var current = pageIndex != null ? pageIndex + 1 : 0; + var total = pageInfo.pageCount; + pageText && pageFormatter && pageText.setStyle('text', isString(pageFormatter) ? pageFormatter.replace('{current}', current == null ? '' : current + '').replace('{total}', total == null ? '' : total + '') : pageFormatter({ + current: current, + total: total + })); + }; + /** + * contentPosition: Array., null when data item not found. + * pageIndex: number, null when data item not found. + * pageCount: number, always be a number, can be 0. + * pagePrevDataIndex: number, null when no previous page. + * pageNextDataIndex: number, null when no next page. + * } + */ + + + ScrollableLegendView.prototype._getPageInfo = function (legendModel) { + var scrollDataIndex = legendModel.get('scrollDataIndex', true); + var contentGroup = this.getContentGroup(); + var containerRectSize = this._containerGroup.__rectSize; + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var xy = XY$1[orientIdx]; + + var targetItemIndex = this._findTargetItemIndex(scrollDataIndex); + + var children = contentGroup.children(); + var targetItem = children[targetItemIndex]; + var itemCount = children.length; + var pCount = !itemCount ? 0 : 1; + var result = { + contentPosition: [contentGroup.x, contentGroup.y], + pageCount: pCount, + pageIndex: pCount - 1, + pagePrevDataIndex: null, + pageNextDataIndex: null + }; + + if (!targetItem) { + return result; + } + + var targetItemInfo = getItemInfo(targetItem); + result.contentPosition[orientIdx] = -targetItemInfo.s; // Strategy: + // (1) Always align based on the left/top most item. + // (2) It is user-friendly that the last item shown in the + // current window is shown at the begining of next window. + // Otherwise if half of the last item is cut by the window, + // it will have no chance to display entirely. + // (3) Consider that item size probably be different, we + // have calculate pageIndex by size rather than item index, + // and we can not get page index directly by division. + // (4) The window is to narrow to contain more than + // one item, we should make sure that the page can be fliped. + + for (var i = targetItemIndex + 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i <= itemCount; ++i) { + currItemInfo = getItemInfo(children[i]); + + if ( // Half of the last item is out of the window. + !currItemInfo && winEndItemInfo.e > winStartItemInfo.s + containerRectSize || // If the current item does not intersect with the window, the new page + // can be started at the current item or the last item. + currItemInfo && !intersect(currItemInfo, winStartItemInfo.s)) { + if (winEndItemInfo.i > winStartItemInfo.i) { + winStartItemInfo = winEndItemInfo; + } else { + // e.g., when page size is smaller than item size. + winStartItemInfo = currItemInfo; + } + + if (winStartItemInfo) { + if (result.pageNextDataIndex == null) { + result.pageNextDataIndex = winStartItemInfo.i; + } + + ++result.pageCount; + } + } + + winEndItemInfo = currItemInfo; + } + + for (var i = targetItemIndex - 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i >= -1; --i) { + currItemInfo = getItemInfo(children[i]); + + if ( // If the the end item does not intersect with the window started + // from the current item, a page can be settled. + (!currItemInfo || !intersect(winEndItemInfo, currItemInfo.s)) && // e.g., when page size is smaller than item size. + winStartItemInfo.i < winEndItemInfo.i) { + winEndItemInfo = winStartItemInfo; + + if (result.pagePrevDataIndex == null) { + result.pagePrevDataIndex = winStartItemInfo.i; + } + + ++result.pageCount; + ++result.pageIndex; + } + + winStartItemInfo = currItemInfo; + } + + return result; + + function getItemInfo(el) { + if (el) { + var itemRect = el.getBoundingRect(); + var start = itemRect[xy] + el[xy]; + return { + s: start, + e: start + itemRect[wh], + i: el.__legendDataIndex + }; + } + } + + function intersect(itemInfo, winStart) { + return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize; + } + }; + + ScrollableLegendView.prototype._findTargetItemIndex = function (targetDataIndex) { + if (!this._showController) { + return 0; + } + + var index; + var contentGroup = this.getContentGroup(); + var defaultIndex; + contentGroup.eachChild(function (child, idx) { + var legendDataIdx = child.__legendDataIndex; // FIXME + // If the given targetDataIndex (from model) is illegal, + // we use defaultIndex. But the index on the legend model and + // action payload is still illegal. That case will not be + // changed until some scenario requires. + + if (defaultIndex == null && legendDataIdx != null) { + defaultIndex = idx; + } + + if (legendDataIdx === targetDataIndex) { + index = idx; + } + }); + return index != null ? index : defaultIndex; + }; + + ScrollableLegendView.type = 'legend.scroll'; + return ScrollableLegendView; + }(LegendView); + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + function installScrollableLegendAction(registers) { + /** + * @event legendScroll + * @type {Object} + * @property {string} type 'legendScroll' + * @property {string} scrollDataIndex + */ + registers.registerAction('legendScroll', 'legendscroll', function (payload, ecModel) { + var scrollDataIndex = payload.scrollDataIndex; + scrollDataIndex != null && ecModel.eachComponent({ + mainType: 'legend', + subType: 'scroll', + query: payload + }, function (legendModel) { + legendModel.setScrollDataIndex(scrollDataIndex); + }); + }); + } + + function install$I(registers) { + use(install$H); + registers.registerComponentModel(ScrollableLegendModel); + registers.registerComponentView(ScrollableLegendView); + installScrollableLegendAction(registers); + } + + function install$J(registers) { + use(install$H); + use(install$I); + } + + var InsideZoomModel = + /** @class */ + function (_super) { + __extends(InsideZoomModel, _super); + + function InsideZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = InsideZoomModel.type; + return _this; + } + + InsideZoomModel.type = 'dataZoom.inside'; + InsideZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { + disabled: false, + zoomLock: false, + zoomOnMouseWheel: true, + moveOnMouseMove: true, + moveOnMouseWheel: false, + preventDefaultMouseMove: true + }); + return InsideZoomModel; + }(DataZoomModel); + + var inner$k = makeInner(); + + function setViewInfoToCoordSysRecord(api, dataZoomModel, getRange) { + inner$k(api).coordSysRecordMap.each(function (coordSysRecord) { + var dzInfo = coordSysRecord.dataZoomInfoMap.get(dataZoomModel.uid); + + if (dzInfo) { + dzInfo.getRange = getRange; + } + }); + } + + function disposeCoordSysRecordIfNeeded(api, dataZoomModel) { + var coordSysRecordMap = inner$k(api).coordSysRecordMap; + var coordSysKeyArr = coordSysRecordMap.keys(); + + for (var i = 0; i < coordSysKeyArr.length; i++) { + var coordSysKey = coordSysKeyArr[i]; + var coordSysRecord = coordSysRecordMap.get(coordSysKey); + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; + + if (dataZoomInfoMap) { + var dzUid = dataZoomModel.uid; + var dzInfo = dataZoomInfoMap.get(dzUid); + + if (dzInfo) { + dataZoomInfoMap.removeKey(dzUid); + + if (!dataZoomInfoMap.keys().length) { + disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); + } + } + } + } + } + + function disposeCoordSysRecord(coordSysRecordMap, coordSysRecord) { + if (coordSysRecord) { + coordSysRecordMap.removeKey(coordSysRecord.model.uid); + var controller = coordSysRecord.controller; + controller && controller.dispose(); + } + } + + function createCoordSysRecord(api, coordSysModel) { + // These init props will never change after record created. + var coordSysRecord = { + model: coordSysModel, + containsPoint: curry(containsPoint, coordSysModel), + dispatchAction: curry(dispatchAction$1, api), + dataZoomInfoMap: null, + controller: null + }; // Must not do anything depends on coordSysRecord outside the event handler here, + // because coordSysRecord not completed yet. + + var controller = coordSysRecord.controller = new RoamController(api.getZr()); + each(['pan', 'zoom', 'scrollMove'], function (eventName) { + controller.on(eventName, function (event) { + var batch = []; + coordSysRecord.dataZoomInfoMap.each(function (dzInfo) { + // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove, + // moveOnMouseWheel, ...) enabled. + if (!event.isAvailableBehavior(dzInfo.model.option)) { + return; + } + + var method = (dzInfo.getRange || {})[eventName]; + var range = method && method(dzInfo.dzReferCoordSysInfo, coordSysRecord.model.mainType, coordSysRecord.controller, event); + !dzInfo.model.get('disabled', true) && range && batch.push({ + dataZoomId: dzInfo.model.id, + start: range[0], + end: range[1] + }); + }); + batch.length && coordSysRecord.dispatchAction(batch); + }); + }); + return coordSysRecord; + } + + /** + * This action will be throttled. + */ + + + function dispatchAction$1(api, batch) { + if (!api.isDisposed()) { + api.dispatchAction({ + type: 'dataZoom', + animation: { + easing: 'cubicOut', + duration: 100 + }, + batch: batch + }); + } + } + + function containsPoint(coordSysModel, e, x, y) { + return coordSysModel.coordinateSystem.containPoint([x, y]); + } + + /** + * Merge roamController settings when multiple dataZooms share one roamController. + */ + + + function mergeControllerParams(dataZoomInfoMap) { + var controlType; // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated + // as string, it is probably revert to reserved word by compress tool. See #7411. + + var prefix = 'type_'; + var typePriority = { + 'type_true': 2, + 'type_move': 1, + 'type_false': 0, + 'type_undefined': -1 + }; + var preventDefaultMouseMove = true; + dataZoomInfoMap.each(function (dataZoomInfo) { + var dataZoomModel = dataZoomInfo.model; + var oneType = dataZoomModel.get('disabled', true) ? false : dataZoomModel.get('zoomLock', true) ? 'move' : true; + + if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) { + controlType = oneType; + } // Prevent default move event by default. If one false, do not prevent. Otherwise + // users may be confused why it does not work when multiple insideZooms exist. + + + preventDefaultMouseMove = preventDefaultMouseMove && dataZoomModel.get('preventDefaultMouseMove', true); + }); + return { + controlType: controlType, + opt: { + // RoamController will enable all of these functionalities, + // and the final behavior is determined by its event listener + // provided by each inside zoom. + zoomOnMouseWheel: true, + moveOnMouseMove: true, + moveOnMouseWheel: true, + preventDefaultMouseMove: !!preventDefaultMouseMove + } + }; + } + + function installDataZoomRoamProcessor(registers) { + registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, function (ecModel, api) { + var apiInner = inner$k(api); + var coordSysRecordMap = apiInner.coordSysRecordMap || (apiInner.coordSysRecordMap = createHashMap()); + coordSysRecordMap.each(function (coordSysRecord) { + // `coordSysRecordMap` always exists (becuase it hold the `roam controller`, which should + // better not re-create each time), but clear `dataZoomInfoMap` each round of the workflow. + coordSysRecord.dataZoomInfoMap = null; + }); + ecModel.eachComponent({ + mainType: 'dataZoom', + subType: 'inside' + }, function (dataZoomModel) { + var dzReferCoordSysWrap = collectReferCoordSysModelInfo(dataZoomModel); + each(dzReferCoordSysWrap.infoList, function (dzCoordSysInfo) { + var coordSysUid = dzCoordSysInfo.model.uid; + var coordSysRecord = coordSysRecordMap.get(coordSysUid) || coordSysRecordMap.set(coordSysUid, createCoordSysRecord(api, dzCoordSysInfo.model)); + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap || (coordSysRecord.dataZoomInfoMap = createHashMap()); // Notice these props might be changed each time for a single dataZoomModel. + + dataZoomInfoMap.set(dataZoomModel.uid, { + dzReferCoordSysInfo: dzCoordSysInfo, + model: dataZoomModel, + getRange: null + }); + }); + }); // (1) Merge dataZoom settings for each coord sys and set to the roam controller. + // (2) Clear coord sys if not refered by any dataZoom. + + coordSysRecordMap.each(function (coordSysRecord) { + var controller = coordSysRecord.controller; + var firstDzInfo; + var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; + + if (dataZoomInfoMap) { + var firstDzKey = dataZoomInfoMap.keys()[0]; + + if (firstDzKey != null) { + firstDzInfo = dataZoomInfoMap.get(firstDzKey); + } + } + + if (!firstDzInfo) { + disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); + return; + } + + var controllerParams = mergeControllerParams(dataZoomInfoMap); + controller.enable(controllerParams.controlType, controllerParams.opt); + controller.setPointerChecker(coordSysRecord.containsPoint); + createOrUpdate(coordSysRecord, 'dispatchAction', firstDzInfo.model.get('throttle', true), 'fixRate'); + }); + }); + } + + var InsideZoomView = + /** @class */ + function (_super) { + __extends(InsideZoomView, _super); + + function InsideZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataZoom.inside'; + return _this; + } + + InsideZoomView.prototype.render = function (dataZoomModel, ecModel, api) { + _super.prototype.render.apply(this, arguments); + + if (dataZoomModel.noTarget()) { + this._clear(); + + return; + } // Hence the `throttle` util ensures to preserve command order, + // here simply updating range all the time will not cause missing + // any of the the roam change. + + + this.range = dataZoomModel.getPercentRange(); // Reset controllers. + + setViewInfoToCoordSysRecord(api, dataZoomModel, { + pan: bind(getRangeHandlers.pan, this), + zoom: bind(getRangeHandlers.zoom, this), + scrollMove: bind(getRangeHandlers.scrollMove, this) + }); + }; + + InsideZoomView.prototype.dispose = function () { + this._clear(); + + _super.prototype.dispose.apply(this, arguments); + }; + + InsideZoomView.prototype._clear = function () { + disposeCoordSysRecordIfNeeded(this.api, this.dataZoomModel); + this.range = null; + }; + + InsideZoomView.type = 'dataZoom.inside'; + return InsideZoomView; + }(DataZoomView); + + var getRangeHandlers = { + zoom: function (coordSysInfo, coordSysMainType, controller, e) { + var lastRange = this.range; + var range = lastRange.slice(); // Calculate transform by the first axis. + + var axisModel = coordSysInfo.axisModels[0]; + + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo[coordSysMainType](null, [e.originX, e.originY], axisModel, controller, coordSysInfo); + var percentPoint = (directionInfo.signal > 0 ? directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel : directionInfo.pixel - directionInfo.pixelStart) / directionInfo.pixelLength * (range[1] - range[0]) + range[0]; + var scale = Math.max(1 / e.scale, 0); + range[0] = (range[0] - percentPoint) * scale + percentPoint; + range[1] = (range[1] - percentPoint) * scale + percentPoint; // Restrict range. + + var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan); + this.range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }, + pan: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { + var directionInfo = getDirectionInfo[coordSysMainType]([e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordSysInfo); + return directionInfo.signal * (range[1] - range[0]) * directionInfo.pixel / directionInfo.pixelLength; + }), + scrollMove: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) { + var directionInfo = getDirectionInfo[coordSysMainType]([0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordSysInfo); + return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta; + }) + }; + + function makeMover(getPercentDelta) { + return function (coordSysInfo, coordSysMainType, controller, e) { + var lastRange = this.range; + var range = lastRange.slice(); // Calculate transform by the first axis. + + var axisModel = coordSysInfo.axisModels[0]; + + if (!axisModel) { + return; + } + + var percentDelta = getPercentDelta(range, axisModel, coordSysInfo, coordSysMainType, controller, e); + sliderMove(percentDelta, range, [0, 100], 'all'); + this.range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }; + } + + var getDirectionInfo = { + grid: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var ret = {}; + var rect = coordSysInfo.model.coordinateSystem.getRect(); + oldPoint = oldPoint || [0, 0]; + + if (axis.dim === 'x') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } else { + // axis.dim === 'y' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + polar: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var ret = {}; + var polar = coordSysInfo.model.coordinateSystem; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var angleExtent = polar.getAngleAxis().getExtent(); + oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0]; + newPoint = polar.pointToCoord(newPoint); + + if (axisModel.mainType === 'radiusAxis') { + ret.pixel = newPoint[0] - oldPoint[0]; // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]); + // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]); + + ret.pixelLength = radiusExtent[1] - radiusExtent[0]; + ret.pixelStart = radiusExtent[0]; + ret.signal = axis.inverse ? 1 : -1; + } else { + // 'angleAxis' + ret.pixel = newPoint[1] - oldPoint[1]; // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]); + // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]); + + ret.pixelLength = angleExtent[1] - angleExtent[0]; + ret.pixelStart = angleExtent[0]; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + singleAxis: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) { + var axis = axisModel.axis; + var rect = coordSysInfo.model.coordinateSystem.getRect(); + var ret = {}; + oldPoint = oldPoint || [0, 0]; + + if (axis.orient === 'horizontal') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } else { + // 'vertical' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + } + }; + + function install$K(registers) { + installCommon(registers); + registers.registerComponentModel(InsideZoomModel); + registers.registerComponentView(InsideZoomView); + installDataZoomRoamProcessor(registers); + } + + var SliderZoomModel = + /** @class */ + function (_super) { + __extends(SliderZoomModel, _super); + + function SliderZoomModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderZoomModel.type; + return _this; + } + + SliderZoomModel.type = 'dataZoom.slider'; + SliderZoomModel.layoutMode = 'box'; + SliderZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, { + show: true, + // deault value can only be drived in view stage. + right: 'ph', + top: 'ph', + width: 'ph', + height: 'ph', + left: null, + bottom: null, + borderColor: '#d2dbee', + borderRadius: 3, + backgroundColor: 'rgba(47,69,84,0)', + // dataBackgroundColor: '#ddd', + dataBackground: { + lineStyle: { + color: '#d2dbee', + width: 0.5 + }, + areaStyle: { + color: '#d2dbee', + opacity: 0.2 + } + }, + selectedDataBackground: { + lineStyle: { + color: '#8fb0f7', + width: 0.5 + }, + areaStyle: { + color: '#8fb0f7', + opacity: 0.2 + } + }, + // Color of selected window. + fillerColor: 'rgba(135,175,274,0.2)', + handleIcon: 'path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z', + // Percent of the slider height + handleSize: '100%', + handleStyle: { + color: '#fff', + borderColor: '#ACB8D1' + }, + moveHandleSize: 7, + moveHandleIcon: 'path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z', + moveHandleStyle: { + color: '#D2DBEE', + opacity: 0.7 + }, + showDetail: true, + showDataShadow: 'auto', + realtime: true, + zoomLock: false, + textStyle: { + color: '#6E7079' + }, + brushSelect: true, + brushStyle: { + color: 'rgba(135,175,274,0.15)' + }, + emphasis: { + handleStyle: { + borderColor: '#8FB0F7' + }, + moveHandleStyle: { + color: '#8FB0F7' + } + } + }); + return SliderZoomModel; + }(DataZoomModel); + + var Rect$2 = Rect; // Constants + + var DEFAULT_LOCATION_EDGE_GAP = 7; + var DEFAULT_FRAME_BORDER_WIDTH = 1; + var DEFAULT_FILLER_SIZE = 30; + var DEFAULT_MOVE_HANDLE_SIZE = 7; + var HORIZONTAL = 'horizontal'; + var VERTICAL = 'vertical'; + var LABEL_GAP = 5; + var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter']; + var REALTIME_ANIMATION_CONFIG = { + easing: 'cubicOut', + duration: 100, + delay: 0 + }; + + var SliderZoomView = + /** @class */ + function (_super) { + __extends(SliderZoomView, _super); + + function SliderZoomView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = SliderZoomView.type; + _this._displayables = {}; + return _this; + } + + SliderZoomView.prototype.init = function (ecModel, api) { + this.api = api; // A unique handler for each dataZoom component + + this._onBrush = bind(this._onBrush, this); + this._onBrushEnd = bind(this._onBrushEnd, this); + }; + + SliderZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) { + _super.prototype.render.apply(this, arguments); + + createOrUpdate(this, '_dispatchZoomAction', dataZoomModel.get('throttle'), 'fixRate'); + this._orient = dataZoomModel.getOrient(); + + if (dataZoomModel.get('show') === false) { + this.group.removeAll(); + return; + } + + if (dataZoomModel.noTarget()) { + this._clear(); + + this.group.removeAll(); + return; + } // Notice: this._resetInterval() should not be executed when payload.type + // is 'dataZoom', origin this._range should be maintained, otherwise 'pan' + // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction, + + + if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) { + this._buildView(); + } + + this._updateView(); + }; + + SliderZoomView.prototype.dispose = function () { + this._clear(); + + _super.prototype.dispose.apply(this, arguments); + }; + + SliderZoomView.prototype._clear = function () { + clear(this, '_dispatchZoomAction'); + var zr = this.api.getZr(); + zr.off('mousemove', this._onBrush); + zr.off('mouseup', this._onBrushEnd); + }; + + SliderZoomView.prototype._buildView = function () { + var thisGroup = this.group; + thisGroup.removeAll(); + this._brushing = false; + this._displayables.brushRect = null; + + this._resetLocation(); + + this._resetInterval(); + + var barGroup = this._displayables.sliderGroup = new Group(); + + this._renderBackground(); + + this._renderHandle(); + + this._renderDataShadow(); + + thisGroup.add(barGroup); + + this._positionGroup(); + }; + + SliderZoomView.prototype._resetLocation = function () { + var dataZoomModel = this.dataZoomModel; + var api = this.api; + var showMoveHandle = dataZoomModel.get('brushSelect'); + var moveHandleSize = showMoveHandle ? DEFAULT_MOVE_HANDLE_SIZE : 0; // If some of x/y/width/height are not specified, + // auto-adapt according to target grid. + + var coordRect = this._findCoordRect(); + + var ecSize = { + width: api.getWidth(), + height: api.getHeight() + }; // Default align by coordinate system rect. + + var positionInfo = this._orient === HORIZONTAL ? { + // Why using 'right', because right should be used in vertical, + // and it is better to be consistent for dealing with position param merge. + right: ecSize.width - coordRect.x - coordRect.width, + top: ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP - moveHandleSize, + width: coordRect.width, + height: DEFAULT_FILLER_SIZE + } : { + right: DEFAULT_LOCATION_EDGE_GAP, + top: coordRect.y, + width: DEFAULT_FILLER_SIZE, + height: coordRect.height + }; // Do not write back to option and replace value 'ph', because + // the 'ph' value should be recalculated when resize. + + var layoutParams = getLayoutParams(dataZoomModel.option); // Replace the placeholder value. + + each(['right', 'top', 'width', 'height'], function (name) { + if (layoutParams[name] === 'ph') { + layoutParams[name] = positionInfo[name]; + } + }); + var layoutRect = getLayoutRect(layoutParams, ecSize); + this._location = { + x: layoutRect.x, + y: layoutRect.y + }; + this._size = [layoutRect.width, layoutRect.height]; + this._orient === VERTICAL && this._size.reverse(); + }; + + SliderZoomView.prototype._positionGroup = function () { + var thisGroup = this.group; + var location = this._location; + var orient = this._orient; // Just use the first axis to determine mapping. + + var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel(); + var inverse = targetAxisModel && targetAxisModel.get('inverse'); + var sliderGroup = this._displayables.sliderGroup; + var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; // Transform barGroup. + + sliderGroup.attr(orient === HORIZONTAL && !inverse ? { + scaleY: otherAxisInverse ? 1 : -1, + scaleX: 1 + } : orient === HORIZONTAL && inverse ? { + scaleY: otherAxisInverse ? 1 : -1, + scaleX: -1 + } : orient === VERTICAL && !inverse ? { + scaleY: otherAxisInverse ? -1 : 1, + scaleX: 1, + rotation: Math.PI / 2 + } // Dont use Math.PI, considering shadow direction. + : { + scaleY: otherAxisInverse ? -1 : 1, + scaleX: -1, + rotation: Math.PI / 2 + }); // Position barGroup + + var rect = thisGroup.getBoundingRect([sliderGroup]); + thisGroup.x = location.x - rect.x; + thisGroup.y = location.y - rect.y; + thisGroup.markRedraw(); + }; + + SliderZoomView.prototype._getViewExtent = function () { + return [0, this._size[0]]; + }; + + SliderZoomView.prototype._renderBackground = function () { + var dataZoomModel = this.dataZoomModel; + var size = this._size; + var barGroup = this._displayables.sliderGroup; + var brushSelect = dataZoomModel.get('brushSelect'); + barGroup.add(new Rect$2({ + silent: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + fill: dataZoomModel.get('backgroundColor') + }, + z2: -40 + })); // Click panel, over shadow, below handles. + + var clickPanel = new Rect$2({ + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + fill: 'transparent' + }, + z2: 0, + onclick: bind(this._onClickPanel, this) + }); + var zr = this.api.getZr(); + + if (brushSelect) { + clickPanel.on('mousedown', this._onBrushStart, this); + clickPanel.cursor = 'crosshair'; + zr.on('mousemove', this._onBrush); + zr.on('mouseup', this._onBrushEnd); + } else { + zr.off('mousemove', this._onBrush); + zr.off('mouseup', this._onBrushEnd); + } + + barGroup.add(clickPanel); + }; + + SliderZoomView.prototype._renderDataShadow = function () { + var info = this._dataShadowInfo = this._prepareDataShadowInfo(); + + this._displayables.dataShadowSegs = []; + + if (!info) { + return; + } + + var size = this._size; + var oldSize = this._shadowSize || []; + var seriesModel = info.series; + var data = seriesModel.getRawData(); + var otherDim = seriesModel.getShadowDim ? seriesModel.getShadowDim() // @see candlestick + : info.otherDim; + + if (otherDim == null) { + return; + } + + var polygonPts = this._shadowPolygonPts; + var polylinePts = this._shadowPolylinePts; // Not re-render if data doesn't change. + + if (data !== this._shadowData || otherDim !== this._shadowDim || size[0] !== oldSize[0] || size[1] !== oldSize[1]) { + var otherDataExtent_1 = data.getDataExtent(otherDim); // Nice extent. + + var otherOffset = (otherDataExtent_1[1] - otherDataExtent_1[0]) * 0.3; + otherDataExtent_1 = [otherDataExtent_1[0] - otherOffset, otherDataExtent_1[1] + otherOffset]; + var otherShadowExtent_1 = [0, size[1]]; + var thisShadowExtent = [0, size[0]]; + var areaPoints_1 = [[size[0], 0], [0, 0]]; + var linePoints_1 = []; + var step_1 = thisShadowExtent[1] / (data.count() - 1); + var thisCoord_1 = 0; // Optimize for large data shadow + + var stride_1 = Math.round(data.count() / size[0]); + var lastIsEmpty_1; + data.each([otherDim], function (value, index) { + if (stride_1 > 0 && index % stride_1) { + thisCoord_1 += step_1; + return; + } // FIXME + // Should consider axis.min/axis.max when drawing dataShadow. + // FIXME + // 应该使用统一的空判断?还是在list里进行空判断? + + + var isEmpty = value == null || isNaN(value) || value === ''; // See #4235. + + var otherCoord = isEmpty ? 0 : linearMap(value, otherDataExtent_1, otherShadowExtent_1, true); // Attempt to draw data shadow precisely when there are empty value. + + if (isEmpty && !lastIsEmpty_1 && index) { + areaPoints_1.push([areaPoints_1[areaPoints_1.length - 1][0], 0]); + linePoints_1.push([linePoints_1[linePoints_1.length - 1][0], 0]); + } else if (!isEmpty && lastIsEmpty_1) { + areaPoints_1.push([thisCoord_1, 0]); + linePoints_1.push([thisCoord_1, 0]); + } + + areaPoints_1.push([thisCoord_1, otherCoord]); + linePoints_1.push([thisCoord_1, otherCoord]); + thisCoord_1 += step_1; + lastIsEmpty_1 = isEmpty; + }); + polygonPts = this._shadowPolygonPts = areaPoints_1; + polylinePts = this._shadowPolylinePts = linePoints_1; + } + + this._shadowData = data; + this._shadowDim = otherDim; + this._shadowSize = [size[0], size[1]]; + var dataZoomModel = this.dataZoomModel; + + function createDataShadowGroup(isSelectedArea) { + var model = dataZoomModel.getModel(isSelectedArea ? 'selectedDataBackground' : 'dataBackground'); + var group = new Group(); + var polygon = new Polygon({ + shape: { + points: polygonPts + }, + segmentIgnoreThreshold: 1, + style: model.getModel('areaStyle').getAreaStyle(), + silent: true, + z2: -20 + }); + var polyline = new Polyline({ + shape: { + points: polylinePts + }, + segmentIgnoreThreshold: 1, + style: model.getModel('lineStyle').getLineStyle(), + silent: true, + z2: -19 + }); + group.add(polygon); + group.add(polyline); + return group; + } // let dataBackgroundModel = dataZoomModel.getModel('dataBackground'); + + + for (var i = 0; i < 3; i++) { + var group = createDataShadowGroup(i === 1); + + this._displayables.sliderGroup.add(group); + + this._displayables.dataShadowSegs.push(group); + } + }; + + SliderZoomView.prototype._prepareDataShadowInfo = function () { + var dataZoomModel = this.dataZoomModel; + var showDataShadow = dataZoomModel.get('showDataShadow'); + + if (showDataShadow === false) { + return; + } // Find a representative series. + + + var result; + var ecModel = this.ecModel; + dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) { + var seriesModels = dataZoomModel.getAxisProxy(axisDim, axisIndex).getTargetSeriesModels(); + each(seriesModels, function (seriesModel) { + if (result) { + return; + } + + if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) { + return; + } + + var thisAxis = ecModel.getComponent(getAxisMainType(axisDim), axisIndex).axis; + var otherDim = getOtherDim(axisDim); + var otherAxisInverse; + var coordSys = seriesModel.coordinateSystem; + + if (otherDim != null && coordSys.getOtherAxis) { + otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse; + } + + otherDim = seriesModel.getData().mapDimension(otherDim); + result = { + thisAxis: thisAxis, + series: seriesModel, + thisDim: axisDim, + otherDim: otherDim, + otherAxisInverse: otherAxisInverse + }; + }, this); + }, this); + return result; + }; + + SliderZoomView.prototype._renderHandle = function () { + var thisGroup = this.group; + var displayables = this._displayables; + var handles = displayables.handles = [null, null]; + var handleLabels = displayables.handleLabels = [null, null]; + var sliderGroup = this._displayables.sliderGroup; + var size = this._size; + var dataZoomModel = this.dataZoomModel; + var api = this.api; + var borderRadius = dataZoomModel.get('borderRadius') || 0; + var brushSelect = dataZoomModel.get('brushSelect'); + var filler = displayables.filler = new Rect$2({ + silent: brushSelect, + style: { + fill: dataZoomModel.get('fillerColor') + }, + textConfig: { + position: 'inside' + } + }); + sliderGroup.add(filler); // Frame border. + + sliderGroup.add(new Rect$2({ + silent: true, + subPixelOptimize: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1], + r: borderRadius + }, + style: { + stroke: dataZoomModel.get('dataBackgroundColor') // deprecated option + || dataZoomModel.get('borderColor'), + lineWidth: DEFAULT_FRAME_BORDER_WIDTH, + fill: 'rgba(0,0,0,0)' + } + })); // Left and right handle to resize + + each([0, 1], function (handleIndex) { + var iconStr = dataZoomModel.get('handleIcon'); + + if (!symbolBuildProxies[iconStr] && iconStr.indexOf('path://') < 0 && iconStr.indexOf('image://') < 0) { + // Compatitable with the old icon parsers. Which can use a path string without path:// + iconStr = 'path://' + iconStr; + + if ("development" !== 'production') { + deprecateLog('handleIcon now needs \'path://\' prefix when using a path string'); + } + } + + var path = createSymbol(iconStr, -1, 0, 2, 2, null, true); + path.attr({ + cursor: getCursor(this._orient), + draggable: true, + drift: bind(this._onDragMove, this, handleIndex), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false), + z2: 5 + }); + var bRect = path.getBoundingRect(); + var handleSize = dataZoomModel.get('handleSize'); + this._handleHeight = parsePercent$1(handleSize, this._size[1]); + this._handleWidth = bRect.width / bRect.height * this._handleHeight; + path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle()); + path.style.strokeNoScale = true; + path.rectHover = true; + path.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'handleStyle']).getItemStyle(); + enableHoverEmphasis(path); + var handleColor = dataZoomModel.get('handleColor'); // deprecated option + // Compatitable with previous version + + if (handleColor != null) { + path.style.fill = handleColor; + } + + sliderGroup.add(handles[handleIndex] = path); + var textStyleModel = dataZoomModel.getModel('textStyle'); + thisGroup.add(handleLabels[handleIndex] = new ZRText({ + silent: true, + invisible: true, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '', + verticalAlign: 'middle', + align: 'center', + fill: textStyleModel.getTextColor(), + font: textStyleModel.getFont() + }), + z2: 10 + })); + }, this); // Handle to move. Only visible when brushSelect is set true. + + var actualMoveZone = filler; + + if (brushSelect) { + var moveHandleHeight = parsePercent$1(dataZoomModel.get('moveHandleSize'), size[1]); + var moveHandle_1 = displayables.moveHandle = new Rect({ + style: dataZoomModel.getModel('moveHandleStyle').getItemStyle(), + silent: true, + shape: { + r: [0, 0, 2, 2], + y: size[1] - 0.5, + height: moveHandleHeight + } + }); + var iconSize = moveHandleHeight * 0.8; + var moveHandleIcon = displayables.moveHandleIcon = createSymbol(dataZoomModel.get('moveHandleIcon'), -iconSize / 2, -iconSize / 2, iconSize, iconSize, '#fff', true); + moveHandleIcon.silent = true; + moveHandleIcon.y = size[1] + moveHandleHeight / 2 - 0.5; + moveHandle_1.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'moveHandleStyle']).getItemStyle(); + var moveZoneExpandSize = Math.min(size[1] / 2, Math.max(moveHandleHeight, 10)); + actualMoveZone = displayables.moveZone = new Rect({ + invisible: true, + shape: { + y: size[1] - moveZoneExpandSize, + height: moveHandleHeight + moveZoneExpandSize + } + }); + actualMoveZone.on('mouseover', function () { + api.enterEmphasis(moveHandle_1); + }).on('mouseout', function () { + api.leaveEmphasis(moveHandle_1); + }); + sliderGroup.add(moveHandle_1); + sliderGroup.add(moveHandleIcon); + sliderGroup.add(actualMoveZone); + } + + actualMoveZone.attr({ + draggable: true, + cursor: getCursor(this._orient), + drift: bind(this._onDragMove, this, 'all'), + ondragstart: bind(this._showDataInfo, this, true), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false) + }); + }; + + SliderZoomView.prototype._resetInterval = function () { + var range = this._range = this.dataZoomModel.getPercentRange(); + + var viewExtent = this._getViewExtent(); + + this._handleEnds = [linearMap(range[0], [0, 100], viewExtent, true), linearMap(range[1], [0, 100], viewExtent, true)]; + }; + + SliderZoomView.prototype._updateInterval = function (handleIndex, delta) { + var dataZoomModel = this.dataZoomModel; + var handleEnds = this._handleEnds; + + var viewExtend = this._getViewExtent(); + + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + var percentExtent = [0, 100]; + sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null); + var lastRange = this._range; + var range = this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]); + return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1]; + }; + + SliderZoomView.prototype._updateView = function (nonRealtime) { + var displaybles = this._displayables; + var handleEnds = this._handleEnds; + var handleInterval = asc(handleEnds.slice()); + var size = this._size; + each([0, 1], function (handleIndex) { + // Handles + var handle = displaybles.handles[handleIndex]; + var handleHeight = this._handleHeight; + handle.attr({ + scaleX: handleHeight / 2, + scaleY: handleHeight / 2, + // This is a trick, by adding an extra tiny offset to let the default handle's end point align to the drag window. + // NOTE: It may affect some custom shapes a bit. But we prefer to have better result by default. + x: handleEnds[handleIndex] + (handleIndex ? -1 : 1), + y: size[1] / 2 - handleHeight / 2 + }); + }, this); // Filler + + displaybles.filler.setShape({ + x: handleInterval[0], + y: 0, + width: handleInterval[1] - handleInterval[0], + height: size[1] + }); + var viewExtent = { + x: handleInterval[0], + width: handleInterval[1] - handleInterval[0] + }; // Move handle + + if (displaybles.moveHandle) { + displaybles.moveHandle.setShape(viewExtent); + displaybles.moveZone.setShape(viewExtent); // Force update path on the invisible object + + displaybles.moveZone.getBoundingRect(); + displaybles.moveHandleIcon && displaybles.moveHandleIcon.attr('x', viewExtent.x + viewExtent.width / 2); + } // update clip path of shadow. + + + var dataShadowSegs = displaybles.dataShadowSegs; + var segIntervals = [0, handleInterval[0], handleInterval[1], size[0]]; + + for (var i = 0; i < dataShadowSegs.length; i++) { + var segGroup = dataShadowSegs[i]; + var clipPath = segGroup.getClipPath(); + + if (!clipPath) { + clipPath = new Rect(); + segGroup.setClipPath(clipPath); + } + + clipPath.setShape({ + x: segIntervals[i], + y: 0, + width: segIntervals[i + 1] - segIntervals[i], + height: size[1] + }); + } + + this._updateDataInfo(nonRealtime); + }; + + SliderZoomView.prototype._updateDataInfo = function (nonRealtime) { + var dataZoomModel = this.dataZoomModel; + var displaybles = this._displayables; + var handleLabels = displaybles.handleLabels; + var orient = this._orient; + var labelTexts = ['', '']; // FIXME + // date型,支持formatter,autoformatter(ec2 date.getAutoFormatter) + + if (dataZoomModel.get('showDetail')) { + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + + if (axisProxy) { + var axis = axisProxy.getAxisModel().axis; + var range = this._range; + var dataInterval = nonRealtime // See #4434, data and axis are not processed and reset yet in non-realtime mode. + ? axisProxy.calculateDataWindow({ + start: range[0], + end: range[1] + }).valueWindow : axisProxy.getDataValueWindow(); + labelTexts = [this._formatLabel(dataInterval[0], axis), this._formatLabel(dataInterval[1], axis)]; + } + } + + var orderedHandleEnds = asc(this._handleEnds.slice()); + setLabel.call(this, 0); + setLabel.call(this, 1); + + function setLabel(handleIndex) { + // Label + // Text should not transform by barGroup. + // Ignore handlers transform + var barTransform = getTransform(displaybles.handles[handleIndex].parent, this.group); + var direction = transformDirection(handleIndex === 0 ? 'right' : 'left', barTransform); + var offset = this._handleWidth / 2 + LABEL_GAP; + var textPoint = applyTransform$1([orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), this._size[1] / 2], barTransform); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + verticalAlign: orient === HORIZONTAL ? 'middle' : direction, + align: orient === HORIZONTAL ? direction : 'center', + text: labelTexts[handleIndex] + }); + } + }; + + SliderZoomView.prototype._formatLabel = function (value, axis) { + var dataZoomModel = this.dataZoomModel; + var labelFormatter = dataZoomModel.get('labelFormatter'); + var labelPrecision = dataZoomModel.get('labelPrecision'); + + if (labelPrecision == null || labelPrecision === 'auto') { + labelPrecision = axis.getPixelPrecision(); + } + + var valueStr = value == null || isNaN(value) ? '' // FIXME Glue code + : axis.type === 'category' || axis.type === 'time' ? axis.scale.getLabel({ + value: Math.round(value) + }) // param of toFixed should less then 20. + : value.toFixed(Math.min(labelPrecision, 20)); + return isFunction(labelFormatter) ? labelFormatter(value, valueStr) : isString(labelFormatter) ? labelFormatter.replace('{value}', valueStr) : valueStr; + }; + /** + * @param showOrHide true: show, false: hide + */ + + + SliderZoomView.prototype._showDataInfo = function (showOrHide) { + // Always show when drgging. + showOrHide = this._dragging || showOrHide; + var displayables = this._displayables; + var handleLabels = displayables.handleLabels; + handleLabels[0].attr('invisible', !showOrHide); + handleLabels[1].attr('invisible', !showOrHide); // Highlight move handle + + displayables.moveHandle && this.api[showOrHide ? 'enterEmphasis' : 'leaveEmphasis'](displayables.moveHandle, 1); + }; + + SliderZoomView.prototype._onDragMove = function (handleIndex, dx, dy, event) { + this._dragging = true; // For mobile device, prevent screen slider on the button. + + stop(event.event); // Transform dx, dy to bar coordination. + + var barTransform = this._displayables.sliderGroup.getLocalTransform(); + + var vertex = applyTransform$1([dx, dy], barTransform, true); + + var changed = this._updateInterval(handleIndex, vertex[0]); + + var realtime = this.dataZoomModel.get('realtime'); + + this._updateView(!realtime); // Avoid dispatch dataZoom repeatly but range not changed, + // which cause bad visual effect when progressive enabled. + + + changed && realtime && this._dispatchZoomAction(true); + }; + + SliderZoomView.prototype._onDragEnd = function () { + this._dragging = false; + + this._showDataInfo(false); // While in realtime mode and stream mode, dispatch action when + // drag end will cause the whole view rerender, which is unnecessary. + + + var realtime = this.dataZoomModel.get('realtime'); + !realtime && this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onClickPanel = function (e) { + var size = this._size; + + var localPoint = this._displayables.sliderGroup.transformCoordToLocal(e.offsetX, e.offsetY); + + if (localPoint[0] < 0 || localPoint[0] > size[0] || localPoint[1] < 0 || localPoint[1] > size[1]) { + return; + } + + var handleEnds = this._handleEnds; + var center = (handleEnds[0] + handleEnds[1]) / 2; + + var changed = this._updateInterval('all', localPoint[0] - center); + + this._updateView(); + + changed && this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onBrushStart = function (e) { + var x = e.offsetX; + var y = e.offsetY; + this._brushStart = new Point(x, y); + this._brushing = true; + this._brushStartTime = +new Date(); // this._updateBrushRect(x, y); + }; + + SliderZoomView.prototype._onBrushEnd = function (e) { + if (!this._brushing) { + return; + } + + var brushRect = this._displayables.brushRect; + this._brushing = false; + + if (!brushRect) { + return; + } + + brushRect.attr('ignore', true); + var brushShape = brushRect.shape; + var brushEndTime = +new Date(); // console.log(brushEndTime - this._brushStartTime); + + if (brushEndTime - this._brushStartTime < 200 && Math.abs(brushShape.width) < 5) { + // Will treat it as a click + return; + } + + var viewExtend = this._getViewExtent(); + + var percentExtent = [0, 100]; + this._range = asc([linearMap(brushShape.x, viewExtend, percentExtent, true), linearMap(brushShape.x + brushShape.width, viewExtend, percentExtent, true)]); + this._handleEnds = [brushShape.x, brushShape.x + brushShape.width]; + + this._updateView(); + + this._dispatchZoomAction(false); + }; + + SliderZoomView.prototype._onBrush = function (e) { + if (this._brushing) { + // For mobile device, prevent screen slider on the button. + stop(e.event); + + this._updateBrushRect(e.offsetX, e.offsetY); + } + }; + + SliderZoomView.prototype._updateBrushRect = function (mouseX, mouseY) { + var displayables = this._displayables; + var dataZoomModel = this.dataZoomModel; + var brushRect = displayables.brushRect; + + if (!brushRect) { + brushRect = displayables.brushRect = new Rect$2({ + silent: true, + style: dataZoomModel.getModel('brushStyle').getItemStyle() + }); + displayables.sliderGroup.add(brushRect); + } + + brushRect.attr('ignore', false); + var brushStart = this._brushStart; + var sliderGroup = this._displayables.sliderGroup; + var endPoint = sliderGroup.transformCoordToLocal(mouseX, mouseY); + var startPoint = sliderGroup.transformCoordToLocal(brushStart.x, brushStart.y); + var size = this._size; + endPoint[0] = Math.max(Math.min(size[0], endPoint[0]), 0); + brushRect.setShape({ + x: startPoint[0], + y: 0, + width: endPoint[0] - startPoint[0], + height: size[1] + }); + }; + /** + * This action will be throttled. + */ + + + SliderZoomView.prototype._dispatchZoomAction = function (realtime) { + var range = this._range; + this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + dataZoomId: this.dataZoomModel.id, + animation: realtime ? REALTIME_ANIMATION_CONFIG : null, + start: range[0], + end: range[1] + }); + }; + + SliderZoomView.prototype._findCoordRect = function () { + // Find the grid coresponding to the first axis referred by dataZoom. + var rect; + var coordSysInfoList = collectReferCoordSysModelInfo(this.dataZoomModel).infoList; + + if (!rect && coordSysInfoList.length) { + var coordSys = coordSysInfoList[0].model.coordinateSystem; + rect = coordSys.getRect && coordSys.getRect(); + } + + if (!rect) { + var width = this.api.getWidth(); + var height = this.api.getHeight(); + rect = { + x: width * 0.2, + y: height * 0.2, + width: width * 0.6, + height: height * 0.6 + }; + } + + return rect; + }; + + SliderZoomView.type = 'dataZoom.slider'; + return SliderZoomView; + }(DataZoomView); + + function getOtherDim(thisDim) { + // FIXME + // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好 + var map = { + x: 'y', + y: 'x', + radius: 'angle', + angle: 'radius' + }; + return map[thisDim]; + } + + function getCursor(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; + } + + function install$L(registers) { + registers.registerComponentModel(SliderZoomModel); + registers.registerComponentView(SliderZoomView); + installCommon(registers); + } + + function install$M(registers) { + use(install$K); + use(install$L); // Do not install './dataZoomSelect', + // since it only work for toolbox dataZoom. + } + + var visualDefault = { + /** + * @public + */ + get: function (visualType, key, isCategory) { + var value = clone((defaultOption$1[visualType] || {})[key]); + return isCategory ? isArray(value) ? value[value.length - 1] : value : value; + } + }; + var defaultOption$1 = { + color: { + active: ['#006edd', '#e0ffff'], + inactive: ['rgba(0,0,0,0)'] + }, + colorHue: { + active: [0, 360], + inactive: [0, 0] + }, + colorSaturation: { + active: [0.3, 1], + inactive: [0, 0] + }, + colorLightness: { + active: [0.9, 0.5], + inactive: [0, 0] + }, + colorAlpha: { + active: [0.3, 1], + inactive: [0, 0] + }, + opacity: { + active: [0.3, 1], + inactive: [0, 0] + }, + symbol: { + active: ['circle', 'roundRect', 'diamond'], + inactive: ['none'] + }, + symbolSize: { + active: [10, 50], + inactive: [0, 0] + } + }; + + var mapVisual$1 = VisualMapping.mapVisual; + var eachVisual = VisualMapping.eachVisual; + var isArray$1 = isArray; + var each$d = each; + var asc$2 = asc; + var linearMap$1 = linearMap; + + var VisualMapModel = + /** @class */ + function (_super) { + __extends(VisualMapModel, _super); + + function VisualMapModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = VisualMapModel.type; + _this.stateList = ['inRange', 'outOfRange']; + _this.replacableOptionKeys = ['inRange', 'outOfRange', 'target', 'controller', 'color']; + _this.layoutMode = { + type: 'box', + ignoreSize: true + }; + /** + * [lowerBound, upperBound] + */ + + _this.dataBound = [-Infinity, Infinity]; + _this.targetVisuals = {}; + _this.controllerVisuals = {}; + return _this; + } + + VisualMapModel.prototype.init = function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + }; + /** + * @protected + */ + + + VisualMapModel.prototype.optionUpdated = function (newOption, isInit) { + var thisOption = this.option; + !isInit && replaceVisualOption(thisOption, newOption, this.replacableOptionKeys); + this.textStyleModel = this.getModel('textStyle'); + this.resetItemSize(); + this.completeVisualOption(); + }; + /** + * @protected + */ + + + VisualMapModel.prototype.resetVisual = function (supplementVisualOption) { + var stateList = this.stateList; + supplementVisualOption = bind(supplementVisualOption, this); + this.controllerVisuals = createVisualMappings(this.option.controller, stateList, supplementVisualOption); + this.targetVisuals = createVisualMappings(this.option.target, stateList, supplementVisualOption); + }; + /** + * @public + */ + + + VisualMapModel.prototype.getItemSymbol = function () { + return null; + }; + /** + * @protected + * @return {Array.} An array of series indices. + */ + + + VisualMapModel.prototype.getTargetSeriesIndices = function () { + var optionSeriesIndex = this.option.seriesIndex; + var seriesIndices = []; + + if (optionSeriesIndex == null || optionSeriesIndex === 'all') { + this.ecModel.eachSeries(function (seriesModel, index) { + seriesIndices.push(index); + }); + } else { + seriesIndices = normalizeToArray(optionSeriesIndex); + } + + return seriesIndices; + }; + /** + * @public + */ + + + VisualMapModel.prototype.eachTargetSeries = function (callback, context) { + each(this.getTargetSeriesIndices(), function (seriesIndex) { + var seriesModel = this.ecModel.getSeriesByIndex(seriesIndex); + + if (seriesModel) { + callback.call(context, seriesModel); + } + }, this); + }; + /** + * @pubilc + */ + + + VisualMapModel.prototype.isTargetSeries = function (seriesModel) { + var is = false; + this.eachTargetSeries(function (model) { + model === seriesModel && (is = true); + }); + return is; + }; + /** + * @example + * this.formatValueText(someVal); // format single numeric value to text. + * this.formatValueText(someVal, true); // format single category value to text. + * this.formatValueText([min, max]); // format numeric min-max to text. + * this.formatValueText([this.dataBound[0], max]); // using data lower bound. + * this.formatValueText([min, this.dataBound[1]]); // using data upper bound. + * + * @param value Real value, or this.dataBound[0 or 1]. + * @param isCategory Only available when value is number. + * @param edgeSymbols Open-close symbol when value is interval. + * @protected + */ + + + VisualMapModel.prototype.formatValueText = function (value, isCategory, edgeSymbols) { + var option = this.option; + var precision = option.precision; + var dataBound = this.dataBound; + var formatter = option.formatter; + var isMinMax; + edgeSymbols = edgeSymbols || ['<', '>']; + + if (isArray(value)) { + value = value.slice(); + isMinMax = true; + } + + var textValue = isCategory ? value // Value is string when isCategory + : isMinMax ? [toFixed(value[0]), toFixed(value[1])] : toFixed(value); + + if (isString(formatter)) { + return formatter.replace('{value}', isMinMax ? textValue[0] : textValue).replace('{value2}', isMinMax ? textValue[1] : textValue); + } else if (isFunction(formatter)) { + return isMinMax ? formatter(value[0], value[1]) : formatter(value); + } + + if (isMinMax) { + if (value[0] === dataBound[0]) { + return edgeSymbols[0] + ' ' + textValue[1]; + } else if (value[1] === dataBound[1]) { + return edgeSymbols[1] + ' ' + textValue[0]; + } else { + return textValue[0] + ' - ' + textValue[1]; + } + } else { + // Format single value (includes category case). + return textValue; + } + + function toFixed(val) { + return val === dataBound[0] ? 'min' : val === dataBound[1] ? 'max' : (+val).toFixed(Math.min(precision, 20)); + } + }; + /** + * @protected + */ + + + VisualMapModel.prototype.resetExtent = function () { + var thisOption = this.option; // Can not calculate data extent by data here. + // Because series and data may be modified in processing stage. + // So we do not support the feature "auto min/max". + + var extent = asc$2([thisOption.min, thisOption.max]); + this._dataExtent = extent; + }; + /** + * PENDING: + * delete this method if no outer usage. + * + * Return Concrete dimention. If return null/undefined, no dimension used. + */ + // getDataDimension(data: SeriesData) { + // const optDim = this.option.dimension; + // if (optDim != null) { + // return data.getDimension(optDim); + // } + // const dimNames = data.dimensions; + // for (let i = dimNames.length - 1; i >= 0; i--) { + // const dimName = dimNames[i]; + // const dimInfo = data.getDimensionInfo(dimName); + // if (!dimInfo.isCalculationCoord) { + // return dimName; + // } + // } + // } + + + VisualMapModel.prototype.getDataDimensionIndex = function (data) { + var optDim = this.option.dimension; + + if (optDim != null) { + return data.getDimensionIndex(optDim); + } + + var dimNames = data.dimensions; + + for (var i = dimNames.length - 1; i >= 0; i--) { + var dimName = dimNames[i]; + var dimInfo = data.getDimensionInfo(dimName); + + if (!dimInfo.isCalculationCoord) { + return dimInfo.storeDimIndex; + } + } + }; + + VisualMapModel.prototype.getExtent = function () { + return this._dataExtent.slice(); + }; + + VisualMapModel.prototype.completeVisualOption = function () { + var ecModel = this.ecModel; + var thisOption = this.option; + var base = { + inRange: thisOption.inRange, + outOfRange: thisOption.outOfRange + }; + var target = thisOption.target || (thisOption.target = {}); + var controller = thisOption.controller || (thisOption.controller = {}); + merge(target, base); // Do not override + + merge(controller, base); // Do not override + + var isCategory = this.isCategory(); + completeSingle.call(this, target); + completeSingle.call(this, controller); + completeInactive.call(this, target, 'inRange', 'outOfRange'); // completeInactive.call(this, target, 'outOfRange', 'inRange'); + + completeController.call(this, controller); + + function completeSingle(base) { + // Compatible with ec2 dataRange.color. + // The mapping order of dataRange.color is: [high value, ..., low value] + // whereas inRange.color and outOfRange.color is [low value, ..., high value] + // Notice: ec2 has no inverse. + if (isArray$1(thisOption.color) // If there has been inRange: {symbol: ...}, adding color is a mistake. + // So adding color only when no inRange defined. + && !base.inRange) { + base.inRange = { + color: thisOption.color.slice().reverse() + }; + } // Compatible with previous logic, always give a defautl color, otherwise + // simple config with no inRange and outOfRange will not work. + // Originally we use visualMap.color as the default color, but setOption at + // the second time the default color will be erased. So we change to use + // constant DEFAULT_COLOR. + // If user do not want the default color, set inRange: {color: null}. + + + base.inRange = base.inRange || { + color: ecModel.get('gradientColor') + }; + } + + function completeInactive(base, stateExist, stateAbsent) { + var optExist = base[stateExist]; + var optAbsent = base[stateAbsent]; + + if (optExist && !optAbsent) { + optAbsent = base[stateAbsent] = {}; + each$d(optExist, function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var defa = visualDefault.get(visualType, 'inactive', isCategory); + + if (defa != null) { + optAbsent[visualType] = defa; // Compatibable with ec2: + // Only inactive color to rgba(0,0,0,0) can not + // make label transparent, so use opacity also. + + if (visualType === 'color' && !optAbsent.hasOwnProperty('opacity') && !optAbsent.hasOwnProperty('colorAlpha')) { + optAbsent.opacity = [0, 0]; + } + } + }); + } + } + + function completeController(controller) { + var symbolExists = (controller.inRange || {}).symbol || (controller.outOfRange || {}).symbol; + var symbolSizeExists = (controller.inRange || {}).symbolSize || (controller.outOfRange || {}).symbolSize; + var inactiveColor = this.get('inactiveColor'); + var itemSymbol = this.getItemSymbol(); + var defaultSymbol = itemSymbol || 'roundRect'; + each$d(this.stateList, function (state) { + var itemSize = this.itemSize; + var visuals = controller[state]; // Set inactive color for controller if no other color + // attr (like colorAlpha) specified. + + if (!visuals) { + visuals = controller[state] = { + color: isCategory ? inactiveColor : [inactiveColor] + }; + } // Consistent symbol and symbolSize if not specified. + + + if (visuals.symbol == null) { + visuals.symbol = symbolExists && clone(symbolExists) || (isCategory ? defaultSymbol : [defaultSymbol]); + } + + if (visuals.symbolSize == null) { + visuals.symbolSize = symbolSizeExists && clone(symbolSizeExists) || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]); + } // Filter none + + + visuals.symbol = mapVisual$1(visuals.symbol, function (symbol) { + return symbol === 'none' ? defaultSymbol : symbol; + }); // Normalize symbolSize + + var symbolSize = visuals.symbolSize; + + if (symbolSize != null) { + var max_1 = -Infinity; // symbolSize can be object when categories defined. + + eachVisual(symbolSize, function (value) { + value > max_1 && (max_1 = value); + }); + visuals.symbolSize = mapVisual$1(symbolSize, function (value) { + return linearMap$1(value, [0, max_1], [0, itemSize[0]], true); + }); + } + }, this); + } + }; + + VisualMapModel.prototype.resetItemSize = function () { + this.itemSize = [parseFloat(this.get('itemWidth')), parseFloat(this.get('itemHeight'))]; + }; + + VisualMapModel.prototype.isCategory = function () { + return !!this.option.categories; + }; + /** + * @public + * @abstract + */ + + + VisualMapModel.prototype.setSelected = function (selected) { + }; + + VisualMapModel.prototype.getSelected = function () { + return null; + }; + /** + * @public + * @abstract + */ + + + VisualMapModel.prototype.getValueState = function (value) { + return null; + }; + /** + * FIXME + * Do not publish to thirt-part-dev temporarily + * util the interface is stable. (Should it return + * a function but not visual meta?) + * + * @pubilc + * @abstract + * @param getColorVisual + * params: value, valueState + * return: color + * @return {Object} visualMeta + * should includes {stops, outerColors} + * outerColor means [colorBeyondMinValue, colorBeyondMaxValue] + */ + + + VisualMapModel.prototype.getVisualMeta = function (getColorVisual) { + return null; + }; + + VisualMapModel.type = 'visualMap'; + VisualMapModel.dependencies = ['series']; + VisualMapModel.defaultOption = { + show: true, + // zlevel: 0, + z: 4, + seriesIndex: 'all', + min: 0, + max: 200, + left: 0, + right: null, + top: null, + bottom: 0, + itemWidth: null, + itemHeight: null, + inverse: false, + orient: 'vertical', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', + contentColor: '#5793f3', + inactiveColor: '#aaa', + borderWidth: 0, + padding: 5, + // 接受数组分别设定上右下左边距,同css + textGap: 10, + precision: 0, + textStyle: { + color: '#333' // 值域文字颜色 + + } + }; + return VisualMapModel; + }(ComponentModel); + + var DEFAULT_BAR_BOUND = [20, 140]; + + var ContinuousModel = + /** @class */ + function (_super) { + __extends(ContinuousModel, _super); + + function ContinuousModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ContinuousModel.type; + return _this; + } + + /** + * @override + */ + + + ContinuousModel.prototype.optionUpdated = function (newOption, isInit) { + _super.prototype.optionUpdated.apply(this, arguments); + + this.resetExtent(); + this.resetVisual(function (mappingOption) { + mappingOption.mappingMethod = 'linear'; + mappingOption.dataExtent = this.getExtent(); + }); + + this._resetRange(); + }; + /** + * @protected + * @override + */ + + + ContinuousModel.prototype.resetItemSize = function () { + _super.prototype.resetItemSize.apply(this, arguments); + + var itemSize = this.itemSize; + (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]); + (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]); + }; + /** + * @private + */ + + + ContinuousModel.prototype._resetRange = function () { + var dataExtent = this.getExtent(); + var range = this.option.range; + + if (!range || range.auto) { + // `range` should always be array (so we dont use other + // value like 'auto') for user-friend. (consider getOption). + dataExtent.auto = 1; + this.option.range = dataExtent; + } else if (isArray(range)) { + if (range[0] > range[1]) { + range.reverse(); + } + + range[0] = Math.max(range[0], dataExtent[0]); + range[1] = Math.min(range[1], dataExtent[1]); + } + }; + /** + * @protected + * @override + */ + + + ContinuousModel.prototype.completeVisualOption = function () { + _super.prototype.completeVisualOption.apply(this, arguments); + + each(this.stateList, function (state) { + var symbolSize = this.option.controller[state].symbolSize; + + if (symbolSize && symbolSize[0] !== symbolSize[1]) { + symbolSize[0] = symbolSize[1] / 3; // For good looking. + } + }, this); + }; + /** + * @override + */ + + + ContinuousModel.prototype.setSelected = function (selected) { + this.option.range = selected.slice(); + + this._resetRange(); + }; + /** + * @public + */ + + + ContinuousModel.prototype.getSelected = function () { + var dataExtent = this.getExtent(); + var dataInterval = asc((this.get('range') || []).slice()); // Clamp + + dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]); + dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]); + dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]); + dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]); + return dataInterval; + }; + /** + * @override + */ + + + ContinuousModel.prototype.getValueState = function (value) { + var range = this.option.range; + var dataExtent = this.getExtent(); // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'. + // range[1] is processed likewise. + + return (range[0] <= dataExtent[0] || range[0] <= value) && (range[1] >= dataExtent[1] || value <= range[1]) ? 'inRange' : 'outOfRange'; + }; + + ContinuousModel.prototype.findTargetDataIndices = function (range) { + var result = []; + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + data.each(this.getDataDimensionIndex(data), function (value, dataIndex) { + range[0] <= value && value <= range[1] && dataIndices.push(dataIndex); + }, this); + result.push({ + seriesId: seriesModel.id, + dataIndex: dataIndices + }); + }, this); + return result; + }; + /** + * @implement + */ + + + ContinuousModel.prototype.getVisualMeta = function (getColorVisual) { + var oVals = getColorStopValues(this, 'outOfRange', this.getExtent()); + var iVals = getColorStopValues(this, 'inRange', this.option.range.slice()); + var stops = []; + + function setStop(value, valueState) { + stops.push({ + value: value, + color: getColorVisual(value, valueState) + }); + } // Format to: outOfRange -- inRange -- outOfRange. + + + var iIdx = 0; + var oIdx = 0; + var iLen = iVals.length; + var oLen = oVals.length; + + for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) { + // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored. + if (oVals[oIdx] < iVals[iIdx]) { + setStop(oVals[oIdx], 'outOfRange'); + } + } + + for (var first = 1; iIdx < iLen; iIdx++, first = 0) { + // If range is full, value beyond min, max will be clamped. + // make a singularity + first && stops.length && setStop(iVals[iIdx], 'outOfRange'); + setStop(iVals[iIdx], 'inRange'); + } + + for (var first = 1; oIdx < oLen; oIdx++) { + if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) { + // make a singularity + if (first) { + stops.length && setStop(stops[stops.length - 1].value, 'outOfRange'); + first = 0; + } + + setStop(oVals[oIdx], 'outOfRange'); + } + } + + var stopsLen = stops.length; + return { + stops: stops, + outerColors: [stopsLen ? stops[0].color : 'transparent', stopsLen ? stops[stopsLen - 1].color : 'transparent'] + }; + }; + + ContinuousModel.type = 'visualMap.continuous'; + ContinuousModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { + align: 'auto', + calculable: false, + hoverLink: true, + realtime: true, + handleIcon: 'path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z', + handleSize: '120%', + handleStyle: { + borderColor: '#fff', + borderWidth: 1 + }, + indicatorIcon: 'circle', + indicatorSize: '50%', + indicatorStyle: { + borderColor: '#fff', + borderWidth: 2, + shadowBlur: 2, + shadowOffsetX: 1, + shadowOffsetY: 1, + shadowColor: 'rgba(0,0,0,0.2)' + } // emphasis: { + // handleStyle: { + // shadowBlur: 3, + // shadowOffsetX: 1, + // shadowOffsetY: 1, + // shadowColor: 'rgba(0,0,0,0.2)' + // } + // } + + }); + return ContinuousModel; + }(VisualMapModel); + + function getColorStopValues(visualMapModel, valueState, dataExtent) { + if (dataExtent[0] === dataExtent[1]) { + return dataExtent.slice(); + } // When using colorHue mapping, it is not linear color any more. + // Moreover, canvas gradient seems not to be accurate linear. + // FIXME + // Should be arbitrary value 100? or based on pixel size? + + + var count = 200; + var step = (dataExtent[1] - dataExtent[0]) / count; + var value = dataExtent[0]; + var stopValues = []; + + for (var i = 0; i <= count && value < dataExtent[1]; i++) { + stopValues.push(value); + value += step; + } + + stopValues.push(dataExtent[1]); + return stopValues; + } + + var VisualMapView = + /** @class */ + function (_super) { + __extends(VisualMapView, _super); + + function VisualMapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = VisualMapView.type; + _this.autoPositionValues = { + left: 1, + right: 1, + top: 1, + bottom: 1 + }; + return _this; + } + + VisualMapView.prototype.init = function (ecModel, api) { + this.ecModel = ecModel; + this.api = api; + }; + /** + * @protected + */ + + + VisualMapView.prototype.render = function (visualMapModel, ecModel, api, payload // TODO: TYPE + ) { + this.visualMapModel = visualMapModel; + + if (visualMapModel.get('show') === false) { + this.group.removeAll(); + return; + } + + this.doRender(visualMapModel, ecModel, api, payload); + }; + /** + * @protected + */ + + + VisualMapView.prototype.renderBackground = function (group) { + var visualMapModel = this.visualMapModel; + var padding = normalizeCssArray$1(visualMapModel.get('padding') || 0); + var rect = group.getBoundingRect(); + group.add(new Rect({ + z2: -1, + silent: true, + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[3] + padding[1], + height: rect.height + padding[0] + padding[2] + }, + style: { + fill: visualMapModel.get('backgroundColor'), + stroke: visualMapModel.get('borderColor'), + lineWidth: visualMapModel.get('borderWidth') + } + })); + }; + /** + * @protected + * @param targetValue can be Infinity or -Infinity + * @param visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize' + * @param opts + * @param opts.forceState Specify state, instead of using getValueState method. + * @param opts.convertOpacityToAlpha For color gradient in controller widget. + * @return {*} Visual value. + */ + + + VisualMapView.prototype.getControllerVisual = function (targetValue, visualCluster, opts) { + opts = opts || {}; + var forceState = opts.forceState; + var visualMapModel = this.visualMapModel; + var visualObj = {}; // Default values. + + if (visualCluster === 'color') { + var defaultColor = visualMapModel.get('contentColor'); + visualObj.color = defaultColor; + } + + function getter(key) { + return visualObj[key]; + } + + function setter(key, value) { + visualObj[key] = value; + } + + var mappings = visualMapModel.controllerVisuals[forceState || visualMapModel.getValueState(targetValue)]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + each(visualTypes, function (type) { + var visualMapping = mappings[type]; + + if (opts.convertOpacityToAlpha && type === 'opacity') { + type = 'colorAlpha'; + visualMapping = mappings.__alphaForOpacity; + } + + if (VisualMapping.dependsOn(type, visualCluster)) { + visualMapping && visualMapping.applyVisual(targetValue, getter, setter); + } + }); + return visualObj[visualCluster]; + }; + + VisualMapView.prototype.positionGroup = function (group) { + var model = this.visualMapModel; + var api = this.api; + positionElement(group, model.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + }; + + VisualMapView.prototype.doRender = function (visualMapModel, ecModel, api, payload) { + }; + + VisualMapView.type = 'visualMap'; + return VisualMapView; + }(ComponentView); + + var paramsSet = [['left', 'right', 'width'], ['top', 'bottom', 'height']]; + + /** + * @param visualMapModel + * @param api + * @param itemSize always [short, long] + * @return {string} 'left' or 'right' or 'top' or 'bottom' + */ + + function getItemAlign(visualMapModel, api, itemSize) { + var modelOption = visualMapModel.option; + var itemAlign = modelOption.align; + + if (itemAlign != null && itemAlign !== 'auto') { + return itemAlign; + } // Auto decision align. + + + var ecSize = { + width: api.getWidth(), + height: api.getHeight() + }; + var realIndex = modelOption.orient === 'horizontal' ? 1 : 0; + var reals = paramsSet[realIndex]; + var fakeValue = [0, null, 10]; + var layoutInput = {}; + + for (var i = 0; i < 3; i++) { + layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i]; + layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]]; + } + + var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex]; + var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding); + return reals[(rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 < ecSize[rParam[1]] * 0.5 ? 0 : 1]; + } + + /** + * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and + * dataIndexInside means filtered index. + */ + // TODO: TYPE more specified payload types. + + function makeHighDownBatch(batch, visualMapModel) { + each(batch || [], function (batchItem) { + if (batchItem.dataIndex != null) { + batchItem.dataIndexInside = batchItem.dataIndex; + batchItem.dataIndex = null; + } + + batchItem.highlightKey = 'visualMap' + (visualMapModel ? visualMapModel.componentIndex : ''); + }); + return batch; + } + + var linearMap$2 = linearMap; + var each$e = each; + var mathMin$a = Math.min; + var mathMax$a = Math.max; // Arbitrary value + + var HOVER_LINK_SIZE = 12; + var HOVER_LINK_OUT = 6; // Notice: + // Any "interval" should be by the order of [low, high]. + // "handle0" (handleIndex === 0) maps to + // low data value: this._dataInterval[0] and has low coord. + // "handle1" (handleIndex === 1) maps to + // high data value: this._dataInterval[1] and has high coord. + // The logic of transform is implemented in this._createBarGroup. + + var ContinuousView = + /** @class */ + function (_super) { + __extends(ContinuousView, _super); + + function ContinuousView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = ContinuousView.type; + _this._shapes = {}; + _this._dataInterval = []; + _this._handleEnds = []; + _this._hoverLinkDataIndices = []; + return _this; + } + + ContinuousView.prototype.doRender = function (visualMapModel, ecModel, api, payload) { + this._api = api; + + if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) { + this._buildView(); + } + }; + + ContinuousView.prototype._buildView = function () { + this.group.removeAll(); + var visualMapModel = this.visualMapModel; + var thisGroup = this.group; + this._orient = visualMapModel.get('orient'); + this._useHandle = visualMapModel.get('calculable'); + + this._resetInterval(); + + this._renderBar(thisGroup); + + var dataRangeText = visualMapModel.get('text'); + + this._renderEndsText(thisGroup, dataRangeText, 0); + + this._renderEndsText(thisGroup, dataRangeText, 1); // Do this for background size calculation. + + + this._updateView(true); // After updating view, inner shapes is built completely, + // and then background can be rendered. + + + this.renderBackground(thisGroup); // Real update view + + this._updateView(); + + this._enableHoverLinkToSeries(); + + this._enableHoverLinkFromSeries(); + + this.positionGroup(thisGroup); + }; + + ContinuousView.prototype._renderEndsText = function (group, dataRangeText, endsIndex) { + if (!dataRangeText) { + return; + } // Compatible with ec2, text[0] map to high value, text[1] map low value. + + + var text = dataRangeText[1 - endsIndex]; + text = text != null ? text + '' : ''; + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var itemSize = visualMapModel.itemSize; + var barGroup = this._shapes.mainGroup; + + var position = this._applyTransform([itemSize[0] / 2, endsIndex === 0 ? -textGap : itemSize[1] + textGap], barGroup); + + var align = this._applyTransform(endsIndex === 0 ? 'bottom' : 'top', barGroup); + + var orient = this._orient; + var textStyleModel = this.visualMapModel.textStyleModel; + this.group.add(new ZRText({ + style: createTextStyle(textStyleModel, { + x: position[0], + y: position[1], + verticalAlign: orient === 'horizontal' ? 'middle' : align, + align: orient === 'horizontal' ? align : 'center', + text: text + }) + })); + }; + + ContinuousView.prototype._renderBar = function (targetGroup) { + var visualMapModel = this.visualMapModel; + var shapes = this._shapes; + var itemSize = visualMapModel.itemSize; + var orient = this._orient; + var useHandle = this._useHandle; + var itemAlign = getItemAlign(visualMapModel, this.api, itemSize); + + var mainGroup = shapes.mainGroup = this._createBarGroup(itemAlign); + + var gradientBarGroup = new Group(); + mainGroup.add(gradientBarGroup); // Bar + + gradientBarGroup.add(shapes.outOfRange = createPolygon()); + gradientBarGroup.add(shapes.inRange = createPolygon(null, useHandle ? getCursor$1(this._orient) : null, bind(this._dragHandle, this, 'all', false), bind(this._dragHandle, this, 'all', true))); // A border radius clip. + + gradientBarGroup.setClipPath(new Rect({ + shape: { + x: 0, + y: 0, + width: itemSize[0], + height: itemSize[1], + r: 3 + } + })); + var textRect = visualMapModel.textStyleModel.getTextRect('国'); + var textSize = mathMax$a(textRect.width, textRect.height); // Handle + + if (useHandle) { + shapes.handleThumbs = []; + shapes.handleLabels = []; + shapes.handleLabelPoints = []; + + this._createHandle(visualMapModel, mainGroup, 0, itemSize, textSize, orient); + + this._createHandle(visualMapModel, mainGroup, 1, itemSize, textSize, orient); + } + + this._createIndicator(visualMapModel, mainGroup, itemSize, textSize, orient); + + targetGroup.add(mainGroup); + }; + + ContinuousView.prototype._createHandle = function (visualMapModel, mainGroup, handleIndex, itemSize, textSize, orient) { + var onDrift = bind(this._dragHandle, this, handleIndex, false); + var onDragEnd = bind(this._dragHandle, this, handleIndex, true); + var handleSize = parsePercent(visualMapModel.get('handleSize'), itemSize[0]); + var handleThumb = createSymbol(visualMapModel.get('handleIcon'), -handleSize / 2, -handleSize / 2, handleSize, handleSize, null, true); + var cursor = getCursor$1(this._orient); + handleThumb.attr({ + cursor: cursor, + draggable: true, + drift: onDrift, + ondragend: onDragEnd, + onmousemove: function (e) { + stop(e.event); + } + }); + handleThumb.x = itemSize[0] / 2; + handleThumb.useStyle(visualMapModel.getModel('handleStyle').getItemStyle()); + handleThumb.setStyle({ + strokeNoScale: true, + strokeFirst: true + }); + handleThumb.style.lineWidth *= 2; + handleThumb.ensureState('emphasis').style = visualMapModel.getModel(['emphasis', 'handleStyle']).getItemStyle(); + setAsHighDownDispatcher(handleThumb, true); + mainGroup.add(handleThumb); // Text is always horizontal layout but should not be effected by + // transform (orient/inverse). So label is built separately but not + // use zrender/graphic/helper/RectText, and is located based on view + // group (according to handleLabelPoint) but not barGroup. + + var textStyleModel = this.visualMapModel.textStyleModel; + var handleLabel = new ZRText({ + cursor: cursor, + draggable: true, + drift: onDrift, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '' + }) + }); + handleLabel.ensureState('blur').style = { + opacity: 0.1 + }; + handleLabel.stateTransition = { + duration: 200 + }; + this.group.add(handleLabel); + var handleLabelPoint = [handleSize, 0]; + var shapes = this._shapes; + shapes.handleThumbs[handleIndex] = handleThumb; + shapes.handleLabelPoints[handleIndex] = handleLabelPoint; + shapes.handleLabels[handleIndex] = handleLabel; + }; + + ContinuousView.prototype._createIndicator = function (visualMapModel, mainGroup, itemSize, textSize, orient) { + var scale = parsePercent(visualMapModel.get('indicatorSize'), itemSize[0]); + var indicator = createSymbol(visualMapModel.get('indicatorIcon'), -scale / 2, -scale / 2, scale, scale, null, true); + indicator.attr({ + cursor: 'move', + invisible: true, + silent: true, + x: itemSize[0] / 2 + }); + var indicatorStyle = visualMapModel.getModel('indicatorStyle').getItemStyle(); + + if (indicator instanceof ZRImage) { + var pathStyle = indicator.style; + indicator.useStyle(extend({ + // TODO other properties like x, y ? + image: pathStyle.image, + x: pathStyle.x, + y: pathStyle.y, + width: pathStyle.width, + height: pathStyle.height + }, indicatorStyle)); + } else { + indicator.useStyle(indicatorStyle); + } + + mainGroup.add(indicator); + var textStyleModel = this.visualMapModel.textStyleModel; + var indicatorLabel = new ZRText({ + silent: true, + invisible: true, + style: createTextStyle(textStyleModel, { + x: 0, + y: 0, + text: '' + }) + }); + this.group.add(indicatorLabel); + var indicatorLabelPoint = [(orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT) + itemSize[0] / 2, 0]; + var shapes = this._shapes; + shapes.indicator = indicator; + shapes.indicatorLabel = indicatorLabel; + shapes.indicatorLabelPoint = indicatorLabelPoint; + this._firstShowIndicator = true; + }; + + ContinuousView.prototype._dragHandle = function (handleIndex, isEnd, // dx is event from ondragend if isEnd is true. It's not used + dx, dy) { + if (!this._useHandle) { + return; + } + + this._dragging = !isEnd; + + if (!isEnd) { + // Transform dx, dy to bar coordination. + var vertex = this._applyTransform([dx, dy], this._shapes.mainGroup, true); + + this._updateInterval(handleIndex, vertex[1]); + + this._hideIndicator(); // Considering realtime, update view should be executed + // before dispatch action. + + + this._updateView(); + } // dragEnd do not dispatch action when realtime. + + + if (isEnd === !this.visualMapModel.get('realtime')) { + // jshint ignore:line + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: this._dataInterval.slice() + }); + } + + if (isEnd) { + !this._hovering && this._clearHoverLinkToSeries(); + } else if (useHoverLinkOnHandle(this.visualMapModel)) { + this._doHoverLinkToSeries(this._handleEnds[handleIndex], false); + } + }; + + ContinuousView.prototype._resetInterval = function () { + var visualMapModel = this.visualMapModel; + var dataInterval = this._dataInterval = visualMapModel.getSelected(); + var dataExtent = visualMapModel.getExtent(); + var sizeExtent = [0, visualMapModel.itemSize[1]]; + this._handleEnds = [linearMap$2(dataInterval[0], dataExtent, sizeExtent, true), linearMap$2(dataInterval[1], dataExtent, sizeExtent, true)]; + }; + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} dx + * @param {number} dy + */ + + + ContinuousView.prototype._updateInterval = function (handleIndex, delta) { + delta = delta || 0; + var visualMapModel = this.visualMapModel; + var handleEnds = this._handleEnds; + var sizeExtent = [0, visualMapModel.itemSize[1]]; + sliderMove(delta, handleEnds, sizeExtent, handleIndex, // cross is forbiden + 0); + var dataExtent = visualMapModel.getExtent(); // Update data interval. + + this._dataInterval = [linearMap$2(handleEnds[0], sizeExtent, dataExtent, true), linearMap$2(handleEnds[1], sizeExtent, dataExtent, true)]; + }; + + ContinuousView.prototype._updateView = function (forSketch) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var shapes = this._shapes; + var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]]; + var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds; + + var visualInRange = this._createBarVisual(this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange'); + + var visualOutOfRange = this._createBarVisual(dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange'); + + shapes.inRange.setStyle({ + fill: visualInRange.barColor // opacity: visualInRange.opacity + + }).setShape('points', visualInRange.barPoints); + shapes.outOfRange.setStyle({ + fill: visualOutOfRange.barColor // opacity: visualOutOfRange.opacity + + }).setShape('points', visualOutOfRange.barPoints); + + this._updateHandle(inRangeHandleEnds, visualInRange); + }; + + ContinuousView.prototype._createBarVisual = function (dataInterval, dataExtent, handleEnds, forceState) { + var opts = { + forceState: forceState, + convertOpacityToAlpha: true + }; + + var colorStops = this._makeColorGradient(dataInterval, opts); + + var symbolSizes = [this.getControllerVisual(dataInterval[0], 'symbolSize', opts), this.getControllerVisual(dataInterval[1], 'symbolSize', opts)]; + + var barPoints = this._createBarPoints(handleEnds, symbolSizes); + + return { + barColor: new LinearGradient(0, 0, 0, 1, colorStops), + barPoints: barPoints, + handlesColor: [colorStops[0].color, colorStops[colorStops.length - 1].color] + }; + }; + + ContinuousView.prototype._makeColorGradient = function (dataInterval, opts) { + // Considering colorHue, which is not linear, so we have to sample + // to calculate gradient color stops, but not only caculate head + // and tail. + var sampleNumber = 100; // Arbitrary value. + + var colorStops = []; + var step = (dataInterval[1] - dataInterval[0]) / sampleNumber; + colorStops.push({ + color: this.getControllerVisual(dataInterval[0], 'color', opts), + offset: 0 + }); + + for (var i = 1; i < sampleNumber; i++) { + var currValue = dataInterval[0] + step * i; + + if (currValue > dataInterval[1]) { + break; + } + + colorStops.push({ + color: this.getControllerVisual(currValue, 'color', opts), + offset: i / sampleNumber + }); + } + + colorStops.push({ + color: this.getControllerVisual(dataInterval[1], 'color', opts), + offset: 1 + }); + return colorStops; + }; + + ContinuousView.prototype._createBarPoints = function (handleEnds, symbolSizes) { + var itemSize = this.visualMapModel.itemSize; + return [[itemSize[0] - symbolSizes[0], handleEnds[0]], [itemSize[0], handleEnds[0]], [itemSize[0], handleEnds[1]], [itemSize[0] - symbolSizes[1], handleEnds[1]]]; + }; + + ContinuousView.prototype._createBarGroup = function (itemAlign) { + var orient = this._orient; + var inverse = this.visualMapModel.get('inverse'); + return new Group(orient === 'horizontal' && !inverse ? { + scaleX: itemAlign === 'bottom' ? 1 : -1, + rotation: Math.PI / 2 + } : orient === 'horizontal' && inverse ? { + scaleX: itemAlign === 'bottom' ? -1 : 1, + rotation: -Math.PI / 2 + } : orient === 'vertical' && !inverse ? { + scaleX: itemAlign === 'left' ? 1 : -1, + scaleY: -1 + } : { + scaleX: itemAlign === 'left' ? 1 : -1 + }); + }; + + ContinuousView.prototype._updateHandle = function (handleEnds, visualInRange) { + if (!this._useHandle) { + return; + } + + var shapes = this._shapes; + var visualMapModel = this.visualMapModel; + var handleThumbs = shapes.handleThumbs; + var handleLabels = shapes.handleLabels; + var itemSize = visualMapModel.itemSize; + var dataExtent = visualMapModel.getExtent(); + each$e([0, 1], function (handleIndex) { + var handleThumb = handleThumbs[handleIndex]; + handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]); + handleThumb.y = handleEnds[handleIndex]; + var val = linearMap$2(handleEnds[handleIndex], [0, itemSize[1]], dataExtent, true); + var symbolSize = this.getControllerVisual(val, 'symbolSize'); + handleThumb.scaleX = handleThumb.scaleY = symbolSize / itemSize[0]; + handleThumb.x = itemSize[0] - symbolSize / 2; // Update handle label position. + + var textPoint = applyTransform$1(shapes.handleLabelPoints[handleIndex], getTransform(handleThumb, this.group)); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + text: visualMapModel.formatValueText(this._dataInterval[handleIndex]), + verticalAlign: 'middle', + align: this._orient === 'vertical' ? this._applyTransform('left', shapes.mainGroup) : 'center' + }); + }, this); + }; + + ContinuousView.prototype._showIndicator = function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var itemSize = visualMapModel.itemSize; + var sizeExtent = [0, itemSize[1]]; + var shapes = this._shapes; + var indicator = shapes.indicator; + + if (!indicator) { + return; + } + + indicator.attr('invisible', false); + var opts = { + convertOpacityToAlpha: true + }; + var color = this.getControllerVisual(cursorValue, 'color', opts); + var symbolSize = this.getControllerVisual(cursorValue, 'symbolSize'); + var y = linearMap$2(cursorValue, dataExtent, sizeExtent, true); + var x = itemSize[0] - symbolSize / 2; + var oldIndicatorPos = { + x: indicator.x, + y: indicator.y + }; // Update handle label position. + + indicator.y = y; + indicator.x = x; + var textPoint = applyTransform$1(shapes.indicatorLabelPoint, getTransform(indicator, this.group)); + var indicatorLabel = shapes.indicatorLabel; + indicatorLabel.attr('invisible', false); + + var align = this._applyTransform('left', shapes.mainGroup); + + var orient = this._orient; + var isHorizontal = orient === 'horizontal'; + indicatorLabel.setStyle({ + text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue), + verticalAlign: isHorizontal ? align : 'middle', + align: isHorizontal ? 'center' : align + }); + var indicatorNewProps = { + x: x, + y: y, + style: { + fill: color + } + }; + var labelNewProps = { + style: { + x: textPoint[0], + y: textPoint[1] + } + }; + + if (visualMapModel.ecModel.isAnimationEnabled() && !this._firstShowIndicator) { + var animationCfg = { + duration: 100, + easing: 'cubicInOut', + additive: true + }; + indicator.x = oldIndicatorPos.x; + indicator.y = oldIndicatorPos.y; + indicator.animateTo(indicatorNewProps, animationCfg); + indicatorLabel.animateTo(labelNewProps, animationCfg); + } else { + indicator.attr(indicatorNewProps); + indicatorLabel.attr(labelNewProps); + } + + this._firstShowIndicator = false; + var handleLabels = this._shapes.handleLabels; + + if (handleLabels) { + for (var i = 0; i < handleLabels.length; i++) { + // Fade out handle labels. + // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it. + this._api.enterBlur(handleLabels[i]); + } + } + }; + + ContinuousView.prototype._enableHoverLinkToSeries = function () { + var self = this; + + this._shapes.mainGroup.on('mousemove', function (e) { + self._hovering = true; + + if (!self._dragging) { + var itemSize = self.visualMapModel.itemSize; + + var pos = self._applyTransform([e.offsetX, e.offsetY], self._shapes.mainGroup, true, true); // For hover link show when hover handle, which might be + // below or upper than sizeExtent. + + + pos[1] = mathMin$a(mathMax$a(0, pos[1]), itemSize[1]); + + self._doHoverLinkToSeries(pos[1], 0 <= pos[0] && pos[0] <= itemSize[0]); + } + }).on('mouseout', function () { + // When mouse is out of handle, hoverLink still need + // to be displayed when realtime is set as false. + self._hovering = false; + !self._dragging && self._clearHoverLinkToSeries(); + }); + }; + + ContinuousView.prototype._enableHoverLinkFromSeries = function () { + var zr = this.api.getZr(); + + if (this.visualMapModel.option.hoverLink) { + zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this); + zr.on('mouseout', this._hideIndicator, this); + } else { + this._clearHoverLinkFromSeries(); + } + }; + + ContinuousView.prototype._doHoverLinkToSeries = function (cursorPos, hoverOnBar) { + var visualMapModel = this.visualMapModel; + var itemSize = visualMapModel.itemSize; + + if (!visualMapModel.option.hoverLink) { + return; + } + + var sizeExtent = [0, itemSize[1]]; + var dataExtent = visualMapModel.getExtent(); // For hover link show when hover handle, which might be below or upper than sizeExtent. + + cursorPos = mathMin$a(mathMax$a(sizeExtent[0], cursorPos), sizeExtent[1]); + var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent); + var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize]; + var cursorValue = linearMap$2(cursorPos, sizeExtent, dataExtent, true); + var valueRange = [linearMap$2(hoverRange[0], sizeExtent, dataExtent, true), linearMap$2(hoverRange[1], sizeExtent, dataExtent, true)]; // Consider data range is out of visualMap range, see test/visualMap-continuous.html, + // where china and india has very large population. + + hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity); + hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity); // Do not show indicator when mouse is over handle, + // otherwise labels overlap, especially when dragging. + + if (hoverOnBar) { + if (valueRange[0] === -Infinity) { + this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize); + } else if (valueRange[1] === Infinity) { + this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize); + } else { + this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize); + } + } // When realtime is set as false, handles, which are in barGroup, + // also trigger hoverLink, which help user to realize where they + // focus on when dragging. (see test/heatmap-large.html) + // When realtime is set as true, highlight will not show when hover + // handle, because the label on handle, which displays a exact value + // but not range, might mislead users. + + + var oldBatch = this._hoverLinkDataIndices; + var newBatch = []; + + if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) { + newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange); + } + + var resultBatches = compressBatches(oldBatch, newBatch); + + this._dispatchHighDown('downplay', makeHighDownBatch(resultBatches[0], visualMapModel)); + + this._dispatchHighDown('highlight', makeHighDownBatch(resultBatches[1], visualMapModel)); + }; + + ContinuousView.prototype._hoverLinkFromSeriesMouseOver = function (e) { + var el = e.target; + var visualMapModel = this.visualMapModel; + + if (!el || getECData(el).dataIndex == null) { + return; + } + + var ecData = getECData(el); + var dataModel = this.ecModel.getSeriesByIndex(ecData.seriesIndex); + + if (!visualMapModel.isTargetSeries(dataModel)) { + return; + } + + var data = dataModel.getData(ecData.dataType); + var value = data.getStore().get(visualMapModel.getDataDimensionIndex(data), ecData.dataIndex); + + if (!isNaN(value)) { + this._showIndicator(value, value); + } + }; + + ContinuousView.prototype._hideIndicator = function () { + var shapes = this._shapes; + shapes.indicator && shapes.indicator.attr('invisible', true); + shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true); + var handleLabels = this._shapes.handleLabels; + + if (handleLabels) { + for (var i = 0; i < handleLabels.length; i++) { + // Fade out handle labels. + // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it. + this._api.leaveBlur(handleLabels[i]); + } + } + }; + + ContinuousView.prototype._clearHoverLinkToSeries = function () { + this._hideIndicator(); + + var indices = this._hoverLinkDataIndices; + + this._dispatchHighDown('downplay', makeHighDownBatch(indices, this.visualMapModel)); + + indices.length = 0; + }; + + ContinuousView.prototype._clearHoverLinkFromSeries = function () { + this._hideIndicator(); + + var zr = this.api.getZr(); + zr.off('mouseover', this._hoverLinkFromSeriesMouseOver); + zr.off('mouseout', this._hideIndicator); + }; + + ContinuousView.prototype._applyTransform = function (vertex, element, inverse, global) { + var transform = getTransform(element, global ? null : this.group); + return isArray(vertex) ? applyTransform$1(vertex, transform, inverse) : transformDirection(vertex, transform, inverse); + }; // TODO: TYPE more specified payload types. + + + ContinuousView.prototype._dispatchHighDown = function (type, batch) { + batch && batch.length && this.api.dispatchAction({ + type: type, + batch: batch + }); + }; + /** + * @override + */ + + + ContinuousView.prototype.dispose = function () { + this._clearHoverLinkFromSeries(); + + this._clearHoverLinkToSeries(); + }; + /** + * @override + */ + + + ContinuousView.prototype.remove = function () { + this._clearHoverLinkFromSeries(); + + this._clearHoverLinkToSeries(); + }; + + ContinuousView.type = 'visualMap.continuous'; + return ContinuousView; + }(VisualMapView); + + function createPolygon(points, cursor, onDrift, onDragEnd) { + return new Polygon({ + shape: { + points: points + }, + draggable: !!onDrift, + cursor: cursor, + drift: onDrift, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd + }); + } + + function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) { + var halfHoverLinkSize = HOVER_LINK_SIZE / 2; + var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize'); + + if (hoverLinkDataSize) { + halfHoverLinkSize = linearMap$2(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2; + } + + return halfHoverLinkSize; + } + + function useHoverLinkOnHandle(visualMapModel) { + var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle'); + return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle); + } + + function getCursor$1(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; + } + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + + /** + * AUTO-GENERATED FILE. DO NOT MODIFY. + */ + + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + var visualMapActionInfo = { + type: 'selectDataRange', + event: 'dataRangeSelected', + // FIXME use updateView appears wrong + update: 'update' + }; + var visualMapActionHander = function (payload, ecModel) { + ecModel.eachComponent({ + mainType: 'visualMap', + query: payload + }, function (model) { + model.setSelected(payload.selected); + }); + }; + + var visualMapEncodingHandlers = [{ + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var resetDefines = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + var pipelineContext = seriesModel.pipelineContext; + + if (!visualMapModel.isTargetSeries(seriesModel) || pipelineContext && pipelineContext.large) { + return; + } + + resetDefines.push(incrementalApplyVisual(visualMapModel.stateList, visualMapModel.targetVisuals, bind(visualMapModel.getValueState, visualMapModel), visualMapModel.getDataDimensionIndex(seriesModel.getData()))); + }); + return resetDefines; + } + }, // Only support color. + { + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var visualMetaList = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + if (visualMapModel.isTargetSeries(seriesModel)) { + var visualMeta = visualMapModel.getVisualMeta(bind(getColorVisual, null, seriesModel, visualMapModel)) || { + stops: [], + outerColors: [] + }; + var dimIdx = visualMapModel.getDataDimensionIndex(data); + + if (dimIdx >= 0) { + // visualMeta.dimension should be dimension index, but not concrete dimension. + visualMeta.dimension = dimIdx; + visualMetaList.push(visualMeta); + } + } + }); // console.log(JSON.stringify(visualMetaList.map(a => a.stops))); + + seriesModel.getData().setVisual('visualMeta', visualMetaList); + } + }]; // FIXME + // performance and export for heatmap? + // value can be Infinity or -Infinity + + function getColorVisual(seriesModel, visualMapModel, value, valueState) { + var mappings = visualMapModel.targetVisuals[valueState]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + var resultVisual = { + color: getVisualFromData(seriesModel.getData(), 'color') // default color. + + }; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + var mapping = mappings[type === 'opacity' ? '__alphaForOpacity' : type]; + mapping && mapping.applyVisual(value, getVisual, setVisual); + } + + return resultVisual.color; + + function getVisual(key) { + return resultVisual[key]; + } + + function setVisual(key, value) { + resultVisual[key] = value; + } + } + + var each$f = each; + + function visualMapPreprocessor(option) { + var visualMap = option && option.visualMap; + + if (!isArray(visualMap)) { + visualMap = visualMap ? [visualMap] : []; + } + + each$f(visualMap, function (opt) { + if (!opt) { + return; + } // rename splitList to pieces + + + if (has$1(opt, 'splitList') && !has$1(opt, 'pieces')) { + opt.pieces = opt.splitList; + delete opt.splitList; + } + + var pieces = opt.pieces; + + if (pieces && isArray(pieces)) { + each$f(pieces, function (piece) { + if (isObject(piece)) { + if (has$1(piece, 'start') && !has$1(piece, 'min')) { + piece.min = piece.start; + } + + if (has$1(piece, 'end') && !has$1(piece, 'max')) { + piece.max = piece.end; + } + } + }); + } + }); + } + + function has$1(obj, name) { + return obj && obj.hasOwnProperty && obj.hasOwnProperty(name); + } + + var installed$1 = false; + + function installCommon$1(registers) { + if (installed$1) { + return; + } + + installed$1 = true; + registers.registerSubTypeDefaulter('visualMap', function (option) { + // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used. + return !option.categories && (!(option.pieces ? option.pieces.length > 0 : option.splitNumber > 0) || option.calculable) ? 'continuous' : 'piecewise'; + }); + registers.registerAction(visualMapActionInfo, visualMapActionHander); + each(visualMapEncodingHandlers, function (handler) { + registers.registerVisual(registers.PRIORITY.VISUAL.COMPONENT, handler); + }); + registers.registerPreprocessor(visualMapPreprocessor); + } + + function install$N(registers) { + registers.registerComponentModel(ContinuousModel); + registers.registerComponentView(ContinuousView); + installCommon$1(registers); + } + + var PiecewiseModel = + /** @class */ + function (_super) { + __extends(PiecewiseModel, _super); + + function PiecewiseModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PiecewiseModel.type; + /** + * The order is always [low, ..., high]. + * [{text: string, interval: Array.}, ...] + */ + + _this._pieceList = []; + return _this; + } + + PiecewiseModel.prototype.optionUpdated = function (newOption, isInit) { + _super.prototype.optionUpdated.apply(this, arguments); + + this.resetExtent(); + + var mode = this._mode = this._determineMode(); + + this._pieceList = []; + + resetMethods[this._mode].call(this, this._pieceList); + + this._resetSelected(newOption, isInit); + + var categories = this.option.categories; + this.resetVisual(function (mappingOption, state) { + if (mode === 'categories') { + mappingOption.mappingMethod = 'category'; + mappingOption.categories = clone(categories); + } else { + mappingOption.dataExtent = this.getExtent(); + mappingOption.mappingMethod = 'piecewise'; + mappingOption.pieceList = map(this._pieceList, function (piece) { + piece = clone(piece); + + if (state !== 'inRange') { + // FIXME + // outOfRange do not support special visual in pieces. + piece.visual = null; + } + + return piece; + }); + } + }); + }; + /** + * @protected + * @override + */ + + + PiecewiseModel.prototype.completeVisualOption = function () { + // Consider this case: + // visualMap: { + // pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}] + // } + // where no inRange/outOfRange set but only pieces. So we should make + // default inRange/outOfRange for this case, otherwise visuals that only + // appear in `pieces` will not be taken into account in visual encoding. + var option = this.option; + var visualTypesInPieces = {}; + var visualTypes = VisualMapping.listVisualTypes(); + var isCategory = this.isCategory(); + each(option.pieces, function (piece) { + each(visualTypes, function (visualType) { + if (piece.hasOwnProperty(visualType)) { + visualTypesInPieces[visualType] = 1; + } + }); + }); + each(visualTypesInPieces, function (v, visualType) { + var exists = false; + each(this.stateList, function (state) { + exists = exists || has(option, state, visualType) || has(option.target, state, visualType); + }, this); + !exists && each(this.stateList, function (state) { + (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === 'inRange' ? 'active' : 'inactive', isCategory); + }); + }, this); + + function has(obj, state, visualType) { + return obj && obj[state] && obj[state].hasOwnProperty(visualType); + } + + _super.prototype.completeVisualOption.apply(this, arguments); + }; + + PiecewiseModel.prototype._resetSelected = function (newOption, isInit) { + var thisOption = this.option; + var pieceList = this._pieceList; // Selected do not merge but all override. + + var selected = (isInit ? thisOption : newOption).selected || {}; + thisOption.selected = selected; // Consider 'not specified' means true. + + each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + + if (!selected.hasOwnProperty(key)) { + selected[key] = true; + } + }, this); + + if (thisOption.selectedMode === 'single') { + // Ensure there is only one selected. + var hasSel_1 = false; + each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + + if (selected[key]) { + hasSel_1 ? selected[key] = false : hasSel_1 = true; + } + }, this); + } // thisOption.selectedMode === 'multiple', default: all selected. + + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getItemSymbol = function () { + return this.get('itemSymbol'); + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getSelectedMapKey = function (piece) { + return this._mode === 'categories' ? piece.value + '' : piece.index + ''; + }; + /** + * @public + */ + + + PiecewiseModel.prototype.getPieceList = function () { + return this._pieceList; + }; + /** + * @return {string} + */ + + + PiecewiseModel.prototype._determineMode = function () { + var option = this.option; + return option.pieces && option.pieces.length > 0 ? 'pieces' : this.option.categories ? 'categories' : 'splitNumber'; + }; + /** + * @override + */ + + + PiecewiseModel.prototype.setSelected = function (selected) { + this.option.selected = clone(selected); + }; + /** + * @override + */ + + + PiecewiseModel.prototype.getValueState = function (value) { + var index = VisualMapping.findPieceIndex(value, this._pieceList); + return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? 'inRange' : 'outOfRange' : 'outOfRange'; + }; + /** + * @public + * @param pieceIndex piece index in visualMapModel.getPieceList() + */ + + + PiecewiseModel.prototype.findTargetDataIndices = function (pieceIndex) { + var result = []; + var pieceList = this._pieceList; + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + data.each(this.getDataDimensionIndex(data), function (value, dataIndex) { + // Should always base on model pieceList, because it is order sensitive. + var pIdx = VisualMapping.findPieceIndex(value, pieceList); + pIdx === pieceIndex && dataIndices.push(dataIndex); + }, this); + result.push({ + seriesId: seriesModel.id, + dataIndex: dataIndices + }); + }, this); + return result; + }; + /** + * @private + * @param piece piece.value or piece.interval is required. + * @return Can be Infinity or -Infinity + */ + + + PiecewiseModel.prototype.getRepresentValue = function (piece) { + var representValue; + + if (this.isCategory()) { + representValue = piece.value; + } else { + if (piece.value != null) { + representValue = piece.value; + } else { + var pieceInterval = piece.interval || []; + representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2; + } + } + + return representValue; + }; + + PiecewiseModel.prototype.getVisualMeta = function (getColorVisual) { + // Do not support category. (category axis is ordinal, numerical) + if (this.isCategory()) { + return; + } + + var stops = []; + var outerColors = ['', '']; + var visualMapModel = this; + + function setStop(interval, valueState) { + var representValue = visualMapModel.getRepresentValue({ + interval: interval + }); // Not category + + if (!valueState) { + valueState = visualMapModel.getValueState(representValue); + } + + var color = getColorVisual(representValue, valueState); + + if (interval[0] === -Infinity) { + outerColors[0] = color; + } else if (interval[1] === Infinity) { + outerColors[1] = color; + } else { + stops.push({ + value: interval[0], + color: color + }, { + value: interval[1], + color: color + }); + } + } // Suplement + + + var pieceList = this._pieceList.slice(); + + if (!pieceList.length) { + pieceList.push({ + interval: [-Infinity, Infinity] + }); + } else { + var edge = pieceList[0].interval[0]; + edge !== -Infinity && pieceList.unshift({ + interval: [-Infinity, edge] + }); + edge = pieceList[pieceList.length - 1].interval[1]; + edge !== Infinity && pieceList.push({ + interval: [edge, Infinity] + }); + } + + var curr = -Infinity; + each(pieceList, function (piece) { + var interval = piece.interval; + + if (interval) { + // Fulfill gap. + interval[0] > curr && setStop([curr, interval[0]], 'outOfRange'); + setStop(interval.slice()); + curr = interval[1]; + } + }, this); + return { + stops: stops, + outerColors: outerColors + }; + }; + + PiecewiseModel.type = 'visualMap.piecewise'; + PiecewiseModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, { + selected: null, + minOpen: false, + maxOpen: false, + align: 'auto', + itemWidth: 20, + itemHeight: 14, + itemSymbol: 'roundRect', + pieces: null, + categories: null, + splitNumber: 5, + selectedMode: 'multiple', + itemGap: 10, + hoverLink: true // Enable hover highlight. + + }); + return PiecewiseModel; + }(VisualMapModel); + /** + * Key is this._mode + * @type {Object} + * @this {module:echarts/component/viusalMap/PiecewiseMode} + */ + + var resetMethods = { + splitNumber: function (outPieceList) { + var thisOption = this.option; + var precision = Math.min(thisOption.precision, 20); + var dataExtent = this.getExtent(); + var splitNumber = thisOption.splitNumber; + splitNumber = Math.max(parseInt(splitNumber, 10), 1); + thisOption.splitNumber = splitNumber; + var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber; // Precision auto-adaption + + while (+splitStep.toFixed(precision) !== splitStep && precision < 5) { + precision++; + } + + thisOption.precision = precision; + splitStep = +splitStep.toFixed(precision); + + if (thisOption.minOpen) { + outPieceList.push({ + interval: [-Infinity, dataExtent[0]], + close: [0, 0] + }); + } + + for (var index = 0, curr = dataExtent[0]; index < splitNumber; curr += splitStep, index++) { + var max = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep; + outPieceList.push({ + interval: [curr, max], + close: [1, 1] + }); + } + + if (thisOption.maxOpen) { + outPieceList.push({ + interval: [dataExtent[1], Infinity], + close: [0, 0] + }); + } + + reformIntervals(outPieceList); + each(outPieceList, function (piece, index) { + piece.index = index; + piece.text = this.formatValueText(piece.interval); + }, this); + }, + categories: function (outPieceList) { + var thisOption = this.option; + each(thisOption.categories, function (cate) { + // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。 + // 是否改一致。 + outPieceList.push({ + text: this.formatValueText(cate, true), + value: cate + }); + }, this); // See "Order Rule". + + normalizeReverse(thisOption, outPieceList); + }, + pieces: function (outPieceList) { + var thisOption = this.option; + each(thisOption.pieces, function (pieceListItem, index) { + if (!isObject(pieceListItem)) { + pieceListItem = { + value: pieceListItem + }; + } + + var item = { + text: '', + index: index + }; + + if (pieceListItem.label != null) { + item.text = pieceListItem.label; + } + + if (pieceListItem.hasOwnProperty('value')) { + var value = item.value = pieceListItem.value; + item.interval = [value, value]; + item.close = [1, 1]; + } else { + // `min` `max` is legacy option. + // `lt` `gt` `lte` `gte` is recommanded. + var interval = item.interval = []; + var close_1 = item.close = [0, 0]; + var closeList = [1, 0, 1]; + var infinityList = [-Infinity, Infinity]; + var useMinMax = []; + + for (var lg = 0; lg < 2; lg++) { + var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg]; + + for (var i = 0; i < 3 && interval[lg] == null; i++) { + interval[lg] = pieceListItem[names[i]]; + close_1[lg] = closeList[i]; + useMinMax[lg] = i === 2; + } + + interval[lg] == null && (interval[lg] = infinityList[lg]); + } + + useMinMax[0] && interval[1] === Infinity && (close_1[0] = 0); + useMinMax[1] && interval[0] === -Infinity && (close_1[1] = 0); + + if ("development" !== 'production') { + if (interval[0] > interval[1]) { + console.warn('Piece ' + index + 'is illegal: ' + interval + ' lower bound should not greater then uppper bound.'); + } + } + + if (interval[0] === interval[1] && close_1[0] && close_1[1]) { + // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}], + // we use value to lift the priority when min === max + item.value = interval[0]; + } + } + + item.visual = VisualMapping.retrieveVisuals(pieceListItem); + outPieceList.push(item); + }, this); // See "Order Rule". + + normalizeReverse(thisOption, outPieceList); // Only pieces + + reformIntervals(outPieceList); + each(outPieceList, function (piece) { + var close = piece.close; + var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]]; + piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols); + }, this); + } + }; + + function normalizeReverse(thisOption, pieceList) { + var inverse = thisOption.inverse; + + if (thisOption.orient === 'vertical' ? !inverse : inverse) { + pieceList.reverse(); + } + } + + var PiecewiseVisualMapView = + /** @class */ + function (_super) { + __extends(PiecewiseVisualMapView, _super); + + function PiecewiseVisualMapView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = PiecewiseVisualMapView.type; + return _this; + } + + PiecewiseVisualMapView.prototype.doRender = function () { + var thisGroup = this.group; + thisGroup.removeAll(); + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var textStyleModel = visualMapModel.textStyleModel; + var textFont = textStyleModel.getFont(); + var textFill = textStyleModel.getTextColor(); + + var itemAlign = this._getItemAlign(); + + var itemSize = visualMapModel.itemSize; + + var viewData = this._getViewData(); + + var endsText = viewData.endsText; + var showLabel = retrieve(visualMapModel.get('showLabel', true), !endsText); + endsText && this._renderEndsText(thisGroup, endsText[0], itemSize, showLabel, itemAlign); + each(viewData.viewPieceList, function (item) { + var piece = item.piece; + var itemGroup = new Group(); + itemGroup.onclick = bind(this._onItemClick, this, piece); + + this._enableHoverLink(itemGroup, item.indexInModelPieceList); // TODO Category + + + var representValue = visualMapModel.getRepresentValue(piece); + + this._createItemSymbol(itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]]); + + if (showLabel) { + var visualState = this.visualMapModel.getValueState(representValue); + itemGroup.add(new ZRText({ + style: { + x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap, + y: itemSize[1] / 2, + text: piece.text, + verticalAlign: 'middle', + align: itemAlign, + font: textFont, + fill: textFill, + opacity: visualState === 'outOfRange' ? 0.5 : 1 + } + })); + } + + thisGroup.add(itemGroup); + }, this); + endsText && this._renderEndsText(thisGroup, endsText[1], itemSize, showLabel, itemAlign); + box(visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap')); + this.renderBackground(thisGroup); + this.positionGroup(thisGroup); + }; + + PiecewiseVisualMapView.prototype._enableHoverLink = function (itemGroup, pieceIndex) { + var _this = this; + + itemGroup.on('mouseover', function () { + return onHoverLink('highlight'); + }).on('mouseout', function () { + return onHoverLink('downplay'); + }); + + var onHoverLink = function (method) { + var visualMapModel = _this.visualMapModel; // TODO: TYPE More detailed action types + + visualMapModel.option.hoverLink && _this.api.dispatchAction({ + type: method, + batch: makeHighDownBatch(visualMapModel.findTargetDataIndices(pieceIndex), visualMapModel) + }); + }; + }; + + PiecewiseVisualMapView.prototype._getItemAlign = function () { + var visualMapModel = this.visualMapModel; + var modelOption = visualMapModel.option; + + if (modelOption.orient === 'vertical') { + return getItemAlign(visualMapModel, this.api, visualMapModel.itemSize); + } else { + // horizontal, most case left unless specifying right. + var align = modelOption.align; + + if (!align || align === 'auto') { + align = 'left'; + } + + return align; + } + }; + + PiecewiseVisualMapView.prototype._renderEndsText = function (group, text, itemSize, showLabel, itemAlign) { + if (!text) { + return; + } + + var itemGroup = new Group(); + var textStyleModel = this.visualMapModel.textStyleModel; + itemGroup.add(new ZRText({ + style: createTextStyle(textStyleModel, { + x: showLabel ? itemAlign === 'right' ? itemSize[0] : 0 : itemSize[0] / 2, + y: itemSize[1] / 2, + verticalAlign: 'middle', + align: showLabel ? itemAlign : 'center', + text: text + }) + })); + group.add(itemGroup); + }; + /** + * @private + * @return {Object} {peiceList, endsText} The order is the same as screen pixel order. + */ + + + PiecewiseVisualMapView.prototype._getViewData = function () { + var visualMapModel = this.visualMapModel; + var viewPieceList = map(visualMapModel.getPieceList(), function (piece, index) { + return { + piece: piece, + indexInModelPieceList: index + }; + }); + var endsText = visualMapModel.get('text'); // Consider orient and inverse. + + var orient = visualMapModel.get('orient'); + var inverse = visualMapModel.get('inverse'); // Order of model pieceList is always [low, ..., high] + + if (orient === 'horizontal' ? inverse : !inverse) { + viewPieceList.reverse(); + } // Origin order of endsText is [high, low] + else if (endsText) { + endsText = endsText.slice().reverse(); + } + + return { + viewPieceList: viewPieceList, + endsText: endsText + }; + }; + + PiecewiseVisualMapView.prototype._createItemSymbol = function (group, representValue, shapeParam) { + group.add(createSymbol( // symbol will be string + this.getControllerVisual(representValue, 'symbol'), shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3], // color will be string + this.getControllerVisual(representValue, 'color'))); + }; + + PiecewiseVisualMapView.prototype._onItemClick = function (piece) { + var visualMapModel = this.visualMapModel; + var option = visualMapModel.option; + var selected = clone(option.selected); + var newKey = visualMapModel.getSelectedMapKey(piece); + + if (option.selectedMode === 'single') { + selected[newKey] = true; + each(selected, function (o, key) { + selected[key] = key === newKey; + }); + } else { + selected[newKey] = !selected[newKey]; + } + + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: selected + }); + }; + + PiecewiseVisualMapView.type = 'visualMap.piecewise'; + return PiecewiseVisualMapView; + }(VisualMapView); + + function install$O(registers) { + registers.registerComponentModel(PiecewiseModel); + registers.registerComponentView(PiecewiseVisualMapView); + installCommon$1(registers); + } + + function install$P(registers) { + use(install$N); + use(install$O); // Do not install './dataZoomSelect', + // since it only work for toolbox dataZoom. + } + + var DEFAULT_OPTION = { + label: { + enabled: true + }, + decal: { + show: false + } + }; + var inner$l = makeInner(); + var decalPaletteScope = {}; + + function ariaVisual(ecModel, api) { + var ariaModel = ecModel.getModel('aria'); // See "area enabled" detection code in `GlobalModel.ts`. + + if (!ariaModel.get('enabled')) { + return; + } + + var defaultOption = clone(DEFAULT_OPTION); + merge(defaultOption.label, ecModel.getLocaleModel().get('aria'), false); + merge(ariaModel.option, defaultOption, false); + setDecal(); + setLabel(); + + function setDecal() { + var decalModel = ariaModel.getModel('decal'); + var useDecal = decalModel.get('show'); + + if (useDecal) { + // Each type of series use one scope. + // Pie and funnel are using diferrent scopes + var paletteScopeGroupByType_1 = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.isColorBySeries()) { + return; + } + + var decalScope = paletteScopeGroupByType_1.get(seriesModel.type); + + if (!decalScope) { + decalScope = {}; + paletteScopeGroupByType_1.set(seriesModel.type, decalScope); + } + + inner$l(seriesModel).scope = decalScope; + }); + ecModel.eachRawSeries(function (seriesModel) { + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + if (isFunction(seriesModel.enableAriaDecal)) { + // Let series define how to use decal palette on data + seriesModel.enableAriaDecal(); + return; + } + + var data = seriesModel.getData(); + + if (!seriesModel.isColorBySeries()) { + var dataAll_1 = seriesModel.getRawData(); + var idxMap_1 = {}; + var decalScope_1 = inner$l(seriesModel).scope; + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap_1[rawIdx] = idx; + }); + var dataCount_1 = dataAll_1.count(); + dataAll_1.each(function (rawIdx) { + var idx = idxMap_1[rawIdx]; + var name = dataAll_1.getName(rawIdx) || rawIdx + ''; + var paletteDecal = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1); + var specifiedDecal = data.getItemVisual(idx, 'decal'); + data.setItemVisual(idx, 'decal', mergeDecal(specifiedDecal, paletteDecal)); + }); + } else { + var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount()); + var specifiedDecal = data.getVisual('decal'); + data.setVisual('decal', mergeDecal(specifiedDecal, paletteDecal)); + } + + function mergeDecal(specifiedDecal, paletteDecal) { + // Merge decal from palette to decal from itemStyle. + // User do not need to specify all of the decal props. + var resultDecal = specifiedDecal ? extend(extend({}, paletteDecal), specifiedDecal) : paletteDecal; + resultDecal.dirty = true; + return resultDecal; + } + }); + } + } + + function setLabel() { + var labelLocale = ecModel.getLocaleModel().get('aria'); + var labelModel = ariaModel.getModel('label'); + labelModel.option = defaults(labelModel.option, labelLocale); + + if (!labelModel.get('enabled')) { + return; + } + + var dom = api.getZr().dom; + + if (labelModel.get('description')) { + dom.setAttribute('aria-label', labelModel.get('description')); + return; + } + + var seriesCnt = ecModel.getSeriesCount(); + var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10; + var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10; + var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt); + var ariaLabel; + + if (seriesCnt < 1) { + // No series, no aria label + return; + } else { + var title = getTitle(); + + if (title) { + var withTitle = labelModel.get(['general', 'withTitle']); + ariaLabel = replace(withTitle, { + title: title + }); + } else { + ariaLabel = labelModel.get(['general', 'withoutTitle']); + } + + var seriesLabels_1 = []; + var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']); + ariaLabel += replace(prefix, { + seriesCount: seriesCnt + }); + ecModel.eachSeries(function (seriesModel, idx) { + if (idx < displaySeriesCnt) { + var seriesLabel = void 0; + var seriesName = seriesModel.get('name'); + var withName = seriesName ? 'withName' : 'withoutName'; + seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]); + seriesLabel = replace(seriesLabel, { + seriesId: seriesModel.seriesIndex, + seriesName: seriesModel.get('name'), + seriesType: getSeriesTypeName(seriesModel.subType) + }); + var data = seriesModel.getData(); + + if (data.count() > maxDataCnt) { + // Show part of data + var partialLabel = labelModel.get(['data', 'partialData']); + seriesLabel += replace(partialLabel, { + displayCnt: maxDataCnt + }); + } else { + seriesLabel += labelModel.get(['data', 'allData']); + } + + var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']); + var endSeparator_1 = labelModel.get(['data', 'separator', 'end']); + var dataLabels = []; + + for (var i = 0; i < data.count(); i++) { + if (i < maxDataCnt) { + var name_1 = data.getName(i); + var value = data.getValues(i); + var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']); + dataLabels.push(replace(dataLabel, { + name: name_1, + value: value.join(middleSeparator_1) + })); + } + } + + seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1; + seriesLabels_1.push(seriesLabel); + } + }); + var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']); + var middleSeparator = separatorModel.get('middle'); + var endSeparator = separatorModel.get('end'); + ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator; + dom.setAttribute('aria-label', ariaLabel); + } + } + + function replace(str, keyValues) { + if (!isString(str)) { + return str; + } + + var result = str; + each(keyValues, function (value, key) { + result = result.replace(new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), value); + }); + return result; + } + + function getTitle() { + var title = ecModel.get('title'); + + if (title && title.length) { + title = title[0]; + } + + return title && title.text; + } + + function getSeriesTypeName(type) { + return ecModel.getLocaleModel().get(['series', 'typeNames'])[type] || '自定义图'; + } + } + + function ariaPreprocessor(option) { + if (!option || !option.aria) { + return; + } + + var aria = option.aria; // aria.show is deprecated and should use aria.enabled instead + + if (aria.show != null) { + aria.enabled = aria.show; + } + + aria.label = aria.label || {}; // move description, general, series, data to be under aria.label + + each(['description', 'general', 'series', 'data'], function (name) { + if (aria[name] != null) { + aria.label[name] = aria[name]; + } + }); + } + + function install$Q(registers) { + registers.registerPreprocessor(ariaPreprocessor); + registers.registerVisual(registers.PRIORITY.VISUAL.ARIA, ariaVisual); + } + + var RELATIONAL_EXPRESSION_OP_ALIAS_MAP = { + value: 'eq', + // PENDING: not good for literal semantic? + '<': 'lt', + '<=': 'lte', + '>': 'gt', + '>=': 'gte', + '=': 'eq', + '!=': 'ne', + '<>': 'ne' // Might mileading for sake of the different between '==' and '===', + // So dont support them. + // '==': 'eq', + // '===': 'seq', + // '!==': 'sne' + // PENDING: Whether support some common alias "ge", "le", "neq"? + // ge: 'gte', + // le: 'lte', + // neq: 'ne', + + }; // type RelationalExpressionOpEvaluate = (tarVal: unknown, condVal: unknown) => boolean; + + var RegExpEvaluator = + /** @class */ + function () { + function RegExpEvaluator(rVal) { + // Support condVal: RegExp | string + var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null; + + if (condValue == null) { + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('Illegal regexp', rVal, 'in'); + } + + throwError(errMsg); + } + } + + RegExpEvaluator.prototype.evaluate = function (lVal) { + var type = typeof lVal; + return isString(type) ? this._condVal.test(lVal) : isNumber(type) ? this._condVal.test(lVal + '') : false; + }; + + return RegExpEvaluator; + }(); + + var ConstConditionInternal = + /** @class */ + function () { + function ConstConditionInternal() { + } + + ConstConditionInternal.prototype.evaluate = function () { + return this.value; + }; + + return ConstConditionInternal; + }(); + + var AndConditionInternal = + /** @class */ + function () { + function AndConditionInternal() { + } + + AndConditionInternal.prototype.evaluate = function () { + var children = this.children; + + for (var i = 0; i < children.length; i++) { + if (!children[i].evaluate()) { + return false; + } + } + + return true; + }; + + return AndConditionInternal; + }(); + + var OrConditionInternal = + /** @class */ + function () { + function OrConditionInternal() { + } + + OrConditionInternal.prototype.evaluate = function () { + var children = this.children; + + for (var i = 0; i < children.length; i++) { + if (children[i].evaluate()) { + return true; + } + } + + return false; + }; + + return OrConditionInternal; + }(); + + var NotConditionInternal = + /** @class */ + function () { + function NotConditionInternal() { + } + + NotConditionInternal.prototype.evaluate = function () { + return !this.child.evaluate(); + }; + + return NotConditionInternal; + }(); + + var RelationalConditionInternal = + /** @class */ + function () { + function RelationalConditionInternal() { + } + + RelationalConditionInternal.prototype.evaluate = function () { + var needParse = !!this.valueParser; // Call getValue with no `this`. + + var getValue = this.getValue; + var tarValRaw = getValue(this.valueGetterParam); + var tarValParsed = needParse ? this.valueParser(tarValRaw) : null; // Relational cond follow "and" logic internally. + + for (var i = 0; i < this.subCondList.length; i++) { + if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) { + return false; + } + } + + return true; + }; + + return RelationalConditionInternal; + }(); + + function parseOption(exprOption, getters) { + if (exprOption === true || exprOption === false) { + var cond = new ConstConditionInternal(); + cond.value = exprOption; + return cond; + } + + var errMsg = ''; + + if (!isObjectNotArray(exprOption)) { + if ("development" !== 'production') { + errMsg = makePrintable('Illegal config. Expect a plain object but actually', exprOption); + } + + throwError(errMsg); + } + + if (exprOption.and) { + return parseAndOrOption('and', exprOption, getters); + } else if (exprOption.or) { + return parseAndOrOption('or', exprOption, getters); + } else if (exprOption.not) { + return parseNotOption(exprOption, getters); + } + + return parseRelationalOption(exprOption, getters); + } + + function parseAndOrOption(op, exprOption, getters) { + var subOptionArr = exprOption[op]; + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('"and"/"or" condition should only be `' + op + ': [...]` and must not be empty array.', 'Illegal condition:', exprOption); + } + + if (!isArray(subOptionArr)) { + throwError(errMsg); + } + + if (!subOptionArr.length) { + throwError(errMsg); + } + + var cond = op === 'and' ? new AndConditionInternal() : new OrConditionInternal(); + cond.children = map(subOptionArr, function (subOption) { + return parseOption(subOption, getters); + }); + + if (!cond.children.length) { + throwError(errMsg); + } + + return cond; + } + + function parseNotOption(exprOption, getters) { + var subOption = exprOption.not; + var errMsg = ''; + + if ("development" !== 'production') { + errMsg = makePrintable('"not" condition should only be `not: {}`.', 'Illegal condition:', exprOption); + } + + if (!isObjectNotArray(subOption)) { + throwError(errMsg); + } + + var cond = new NotConditionInternal(); + cond.child = parseOption(subOption, getters); + + if (!cond.child) { + throwError(errMsg); + } + + return cond; + } + + function parseRelationalOption(exprOption, getters) { + var errMsg = ''; + var valueGetterParam = getters.prepareGetValue(exprOption); + var subCondList = []; + var exprKeys = keys(exprOption); + var parserName = exprOption.parser; + var valueParser = parserName ? getRawValueParser(parserName) : null; + + for (var i = 0; i < exprKeys.length; i++) { + var keyRaw = exprKeys[i]; + + if (keyRaw === 'parser' || getters.valueGetterAttrMap.get(keyRaw)) { + continue; + } + + var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw; + var condValueRaw = exprOption[keyRaw]; + var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw; + var evaluator = createFilterComparator(op, condValueParsed) || op === 'reg' && new RegExpEvaluator(condValueParsed); + + if (!evaluator) { + if ("development" !== 'production') { + errMsg = makePrintable('Illegal relational operation: "' + keyRaw + '" in condition:', exprOption); + } + + throwError(errMsg); + } + + subCondList.push(evaluator); + } + + if (!subCondList.length) { + if ("development" !== 'production') { + errMsg = makePrintable('Relational condition must have at least one operator.', 'Illegal condition:', exprOption); + } // No relational operator always disabled in case of dangers result. + + + throwError(errMsg); + } + + var cond = new RelationalConditionInternal(); + cond.valueGetterParam = valueGetterParam; + cond.valueParser = valueParser; + cond.getValue = getters.getValue; + cond.subCondList = subCondList; + return cond; + } + + function isObjectNotArray(val) { + return isObject(val) && !isArrayLike(val); + } + + var ConditionalExpressionParsed = + /** @class */ + function () { + function ConditionalExpressionParsed(exprOption, getters) { + this._cond = parseOption(exprOption, getters); + } + + ConditionalExpressionParsed.prototype.evaluate = function () { + return this._cond.evaluate(); + }; + + return ConditionalExpressionParsed; + }(); + + function parseConditionalExpression(exprOption, getters) { + return new ConditionalExpressionParsed(exprOption, getters); + } + + var filterTransform = { + type: 'echarts:filter', + // PEDING: enhance to filter by index rather than create new data + transform: function (params) { + // [Caveat] Fail-Fast: + // Do not return the whole dataset unless user config indicate it explicitly. + // For example, if no condition specified by mistake, return an empty result + // is better than return the entire raw soruce for user to find the mistake. + var upstream = params.upstream; + var rawItem; + var condition = parseConditionalExpression(params.config, { + valueGetterAttrMap: createHashMap({ + dimension: true + }), + prepareGetValue: function (exprOption) { + var errMsg = ''; + var dimLoose = exprOption.dimension; + + if (!hasOwn(exprOption, 'dimension')) { + if ("development" !== 'production') { + errMsg = makePrintable('Relation condition must has prop "dimension" specified.', 'Illegal condition:', exprOption); + } + + throwError(errMsg); + } + + var dimInfo = upstream.getDimensionInfo(dimLoose); + + if (!dimInfo) { + if ("development" !== 'production') { + errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal condition:', exprOption, '.\n'); + } + + throwError(errMsg); + } + + return { + dimIdx: dimInfo.index + }; + }, + getValue: function (param) { + return upstream.retrieveValueFromItem(rawItem, param.dimIdx); + } + }); + var resultData = []; + + for (var i = 0, len = upstream.count(); i < len; i++) { + rawItem = upstream.getRawDataItem(i); + + if (condition.evaluate()) { + resultData.push(rawItem); + } + } + + return { + data: resultData + }; + } + }; + + var sampleLog = ''; + + if ("development" !== 'production') { + sampleLog = ['Valid config is like:', '{ dimension: "age", order: "asc" }', 'or [{ dimension: "age", order: "asc"], { dimension: "date", order: "desc" }]'].join(' '); + } + + var sortTransform = { + type: 'echarts:sort', + transform: function (params) { + var upstream = params.upstream; + var config = params.config; + var errMsg = ''; // Normalize + // const orderExprList: OrderExpression[] = isArray(config[0]) + // ? config as OrderExpression[] + // : [config as OrderExpression]; + + var orderExprList = normalizeToArray(config); + + if (!orderExprList.length) { + if ("development" !== 'production') { + errMsg = 'Empty `config` in sort transform.'; + } + + throwError(errMsg); + } + + var orderDefList = []; + each(orderExprList, function (orderExpr) { + var dimLoose = orderExpr.dimension; + var order = orderExpr.order; + var parserName = orderExpr.parser; + var incomparable = orderExpr.incomparable; + + if (dimLoose == null) { + if ("development" !== 'production') { + errMsg = 'Sort transform config must has "dimension" specified.' + sampleLog; + } + + throwError(errMsg); + } + + if (order !== 'asc' && order !== 'desc') { + if ("development" !== 'production') { + errMsg = 'Sort transform config must has "order" specified.' + sampleLog; + } + + throwError(errMsg); + } + + if (incomparable && incomparable !== 'min' && incomparable !== 'max') { + var errMsg_1 = ''; + + if ("development" !== 'production') { + errMsg_1 = 'incomparable must be "min" or "max" rather than "' + incomparable + '".'; + } + + throwError(errMsg_1); + } + + if (order !== 'asc' && order !== 'desc') { + var errMsg_2 = ''; + + if ("development" !== 'production') { + errMsg_2 = 'order must be "asc" or "desc" rather than "' + order + '".'; + } + + throwError(errMsg_2); + } + + var dimInfo = upstream.getDimensionInfo(dimLoose); + + if (!dimInfo) { + if ("development" !== 'production') { + errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\n', 'Illegal config:', orderExpr, '.\n'); + } + + throwError(errMsg); + } + + var parser = parserName ? getRawValueParser(parserName) : null; + + if (parserName && !parser) { + if ("development" !== 'production') { + errMsg = makePrintable('Invalid parser name ' + parserName + '.\n', 'Illegal config:', orderExpr, '.\n'); + } + + throwError(errMsg); + } + + orderDefList.push({ + dimIdx: dimInfo.index, + parser: parser, + comparator: new SortOrderComparator(order, incomparable) + }); + }); // TODO: support it? + + var sourceFormat = upstream.sourceFormat; + + if (sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) { + if ("development" !== 'production') { + errMsg = 'sourceFormat "' + sourceFormat + '" is not supported yet'; + } + + throwError(errMsg); + } // Other upstream format are all array. + + + var resultData = []; + + for (var i = 0, len = upstream.count(); i < len; i++) { + resultData.push(upstream.getRawDataItem(i)); + } + + resultData.sort(function (item0, item1) { + for (var i = 0; i < orderDefList.length; i++) { + var orderDef = orderDefList[i]; + var val0 = upstream.retrieveValueFromItem(item0, orderDef.dimIdx); + var val1 = upstream.retrieveValueFromItem(item1, orderDef.dimIdx); + + if (orderDef.parser) { + val0 = orderDef.parser(val0); + val1 = orderDef.parser(val1); + } + + var result = orderDef.comparator.evaluate(val0, val1); + + if (result !== 0) { + return result; + } + } + + return 0; + }); + return { + data: resultData + }; + } + }; + + function install$R(registers) { + registers.registerTransform(filterTransform); + registers.registerTransform(sortTransform); + } + + var DatasetModel = + /** @class */ + function (_super) { + __extends(DatasetModel, _super); + + function DatasetModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataset'; + return _this; + } + + DatasetModel.prototype.init = function (option, parentModel, ecModel) { + _super.prototype.init.call(this, option, parentModel, ecModel); + + this._sourceManager = new SourceManager(this); + disableTransformOptionMerge(this); + }; + + DatasetModel.prototype.mergeOption = function (newOption, ecModel) { + _super.prototype.mergeOption.call(this, newOption, ecModel); + + disableTransformOptionMerge(this); + }; + + DatasetModel.prototype.optionUpdated = function () { + this._sourceManager.dirty(); + }; + + DatasetModel.prototype.getSourceManager = function () { + return this._sourceManager; + }; + + DatasetModel.type = 'dataset'; + DatasetModel.defaultOption = { + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN + }; + return DatasetModel; + }(ComponentModel); + + var DatasetView = + /** @class */ + function (_super) { + __extends(DatasetView, _super); + + function DatasetView() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = 'dataset'; + return _this; + } + + DatasetView.type = 'dataset'; + return DatasetView; + }(ComponentView); + + function install$S(registers) { + registers.registerComponentModel(DatasetModel); + registers.registerComponentView(DatasetView); + } + + var CMD$4 = PathProxy.CMD; + + function aroundEqual(a, b) { + return Math.abs(a - b) < 1e-5; + } + + function pathToBezierCurves(path) { + var data = path.data; + var len = path.len(); + var bezierArrayGroups = []; + var currentSubpath; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + function createNewSubpath(x, y) { + if (currentSubpath && currentSubpath.length > 2) { + bezierArrayGroups.push(currentSubpath); + } + currentSubpath = [x, y]; + } + + function addLine(x0, y0, x1, y1) { + if (!(aroundEqual(x0, x1) && aroundEqual(y0, y1))) { + currentSubpath.push(x0, y0, x1, y1, x1, y1); + } + } + + function addArc(startAngle, endAngle, cx, cy, rx, ry) { + var delta = Math.abs(endAngle - startAngle); + var len = Math.tan(delta / 4) * 4 / 3; + var dir = endAngle < startAngle ? -1 : 1; + var c1 = Math.cos(startAngle); + var s1 = Math.sin(startAngle); + var c2 = Math.cos(endAngle); + var s2 = Math.sin(endAngle); + var x1 = c1 * rx + cx; + var y1 = s1 * ry + cy; + var x4 = c2 * rx + cx; + var y4 = s2 * ry + cy; + var hx = rx * len * dir; + var hy = ry * len * dir; + currentSubpath.push(x1 - hx * s1, y1 + hy * c1, x4 + hx * s2, y4 - hy * c2, x4, y4); + } + + var x1; + var y1; + var x2; + var y2; + for (var i = 0; i < len;) { + var cmd = data[i++]; + var isFirst = i === 1; + if (isFirst) { + xi = data[i]; + yi = data[i + 1]; + x0 = xi; + y0 = yi; + if (cmd === CMD$4.L || cmd === CMD$4.C || cmd === CMD$4.Q) { + currentSubpath = [x0, y0]; + } + } + switch (cmd) { + case CMD$4.M: + xi = x0 = data[i++]; + yi = y0 = data[i++]; + createNewSubpath(x0, y0); + break; + case CMD$4.L: + x1 = data[i++]; + y1 = data[i++]; + addLine(xi, yi, x1, y1); + xi = x1; + yi = y1; + break; + case CMD$4.C: + currentSubpath.push(data[i++], data[i++], data[i++], data[i++], xi = data[i++], yi = data[i++]); + break; + case CMD$4.Q: + x1 = data[i++]; + y1 = data[i++]; + x2 = data[i++]; + y2 = data[i++]; + currentSubpath.push(xi + 2 / 3 * (x1 - xi), yi + 2 / 3 * (y1 - yi), x2 + 2 / 3 * (x1 - x2), y2 + 2 / 3 * (y1 - y2), x2, y2); + xi = x2; + yi = y2; + break; + case CMD$4.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + i += 1; + var anticlockwise = !data[i++]; + x1 = Math.cos(startAngle) * rx + cx; + y1 = Math.sin(startAngle) * ry + cy; + if (isFirst) { + x0 = x1; + y0 = y1; + createNewSubpath(x0, y0); + } else { + addLine(xi, yi, x1, y1); + } + xi = Math.cos(endAngle) * rx + cx; + yi = Math.sin(endAngle) * ry + cy; + var step = (anticlockwise ? -1 : 1) * Math.PI / 2; + for (var angle = startAngle; anticlockwise ? angle > endAngle : angle < endAngle; angle += step) { + var nextAngle = anticlockwise ? Math.max(angle + step, endAngle) + : Math.min(angle + step, endAngle); + addArc(angle, nextAngle, cx, cy, rx, ry); + } + break; + case CMD$4.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + x1 = x0 + data[i++]; + y1 = y0 + data[i++]; + createNewSubpath(x1, y0); + addLine(x1, y0, x1, y1); + addLine(x1, y1, x0, y1); + addLine(x0, y1, x0, y0); + addLine(x0, y0, x1, y0); + break; + case CMD$4.Z: + currentSubpath && addLine(xi, yi, x0, y0); + xi = x0; + yi = y0; + break; + } + } + if (currentSubpath && currentSubpath.length > 2) { + bezierArrayGroups.push(currentSubpath); + } + return bezierArrayGroups; + } + + function adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, out, scale) { + if (aroundEqual(x0, x1) && aroundEqual(y0, y1) && aroundEqual(x2, x3) && aroundEqual(y2, y3)) { + out.push(x3, y3); + return; + } + var PIXEL_DISTANCE = 2 / scale; + var PIXEL_DISTANCE_SQR = PIXEL_DISTANCE * PIXEL_DISTANCE; + var dx = x3 - x0; + var dy = y3 - y0; + var d = Math.sqrt(dx * dx + dy * dy); + dx /= d; + dy /= d; + var dx1 = x1 - x0; + var dy1 = y1 - y0; + var dx2 = x2 - x3; + var dy2 = y2 - y3; + var cp1LenSqr = dx1 * dx1 + dy1 * dy1; + var cp2LenSqr = dx2 * dx2 + dy2 * dy2; + if (cp1LenSqr < PIXEL_DISTANCE_SQR && cp2LenSqr < PIXEL_DISTANCE_SQR) { + out.push(x3, y3); + return; + } + var projLen1 = dx * dx1 + dy * dy1; + var projLen2 = -dx * dx2 - dy * dy2; + var d1Sqr = cp1LenSqr - projLen1 * projLen1; + var d2Sqr = cp2LenSqr - projLen2 * projLen2; + if (d1Sqr < PIXEL_DISTANCE_SQR && projLen1 >= 0 + && d2Sqr < PIXEL_DISTANCE_SQR && projLen2 >= 0) { + out.push(x3, y3); + return; + } + var tmpSegX = []; + var tmpSegY = []; + cubicSubdivide(x0, x1, x2, x3, 0.5, tmpSegX); + cubicSubdivide(y0, y1, y2, y3, 0.5, tmpSegY); + adpativeBezier(tmpSegX[0], tmpSegY[0], tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], tmpSegX[3], tmpSegY[3], out, scale); + adpativeBezier(tmpSegX[4], tmpSegY[4], tmpSegX[5], tmpSegY[5], tmpSegX[6], tmpSegY[6], tmpSegX[7], tmpSegY[7], out, scale); + } + + function pathToPolygons(path, scale) { + var bezierArrayGroups = pathToBezierCurves(path); + var polygons = []; + scale = scale || 1; + for (var i = 0; i < bezierArrayGroups.length; i++) { + var beziers = bezierArrayGroups[i]; + var polygon = []; + var x0 = beziers[0]; + var y0 = beziers[1]; + polygon.push(x0, y0); + for (var k = 2; k < beziers.length;) { + var x1 = beziers[k++]; + var y1 = beziers[k++]; + var x2 = beziers[k++]; + var y2 = beziers[k++]; + var x3 = beziers[k++]; + var y3 = beziers[k++]; + adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, polygon, scale); + x0 = x3; + y0 = y3; + } + polygons.push(polygon); + } + return polygons; + } + + function getDividingGrids(dimSize, rowDim, count) { + var rowSize = dimSize[rowDim]; + var columnSize = dimSize[1 - rowDim]; + var ratio = Math.abs(rowSize / columnSize); + var rowCount = Math.ceil(Math.sqrt(ratio * count)); + var columnCount = Math.floor(count / rowCount); + if (columnCount === 0) { + columnCount = 1; + rowCount = count; + } + var grids = []; + for (var i = 0; i < rowCount; i++) { + grids.push(columnCount); + } + var currentCount = rowCount * columnCount; + var remained = count - currentCount; + if (remained > 0) { + for (var i = 0; i < remained; i++) { + grids[i % rowCount] += 1; + } + } + return grids; + } + + function divideSector(sectorShape, count, outShapes) { + var r0 = sectorShape.r0; + var r = sectorShape.r; + var startAngle = sectorShape.startAngle; + var endAngle = sectorShape.endAngle; + var angle = Math.abs(endAngle - startAngle); + var arcLen = angle * r; + var deltaR = r - r0; + var isAngleRow = arcLen > Math.abs(deltaR); + var grids = getDividingGrids([arcLen, deltaR], isAngleRow ? 0 : 1, count); + var rowSize = (isAngleRow ? angle : deltaR) / grids.length; + for (var row = 0; row < grids.length; row++) { + var columnSize = (isAngleRow ? deltaR : angle) / grids[row]; + for (var column = 0; column < grids[row]; column++) { + var newShape = {}; + if (isAngleRow) { + newShape.startAngle = startAngle + rowSize * row; + newShape.endAngle = startAngle + rowSize * (row + 1); + newShape.r0 = r0 + columnSize * column; + newShape.r = r0 + columnSize * (column + 1); + } else { + newShape.startAngle = startAngle + columnSize * column; + newShape.endAngle = startAngle + columnSize * (column + 1); + newShape.r0 = r0 + rowSize * row; + newShape.r = r0 + rowSize * (row + 1); + } + newShape.clockwise = sectorShape.clockwise; + newShape.cx = sectorShape.cx; + newShape.cy = sectorShape.cy; + outShapes.push(newShape); + } + } + } + + function divideRect(rectShape, count, outShapes) { + var width = rectShape.width; + var height = rectShape.height; + var isHorizontalRow = width > height; + var grids = getDividingGrids([width, height], isHorizontalRow ? 0 : 1, count); + var rowSizeDim = isHorizontalRow ? 'width' : 'height'; + var columnSizeDim = isHorizontalRow ? 'height' : 'width'; + var rowDim = isHorizontalRow ? 'x' : 'y'; + var columnDim = isHorizontalRow ? 'y' : 'x'; + var rowSize = rectShape[rowSizeDim] / grids.length; + for (var row = 0; row < grids.length; row++) { + var columnSize = rectShape[columnSizeDim] / grids[row]; + for (var column = 0; column < grids[row]; column++) { + var newShape = {}; + newShape[rowDim] = row * rowSize; + newShape[columnDim] = column * columnSize; + newShape[rowSizeDim] = rowSize; + newShape[columnSizeDim] = columnSize; + newShape.x += rectShape.x; + newShape.y += rectShape.y; + outShapes.push(newShape); + } + } + } + + function crossProduct2d$1(x1, y1, x2, y2) { + return x1 * y2 - x2 * y1; + } + + function lineLineIntersect$1(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + var mx = a2x - a1x; + var my = a2y - a1y; + var nx = b2x - b1x; + var ny = b2y - b1y; + var nmCrossProduct = crossProduct2d$1(nx, ny, mx, my); + if (Math.abs(nmCrossProduct) < 1e-6) { + return null; + } + var b1a1x = a1x - b1x; + var b1a1y = a1y - b1y; + var p = crossProduct2d$1(b1a1x, b1a1y, nx, ny) / nmCrossProduct; + if (p < 0 || p > 1) { + return null; + } + return new Point(p * mx + a1x, p * my + a1y); + } + + function projPtOnLine(pt, lineA, lineB) { + var dir = new Point(); + Point.sub(dir, lineB, lineA); + dir.normalize(); + var dir2 = new Point(); + Point.sub(dir2, pt, lineA); + var len = dir2.dot(dir); + return len; + } + + function addToPoly(poly, pt) { + var last = poly[poly.length - 1]; + if (last && last[0] === pt[0] && last[1] === pt[1]) { + return; + } + poly.push(pt); + } + + function splitPolygonByLine(points, lineA, lineB) { + var len = points.length; + var intersections = []; + for (var i = 0; i < len; i++) { + var p0 = points[i]; + var p1 = points[(i + 1) % len]; + var intersectionPt = lineLineIntersect$1(p0[0], p0[1], p1[0], p1[1], lineA.x, lineA.y, lineB.x, lineB.y); + if (intersectionPt) { + intersections.push({ + projPt: projPtOnLine(intersectionPt, lineA, lineB), + pt: intersectionPt, + idx: i + }); + } + } + if (intersections.length < 2) { + return [{points: points}, {points: points}]; + } + intersections.sort(function (a, b) { + return a.projPt - b.projPt; + }); + var splitPt0 = intersections[0]; + var splitPt1 = intersections[intersections.length - 1]; + if (splitPt1.idx < splitPt0.idx) { + var tmp = splitPt0; + splitPt0 = splitPt1; + splitPt1 = tmp; + } + var splitPt0Arr = [splitPt0.pt.x, splitPt0.pt.y]; + var splitPt1Arr = [splitPt1.pt.x, splitPt1.pt.y]; + var newPolyA = [splitPt0Arr]; + var newPolyB = [splitPt1Arr]; + for (var i = splitPt0.idx + 1; i <= splitPt1.idx; i++) { + addToPoly(newPolyA, points[i].slice()); + } + addToPoly(newPolyA, splitPt1Arr); + addToPoly(newPolyA, splitPt0Arr); + for (var i = splitPt1.idx + 1; i <= splitPt0.idx + len; i++) { + addToPoly(newPolyB, points[i % len].slice()); + } + addToPoly(newPolyB, splitPt0Arr); + addToPoly(newPolyB, splitPt1Arr); + return [{ + points: newPolyA + }, { + points: newPolyB + }]; + } + + function binaryDividePolygon(polygonShape) { + var points = polygonShape.points; + var min = []; + var max = []; + fromPoints(points, min, max); + var boundingRect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); + var width = boundingRect.width; + var height = boundingRect.height; + var x = boundingRect.x; + var y = boundingRect.y; + var pt0 = new Point(); + var pt1 = new Point(); + if (width > height) { + pt0.x = pt1.x = x + width / 2; + pt0.y = y; + pt1.y = y + height; + } else { + pt0.y = pt1.y = y + height / 2; + pt0.x = x; + pt1.x = x + width; + } + return splitPolygonByLine(points, pt0, pt1); + } + + function binaryDivideRecursive(divider, shape, count, out) { + if (count === 1) { + out.push(shape); + } else { + var mid = Math.floor(count / 2); + var sub = divider(shape); + binaryDivideRecursive(divider, sub[0], mid, out); + binaryDivideRecursive(divider, sub[1], count - mid, out); + } + return out; + } + + function clone$4(path, count) { + var paths = []; + for (var i = 0; i < count; i++) { + paths.push(clonePath(path)); + } + return paths; + } + + function copyPathProps(source, target) { + target.setStyle(source.style); + target.z = source.z; + target.z2 = source.z2; + target.zlevel = source.zlevel; + } + + function polygonConvert(points) { + var out = []; + for (var i = 0; i < points.length;) { + out.push([points[i++], points[i++]]); + } + return out; + } + + function split(path, count) { + var outShapes = []; + var shape = path.shape; + var OutShapeCtor; + switch (path.type) { + case 'rect': + divideRect(shape, count, outShapes); + OutShapeCtor = Rect; + break; + case 'sector': + divideSector(shape, count, outShapes); + OutShapeCtor = Sector; + break; + case 'circle': + divideSector({ + r0: 0, r: shape.r, startAngle: 0, endAngle: Math.PI * 2, + cx: shape.cx, cy: shape.cy + }, count, outShapes); + OutShapeCtor = Sector; + break; + default: + var m = path.getComputedTransform(); + var scale = m ? Math.sqrt(Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3])) : 1; + var polygons = map(pathToPolygons(path.getUpdatedPathProxy(), scale), function (poly) { + return polygonConvert(poly); + }); + var polygonCount = polygons.length; + if (polygonCount === 0) { + binaryDivideRecursive(binaryDividePolygon, { + points: polygons[0] + }, count, outShapes); + } else if (polygonCount === count) { + for (var i = 0; i < polygonCount; i++) { + outShapes.push({ + points: polygons[i] + }); + } + } else { + var totalArea_1 = 0; + var items = map(polygons, function (poly) { + var min = []; + var max = []; + fromPoints(poly, min, max); + var area = (max[1] - min[1]) * (max[0] - min[0]); + totalArea_1 += area; + return {poly: poly, area: area}; + }); + items.sort(function (a, b) { + return b.area - a.area; + }); + var left = count; + for (var i = 0; i < polygonCount; i++) { + var item = items[i]; + if (left <= 0) { + break; + } + var selfCount = i === polygonCount - 1 + ? left + : Math.ceil(item.area / totalArea_1 * count); + if (selfCount < 0) { + continue; + } + binaryDivideRecursive(binaryDividePolygon, { + points: item.poly + }, selfCount, outShapes); + left -= selfCount; + } + } + OutShapeCtor = Polygon; + break; + } + if (!OutShapeCtor) { + return clone$4(path, count); + } + var out = []; + for (var i = 0; i < outShapes.length; i++) { + var subPath = new OutShapeCtor(); + subPath.setShape(outShapes[i]); + copyPathProps(path, subPath); + out.push(subPath); + } + return out; + } + + function alignSubpath(subpath1, subpath2) { + var len1 = subpath1.length; + var len2 = subpath2.length; + if (len1 === len2) { + return [subpath1, subpath2]; + } + var tmpSegX = []; + var tmpSegY = []; + var shorterPath = len1 < len2 ? subpath1 : subpath2; + var shorterLen = Math.min(len1, len2); + var diff = Math.abs(len2 - len1) / 6; + var shorterBezierCount = (shorterLen - 2) / 6; + var eachCurveSubDivCount = Math.ceil(diff / shorterBezierCount) + 1; + var newSubpath = [shorterPath[0], shorterPath[1]]; + var remained = diff; + for (var i = 2; i < shorterLen;) { + var x0 = shorterPath[i - 2]; + var y0 = shorterPath[i - 1]; + var x1 = shorterPath[i++]; + var y1 = shorterPath[i++]; + var x2 = shorterPath[i++]; + var y2 = shorterPath[i++]; + var x3 = shorterPath[i++]; + var y3 = shorterPath[i++]; + if (remained <= 0) { + newSubpath.push(x1, y1, x2, y2, x3, y3); + continue; + } + var actualSubDivCount = Math.min(remained, eachCurveSubDivCount - 1) + 1; + for (var k = 1; k <= actualSubDivCount; k++) { + var p = k / actualSubDivCount; + cubicSubdivide(x0, x1, x2, x3, p, tmpSegX); + cubicSubdivide(y0, y1, y2, y3, p, tmpSegY); + x0 = tmpSegX[3]; + y0 = tmpSegY[3]; + newSubpath.push(tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], x0, y0); + x1 = tmpSegX[5]; + y1 = tmpSegY[5]; + x2 = tmpSegX[6]; + y2 = tmpSegY[6]; + } + remained -= actualSubDivCount - 1; + } + return shorterPath === subpath1 ? [newSubpath, subpath2] : [subpath1, newSubpath]; + } + + function createSubpath(lastSubpathSubpath, otherSubpath) { + var len = lastSubpathSubpath.length; + var lastX = lastSubpathSubpath[len - 2]; + var lastY = lastSubpathSubpath[len - 1]; + var newSubpath = []; + for (var i = 0; i < otherSubpath.length;) { + newSubpath[i++] = lastX; + newSubpath[i++] = lastY; + } + return newSubpath; + } + + function alignBezierCurves(array1, array2) { + var _a; + var lastSubpath1; + var lastSubpath2; + var newArray1 = []; + var newArray2 = []; + for (var i = 0; i < Math.max(array1.length, array2.length); i++) { + var subpath1 = array1[i]; + var subpath2 = array2[i]; + var newSubpath1 = void 0; + var newSubpath2 = void 0; + if (!subpath1) { + newSubpath1 = createSubpath(lastSubpath1 || subpath2, subpath2); + newSubpath2 = subpath2; + } else if (!subpath2) { + newSubpath2 = createSubpath(lastSubpath2 || subpath1, subpath1); + newSubpath1 = subpath1; + } else { + _a = alignSubpath(subpath1, subpath2), newSubpath1 = _a[0], newSubpath2 = _a[1]; + lastSubpath1 = newSubpath1; + lastSubpath2 = newSubpath2; + } + newArray1.push(newSubpath1); + newArray2.push(newSubpath2); + } + return [newArray1, newArray2]; + } + + function centroid$1(array) { + var signedArea = 0; + var cx = 0; + var cy = 0; + var len = array.length; + for (var i = 0, j = len - 2; i < len; j = i, i += 2) { + var x0 = array[j]; + var y0 = array[j + 1]; + var x1 = array[i]; + var y1 = array[i + 1]; + var a = x0 * y1 - x1 * y0; + signedArea += a; + cx += (x0 + x1) * a; + cy += (y0 + y1) * a; + } + if (signedArea === 0) { + return [array[0] || 0, array[1] || 0]; + } + return [cx / signedArea / 3, cy / signedArea / 3, signedArea]; + } + + function findBestRingOffset(fromSubBeziers, toSubBeziers, fromCp, toCp) { + var bezierCount = (fromSubBeziers.length - 2) / 6; + var bestScore = Infinity; + var bestOffset = 0; + var len = fromSubBeziers.length; + var len2 = len - 2; + for (var offset = 0; offset < bezierCount; offset++) { + var cursorOffset = offset * 6; + var score = 0; + for (var k = 0; k < len; k += 2) { + var idx = k === 0 ? cursorOffset : ((cursorOffset + k - 2) % len2 + 2); + var x0 = fromSubBeziers[idx] - fromCp[0]; + var y0 = fromSubBeziers[idx + 1] - fromCp[1]; + var x1 = toSubBeziers[k] - toCp[0]; + var y1 = toSubBeziers[k + 1] - toCp[1]; + var dx = x1 - x0; + var dy = y1 - y0; + score += dx * dx + dy * dy; + } + if (score < bestScore) { + bestScore = score; + bestOffset = offset; + } + } + return bestOffset; + } + + function reverse(array) { + var newArr = []; + var len = array.length; + for (var i = 0; i < len; i += 2) { + newArr[i] = array[len - i - 2]; + newArr[i + 1] = array[len - i - 1]; + } + return newArr; + } + + function findBestMorphingRotation(fromArr, toArr, searchAngleIteration, searchAngleRange) { + var result = []; + var fromNeedsReverse; + for (var i = 0; i < fromArr.length; i++) { + var fromSubpathBezier = fromArr[i]; + var toSubpathBezier = toArr[i]; + var fromCp = centroid$1(fromSubpathBezier); + var toCp = centroid$1(toSubpathBezier); + if (fromNeedsReverse == null) { + fromNeedsReverse = fromCp[2] < 0 !== toCp[2] < 0; + } + var newFromSubpathBezier = []; + var newToSubpathBezier = []; + var bestAngle = 0; + var bestScore = Infinity; + var tmpArr = []; + var len = fromSubpathBezier.length; + if (fromNeedsReverse) { + fromSubpathBezier = reverse(fromSubpathBezier); + } + var offset = findBestRingOffset(fromSubpathBezier, toSubpathBezier, fromCp, toCp) * 6; + var len2 = len - 2; + for (var k = 0; k < len2; k += 2) { + var idx = (offset + k) % len2 + 2; + newFromSubpathBezier[k + 2] = fromSubpathBezier[idx] - fromCp[0]; + newFromSubpathBezier[k + 3] = fromSubpathBezier[idx + 1] - fromCp[1]; + } + newFromSubpathBezier[0] = fromSubpathBezier[offset] - fromCp[0]; + newFromSubpathBezier[1] = fromSubpathBezier[offset + 1] - fromCp[1]; + if (searchAngleIteration > 0) { + var step = searchAngleRange / searchAngleIteration; + for (var angle = -searchAngleRange / 2; angle <= searchAngleRange / 2; angle += step) { + var sa = Math.sin(angle); + var ca = Math.cos(angle); + var score = 0; + for (var k = 0; k < fromSubpathBezier.length; k += 2) { + var x0 = newFromSubpathBezier[k]; + var y0 = newFromSubpathBezier[k + 1]; + var x1 = toSubpathBezier[k] - toCp[0]; + var y1 = toSubpathBezier[k + 1] - toCp[1]; + var newX1 = x1 * ca - y1 * sa; + var newY1 = x1 * sa + y1 * ca; + tmpArr[k] = newX1; + tmpArr[k + 1] = newY1; + var dx = newX1 - x0; + var dy = newY1 - y0; + score += dx * dx + dy * dy; + } + if (score < bestScore) { + bestScore = score; + bestAngle = angle; + for (var m = 0; m < tmpArr.length; m++) { + newToSubpathBezier[m] = tmpArr[m]; + } + } + } + } else { + for (var i_1 = 0; i_1 < len; i_1 += 2) { + newToSubpathBezier[i_1] = toSubpathBezier[i_1] - toCp[0]; + newToSubpathBezier[i_1 + 1] = toSubpathBezier[i_1 + 1] - toCp[1]; + } + } + result.push({ + from: newFromSubpathBezier, + to: newToSubpathBezier, + fromCp: fromCp, + toCp: toCp, + rotation: -bestAngle + }); + } + return result; + } + + function isCombineMorphing(path) { + return path.__isCombineMorphing; + } + + var SAVED_METHOD_PREFIX = '__mOriginal_'; + + function saveAndModifyMethod(obj, methodName, modifiers) { + var savedMethodName = SAVED_METHOD_PREFIX + methodName; + var originalMethod = obj[savedMethodName] || obj[methodName]; + if (!obj[savedMethodName]) { + obj[savedMethodName] = obj[methodName]; + } + var replace = modifiers.replace; + var after = modifiers.after; + var before = modifiers.before; + obj[methodName] = function () { + var args = arguments; + var res; + before && before.apply(this, args); + if (replace) { + res = replace.apply(this, args); + } else { + res = originalMethod.apply(this, args); + } + after && after.apply(this, args); + return res; + }; + } + + function restoreMethod(obj, methodName) { + var savedMethodName = SAVED_METHOD_PREFIX + methodName; + if (obj[savedMethodName]) { + obj[methodName] = obj[savedMethodName]; + obj[savedMethodName] = null; + } + } + + function applyTransformOnBeziers(bezierCurves, mm) { + for (var i = 0; i < bezierCurves.length; i++) { + var subBeziers = bezierCurves[i]; + for (var k = 0; k < subBeziers.length;) { + var x = subBeziers[k]; + var y = subBeziers[k + 1]; + subBeziers[k++] = mm[0] * x + mm[2] * y + mm[4]; + subBeziers[k++] = mm[1] * x + mm[3] * y + mm[5]; + } + } + } + + function prepareMorphPath(fromPath, toPath) { + var fromPathProxy = fromPath.getUpdatedPathProxy(); + var toPathProxy = toPath.getUpdatedPathProxy(); + var _a = alignBezierCurves(pathToBezierCurves(fromPathProxy), pathToBezierCurves(toPathProxy)), + fromBezierCurves = _a[0], toBezierCurves = _a[1]; + var fromPathTransform = fromPath.getComputedTransform(); + var toPathTransform = toPath.getComputedTransform(); + + function updateIdentityTransform() { + this.transform = null; + } + + fromPathTransform && applyTransformOnBeziers(fromBezierCurves, fromPathTransform); + toPathTransform && applyTransformOnBeziers(toBezierCurves, toPathTransform); + saveAndModifyMethod(toPath, 'updateTransform', {replace: updateIdentityTransform}); + toPath.transform = null; + var morphingData = findBestMorphingRotation(fromBezierCurves, toBezierCurves, 10, Math.PI); + var tmpArr = []; + saveAndModifyMethod(toPath, 'buildPath', { + replace: function (path) { + var t = toPath.__morphT; + var onet = 1 - t; + var newCp = []; + for (var i = 0; i < morphingData.length; i++) { + var item = morphingData[i]; + var from = item.from; + var to = item.to; + var angle = item.rotation * t; + var fromCp = item.fromCp; + var toCp = item.toCp; + var sa = Math.sin(angle); + var ca = Math.cos(angle); + lerp(newCp, fromCp, toCp, t); + for (var m = 0; m < from.length; m += 2) { + var x0_1 = from[m]; + var y0_1 = from[m + 1]; + var x1 = to[m]; + var y1 = to[m + 1]; + var x = x0_1 * onet + x1 * t; + var y = y0_1 * onet + y1 * t; + tmpArr[m] = (x * ca - y * sa) + newCp[0]; + tmpArr[m + 1] = (x * sa + y * ca) + newCp[1]; + } + var x0 = tmpArr[0]; + var y0 = tmpArr[1]; + path.moveTo(x0, y0); + for (var m = 2; m < from.length;) { + var x1 = tmpArr[m++]; + var y1 = tmpArr[m++]; + var x2 = tmpArr[m++]; + var y2 = tmpArr[m++]; + var x3 = tmpArr[m++]; + var y3 = tmpArr[m++]; + if (x0 === x1 && y0 === y1 && x2 === x3 && y2 === y3) { + path.lineTo(x3, y3); + } else { + path.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + x0 = x3; + y0 = y3; + } + } + } + }); + } + + function morphPath(fromPath, toPath, animationOpts) { + if (!fromPath || !toPath) { + return toPath; + } + var oldDone = animationOpts.done; + var oldDuring = animationOpts.during; + prepareMorphPath(fromPath, toPath); + toPath.__morphT = 0; + + function restoreToPath() { + restoreMethod(toPath, 'buildPath'); + restoreMethod(toPath, 'updateTransform'); + toPath.__morphT = -1; + toPath.createPathProxy(); + toPath.dirtyShape(); + } + + toPath.animateTo({ + __morphT: 1 + }, defaults({ + during: function (p) { + toPath.dirtyShape(); + oldDuring && oldDuring(p); + }, + done: function () { + restoreToPath(); + oldDone && oldDone(); + } + }, animationOpts)); + return toPath; + } + + function hilbert(x, y, minX, minY, maxX, maxY) { + var bits = 16; + x = (maxX === minX) ? 0 : Math.round(32767 * (x - minX) / (maxX - minX)); + y = (maxY === minY) ? 0 : Math.round(32767 * (y - minY) / (maxY - minY)); + var d = 0; + var tmp; + for (var s = (1 << bits) / 2; s > 0; s /= 2) { + var rx = 0; + var ry = 0; + if ((x & s) > 0) { + rx = 1; + } + if ((y & s) > 0) { + ry = 1; + } + d += s * s * ((3 * rx) ^ ry); + if (ry === 0) { + if (rx === 1) { + x = s - 1 - x; + y = s - 1 - y; + } + tmp = x; + x = y; + y = tmp; + } + } + return d; + } + + function sortPaths(pathList) { + var xMin = Infinity; + var yMin = Infinity; + var xMax = -Infinity; + var yMax = -Infinity; + var cps = map(pathList, function (path) { + var rect = path.getBoundingRect(); + var m = path.getComputedTransform(); + var x = rect.x + rect.width / 2 + (m ? m[4] : 0); + var y = rect.y + rect.height / 2 + (m ? m[5] : 0); + xMin = Math.min(x, xMin); + yMin = Math.min(y, yMin); + xMax = Math.max(x, xMax); + yMax = Math.max(y, yMax); + return [x, y]; + }); + var items = map(cps, function (cp, idx) { + return { + cp: cp, + z: hilbert(cp[0], cp[1], xMin, yMin, xMax, yMax), + path: pathList[idx] + }; + }); + return items.sort(function (a, b) { + return a.z - b.z; + }).map(function (item) { + return item.path; + }); + } + + function defaultDividePath(param) { + return split(param.path, param.count); + } + + function createEmptyReturn() { + return { + fromIndividuals: [], + toIndividuals: [], + count: 0 + }; + } + + function combineMorph(fromList, toPath, animationOpts) { + var fromPathList = []; + + function addFromPath(fromList) { + for (var i = 0; i < fromList.length; i++) { + var from = fromList[i]; + if (isCombineMorphing(from)) { + addFromPath(from.childrenRef()); + } else if (from instanceof Path) { + fromPathList.push(from); + } + } + } + + addFromPath(fromList); + var separateCount = fromPathList.length; + if (!separateCount) { + return createEmptyReturn(); + } + var dividePath = animationOpts.dividePath || defaultDividePath; + var toSubPathList = dividePath({ + path: toPath, count: separateCount + }); + if (toSubPathList.length !== separateCount) { + console.error('Invalid morphing: unmatched splitted path'); + return createEmptyReturn(); + } + fromPathList = sortPaths(fromPathList); + toSubPathList = sortPaths(toSubPathList); + var oldDone = animationOpts.done; + var oldDuring = animationOpts.during; + var individualDelay = animationOpts.individualDelay; + var identityTransform = new Transformable(); + for (var i = 0; i < separateCount; i++) { + var from = fromPathList[i]; + var to = toSubPathList[i]; + to.parent = toPath; + to.copyTransform(identityTransform); + if (!individualDelay) { + prepareMorphPath(from, to); + } + } + toPath.__isCombineMorphing = true; + toPath.childrenRef = function () { + return toSubPathList; + }; + + function addToSubPathListToZr(zr) { + for (var i = 0; i < toSubPathList.length; i++) { + toSubPathList[i].addSelfToZr(zr); + } + } + + saveAndModifyMethod(toPath, 'addSelfToZr', { + after: function (zr) { + addToSubPathListToZr(zr); + } + }); + saveAndModifyMethod(toPath, 'removeSelfFromZr', { + after: function (zr) { + for (var i = 0; i < toSubPathList.length; i++) { + toSubPathList[i].removeSelfFromZr(zr); + } + } + }); + + function restoreToPath() { + toPath.__isCombineMorphing = false; + toPath.__morphT = -1; + toPath.childrenRef = null; + restoreMethod(toPath, 'addSelfToZr'); + restoreMethod(toPath, 'removeSelfFromZr'); + } + + var toLen = toSubPathList.length; + if (individualDelay) { + var animating_1 = toLen; + var eachDone = function () { + animating_1--; + if (animating_1 === 0) { + restoreToPath(); + oldDone && oldDone(); + } + }; + for (var i = 0; i < toLen; i++) { + var indivdualAnimationOpts = individualDelay ? defaults({ + delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toSubPathList[i]), + done: eachDone + }, animationOpts) : animationOpts; + morphPath(fromPathList[i], toSubPathList[i], indivdualAnimationOpts); + } + } else { + toPath.__morphT = 0; + toPath.animateTo({ + __morphT: 1 + }, defaults({ + during: function (p) { + for (var i = 0; i < toLen; i++) { + var child = toSubPathList[i]; + child.__morphT = toPath.__morphT; + child.dirtyShape(); + } + oldDuring && oldDuring(p); + }, + done: function () { + restoreToPath(); + for (var i = 0; i < fromList.length; i++) { + restoreMethod(fromList[i], 'updateTransform'); + } + oldDone && oldDone(); + } + }, animationOpts)); + } + if (toPath.__zr) { + addToSubPathListToZr(toPath.__zr); + } + return { + fromIndividuals: fromPathList, + toIndividuals: toSubPathList, + count: toLen + }; + } + + function separateMorph(fromPath, toPathList, animationOpts) { + var toLen = toPathList.length; + var fromPathList = []; + var dividePath = animationOpts.dividePath || defaultDividePath; + + function addFromPath(fromList) { + for (var i = 0; i < fromList.length; i++) { + var from = fromList[i]; + if (isCombineMorphing(from)) { + addFromPath(from.childrenRef()); + } else if (from instanceof Path) { + fromPathList.push(from); + } + } + } + + if (isCombineMorphing(fromPath)) { + addFromPath(fromPath.childrenRef()); + var fromLen = fromPathList.length; + if (fromLen < toLen) { + var k = 0; + for (var i = fromLen; i < toLen; i++) { + fromPathList.push(clonePath(fromPathList[k++ % fromLen])); + } + } + fromPathList.length = toLen; + } else { + fromPathList = dividePath({path: fromPath, count: toLen}); + var fromPathTransform = fromPath.getComputedTransform(); + for (var i = 0; i < fromPathList.length; i++) { + fromPathList[i].setLocalTransform(fromPathTransform); + } + if (fromPathList.length !== toLen) { + console.error('Invalid morphing: unmatched splitted path'); + return createEmptyReturn(); + } + } + fromPathList = sortPaths(fromPathList); + toPathList = sortPaths(toPathList); + var individualDelay = animationOpts.individualDelay; + for (var i = 0; i < toLen; i++) { + var indivdualAnimationOpts = individualDelay ? defaults({ + delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toPathList[i]) + }, animationOpts) : animationOpts; + morphPath(fromPathList[i], toPathList[i], indivdualAnimationOpts); + } + return { + fromIndividuals: fromPathList, + toIndividuals: toPathList, + count: toPathList.length + }; + } + + function isMultiple(elements) { + return isArray(elements[0]); + } + + function prepareMorphBatches(one, many) { + var batches = []; + var batchCount = one.length; + + for (var i = 0; i < batchCount; i++) { + batches.push({ + one: one[i], + many: [] + }); + } + + for (var i = 0; i < many.length; i++) { + var len = many[i].length; + var k = void 0; + + for (k = 0; k < len; k++) { + batches[k % batchCount].many.push(many[i][k]); + } + } + + var off = 0; // If one has more paths than each one of many. average them. + + for (var i = batchCount - 1; i >= 0; i--) { + if (!batches[i].many.length) { + var moveFrom = batches[off].many; + + if (moveFrom.length <= 1) { + // Not enough + // Start from the first one. + if (off) { + off = 0; + } else { + return batches; + } + } + + var len = moveFrom.length; + var mid = Math.ceil(len / 2); + batches[i].many = moveFrom.slice(mid, len); + batches[off].many = moveFrom.slice(0, mid); + off++; + } + } + + return batches; + } + + var pathDividers = { + clone: function (params) { + var ret = []; // Fitting the alpha + + var approxOpacity = 1 - Math.pow(1 - params.path.style.opacity, 1 / params.count); + + for (var i = 0; i < params.count; i++) { + var cloned = clonePath(params.path); + cloned.setStyle('opacity', approxOpacity); + ret.push(cloned); + } + + return ret; + }, + // Use the default divider + split: null + }; + + function applyMorphAnimation(from, to, divideShape, seriesModel, dataIndex, animateOtherProps) { + if (!from.length || !to.length) { + return; + } + + var updateAnimationCfg = getAnimationConfig('update', seriesModel, dataIndex); + + if (!(updateAnimationCfg && updateAnimationCfg.duration > 0)) { + return; + } + + var animationDelay = seriesModel.getModel('universalTransition').get('delay'); + var animationCfg = Object.assign({ + // Need to setToFinal so the further calculation based on the style can be correct. + // Like emphasis color. + setToFinal: true + }, updateAnimationCfg); + var many; + var one; + + if (isMultiple(from)) { + // manyToOne + many = from; + one = to; + } + + if (isMultiple(to)) { + // oneToMany + many = to; + one = from; + } + + function morphOneBatch(batch, fromIsMany, animateIndex, animateCount, forceManyOne) { + var batchMany = batch.many; + var batchOne = batch.one; + + if (batchMany.length === 1 && !forceManyOne) { + // Is one to one + var batchFrom = fromIsMany ? batchMany[0] : batchOne; + var batchTo = fromIsMany ? batchOne : batchMany[0]; + + if (isCombineMorphing(batchFrom)) { + // Keep doing combine animation. + morphOneBatch({ + many: [batchFrom], + one: batchTo + }, true, animateIndex, animateCount, true); + } else { + var individualAnimationCfg = animationDelay ? defaults({ + delay: animationDelay(animateIndex, animateCount) + }, animationCfg) : animationCfg; + morphPath(batchFrom, batchTo, individualAnimationCfg); + animateOtherProps(batchFrom, batchTo, batchFrom, batchTo, individualAnimationCfg); + } + } else { + var separateAnimationCfg = defaults({ + dividePath: pathDividers[divideShape], + individualDelay: animationDelay && function (idx, count, fromPath, toPath) { + return animationDelay(idx + animateIndex, animateCount); + } + }, animationCfg); + + var _a = fromIsMany ? combineMorph(batchMany, batchOne, separateAnimationCfg) : separateMorph(batchOne, batchMany, separateAnimationCfg), + fromIndividuals = _a.fromIndividuals, + toIndividuals = _a.toIndividuals; + + var count = fromIndividuals.length; + + for (var k = 0; k < count; k++) { + var individualAnimationCfg = animationDelay ? defaults({ + delay: animationDelay(k, count) + }, animationCfg) : animationCfg; + animateOtherProps(fromIndividuals[k], toIndividuals[k], fromIsMany ? batchMany[k] : batch.one, fromIsMany ? batch.one : batchMany[k], individualAnimationCfg); + } + } + } + + var fromIsMany = many ? many === from // Is one to one. If the path number not match. also needs do merge and separate morphing. + : from.length > to.length; + var morphBatches = many ? prepareMorphBatches(one, many) : prepareMorphBatches(fromIsMany ? to : from, [fromIsMany ? from : to]); + var animateCount = 0; + + for (var i = 0; i < morphBatches.length; i++) { + animateCount += morphBatches[i].many.length; + } + + var animateIndex = 0; + + for (var i = 0; i < morphBatches.length; i++) { + morphOneBatch(morphBatches[i], fromIsMany, animateIndex, animateCount); + animateIndex += morphBatches[i].many.length; + } + } + + function getPathList(elements) { + if (!elements) { + return []; + } + + if (isArray(elements)) { + var pathList_1 = []; + + for (var i = 0; i < elements.length; i++) { + pathList_1.push(getPathList(elements[i])); + } + + return pathList_1; + } + + var pathList = []; + elements.traverse(function (el) { + if (el instanceof Path && !el.disableMorphing && !el.invisible && !el.ignore) { + pathList.push(el); + } + }); + return pathList; + } + + var DATA_COUNT_THRESHOLD = 1e4; + var getUniversalTransitionGlobalStore = makeInner(); + + function getGroupIdDimension(data) { + var dimensions = data.dimensions; + + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = data.getDimensionInfo(dimensions[i]); + + if (dimInfo && dimInfo.otherDims.itemGroupId === 0) { + return dimensions[i]; + } + } + } + + function flattenDataDiffItems(list) { + var items = []; + each(list, function (seriesInfo) { + var data = seriesInfo.data; + + if (data.count() > DATA_COUNT_THRESHOLD) { + if ("development" !== 'production') { + warn('Universal transition is disabled on large data > 10k.'); + } + + return; + } + + var indices = data.getIndices(); + var groupDim = getGroupIdDimension(data); + + for (var dataIndex = 0; dataIndex < indices.length; dataIndex++) { + items.push({ + data: data, + dim: seriesInfo.dim || groupDim, + divide: seriesInfo.divide, + dataIndex: dataIndex + }); + } + }); + return items; + } + + function fadeInElement(newEl, newSeries, newIndex) { + newEl.traverse(function (el) { + if (el instanceof Path) { + // TODO use fade in animation for target element. + initProps(el, { + style: { + opacity: 0 + } + }, newSeries, { + dataIndex: newIndex, + isFrom: true + }); + } + }); + } + + function removeEl$1(el) { + if (el.parent) { + // Bake parent transform to element. + // So it can still have proper transform to transition after it's removed. + var computedTransform = el.getComputedTransform(); + el.setLocalTransform(computedTransform); + el.parent.remove(el); + } + } + + function stopAnimation(el) { + el.stopAnimation(); + + if (el.isGroup) { + el.traverse(function (child) { + child.stopAnimation(); + }); + } + } + + function animateElementStyles(el, dataIndex, seriesModel) { + var animationConfig = getAnimationConfig('update', seriesModel, dataIndex); + animationConfig && el.traverse(function (child) { + if (child instanceof Displayable) { + var oldStyle = getOldStyle(child); + + if (oldStyle) { + child.animateFrom({ + style: oldStyle + }, animationConfig); + } + } + }); + } + + function isAllIdSame(oldDiffItems, newDiffItems) { + var len = oldDiffItems.length; + + if (len !== newDiffItems.length) { + return false; + } + + for (var i = 0; i < len; i++) { + var oldItem = oldDiffItems[i]; + var newItem = newDiffItems[i]; + + if (oldItem.data.getId(oldItem.dataIndex) !== newItem.data.getId(newItem.dataIndex)) { + return false; + } + } + + return true; + } + + function transitionBetween(oldList, newList, api) { + var oldDiffItems = flattenDataDiffItems(oldList); + var newDiffItems = flattenDataDiffItems(newList); + + function updateMorphingPathProps(from, to, rawFrom, rawTo, animationCfg) { + if (rawFrom || from) { + to.animateFrom({ + style: rawFrom && rawFrom !== from ? // dividingMethod like clone may override the style(opacity) + // So extend it to raw style. + extend(extend({}, rawFrom.style), from.style) : from.style + }, animationCfg); + } + } + + function findKeyDim(items) { + for (var i = 0; i < items.length; i++) { + if (items[i].dim) { + return items[i].dim; + } + } + } + + var oldKeyDim = findKeyDim(oldDiffItems); + var newKeyDim = findKeyDim(newDiffItems); + var hasMorphAnimation = false; + + function createKeyGetter(isOld, onlyGetId) { + return function (diffItem) { + var data = diffItem.data; + var dataIndex = diffItem.dataIndex; // TODO if specified dim + + if (onlyGetId) { + return data.getId(dataIndex); + } // Use group id as transition key by default. + // So we can achieve multiple to multiple animation like drilldown / up naturally. + // If group id not exits. Use id instead. If so, only one to one transition will be applied. + + + var dataGroupId = data.hostModel && data.hostModel.get('dataGroupId'); // If specified key dimension(itemGroupId by default). Use this same dimension from other data. + // PENDING: If only use key dimension of newData. + + var keyDim = isOld ? oldKeyDim || newKeyDim : newKeyDim || oldKeyDim; + var dimInfo = keyDim && data.getDimensionInfo(keyDim); + var dimOrdinalMeta = dimInfo && dimInfo.ordinalMeta; + + if (dimInfo) { + // Get from encode.itemGroupId. + var key = data.get(dimInfo.name, dataIndex); + + if (dimOrdinalMeta) { + return dimOrdinalMeta.categories[key] || key + ''; + } + + return key + ''; + } // Get groupId from raw item. { groupId: '' } + + + var itemVal = data.getRawDataItem(dataIndex); + + if (itemVal && itemVal.groupId) { + return itemVal.groupId + ''; + } + + return dataGroupId || data.getId(dataIndex); + }; + } // Use id if it's very likely to be an one to one animation + // It's more robust than groupId + // TODO Check if key dimension is specified. + + + var useId = isAllIdSame(oldDiffItems, newDiffItems); + var isElementStillInChart = {}; + + if (!useId) { + // We may have different diff strategy with basicTransition if we use other dimension as key. + // If so, we can't simply check if oldEl is same with newEl. We need a map to check if oldEl is still being used in the new chart. + // We can't use the elements that already being morphed. Let it keep it's original basic transition. + for (var i = 0; i < newDiffItems.length; i++) { + var newItem = newDiffItems[i]; + var el = newItem.data.getItemGraphicEl(newItem.dataIndex); + + if (el) { + isElementStillInChart[el.id] = true; + } + } + } + + function updateOneToOne(newIndex, oldIndex) { + var oldItem = oldDiffItems[oldIndex]; + var newItem = newDiffItems[newIndex]; + var newSeries = newItem.data.hostModel; // TODO Mark this elements is morphed and don't morph them anymore + + var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex); + var newEl = newItem.data.getItemGraphicEl(newItem.dataIndex); // Can't handle same elements. + + if (oldEl === newEl) { + newEl && animateElementStyles(newEl, newItem.dataIndex, newSeries); + return; + } + + if ( // We can't use the elements that already being morphed + oldEl && isElementStillInChart[oldEl.id]) { + return; + } + + if (newEl) { + // TODO: If keep animating the group in case + // some of the elements don't want to be morphed. + // TODO Label? + stopAnimation(newEl); + + if (oldEl) { + stopAnimation(oldEl); // If old element is doing leaving animation. stop it and remove it immediately. + + removeEl$1(oldEl); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldEl), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps); + } else { + fadeInElement(newEl, newSeries, newIndex); + } + } // else keep oldEl leaving animation. + + } + + new DataDiffer(oldDiffItems, newDiffItems, createKeyGetter(true, useId), createKeyGetter(false, useId), null, 'multiple').update(updateOneToOne).updateManyToOne(function (newIndex, oldIndices) { + var newItem = newDiffItems[newIndex]; + var newData = newItem.data; + var newSeries = newData.hostModel; + var newEl = newData.getItemGraphicEl(newItem.dataIndex); + var oldElsList = filter(map(oldIndices, function (idx) { + return oldDiffItems[idx].data.getItemGraphicEl(oldDiffItems[idx].dataIndex); + }), function (oldEl) { + return oldEl && oldEl !== newEl && !isElementStillInChart[oldEl.id]; + }); + + if (newEl) { + stopAnimation(newEl); + + if (oldElsList.length) { + // If old element is doing leaving animation. stop it and remove it immediately. + each(oldElsList, function (oldEl) { + stopAnimation(oldEl); + removeEl$1(oldEl); + }); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldElsList), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps); + } else { + fadeInElement(newEl, newSeries, newItem.dataIndex); + } + } // else keep oldEl leaving animation. + + }).updateOneToMany(function (newIndices, oldIndex) { + var oldItem = oldDiffItems[oldIndex]; + var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex); // We can't use the elements that already being morphed + + if (oldEl && isElementStillInChart[oldEl.id]) { + return; + } + + var newElsList = filter(map(newIndices, function (idx) { + return newDiffItems[idx].data.getItemGraphicEl(newDiffItems[idx].dataIndex); + }), function (el) { + return el && el !== oldEl; + }); + var newSeris = newDiffItems[newIndices[0]].data.hostModel; + + if (newElsList.length) { + each(newElsList, function (newEl) { + return stopAnimation(newEl); + }); + + if (oldEl) { + stopAnimation(oldEl); // If old element is doing leaving animation. stop it and remove it immediately. + + removeEl$1(oldEl); + hasMorphAnimation = true; + applyMorphAnimation(getPathList(oldEl), getPathList(newElsList), oldItem.divide, // Use divide on old. + newSeris, newIndices[0], updateMorphingPathProps); + } else { + each(newElsList, function (newEl) { + return fadeInElement(newEl, newSeris, newIndices[0]); + }); + } + } // else keep oldEl leaving animation. + + }).updateManyToMany(function (newIndices, oldIndices) { + // If two data are same and both have groupId. + // Normally they should be diff by id. + new DataDiffer(oldIndices, newIndices, function (rawIdx) { + return oldDiffItems[rawIdx].data.getId(oldDiffItems[rawIdx].dataIndex); + }, function (rawIdx) { + return newDiffItems[rawIdx].data.getId(newDiffItems[rawIdx].dataIndex); + }).update(function (newIndex, oldIndex) { + // Use the original index + updateOneToOne(newIndices[newIndex], oldIndices[oldIndex]); + }).execute(); + }).execute(); + + if (hasMorphAnimation) { + each(newList, function (_a) { + var data = _a.data; + var seriesModel = data.hostModel; + var view = seriesModel && api.getViewOfSeriesModel(seriesModel); + var animationCfg = getAnimationConfig('update', seriesModel, 0); // use 0 index. + + if (view && seriesModel.isAnimationEnabled() && animationCfg && animationCfg.duration > 0) { + view.group.traverse(function (el) { + if (el instanceof Path && !el.animators.length) { + // We can't accept there still exists element that has no animation + // if universalTransition is enabled + el.animateFrom({ + style: { + opacity: 0 + } + }, animationCfg); + } + }); + } + }); + } + } + + function getSeriesTransitionKey(series) { + var seriesKey = series.getModel('universalTransition').get('seriesKey'); + + if (!seriesKey) { + // Use series id by default. + return series.id; + } + + return seriesKey; + } + + function convertArraySeriesKeyToString(seriesKey) { + if (isArray(seriesKey)) { + // Order independent. + return seriesKey.sort().join(','); + } + + return seriesKey; + } + + function getDivideShapeFromData(data) { + if (data.hostModel) { + return data.hostModel.getModel('universalTransition').get('divideShape'); + } + } + + function findTransitionSeriesBatches(globalStore, params) { + var updateBatches = createHashMap(); + var oldDataMap = createHashMap(); // Map that only store key in array seriesKey. + // Which is used to query the old data when transition from one to multiple series. + + var oldDataMapForSplit = createHashMap(); + each(globalStore.oldSeries, function (series, idx) { + var oldData = globalStore.oldData[idx]; + var transitionKey = getSeriesTransitionKey(series); + var transitionKeyStr = convertArraySeriesKeyToString(transitionKey); + oldDataMap.set(transitionKeyStr, oldData); + + if (isArray(transitionKey)) { + // Same key can't in different array seriesKey. + each(transitionKey, function (key) { + oldDataMapForSplit.set(key, { + data: oldData, + key: transitionKeyStr + }); + }); + } + }); + + function checkTransitionSeriesKeyDuplicated(transitionKeyStr) { + if (updateBatches.get(transitionKeyStr)) { + warn("Duplicated seriesKey in universalTransition " + transitionKeyStr); + } + } + + each(params.updatedSeries, function (series) { + if (series.isUniversalTransitionEnabled() && series.isAnimationEnabled()) { + var newData = series.getData(); + var transitionKey = getSeriesTransitionKey(series); + var transitionKeyStr = convertArraySeriesKeyToString(transitionKey); // Only transition between series with same id. + + var oldData = oldDataMap.get(transitionKeyStr); // string transition key is the best match. + + if (oldData) { + if ("development" !== 'production') { + checkTransitionSeriesKeyDuplicated(transitionKeyStr); + } // TODO check if data is same? + + + updateBatches.set(transitionKeyStr, { + oldSeries: [{ + divide: getDivideShapeFromData(oldData), + data: oldData + }], + newSeries: [{ + divide: getDivideShapeFromData(newData), + data: newData + }] + }); + } else { + // Transition from multiple series. + if (isArray(transitionKey)) { + if ("development" !== 'production') { + checkTransitionSeriesKeyDuplicated(transitionKeyStr); + } + + var oldSeries_1 = []; + each(transitionKey, function (key) { + var oldData = oldDataMap.get(key); + + if (oldData) { + oldSeries_1.push({ + divide: getDivideShapeFromData(oldData), + data: oldData + }); + } + }); + + if (oldSeries_1.length) { + updateBatches.set(transitionKeyStr, { + oldSeries: oldSeries_1, + newSeries: [{ + data: newData, + divide: getDivideShapeFromData(newData) + }] + }); + } + } else { + // Try transition to multiple series. + var oldData_1 = oldDataMapForSplit.get(transitionKey); + + if (oldData_1) { + var batch = updateBatches.get(oldData_1.key); + + if (!batch) { + batch = { + oldSeries: [{ + data: oldData_1.data, + divide: getDivideShapeFromData(oldData_1.data) + }], + newSeries: [] + }; + updateBatches.set(oldData_1.key, batch); + } + + batch.newSeries.push({ + data: newData, + divide: getDivideShapeFromData(newData) + }); + } + } + } + } + }); + return updateBatches; + } + + function querySeries(series, finder) { + for (var i = 0; i < series.length; i++) { + var found = finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id; + + if (found) { + return i; + } + } + } + + function transitionSeriesFromOpt(transitionOpt, globalStore, params, api) { + var from = []; + var to = []; + each(normalizeToArray(transitionOpt.from), function (finder) { + var idx = querySeries(globalStore.oldSeries, finder); + + if (idx >= 0) { + from.push({ + data: globalStore.oldData[idx], + // TODO can specify divideShape in transition. + divide: getDivideShapeFromData(globalStore.oldData[idx]), + dim: finder.dimension + }); + } + }); + each(normalizeToArray(transitionOpt.to), function (finder) { + var idx = querySeries(params.updatedSeries, finder); + + if (idx >= 0) { + var data = params.updatedSeries[idx].getData(); + to.push({ + data: data, + divide: getDivideShapeFromData(data), + dim: finder.dimension + }); + } + }); + + if (from.length > 0 && to.length > 0) { + transitionBetween(from, to, api); + } + } + + function installUniversalTransition(registers) { + registers.registerUpdateLifecycle('series:beforeupdate', function (ecMOdel, api, params) { + each(normalizeToArray(params.seriesTransition), function (transOpt) { + each(normalizeToArray(transOpt.to), function (finder) { + var series = params.updatedSeries; + + for (var i = 0; i < series.length; i++) { + if (finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id) { + series[i][SERIES_UNIVERSAL_TRANSITION_PROP] = true; + } + } + }); + }); + }); + registers.registerUpdateLifecycle('series:transition', function (ecModel, api, params) { + // TODO api provide an namespace that can save stuff per instance + var globalStore = getUniversalTransitionGlobalStore(api); // TODO multiple to multiple series. + + if (globalStore.oldSeries && params.updatedSeries && params.optionChanged) { + // Use give transition config if its' give; + var transitionOpt = params.seriesTransition; + + if (transitionOpt) { + each(normalizeToArray(transitionOpt), function (opt) { + transitionSeriesFromOpt(opt, globalStore, params, api); + }); + } else { + // Else guess from series based on transition series key. + var updateBatches_1 = findTransitionSeriesBatches(globalStore, params); + each(updateBatches_1.keys(), function (key) { + var batch = updateBatches_1.get(key); + transitionBetween(batch.oldSeries, batch.newSeries, api); + }); + } // Reset + + + each(params.updatedSeries, function (series) { + // Reset; + if (series[SERIES_UNIVERSAL_TRANSITION_PROP]) { + series[SERIES_UNIVERSAL_TRANSITION_PROP] = false; + } + }); + } // Save all series of current update. Not only the updated one. + + + var allSeries = ecModel.getSeries(); + var savedSeries = globalStore.oldSeries = []; + var savedData = globalStore.oldData = []; + + for (var i = 0; i < allSeries.length; i++) { + var data = allSeries[i].getData(); // Only save the data that can have transition. + // Avoid large data costing too much extra memory + + if (data.count() < DATA_COUNT_THRESHOLD) { + savedSeries.push(allSeries[i]); + savedData.push(data); + } + } + }); + } + + // Render engines + // ----------------- + // Render via Canvas. + // echarts.init(dom, null, { renderer: 'canvas' }) + + use([install$1]); // Render via SVG. + // echarts.init(dom, null, { renderer: 'svg' }) + + use([install]); // ---------------- + // Charts (series) + // ---------------- + // All of the series types, for example: + // chart.setOption({ + // series: [{ + // type: 'line' // or 'bar', 'pie', ... + // }] + // }); + + use([install$2, install$3, install$4, install$6, install$8, install$a, install$b, install$c, install$d, install$e, install$f, install$h, install$i, install$j, install$k, install$l, install$m, install$n, install$o, install$p, install$q, install$r]); // ------------------- + // Coordinate systems + // ------------------- + // All of the axis modules have been included in the + // coordinate system module below, do not need to + // make extra import. + // `cartesian` coordinate system. For some historical + // reasons, it is named as grid, for example: + // chart.setOption({ + // grid: {...}, + // xAxis: {...}, + // yAxis: {...}, + // series: [{...}] + // }); + + use(install$t); // `polar` coordinate system, for example: + // chart.setOption({ + // polar: {...}, + // radiusAxis: {...}, + // angleAxis: {...}, + // series: [{ + // coordinateSystem: 'polar' + // }] + // }); + + use(install$u); // `geo` coordinate system, for example: + // chart.setOption({ + // geo: {...}, + // series: [{ + // coordinateSystem: 'geo' + // }] + // }); + + use(install$9); // `singleAxis` coordinate system (notice, it is a coordinate system + // with only one axis, work for chart like theme river), for example: + // chart.setOption({ + // singleAxis: {...} + // series: [{type: 'themeRiver', ...}] + // }); + + use(install$v); // `parallel` coordinate system, only work for parallel series, for example: + // chart.setOption({ + // parallel: {...}, + // parallelAxis: [{...}, ...], + // series: [{ + // type: 'parallel' + // }] + // }); + + use(install$g); // `calendar` coordinate system. for example, + // chart.setOptionp({ + // calendar: {...}, + // series: [{ + // coordinateSystem: 'calendar' + // }] + // ); + + use(install$w); // ------------------ + // Other components + // ------------------ + // `graphic` component, for example: + // chart.setOption({ + // graphic: {...} + // }); + + use(install$x); // `toolbox` component, for example: + // chart.setOption({ + // toolbox: {...} + // }); + + use(install$z); // `tooltip` component, for example: + // chart.setOption({ + // tooltip: {...} + // }); + + use(install$A); // `axisPointer` component, for example: + // chart.setOption({ + // tooltip: {axisPointer: {...}, ...} + // }); + // Or + // chart.setOption({ + // axisPointer: {...} + // }); + + use(install$s); // `brush` component, for example: + // chart.setOption({ + // brush: {...} + // }); + // Or + // chart.setOption({ + // tooltip: {feature: {brush: {...}} + // }) + + use(install$B); // `title` component, for example: + // chart.setOption({ + // title: {...} + // }); + + use(install$C); // `timeline` component, for example: + // chart.setOption({ + // timeline: {...} + // }); + + use(install$D); // `markPoint` component, for example: + // chart.setOption({ + // series: [{markPoint: {...}}] + // }); + + use(install$E); // `markLine` component, for example: + // chart.setOption({ + // series: [{markLine: {...}}] + // }); + + use(install$F); // `markArea` component, for example: + // chart.setOption({ + // series: [{markArea: {...}}] + // }); + + use(install$G); // `legend` component not scrollable. for example: + // chart.setOption({ + // legend: {...} + // }); + + use(install$J); // `dataZoom` component including both `dataZoomInside` and `dataZoomSlider`. + + use(install$M); // `dataZoom` component providing drag, pinch, wheel behaviors + // inside coodinate system, for example: + // chart.setOption({ + // dataZoom: {type: 'inside'} + // }); + + use(install$K); // `dataZoom` component providing a slider bar, for example: + // chart.setOption({ + // dataZoom: {type: 'slider'} + // }); + + use(install$L); // `visualMap` component including both `visualMapContinuous` and `visualMapPiecewise`. + + use(install$P); // `visualMap` component providing continuous bar, for example: + // chart.setOption({ + // visualMap: {type: 'continuous'} + // }); + + use(install$N); // `visualMap` component providing pieces bar, for example: + // chart.setOption({ + // visualMap: {type: 'piecewise'} + // }); + + use(install$O); // `aria` component providing aria, for example: + // chart.setOption({ + // aria: {...} + // }); + + use(install$Q); // dataset transform + // chart.setOption({ + // dataset: { + // transform: [] + // } + // }); + + use(install$R); + use(install$S); // universal transition + // chart.setOption({ + // series: { + // universalTransition: { enabled: true } + // } + // }) + + use(installUniversalTransition); // label layout + // chart.setOption({ + // series: { + // labelLayout: { hideOverlap: true } + // } + // }) + + use(installLabelLayout); + + exports.Axis = Axis; + exports.ChartView = ChartView; + exports.ComponentModel = ComponentModel; + exports.ComponentView = ComponentView; + exports.List = SeriesData; + exports.Model = Model; + exports.PRIORITY = PRIORITY; + exports.SeriesModel = SeriesModel; + exports.color = color; + exports.connect = connect; + exports.dataTool = dataTool; + exports.dependencies = dependencies; + exports.disConnect = disConnect; + exports.disconnect = disconnect; + exports.dispose = dispose$1; + exports.env = env; + exports.extendChartView = extendChartView; + exports.extendComponentModel = extendComponentModel; + exports.extendComponentView = extendComponentView; + exports.extendSeriesModel = extendSeriesModel; + exports.format = format$1; + exports.getCoordinateSystemDimensions = getCoordinateSystemDimensions; + exports.getInstanceByDom = getInstanceByDom; + exports.getInstanceById = getInstanceById; + exports.getMap = getMap; + exports.graphic = graphic$1; + exports.helper = helper; + exports.init = init$1; + exports.innerDrawElementOnCanvas = brushSingle; + exports.matrix = matrix; + exports.number = number; + exports.parseGeoJSON = parseGeoJSON; + exports.parseGeoJson = parseGeoJSON; + exports.registerAction = registerAction; + exports.registerCoordinateSystem = registerCoordinateSystem; + exports.registerLayout = registerLayout; + exports.registerLoading = registerLoading; + exports.registerLocale = registerLocale; + exports.registerMap = registerMap; + exports.registerPostInit = registerPostInit; + exports.registerPostUpdate = registerPostUpdate; + exports.registerPreprocessor = registerPreprocessor; + exports.registerProcessor = registerProcessor; + exports.registerTheme = registerTheme; + exports.registerTransform = registerTransform; + exports.registerUpdateLifecycle = registerUpdateLifecycle; + exports.registerVisual = registerVisual; + exports.setCanvasCreator = setCanvasCreator; + exports.setPlatformAPI = setPlatformAPI; + exports.throttle = throttle; + exports.time = time; + exports.use = use; + exports.util = util$1; + exports.vector = vector; + exports.version = version$1; + exports.zrUtil = util; + exports.zrender = zrender; + + Object.defineProperty(exports, '__esModule', {value: true}); + +}))); + +layui.define('echartsTheme', function (exports) { + echarts.registerTheme('walden', layui.echartsTheme); + exports('echarts', echarts); +}); \ No newline at end of file diff --git a/static/component/pear/module/extends/echartsTheme.js b/static/component/pear/module/extends/echartsTheme.js new file mode 100644 index 0000000..c0c029b --- /dev/null +++ b/static/component/pear/module/extends/echartsTheme.js @@ -0,0 +1,450 @@ +layui.define(function (exports) { + exports('echartsTheme', + { + "color": [ + "#3fb1e3", + "#6be6c1", + "#626c91", + "#a0a7e6", + "#c4ebad", + "#96dee8" + ], + "backgroundColor": "rgba(252,252,252,0)", + "textStyle": {}, + "title": { + "textStyle": { + "color": "#666666" + }, + "subtextStyle": { + "color": "#999999" + } + }, + "line": { + "itemStyle": { + "borderWidth": "3" + }, + "lineStyle": { + "width": "4" + }, + "symbolSize": "10", + "symbol": "emptyCircle", + "smooth": true + }, + "radar": { + "itemStyle": { + "borderWidth": "3" + }, + "lineStyle": { + "width": "4" + }, + "symbolSize": "10", + "symbol": "emptyCircle", + "smooth": true + }, + "bar": { + "itemStyle": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + }, + "emphasis": { + "itemStyle": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + } + } + }, + "pie": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "scatter": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "boxplot": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + + }, + "emphasis": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "parallel": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "sankey": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "funnel": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "gauge": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "candlestick": { + "itemStyle": { + "color": "#e6a0d2", + "color0": "transparent", + "borderColor": "#e6a0d2", + "borderColor0": "#3fb1e3", + "borderWidth": "2" + } + }, + "graph": { + "itemStyle": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "lineStyle": { + "width": "1", + "color": "#cccccc" + }, + "symbolSize": "10", + "symbol": "emptyCircle", + "smooth": true, + "color": [ + "#3fb1e3", + "#6be6c1", + "#626c91", + "#a0a7e6", + "#c4ebad", + "#96dee8" + ], + "label": { + "color": "#ffffff" + } + }, + "map": { + "itemStyle": { + "areaColor": "#eeeeee", + "borderColor": "#aaaaaa", + "borderWidth": 0.5 + }, + "label": { + "color": "#ffffff" + }, + "emphasis": { + "itemStyle": { + "areaColor": "rgba(63,177,227,0.25)", + "borderColor": "#3fb1e3", + "borderWidth": 1 + }, + "label": { + "color": "rgb(63,177,227)" + } + } + }, + "geo": { + "itemStyle": { + "areaColor": "#eeeeee", + "borderColor": "#aaaaaa", + "borderWidth": 0.5 + }, + "label": { + "color": "#ffffff" + }, + "emphasis": { + "itemStyle": { + "areaColor": "rgba(63,177,227,0.25)", + "borderColor": "#3fb1e3", + "borderWidth": 1 + }, + "label": { + "color": "rgb(63,177,227)" + } + } + }, + "categoryAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + + "color": "#999999" + + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "valueAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "color": "#999999" + + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "logAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "color": "#999999" + + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "timeAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + + "color": "#999999" + + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "toolbox": { + "iconStyle": { + "borderColor": "#999999" + }, + "emphasis": { + "iconStyle": { + "borderColor": "#666666" + } + } + }, + "legend": { + "textStyle": { + "color": "#999999" + } + }, + "tooltip": { + "axisPointer": { + "lineStyle": { + "color": "#cccccc", + "width": 1 + }, + "crossStyle": { + "color": "#cccccc", + "width": 1 + } + } + }, + "timeline": { + "lineStyle": { + "color": "#626c91", + "width": 1 + }, + "itemStyle": { + "color": "#626c91", + "borderWidth": 1 + + }, + "controlStyle": { + "color": "#626c91", + "borderColor": "#626c91", + "borderWidth": 0.5 + }, + "checkpointStyle": { + "color": "#3fb1e3", + "borderColor": "rgba(63,177,227,0.15)" + }, + "label": { + "color": "#626c91" + }, + "emphasis": { + "itemStyle": { + "color": "#626c91" + }, + "controlStyle": { + "color": "#626c91", + "borderColor": "#626c91", + "borderWidth": 0.5 + }, + "label": { + "color": "#626c91" + } + } + }, + "visualMap": { + "color": [ + "#2a99c9", + "#afe8ff" + ] + }, + "dataZoom": { + "backgroundColor": "rgba(255,255,255,0)", + "dataBackgroundColor": "rgba(222,222,222,1)", + "fillerColor": "rgba(114,230,212,0.25)", + "handleColor": "#cccccc", + "handleSize": "100%", + "textStyle": { + "color": "#999999" + } + }, + "markPoint": { + "label": { + "color": "#ffffff" + }, + "emphasis": { + "label": { + "color": "#ffffff" + } + } + } + }); +}); \ No newline at end of file diff --git a/static/component/pear/module/extends/nprogress.js b/static/component/pear/module/extends/nprogress.js new file mode 100644 index 0000000..b59afa7 --- /dev/null +++ b/static/component/pear/module/extends/nprogress.js @@ -0,0 +1,508 @@ +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +;(function (root, factory) { + + if (typeof define === 'function' && define.amd) { + define(factory); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.NProgress = factory(); + } + +})(this, function () { + var NProgress = {}; + + NProgress.version = '0.2.0'; + + var Settings = NProgress.settings = { + minimum: 0.08, + easing: 'linear', + positionUsing: '', + speed: 200, + trickle: true, + trickleSpeed: 200, + showSpinner: true, + barSelector: '[role="bar"]', + spinnerSelector: '[role="spinner"]', + parent: 'body', + template: '
            ' + }; + + /** + * Updates configuration. + * + * NProgress.configure({ + * minimum: 0.1 + * }); + */ + NProgress.configure = function (options) { + var key, value; + for (key in options) { + value = options[key]; + if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value; + } + + return this; + }; + + /** + * Last number. + */ + + NProgress.status = null; + + /** + * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`. + * + * NProgress.set(0.4); + * NProgress.set(1.0); + */ + + NProgress.set = function (n) { + var started = NProgress.isStarted(); + + n = clamp(n, Settings.minimum, 1); + NProgress.status = (n === 1 ? null : n); + + var progress = NProgress.render(!started), + bar = progress.querySelector(Settings.barSelector), + speed = Settings.speed, + ease = Settings.easing; + + progress.offsetWidth; /* Repaint */ + + queue(function (next) { + // Set positionUsing if it hasn't already been set + if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS(); + + // Add transition + css(bar, barPositionCSS(n, speed, ease)); + + if (n === 1) { + // Fade out + css(progress, { + transition: 'none', + opacity: 1 + }); + progress.offsetWidth; /* Repaint */ + + setTimeout(function () { + css(progress, { + transition: 'all ' + speed + 'ms linear', + opacity: 0 + }); + setTimeout(function () { + NProgress.remove(); + next(); + }, speed); + }, speed); + } else { + setTimeout(next, speed); + } + }); + + return this; + }; + + NProgress.isStarted = function () { + return typeof NProgress.status === 'number'; + }; + + /** + * Shows the progress bar. + * This is the same as setting the status to 0%, except that it doesn't go backwards. + * + * NProgress.start(); + * + */ + NProgress.start = function () { + if (!NProgress.status) NProgress.set(0); + + var work = function () { + setTimeout(function () { + if (!NProgress.status) return; + NProgress.trickle(); + work(); + }, Settings.trickleSpeed); + }; + + if (Settings.trickle) work(); + + return this; + }; + + /** + * Hides the progress bar. + * This is the *sort of* the same as setting the status to 100%, with the + * difference being `done()` makes some placebo effect of some realistic motion. + * + * NProgress.done(); + * + * If `true` is passed, it will show the progress bar even if its hidden. + * + * NProgress.done(true); + */ + + NProgress.done = function (force) { + if (!force && !NProgress.status) return this; + + return NProgress.inc(0.3 + 0.5 * Math.random()).set(1); + }; + + /** + * Increments by a random amount. + */ + + NProgress.inc = function (amount) { + var n = NProgress.status; + + if (!n) { + return NProgress.start(); + } else if (n > 1) { + return; + } else { + if (typeof amount !== 'number') { + if (n >= 0 && n < 0.2) { + amount = 0.1; + } else if (n >= 0.2 && n < 0.5) { + amount = 0.04; + } else if (n >= 0.5 && n < 0.8) { + amount = 0.02; + } else if (n >= 0.8 && n < 0.99) { + amount = 0.005; + } else { + amount = 0; + } + } + + n = clamp(n + amount, 0, 0.994); + return NProgress.set(n); + } + }; + + NProgress.trickle = function () { + return NProgress.inc(); + }; + + /** + * Waits for all supplied jQuery promises and + * increases the progress as the promises resolve. + * + * @param $promise jQUery Promise + */ + (function () { + var initial = 0, current = 0; + + NProgress.promise = function ($promise) { + if (!$promise || $promise.state() === "resolved") { + return this; + } + + if (current === 0) { + NProgress.start(); + } + + initial++; + current++; + + $promise.always(function () { + current--; + if (current === 0) { + initial = 0; + NProgress.done(); + } else { + NProgress.set((initial - current) / initial); + } + }); + + return this; + }; + + })(); + + /** + * (Internal) renders the progress bar markup based on the `template` + * setting. + */ + + NProgress.render = function (fromStart) { + if (NProgress.isRendered()) return document.getElementById('nprogress'); + + addClass(document.documentElement, 'nprogress-busy'); + + var progress = document.createElement('div'); + progress.id = 'nprogress'; + progress.innerHTML = Settings.template; + + + var bar = progress.querySelector(Settings.barSelector), + perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0), + parent = isDOM(Settings.parent) + ? Settings.parent + : document.querySelector(Settings.parent), + spinner + + css(bar, { + transition: 'all 0 linear', + transform: 'translate3d(' + perc + '%,0,0)' + }); + + if (!Settings.showSpinner) { + spinner = progress.querySelector(Settings.spinnerSelector); + spinner && removeElement(spinner); + } + + if (parent != document.body) { + addClass(parent, 'nprogress-custom-parent'); + } + + parent.appendChild(progress); + return progress; + }; + + /** + * Removes the element. Opposite of render(). + */ + + NProgress.remove = function () { + removeClass(document.documentElement, 'nprogress-busy'); + var parent = isDOM(Settings.parent) + ? Settings.parent + : document.querySelector(Settings.parent) + removeClass(parent, 'nprogress-custom-parent') + var progress = document.getElementById('nprogress'); + progress && removeElement(progress); + }; + + /** + * Checks if the progress bar is rendered. + */ + + NProgress.isRendered = function () { + return !!document.getElementById('nprogress'); + }; + + /** + * Determine which positioning CSS rule to use. + */ + + NProgress.getPositioningCSS = function () { + // Sniff on document.body.style + var bodyStyle = document.body.style; + + // Sniff prefixes + var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' : + ('MozTransform' in bodyStyle) ? 'Moz' : + ('msTransform' in bodyStyle) ? 'ms' : + ('OTransform' in bodyStyle) ? 'O' : ''; + + if (vendorPrefix + 'Perspective' in bodyStyle) { + // Modern browsers with 3D support, e.g. Webkit, IE10 + return 'translate3d'; + } else if (vendorPrefix + 'Transform' in bodyStyle) { + // Browsers without 3D support, e.g. IE9 + return 'translate'; + } else { + // Browsers without translate() support, e.g. IE7-8 + return 'margin'; + } + }; + + /** + * Helpers + */ + + function isDOM(obj) { + if (typeof HTMLElement === 'object') { + return obj instanceof HTMLElement + } + return ( + obj && + typeof obj === 'object' && + obj.nodeType === 1 && + typeof obj.nodeName === 'string' + ) + } + + function clamp(n, min, max) { + if (n < min) return min; + if (n > max) return max; + return n; + } + + /** + * (Internal) converts a percentage (`0..1`) to a bar translateX + * percentage (`-100%..0%`). + */ + + function toBarPerc(n) { + return (-1 + n) * 100; + } + + + /** + * (Internal) returns the correct CSS for changing the bar's + * position given an n percentage, and speed and ease from Settings + */ + + function barPositionCSS(n, speed, ease) { + var barCSS; + + if (Settings.positionUsing === 'translate3d') { + barCSS = {transform: 'translate3d(' + toBarPerc(n) + '%,0,0)'}; + } else if (Settings.positionUsing === 'translate') { + barCSS = {transform: 'translate(' + toBarPerc(n) + '%,0)'}; + } else { + barCSS = {'margin-left': toBarPerc(n) + '%'}; + } + + barCSS.transition = 'all ' + speed + 'ms ' + ease; + + return barCSS; + } + + /** + * (Internal) Queues a function to be executed. + */ + + var queue = (function () { + var pending = []; + + function next() { + var fn = pending.shift(); + if (fn) { + fn(next); + } + } + + return function (fn) { + pending.push(fn); + if (pending.length == 1) next(); + }; + })(); + + /** + * (Internal) Applies css properties to an element, similar to the jQuery + * css method. + * + * While this helper does assist with vendor prefixed property names, it + * does not perform any manipulation of values prior to setting styles. + */ + + var css = (function () { + var cssPrefixes = ['Webkit', 'O', 'Moz', 'ms'], + cssProps = {}; + + function camelCase(string) { + return string.replace(/^-ms-/, 'ms-').replace(/-([\da-z])/gi, function (match, letter) { + return letter.toUpperCase(); + }); + } + + function getVendorProp(name) { + var style = document.body.style; + if (name in style) return name; + + var i = cssPrefixes.length, + capName = name.charAt(0).toUpperCase() + name.slice(1), + vendorName; + while (i--) { + vendorName = cssPrefixes[i] + capName; + if (vendorName in style) return vendorName; + } + + return name; + } + + function getStyleProp(name) { + name = camelCase(name); + return cssProps[name] || (cssProps[name] = getVendorProp(name)); + } + + function applyCss(element, prop, value) { + prop = getStyleProp(prop); + element.style[prop] = value; + } + + return function (element, properties) { + var args = arguments, + prop, + value; + + if (args.length == 2) { + for (prop in properties) { + value = properties[prop]; + if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value); + } + } else { + applyCss(element, args[1], args[2]); + } + } + })(); + + /** + * (Internal) Determines if an element or space separated list of class names contains a class name. + */ + + function hasClass(element, name) { + var list = typeof element == 'string' ? element : classList(element); + return list.indexOf(' ' + name + ' ') >= 0; + } + + /** + * (Internal) Adds a class to an element. + */ + + function addClass(element, name) { + var oldList = classList(element), + newList = oldList + name; + + if (hasClass(oldList, name)) return; + + // Trim the opening space. + element.className = newList.substring(1); + } + + /** + * (Internal) Removes a class from an element. + */ + + function removeClass(element, name) { + var oldList = classList(element), + newList; + + if (!hasClass(element, name)) return; + + // Replace the class name. + newList = oldList.replace(' ' + name + ' ', ' '); + + // Trim the opening and closing spaces. + element.className = newList.substring(1, newList.length - 1); + } + + /** + * (Internal) Gets a space separated list of the class names on the element. + * The list is wrapped with a single space on each end to facilitate finding + * matches within the list. + */ + + function classList(element) { + return (' ' + (element && element.className || '') + ' ').replace(/\s+/gi, ' '); + } + + /** + * (Internal) Removes an element from the DOM. + */ + + function removeElement(element) { + element && element.parentNode && element.parentNode.removeChild(element); + } + + return NProgress; +}); + +layui.define([], function (exports) { + exports('nprogress', NProgress); +}); \ No newline at end of file diff --git a/static/component/pear/module/extends/popup.js b/static/component/pear/module/extends/popup.js new file mode 100644 index 0000000..188006f --- /dev/null +++ b/static/component/pear/module/extends/popup.js @@ -0,0 +1,47 @@ +layui.define(['layer'], function (exports) { + "use strict"; + + var MOD_NAME = 'popup', + layer = layui.layer; + + var popup = new function () { + + this.success = function (msg) { + layer.msg(msg, { + icon: 1, + time: 1000 + }) + }, + this.failure = function (msg) { + layer.msg(msg, { + icon: 2, + time: 1000 + }) + }, + this.warning = function (msg) { + layer.msg(msg, { + icon: 3, + time: 1000 + }) + }, + this.success = function (msg, callback) { + layer.msg(msg, { + icon: 1, + time: 1000 + }, callback); + }, + this.failure = function (msg, callback) { + layer.msg(msg, { + icon: 2, + time: 1000 + }, callback); + }, + this.warming = function (msg, callback) { + layer.msg(msg, { + icon: 3, + time: 1000 + }, callback); + } + }; + exports(MOD_NAME, popup); +}) diff --git a/static/component/pear/module/extends/toast.js b/static/component/pear/module/extends/toast.js new file mode 100644 index 0000000..2b76fc5 --- /dev/null +++ b/static/component/pear/module/extends/toast.js @@ -0,0 +1,1249 @@ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define([], factory(root)); + } else if (typeof exports === 'object') { + module.exports = factory(root); + } else if (window.layui && layui.define) { + layui.define(function (exports) { + exports('toast', factory(root)) + }) + } else { + root.iziToast = factory(root); + } +})(typeof global !== 'undefined' ? global : window || this.window || this.global, function (root) { + + 'use strict'; + + var $iziToast = {}, + PLUGIN_NAME = 'iziToast', + BODY = document.querySelector('body'), + ISMOBILE = (/Mobi/.test(navigator.userAgent)) ? true : false, + ISCHROME = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor), + ISFIREFOX = typeof InstallTrigger !== 'undefined', + ACCEPTSTOUCH = 'ontouchstart' in document.documentElement, + POSITIONS = ['bottomRight', 'bottomLeft', 'bottomCenter', 'topRight', 'topLeft', 'topCenter', 'center'], + THEMES = { + info: { + color: 'blue', + icon: 'ico-info' + }, + success: { + color: 'green', + icon: 'ico-success' + }, + warning: { + color: 'orange', + icon: 'ico-warning' + }, + error: { + color: 'red', + icon: 'ico-error' + }, + question: { + color: 'yellow', + icon: 'ico-question' + } + }, + MOBILEWIDTH = 568, + CONFIG = {}; + + $iziToast.children = {}; + + // Default settings + var defaults = { + id: null, + class: '', + title: '', + titleColor: '', + titleSize: '', + titleLineHeight: '', + message: '', + messageColor: '', + messageSize: '', + messageLineHeight: '', + backgroundColor: '', + theme: 'light', // dark + color: '', // blue, red, green, yellow + icon: '', + iconText: '', + iconColor: '', + iconUrl: null, + image: '', + imageWidth: 50, + maxWidth: null, + zindex: null, + layout: 2, + balloon: false, + close: true, + closeOnEscape: false, + closeOnClick: false, + displayMode: 0, + position: 'topCenter', // bottomRight, bottomLeft, topRight, topLeft, topCenter, bottomCenter, center + target: '', + targetFirst: true, + timeout: 3000, // 默认3秒 + rtl: false, + animateInside: false, // 动画效果 + drag: true, + pauseOnHover: true, + resetOnHover: false, + progressBar: false, + progressBarColor: '', + progressBarEasing: 'linear', + overlay: false, + overlayClose: false, + overlayColor: 'rgba(0, 0, 0, 0.6)', + transitionIn: 'fadeInDown', // bounceInLeft, bounceInRight, bounceInUp, bounceInDown, fadeIn, fadeInDown, fadeInUp, fadeInLeft, fadeInRight, flipInX + transitionOut: 'fadeOut', // fadeOut, fadeOutUp, fadeOutDown, fadeOutLeft, fadeOutRight, flipOutX + transitionInMobile: 'bounceInDown', + transitionOutMobile: 'fadeOutUp', + buttons: {}, + inputs: {}, + onOpening: function () { + }, + onOpened: function () { + }, + onClosing: function () { + }, + onClosed: function () { + } + }; + + if (!('remove' in Element.prototype)) { + Element.prototype.remove = function () { + if (this.parentNode) { + this.parentNode.removeChild(this); + } + }; + } + + if (typeof window.CustomEvent !== 'function') { + var CustomEventPolyfill = function (event, params) { + params = params || {bubbles: false, cancelable: false, detail: undefined}; + var evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + }; + + CustomEventPolyfill.prototype = window.Event.prototype; + + window.CustomEvent = CustomEventPolyfill; + } + + var forEach = function (collection, callback, scope) { + if (Object.prototype.toString.call(collection) === '[object Object]') { + for (var prop in collection) { + if (Object.prototype.hasOwnProperty.call(collection, prop)) { + callback.call(scope, collection[prop], prop, collection); + } + } + } else { + if (collection) { + for (var i = 0, len = collection.length; i < len; i++) { + callback.call(scope, collection[i], i, collection); + } + } + } + }; + + var extend = function (defaults, options) { + var extended = {}; + forEach(defaults, function (value, prop) { + extended[prop] = defaults[prop]; + }); + forEach(options, function (value, prop) { + extended[prop] = options[prop]; + }); + return extended; + }; + + var createFragElem = function (htmlStr) { + var frag = document.createDocumentFragment(), + temp = document.createElement('div'); + temp.innerHTML = htmlStr; + while (temp.firstChild) { + frag.appendChild(temp.firstChild); + } + return frag; + }; + + var generateId = function (params) { + var newId = btoa(encodeURIComponent(params)); + return newId.replace(/=/g, ""); + }; + + var isColor = function (color) { + if (color.substring(0, 1) == '#' || color.substring(0, 3) == 'rgb' || color.substring(0, 3) == 'hsl') { + return true; + } else { + return false; + } + }; + + var isBase64 = function (str) { + try { + return btoa(atob(str)) == str; + } catch (err) { + return false; + } + }; + + var drag = function () { + + return { + move: function (toast, instance, settings, xpos) { + + var opacity, + opacityRange = 0.3, + distance = 180; + + if (xpos !== 0) { + + toast.classList.add(PLUGIN_NAME + '-dragged'); + + toast.style.transform = 'translateX(' + xpos + 'px)'; + + if (xpos > 0) { + opacity = (distance - xpos) / distance; + if (opacity < opacityRange) { + instance.hide(extend(settings, { + transitionOut: 'fadeOutRight', + transitionOutMobile: 'fadeOutRight' + }), toast, 'drag'); + } + } else { + opacity = (distance + xpos) / distance; + if (opacity < opacityRange) { + instance.hide(extend(settings, { + transitionOut: 'fadeOutLeft', + transitionOutMobile: 'fadeOutLeft' + }), toast, 'drag'); + } + } + toast.style.opacity = opacity; + + if (opacity < opacityRange) { + + if (ISCHROME || ISFIREFOX) + toast.style.left = xpos + 'px'; + + toast.parentNode.style.opacity = opacityRange; + + this.stopMoving(toast, null); + } + } + + + }, + startMoving: function (toast, instance, settings, e) { + + e = e || window.event; + var posX = ((ACCEPTSTOUCH) ? e.touches[0].clientX : e.clientX), + toastLeft = toast.style.transform.replace('px)', ''); + toastLeft = toastLeft.replace('translateX(', ''); + var offsetX = posX - toastLeft; + + if (settings.transitionIn) { + toast.classList.remove(settings.transitionIn); + } + if (settings.transitionInMobile) { + toast.classList.remove(settings.transitionInMobile); + } + toast.style.transition = ''; + + if (ACCEPTSTOUCH) { + document.ontouchmove = function (e) { + e.preventDefault(); + e = e || window.event; + var posX = e.touches[0].clientX, + finalX = posX - offsetX; + drag.move(toast, instance, settings, finalX); + }; + } else { + document.onmousemove = function (e) { + e.preventDefault(); + e = e || window.event; + var posX = e.clientX, + finalX = posX - offsetX; + drag.move(toast, instance, settings, finalX); + }; + } + + }, + stopMoving: function (toast, e) { + + if (ACCEPTSTOUCH) { + document.ontouchmove = function () { + }; + } else { + document.onmousemove = function () { + }; + } + + toast.style.opacity = ''; + toast.style.transform = ''; + + if (toast.classList.contains(PLUGIN_NAME + '-dragged')) { + + toast.classList.remove(PLUGIN_NAME + '-dragged'); + + toast.style.transition = 'transform 0.4s ease, opacity 0.4s ease'; + setTimeout(function () { + toast.style.transition = ''; + }, 400); + } + + } + }; + + }(); + + $iziToast.setSetting = function (ref, option, value) { + + $iziToast.children[ref][option] = value; + + }; + + $iziToast.getSetting = function (ref, option) { + + return $iziToast.children[ref][option]; + + }; + + $iziToast.destroy = function () { + + forEach(document.querySelectorAll('.' + PLUGIN_NAME + '-overlay'), function (element, index) { + element.remove(); + }); + + forEach(document.querySelectorAll('.' + PLUGIN_NAME + '-wrapper'), function (element, index) { + element.remove(); + }); + + forEach(document.querySelectorAll('.' + PLUGIN_NAME), function (element, index) { + element.remove(); + }); + + this.children = {}; + + // Remove event listeners + document.removeEventListener(PLUGIN_NAME + '-opened', {}, false); + document.removeEventListener(PLUGIN_NAME + '-opening', {}, false); + document.removeEventListener(PLUGIN_NAME + '-closing', {}, false); + document.removeEventListener(PLUGIN_NAME + '-closed', {}, false); + document.removeEventListener('keyup', {}, false); + + // Reset variables + CONFIG = {}; + }; + + /** + * Initialize Plugin + * @public + * @param {Object} options User settings + */ + $iziToast.settings = function (options) { + + // Destroy any existing initializations + $iziToast.destroy(); + + CONFIG = options; + defaults = extend(defaults, options || {}); + }; + + + /** + * Building themes functions. + * @public + * @param {Object} options User settings + */ + forEach(THEMES, function (theme, name) { + + $iziToast[name] = function (options) { + + var settings = extend(CONFIG, options || {}); + settings = extend(theme, settings || {}); + + this.show(settings); + }; + + }); + + + /** + * Do the calculation to move the progress bar + * @private + */ + $iziToast.progress = function (options, $toast, callback) { + + + var that = this, + ref = $toast.getAttribute('data-iziToast-ref'), + settings = extend(this.children[ref], options || {}), + $elem = $toast.querySelector('.' + PLUGIN_NAME + '-progressbar div'); + + return { + start: function () { + + if (typeof settings.time.REMAINING == 'undefined') { + + $toast.classList.remove(PLUGIN_NAME + '-reseted'); + + if ($elem !== null) { + $elem.style.transition = 'width ' + settings.timeout + 'ms ' + settings.progressBarEasing; + $elem.style.width = '0%'; + } + + settings.time.START = new Date().getTime(); + settings.time.END = settings.time.START + settings.timeout; + settings.time.TIMER = setTimeout(function () { + + clearTimeout(settings.time.TIMER); + + if (!$toast.classList.contains(PLUGIN_NAME + '-closing')) { + + that.hide(settings, $toast, 'timeout'); + + if (typeof callback === 'function') { + callback.apply(that); + } + } + + }, settings.timeout); + that.setSetting(ref, 'time', settings.time); + } + }, + pause: function () { + + if (typeof settings.time.START !== 'undefined' && !$toast.classList.contains(PLUGIN_NAME + '-paused') && !$toast.classList.contains(PLUGIN_NAME + '-reseted')) { + + $toast.classList.add(PLUGIN_NAME + '-paused'); + + settings.time.REMAINING = settings.time.END - new Date().getTime(); + + clearTimeout(settings.time.TIMER); + + that.setSetting(ref, 'time', settings.time); + + if ($elem !== null) { + var computedStyle = window.getComputedStyle($elem), + propertyWidth = computedStyle.getPropertyValue('width'); + + $elem.style.transition = 'none'; + $elem.style.width = propertyWidth; + } + + if (typeof callback === 'function') { + setTimeout(function () { + callback.apply(that); + }, 10); + } + } + }, + resume: function () { + + if (typeof settings.time.REMAINING !== 'undefined') { + + $toast.classList.remove(PLUGIN_NAME + '-paused'); + + if ($elem !== null) { + $elem.style.transition = 'width ' + settings.time.REMAINING + 'ms ' + settings.progressBarEasing; + $elem.style.width = '0%'; + } + + settings.time.END = new Date().getTime() + settings.time.REMAINING; + settings.time.TIMER = setTimeout(function () { + + clearTimeout(settings.time.TIMER); + + if (!$toast.classList.contains(PLUGIN_NAME + '-closing')) { + + that.hide(settings, $toast, 'timeout'); + + if (typeof callback === 'function') { + callback.apply(that); + } + } + + + }, settings.time.REMAINING); + + that.setSetting(ref, 'time', settings.time); + } else { + this.start(); + } + }, + reset: function () { + + clearTimeout(settings.time.TIMER); + + delete settings.time.REMAINING; + + that.setSetting(ref, 'time', settings.time); + + $toast.classList.add(PLUGIN_NAME + '-reseted'); + + $toast.classList.remove(PLUGIN_NAME + '-paused'); + + if ($elem !== null) { + $elem.style.transition = 'none'; + $elem.style.width = '100%'; + } + + if (typeof callback === 'function') { + setTimeout(function () { + callback.apply(that); + }, 10); + } + } + }; + + }; + + + /** + * Close the specific Toast + * @public + * @param {Object} options User settings + */ + $iziToast.hide = function (options, $toast, closedBy) { + + if (typeof $toast != 'object') { + $toast = document.querySelector($toast); + } + + var that = this, + settings = extend(this.children[$toast.getAttribute('data-iziToast-ref')], options || {}); + settings.closedBy = closedBy || null; + + delete settings.time.REMAINING; + + $toast.classList.add(PLUGIN_NAME + '-closing'); + + // Overlay + (function () { + + var $overlay = document.querySelector('.' + PLUGIN_NAME + '-overlay'); + if ($overlay !== null) { + var refs = $overlay.getAttribute('data-iziToast-ref'); + refs = refs.split(','); + var index = refs.indexOf(String(settings.ref)); + + if (index !== -1) { + refs.splice(index, 1); + } + $overlay.setAttribute('data-iziToast-ref', refs.join()); + + if (refs.length === 0) { + $overlay.classList.remove('fadeIn'); + $overlay.classList.add('fadeOut'); + setTimeout(function () { + $overlay.remove(); + }, 700); + } + } + + })(); + + if (settings.transitionIn) { + $toast.classList.remove(settings.transitionIn); + } + + if (settings.transitionInMobile) { + $toast.classList.remove(settings.transitionInMobile); + } + + if (ISMOBILE || window.innerWidth <= MOBILEWIDTH) { + if (settings.transitionOutMobile) + $toast.classList.add(settings.transitionOutMobile); + } else { + if (settings.transitionOut) + $toast.classList.add(settings.transitionOut); + } + var H = $toast.parentNode.offsetHeight; + $toast.parentNode.style.height = H + 'px'; + $toast.style.pointerEvents = 'none'; + + if (!ISMOBILE || window.innerWidth > MOBILEWIDTH) { + $toast.parentNode.style.transitionDelay = '0.2s'; + } + + try { + var event = new CustomEvent(PLUGIN_NAME + '-closing', {detail: settings, bubbles: true, cancelable: true}); + document.dispatchEvent(event); + } catch (ex) { + console.warn(ex); + } + + setTimeout(function () { + + $toast.parentNode.style.height = '0px'; + $toast.parentNode.style.overflow = ''; + + setTimeout(function () { + + delete that.children[settings.ref]; + + $toast.parentNode.remove(); + + try { + var event = new CustomEvent(PLUGIN_NAME + '-closed', { + detail: settings, + bubbles: true, + cancelable: true + }); + document.dispatchEvent(event); + } catch (ex) { + console.warn(ex); + } + + if (typeof settings.onClosed !== 'undefined') { + settings.onClosed.apply(null, [settings, $toast, closedBy]); + } + + }, 1000); + }, 200); + + + if (typeof settings.onClosing !== 'undefined') { + settings.onClosing.apply(null, [settings, $toast, closedBy]); + } + }; + + /** + * Create and show the Toast + * @public + * @param {Object} options User settings + */ + $iziToast.show = function (options) { + + var that = this; + + // Merge user options with defaults + var settings = extend(CONFIG, options || {}); + settings = extend(defaults, settings); + settings.time = {}; + + if (settings.id === null) { + settings.id = generateId(settings.title + settings.message + settings.color); + } + + if (settings.displayMode === 1 || settings.displayMode == 'once') { + try { + if (document.querySelectorAll('.' + PLUGIN_NAME + '#' + settings.id).length > 0) { + return false; + } + } catch (exc) { + console.warn('[' + PLUGIN_NAME + '] Could not find an element with this selector: ' + '#' + settings.id + '. Try to set an valid id.'); + } + } + + if (settings.displayMode === 2 || settings.displayMode == 'replace') { + try { + forEach(document.querySelectorAll('.' + PLUGIN_NAME + '#' + settings.id), function (element, index) { + that.hide(settings, element, 'replaced'); + }); + } catch (exc) { + console.warn('[' + PLUGIN_NAME + '] Could not find an element with this selector: ' + '#' + settings.id + '. Try to set an valid id.'); + } + } + + settings.ref = new Date().getTime() + Math.floor((Math.random() * 10000000) + 1); + + $iziToast.children[settings.ref] = settings; + + var $DOM = { + body: document.querySelector('body'), + overlay: document.createElement('div'), + toast: document.createElement('div'), + toastBody: document.createElement('div'), + toastTexts: document.createElement('div'), + toastCapsule: document.createElement('div'), + cover: document.createElement('div'), + buttons: document.createElement('div'), + inputs: document.createElement('div'), + icon: !settings.iconUrl ? document.createElement('i') : document.createElement('img'), + wrapper: null + }; + + $DOM.toast.setAttribute('data-iziToast-ref', settings.ref); + $DOM.toast.appendChild($DOM.toastBody); + $DOM.toastCapsule.appendChild($DOM.toast); + + // CSS Settings + (function () { + + $DOM.toast.classList.add(PLUGIN_NAME); + $DOM.toast.classList.add(PLUGIN_NAME + '-opening'); + $DOM.toastCapsule.classList.add(PLUGIN_NAME + '-capsule'); + $DOM.toastBody.classList.add(PLUGIN_NAME + '-body'); + $DOM.toastTexts.classList.add(PLUGIN_NAME + '-texts'); + + if (ISMOBILE || window.innerWidth <= MOBILEWIDTH) { + if (settings.transitionInMobile) + $DOM.toast.classList.add(settings.transitionInMobile); + } else { + if (settings.transitionIn) + $DOM.toast.classList.add(settings.transitionIn); + } + + if (settings.class) { + var classes = settings.class.split(' '); + forEach(classes, function (value, index) { + $DOM.toast.classList.add(value); + }); + } + + if (settings.id) { + $DOM.toast.id = settings.id; + } + + if (settings.rtl) { + $DOM.toast.classList.add(PLUGIN_NAME + '-rtl'); + $DOM.toast.setAttribute('dir', 'rtl'); + } + + if (settings.layout > 1) { + $DOM.toast.classList.add(PLUGIN_NAME + '-layout' + settings.layout); + } + + if (settings.balloon) { + $DOM.toast.classList.add(PLUGIN_NAME + '-balloon'); + } + + if (settings.maxWidth) { + if (!isNaN(settings.maxWidth)) { + $DOM.toast.style.maxWidth = settings.maxWidth + 'px'; + } else { + $DOM.toast.style.maxWidth = settings.maxWidth; + } + } + + if (settings.theme !== '' || settings.theme !== 'light') { + + $DOM.toast.classList.add(PLUGIN_NAME + '-theme-' + settings.theme); + } + + if (settings.color) { //#, rgb, rgba, hsl + + if (isColor(settings.color)) { + $DOM.toast.style.background = settings.color; + } else { + $DOM.toast.classList.add(PLUGIN_NAME + '-color-' + settings.color); + } + } + + if (settings.backgroundColor) { + $DOM.toast.style.background = settings.backgroundColor; + if (settings.balloon) { + $DOM.toast.style.borderColor = settings.backgroundColor; + } + } + })(); + + // Cover image + (function () { + if (settings.image) { + $DOM.cover.classList.add(PLUGIN_NAME + '-cover'); + $DOM.cover.style.width = settings.imageWidth + 'px'; + + if (isBase64(settings.image.replace(/ /g, ''))) { + $DOM.cover.style.backgroundImage = 'url(data:image/png;base64,' + settings.image.replace(/ /g, '') + ')'; + } else { + $DOM.cover.style.backgroundImage = 'url(' + settings.image + ')'; + } + + if (settings.rtl) { + $DOM.toastBody.style.marginRight = (settings.imageWidth + 10) + 'px'; + } else { + $DOM.toastBody.style.marginLeft = (settings.imageWidth + 10) + 'px'; + } + $DOM.toast.appendChild($DOM.cover); + } + })(); + + // Button close + (function () { + if (settings.close) { + + $DOM.buttonClose = document.createElement('button'); + $DOM.buttonClose.type = 'button'; + $DOM.buttonClose.classList.add(PLUGIN_NAME + '-close'); + $DOM.buttonClose.addEventListener('click', function (e) { + var button = e.target; + that.hide(settings, $DOM.toast, 'button'); + }); + $DOM.toast.appendChild($DOM.buttonClose); + } else { + if (settings.rtl) { + $DOM.toast.style.paddingLeft = '18px'; + } else { + $DOM.toast.style.paddingRight = '18px'; + } + } + })(); + + // Progress Bar & Timeout + (function () { + + if (settings.progressBar) { + $DOM.progressBar = document.createElement('div'); + $DOM.progressBarDiv = document.createElement('div'); + $DOM.progressBar.classList.add(PLUGIN_NAME + '-progressbar'); + $DOM.progressBarDiv.style.background = settings.progressBarColor; + $DOM.progressBar.appendChild($DOM.progressBarDiv); + $DOM.toast.appendChild($DOM.progressBar); + } + + if (settings.timeout) { + + if (settings.pauseOnHover && !settings.resetOnHover) { + + $DOM.toast.addEventListener('mouseenter', function (e) { + that.progress(settings, $DOM.toast).pause(); + }); + $DOM.toast.addEventListener('mouseleave', function (e) { + that.progress(settings, $DOM.toast).resume(); + }); + } + + if (settings.resetOnHover) { + + $DOM.toast.addEventListener('mouseenter', function (e) { + that.progress(settings, $DOM.toast).reset(); + }); + $DOM.toast.addEventListener('mouseleave', function (e) { + that.progress(settings, $DOM.toast).start(); + }); + } + } + })(); + + // Icon + (function () { + + if (settings.iconUrl) { + + $DOM.icon.setAttribute('class', PLUGIN_NAME + '-icon'); + $DOM.icon.setAttribute('src', settings.iconUrl); + + } else if (settings.icon) { + $DOM.icon.setAttribute('class', PLUGIN_NAME + '-icon ' + settings.icon); + + if (settings.iconText) { + $DOM.icon.appendChild(document.createTextNode(settings.iconText)); + } + + if (settings.iconColor) { + $DOM.icon.style.color = settings.iconColor; + } + } + + if (settings.icon || settings.iconUrl) { + + if (settings.rtl) { + $DOM.toastBody.style.paddingRight = '33px'; + } else { + $DOM.toastBody.style.paddingLeft = '33px'; + } + + $DOM.toastBody.appendChild($DOM.icon); + } + + })(); + + // Title & Message + (function () { + if (settings.title.length > 0) { + + $DOM.strong = document.createElement('strong'); + $DOM.strong.classList.add(PLUGIN_NAME + '-title'); + $DOM.strong.appendChild(createFragElem(settings.title)); + $DOM.toastTexts.appendChild($DOM.strong); + + if (settings.titleColor) { + $DOM.strong.style.color = settings.titleColor; + } + if (settings.titleSize) { + if (!isNaN(settings.titleSize)) { + $DOM.strong.style.fontSize = settings.titleSize + 'px'; + } else { + $DOM.strong.style.fontSize = settings.titleSize; + } + } + if (settings.titleLineHeight) { + if (!isNaN(settings.titleSize)) { + $DOM.strong.style.lineHeight = settings.titleLineHeight + 'px'; + } else { + $DOM.strong.style.lineHeight = settings.titleLineHeight; + } + } + } + + if (settings.message.length > 0) { + + $DOM.p = document.createElement('p'); + $DOM.p.classList.add(PLUGIN_NAME + '-message'); + $DOM.p.appendChild(createFragElem(settings.message)); + $DOM.toastTexts.appendChild($DOM.p); + + if (settings.messageColor) { + $DOM.p.style.color = settings.messageColor; + } + if (settings.messageSize) { + if (!isNaN(settings.titleSize)) { + $DOM.p.style.fontSize = settings.messageSize + 'px'; + } else { + $DOM.p.style.fontSize = settings.messageSize; + } + } + if (settings.messageLineHeight) { + + if (!isNaN(settings.titleSize)) { + $DOM.p.style.lineHeight = settings.messageLineHeight + 'px'; + } else { + $DOM.p.style.lineHeight = settings.messageLineHeight; + } + } + } + + if (settings.title.length > 0 && settings.message.length > 0) { + if (settings.rtl) { + $DOM.strong.style.marginLeft = '10px'; + } else if (settings.layout !== 2 && !settings.rtl) { + $DOM.strong.style.marginRight = '10px'; + } + } + })(); + + $DOM.toastBody.appendChild($DOM.toastTexts); + + // Inputs + var $inputs; + (function () { + if (settings.inputs.length > 0) { + + $DOM.inputs.classList.add(PLUGIN_NAME + '-inputs'); + + forEach(settings.inputs, function (value, index) { + $DOM.inputs.appendChild(createFragElem(value[0])); + + $inputs = $DOM.inputs.childNodes; + + $inputs[index].classList.add(PLUGIN_NAME + '-inputs-child'); + + if (value[3]) { + setTimeout(function () { + $inputs[index].focus(); + }, 300); + } + + $inputs[index].addEventListener(value[1], function (e) { + var ts = value[2]; + return ts(that, $DOM.toast, this, e); + }); + }); + $DOM.toastBody.appendChild($DOM.inputs); + } + })(); + + // Buttons + (function () { + if (settings.buttons.length > 0) { + + $DOM.buttons.classList.add(PLUGIN_NAME + '-buttons'); + + forEach(settings.buttons, function (value, index) { + $DOM.buttons.appendChild(createFragElem(value[0])); + + var $btns = $DOM.buttons.childNodes; + + $btns[index].classList.add(PLUGIN_NAME + '-buttons-child'); + + if (value[2]) { + setTimeout(function () { + $btns[index].focus(); + }, 300); + } + + $btns[index].addEventListener('click', function (e) { + e.preventDefault(); + var ts = value[1]; + return ts(that, $DOM.toast, this, e, $inputs); + }); + }); + } + $DOM.toastBody.appendChild($DOM.buttons); + })(); + + if (settings.message.length > 0 && (settings.inputs.length > 0 || settings.buttons.length > 0)) { + $DOM.p.style.marginBottom = '0'; + } + + if (settings.inputs.length > 0 || settings.buttons.length > 0) { + if (settings.rtl) { + $DOM.toastTexts.style.marginLeft = '10px'; + } else { + $DOM.toastTexts.style.marginRight = '10px'; + } + if (settings.inputs.length > 0 && settings.buttons.length > 0) { + if (settings.rtl) { + $DOM.inputs.style.marginLeft = '8px'; + } else { + $DOM.inputs.style.marginRight = '8px'; + } + } + } + + // Wrap + (function () { + $DOM.toastCapsule.style.visibility = 'hidden'; + setTimeout(function () { + var H = $DOM.toast.offsetHeight; + var style = $DOM.toast.currentStyle || window.getComputedStyle($DOM.toast); + var marginTop = style.marginTop; + marginTop = marginTop.split('px'); + marginTop = parseInt(marginTop[0]); + var marginBottom = style.marginBottom; + marginBottom = marginBottom.split('px'); + marginBottom = parseInt(marginBottom[0]); + + $DOM.toastCapsule.style.visibility = ''; + $DOM.toastCapsule.style.height = (H + marginBottom + marginTop) + 'px'; + + setTimeout(function () { + $DOM.toastCapsule.style.height = 'auto'; + if (settings.target) { + $DOM.toastCapsule.style.overflow = 'visible'; + } + }, 500); + + if (settings.timeout) { + that.progress(settings, $DOM.toast).start(); + } + }, 100); + })(); + + // Target + (function () { + var position = settings.position; + + if (settings.target) { + + $DOM.wrapper = document.querySelector(settings.target); + $DOM.wrapper.classList.add(PLUGIN_NAME + '-target'); + + if (settings.targetFirst) { + $DOM.wrapper.insertBefore($DOM.toastCapsule, $DOM.wrapper.firstChild); + } else { + $DOM.wrapper.appendChild($DOM.toastCapsule); + } + + } else { + + if (POSITIONS.indexOf(settings.position) == -1) { + console.warn('[' + PLUGIN_NAME + '] Incorrect position.\nIt can be › ' + POSITIONS); + return; + } + + if (ISMOBILE || window.innerWidth <= MOBILEWIDTH) { + if (settings.position == 'bottomLeft' || settings.position == 'bottomRight' || settings.position == 'bottomCenter') { + position = PLUGIN_NAME + '-wrapper-bottomCenter'; + } else if (settings.position == 'topLeft' || settings.position == 'topRight' || settings.position == 'topCenter') { + position = PLUGIN_NAME + '-wrapper-topCenter'; + } else { + position = PLUGIN_NAME + '-wrapper-center'; + } + } else { + position = PLUGIN_NAME + '-wrapper-' + position; + } + $DOM.wrapper = document.querySelector('.' + PLUGIN_NAME + '-wrapper.' + position); + + if (!$DOM.wrapper) { + $DOM.wrapper = document.createElement('div'); + $DOM.wrapper.classList.add(PLUGIN_NAME + '-wrapper'); + $DOM.wrapper.classList.add(position); + document.body.appendChild($DOM.wrapper); + } + if (settings.position == 'topLeft' || settings.position == 'topCenter' || settings.position == 'topRight') { + $DOM.wrapper.insertBefore($DOM.toastCapsule, $DOM.wrapper.firstChild); + } else { + $DOM.wrapper.appendChild($DOM.toastCapsule); + } + } + + if (!isNaN(settings.zindex)) { + $DOM.wrapper.style.zIndex = settings.zindex; + } else { + console.warn('[' + PLUGIN_NAME + '] Invalid zIndex.'); + } + })(); + + // Overlay + (function () { + + if (settings.overlay) { + + if (document.querySelector('.' + PLUGIN_NAME + '-overlay.fadeIn') !== null) { + + $DOM.overlay = document.querySelector('.' + PLUGIN_NAME + '-overlay'); + $DOM.overlay.setAttribute('data-iziToast-ref', $DOM.overlay.getAttribute('data-iziToast-ref') + ',' + settings.ref); + + if (!isNaN(settings.zindex) && settings.zindex !== null) { + $DOM.overlay.style.zIndex = settings.zindex - 1; + } + + } else { + + $DOM.overlay.classList.add(PLUGIN_NAME + '-overlay'); + $DOM.overlay.classList.add('fadeIn'); + $DOM.overlay.style.background = settings.overlayColor; + $DOM.overlay.setAttribute('data-iziToast-ref', settings.ref); + if (!isNaN(settings.zindex) && settings.zindex !== null) { + $DOM.overlay.style.zIndex = settings.zindex - 1; + } + document.querySelector('body').appendChild($DOM.overlay); + } + + if (settings.overlayClose) { + + $DOM.overlay.removeEventListener('click', {}); + $DOM.overlay.addEventListener('click', function (e) { + that.hide(settings, $DOM.toast, 'overlay'); + }); + } else { + $DOM.overlay.removeEventListener('click', {}); + } + } + })(); + + // Inside animations + (function () { + if (settings.animateInside) { + $DOM.toast.classList.add(PLUGIN_NAME + '-animateInside'); + + var animationTimes = [200, 100, 300]; + if (settings.transitionIn == 'bounceInLeft' || settings.transitionIn == 'bounceInRight') { + animationTimes = [400, 200, 400]; + } + + if (settings.title.length > 0) { + setTimeout(function () { + $DOM.strong.classList.add('slideIn'); + }, animationTimes[0]); + } + + if (settings.message.length > 0) { + setTimeout(function () { + $DOM.p.classList.add('slideIn'); + }, animationTimes[1]); + } + + if (settings.icon || settings.iconUrl) { + setTimeout(function () { + $DOM.icon.classList.add('revealIn'); + }, animationTimes[2]); + } + + var counter = 150; + if (settings.buttons.length > 0 && $DOM.buttons) { + + setTimeout(function () { + + forEach($DOM.buttons.childNodes, function (element, index) { + + setTimeout(function () { + element.classList.add('revealIn'); + }, counter); + counter = counter + 150; + }); + + }, settings.inputs.length > 0 ? 150 : 0); + } + + if (settings.inputs.length > 0 && $DOM.inputs) { + counter = 150; + forEach($DOM.inputs.childNodes, function (element, index) { + + setTimeout(function () { + element.classList.add('revealIn'); + }, counter); + counter = counter + 150; + }); + } + } + })(); + + settings.onOpening.apply(null, [settings, $DOM.toast]); + + try { + var event = new CustomEvent(PLUGIN_NAME + '-opening', {detail: settings, bubbles: true, cancelable: true}); + document.dispatchEvent(event); + } catch (ex) { + console.warn(ex); + } + + setTimeout(function () { + + $DOM.toast.classList.remove(PLUGIN_NAME + '-opening'); + $DOM.toast.classList.add(PLUGIN_NAME + '-opened'); + + try { + var event = new CustomEvent(PLUGIN_NAME + '-opened', { + detail: settings, + bubbles: true, + cancelable: true + }); + document.dispatchEvent(event); + } catch (ex) { + console.warn(ex); + } + + settings.onOpened.apply(null, [settings, $DOM.toast]); + }, 1000); + + if (settings.drag) { + + if (ACCEPTSTOUCH) { + + $DOM.toast.addEventListener('touchstart', function (e) { + drag.startMoving(this, that, settings, e); + }, false); + + $DOM.toast.addEventListener('touchend', function (e) { + drag.stopMoving(this, e); + }, false); + } else { + + $DOM.toast.addEventListener('mousedown', function (e) { + e.preventDefault(); + drag.startMoving(this, that, settings, e); + }, false); + + $DOM.toast.addEventListener('mouseup', function (e) { + e.preventDefault(); + drag.stopMoving(this, e); + }, false); + } + } + + if (settings.closeOnEscape) { + + document.addEventListener('keyup', function (evt) { + evt = evt || window.event; + if (evt.keyCode == 27) { + that.hide(settings, $DOM.toast, 'esc'); + } + }); + } + + if (settings.closeOnClick) { + $DOM.toast.addEventListener('click', function (evt) { + that.hide(settings, $DOM.toast, 'toast'); + }); + } + + that.toast = $DOM.toast; + }; + return $iziToast; +}); \ No newline at end of file diff --git a/static/component/pear/module/extends/yaml.js b/static/component/pear/module/extends/yaml.js new file mode 100644 index 0000000..c704608 --- /dev/null +++ b/static/component/pear/module/extends/yaml.js @@ -0,0 +1,2072 @@ +layui.define(['jquery', 'element'], function (exports) { + "use strict"; + + var MOD_NAME = 'yaml'; + + var yaml = new function () { + this.parse = function (yamlStr) { + return YAML.parse(yamlStr); + } + this.load = function (path) { + return YAML.load(path); + } + } + exports(MOD_NAME, yaml); +}); + + +(function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = "function" == typeof require && require; + if (!f && c) return c(i, !0); + if (u) return u(i, !0); + var a = new Error("Cannot find module '" + i + "'"); + throw a.code = "MODULE_NOT_FOUND", a + } + var p = n[i] = { + exports: {} + }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r) + }, p, p.exports, r, e, n, t) + } + return n[i].exports + } + + for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) o(t[i]); + return o + } + + return r +})()({ + 1: [function (require, module, exports) { + var Dumper, Inline, Utils; + + Utils = require('./Utils'); + + Inline = require('./Inline'); + + Dumper = (function () { + function Dumper() { + } + + Dumper.indentation = 4; + + Dumper.prototype.dump = function (input, inline, indent, exceptionOnInvalidType, objectEncoder) { + var i, key, len, output, prefix, value, willBeInlined; + if (inline == null) { + inline = 0; + } + if (indent == null) { + indent = 0; + } + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectEncoder == null) { + objectEncoder = null; + } + output = ''; + if (typeof input === 'function') { + return output; + } + prefix = (indent ? Utils.strRepeat(' ', indent) : ''); + if (inline <= 0 || typeof input !== 'object' || input instanceof Date || Utils.isEmpty(input)) { + output += prefix + Inline.dump(input, exceptionOnInvalidType, objectEncoder); + } else { + if (input instanceof Array) { + for (i = 0, len = input.length; i < len; i++) { + value = input[i]; + willBeInlined = inline - 1 <= 0 || typeof value !== 'object' || Utils.isEmpty(value); + output += prefix + '-' + (willBeInlined ? ' ' : "\n") + this.dump(value, inline - 1, (willBeInlined ? 0 : + indent + this.indentation), exceptionOnInvalidType, objectEncoder) + (willBeInlined ? "\n" : ''); + } + } else { + for (key in input) { + value = input[key]; + willBeInlined = inline - 1 <= 0 || typeof value !== 'object' || Utils.isEmpty(value); + output += prefix + Inline.dump(key, exceptionOnInvalidType, objectEncoder) + ':' + (willBeInlined ? ' ' : + "\n") + this.dump(value, inline - 1, (willBeInlined ? 0 : indent + this.indentation), + exceptionOnInvalidType, objectEncoder) + (willBeInlined ? "\n" : ''); + } + } + } + return output; + }; + + return Dumper; + + })(); + + module.exports = Dumper; + + + }, { + "./Inline": 6, + "./Utils": 10 + }], + 2: [function (require, module, exports) { + var Escaper, Pattern; + + Pattern = require('./Pattern'); + + Escaper = (function () { + var ch; + + function Escaper() { + } + + Escaper.LIST_ESCAPEES = ['\\', '\\\\', '\\"', '"', "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", + "\x07", "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f", "\x10", "\x11", "\x12", "\x13", + "\x14", "\x15", "\x16", "\x17", "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", (ch = String.fromCharCode) + (0x0085), ch(0x00A0), ch(0x2028), ch(0x2029) + ]; + + Escaper.LIST_ESCAPED = ['\\\\', '\\"', '\\"', '\\"', "\\0", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", + "\\x06", "\\a", "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", "\\x10", "\\x11", "\\x12", + "\\x13", "\\x14", "\\x15", "\\x16", "\\x17", "\\x18", "\\x19", "\\x1a", "\\e", "\\x1c", "\\x1d", "\\x1e", + "\\x1f", "\\N", "\\_", "\\L", "\\P" + ]; + + Escaper.MAPPING_ESCAPEES_TO_ESCAPED = (function () { + var i, j, mapping, ref; + mapping = {}; + for (i = j = 0, ref = Escaper.LIST_ESCAPEES.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { + mapping[Escaper.LIST_ESCAPEES[i]] = Escaper.LIST_ESCAPED[i]; + } + return mapping; + })(); + + Escaper.PATTERN_CHARACTERS_TO_ESCAPE = new Pattern('[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9'); + + Escaper.PATTERN_MAPPING_ESCAPEES = new Pattern(Escaper.LIST_ESCAPEES.join('|').split('\\').join('\\\\')); + + Escaper.PATTERN_SINGLE_QUOTING = new Pattern('[\\s\'":{}[\\],&*#?]|^[-?|<>=!%@`]'); + + Escaper.requiresDoubleQuoting = function (value) { + return this.PATTERN_CHARACTERS_TO_ESCAPE.test(value); + }; + + Escaper.escapeWithDoubleQuotes = function (value) { + var result; + result = this.PATTERN_MAPPING_ESCAPEES.replace(value, (function (_this) { + return function (str) { + return _this.MAPPING_ESCAPEES_TO_ESCAPED[str]; + }; + })(this)); + return '"' + result + '"'; + }; + + Escaper.requiresSingleQuoting = function (value) { + return this.PATTERN_SINGLE_QUOTING.test(value); + }; + + Escaper.escapeWithSingleQuotes = function (value) { + return "'" + value.replace(/'/g, "''") + "'"; + }; + + return Escaper; + + })(); + + module.exports = Escaper; + + + }, { + "./Pattern": 8 + }], + 3: [function (require, module, exports) { + var DumpException, + extend = function (child, parent) { + for (var key in parent) { + if (hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }, + hasProp = {}.hasOwnProperty; + + DumpException = (function (superClass) { + extend(DumpException, superClass); + + function DumpException(message, parsedLine, snippet) { + DumpException.__super__.constructor.call(this, message); + this.message = message; + this.parsedLine = parsedLine; + this.snippet = snippet; + } + + DumpException.prototype.toString = function () { + if ((this.parsedLine != null) && (this.snippet != null)) { + return ' ' + this.message + ' (line ' + this.parsedLine + ': \'' + this.snippet + '\')'; + } else { + return ' ' + this.message; + } + }; + + return DumpException; + + })(Error); + + module.exports = DumpException; + + + }, {}], + 4: [function (require, module, exports) { + var ParseException, + extend = function (child, parent) { + for (var key in parent) { + if (hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }, + hasProp = {}.hasOwnProperty; + + ParseException = (function (superClass) { + extend(ParseException, superClass); + + function ParseException(message, parsedLine, snippet) { + ParseException.__super__.constructor.call(this, message); + this.message = message; + this.parsedLine = parsedLine; + this.snippet = snippet; + } + + ParseException.prototype.toString = function () { + if ((this.parsedLine != null) && (this.snippet != null)) { + return ' ' + this.message + ' (line ' + this.parsedLine + ': \'' + this.snippet + '\')'; + } else { + return ' ' + this.message; + } + }; + + return ParseException; + + })(Error); + + module.exports = ParseException; + + + }, {}], + 5: [function (require, module, exports) { + var ParseMore, + extend = function (child, parent) { + for (var key in parent) { + if (hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }, + hasProp = {}.hasOwnProperty; + + ParseMore = (function (superClass) { + extend(ParseMore, superClass); + + function ParseMore(message, parsedLine, snippet) { + ParseMore.__super__.constructor.call(this, message); + this.message = message; + this.parsedLine = parsedLine; + this.snippet = snippet; + } + + ParseMore.prototype.toString = function () { + if ((this.parsedLine != null) && (this.snippet != null)) { + return ' ' + this.message + ' (line ' + this.parsedLine + ': \'' + this.snippet + '\')'; + } else { + return ' ' + this.message; + } + }; + + return ParseMore; + + })(Error); + + module.exports = ParseMore; + + + }, {}], + 6: [function (require, module, exports) { + var DumpException, Escaper, Inline, ParseException, ParseMore, Pattern, Unescaper, Utils, + indexOf = [].indexOf || function (item) { + for (var i = 0, l = this.length; i < l; i++) { + if (i in this && this[i] === item) return i; + } + return -1; + }; + + Pattern = require('./Pattern'); + + Unescaper = require('./Unescaper'); + + Escaper = require('./Escaper'); + + Utils = require('./Utils'); + + ParseException = require('./Exception/ParseException'); + + ParseMore = require('./Exception/ParseMore'); + + DumpException = require('./Exception/DumpException'); + + Inline = (function () { + function Inline() { + } + + Inline.REGEX_QUOTED_STRING = '(?:"(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\']*(?:\'\'[^\']*)*)\')'; + + Inline.PATTERN_TRAILING_COMMENTS = new Pattern('^\\s*#.*$'); + + Inline.PATTERN_QUOTED_SCALAR = new Pattern('^' + Inline.REGEX_QUOTED_STRING); + + Inline.PATTERN_THOUSAND_NUMERIC_SCALAR = new Pattern('^(-|\\+)?[0-9,]+(\\.[0-9]+)?$'); + + Inline.PATTERN_SCALAR_BY_DELIMITERS = {}; + + Inline.settings = {}; + + Inline.configure = function (exceptionOnInvalidType, objectDecoder) { + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = null; + } + if (objectDecoder == null) { + objectDecoder = null; + } + this.settings.exceptionOnInvalidType = exceptionOnInvalidType; + this.settings.objectDecoder = objectDecoder; + }; + + Inline.parse = function (value, exceptionOnInvalidType, objectDecoder) { + var context, result; + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectDecoder == null) { + objectDecoder = null; + } + this.settings.exceptionOnInvalidType = exceptionOnInvalidType; + this.settings.objectDecoder = objectDecoder; + if (value == null) { + return ''; + } + value = Utils.trim(value); + if (0 === value.length) { + return ''; + } + context = { + exceptionOnInvalidType: exceptionOnInvalidType, + objectDecoder: objectDecoder, + i: 0 + }; + switch (value.charAt(0)) { + case '[': + result = this.parseSequence(value, context); + ++context.i; + break; + case '{': + result = this.parseMapping(value, context); + ++context.i; + break; + default: + result = this.parseScalar(value, null, ['"', "'"], context); + } + if (this.PATTERN_TRAILING_COMMENTS.replace(value.slice(context.i), '') !== '') { + throw new ParseException('Unexpected characters near "' + value.slice(context.i) + '".'); + } + return result; + }; + + Inline.dump = function (value, exceptionOnInvalidType, objectEncoder) { + var ref, result, type; + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectEncoder == null) { + objectEncoder = null; + } + if (value == null) { + return 'null'; + } + type = typeof value; + if (type === 'object') { + if (value instanceof Date) { + return value.toISOString(); + } else if (objectEncoder != null) { + result = objectEncoder(value); + if (typeof result === 'string' || (result != null)) { + return result; + } + } + return this.dumpObject(value); + } + if (type === 'boolean') { + return (value ? 'true' : 'false'); + } + if (Utils.isDigits(value)) { + return (type === 'string' ? "'" + value + "'" : String(parseInt(value))); + } + if (Utils.isNumeric(value)) { + return (type === 'string' ? "'" + value + "'" : String(parseFloat(value))); + } + if (type === 'number') { + return (value === Infinity ? '.Inf' : (value === -Infinity ? '-.Inf' : (isNaN(value) ? '.NaN' : value))); + } + if (Escaper.requiresDoubleQuoting(value)) { + return Escaper.escapeWithDoubleQuotes(value); + } + if (Escaper.requiresSingleQuoting(value)) { + return Escaper.escapeWithSingleQuotes(value); + } + if ('' === value) { + return '""'; + } + if (Utils.PATTERN_DATE.test(value)) { + return "'" + value + "'"; + } + if ((ref = value.toLowerCase()) === 'null' || ref === '~' || ref === 'true' || ref === 'false') { + return "'" + value + "'"; + } + return value; + }; + + Inline.dumpObject = function (value, exceptionOnInvalidType, objectSupport) { + var j, key, len1, output, val; + if (objectSupport == null) { + objectSupport = null; + } + if (value instanceof Array) { + output = []; + for (j = 0, len1 = value.length; j < len1; j++) { + val = value[j]; + output.push(this.dump(val)); + } + return '[' + output.join(', ') + ']'; + } else { + output = []; + for (key in value) { + val = value[key]; + output.push(this.dump(key) + ': ' + this.dump(val)); + } + return '{' + output.join(', ') + '}'; + } + }; + + Inline.parseScalar = function (scalar, delimiters, stringDelimiters, context, evaluate) { + var i, joinedDelimiters, match, output, pattern, ref, ref1, strpos, tmp; + if (delimiters == null) { + delimiters = null; + } + if (stringDelimiters == null) { + stringDelimiters = ['"', "'"]; + } + if (context == null) { + context = null; + } + if (evaluate == null) { + evaluate = true; + } + if (context == null) { + context = { + exceptionOnInvalidType: this.settings.exceptionOnInvalidType, + objectDecoder: this.settings.objectDecoder, + i: 0 + }; + } + i = context.i; + if (ref = scalar.charAt(i), indexOf.call(stringDelimiters, ref) >= 0) { + output = this.parseQuotedScalar(scalar, context); + i = context.i; + if (delimiters != null) { + tmp = Utils.ltrim(scalar.slice(i), ' '); + if (!(ref1 = tmp.charAt(0), indexOf.call(delimiters, ref1) >= 0)) { + throw new ParseException('Unexpected characters (' + scalar.slice(i) + ').'); + } + } + } else { + if (!delimiters) { + output = scalar.slice(i); + i += output.length; + strpos = output.indexOf(' #'); + if (strpos !== -1) { + output = Utils.rtrim(output.slice(0, strpos)); + } + } else { + joinedDelimiters = delimiters.join('|'); + pattern = this.PATTERN_SCALAR_BY_DELIMITERS[joinedDelimiters]; + if (pattern == null) { + pattern = new Pattern('^(.+?)(' + joinedDelimiters + ')'); + this.PATTERN_SCALAR_BY_DELIMITERS[joinedDelimiters] = pattern; + } + if (match = pattern.exec(scalar.slice(i))) { + output = match[1]; + i += output.length; + } else { + throw new ParseException('Malformed inline YAML string (' + scalar + ').'); + } + } + if (evaluate) { + output = this.evaluateScalar(output, context); + } + } + context.i = i; + return output; + }; + + Inline.parseQuotedScalar = function (scalar, context) { + var i, match, output; + i = context.i; + if (!(match = this.PATTERN_QUOTED_SCALAR.exec(scalar.slice(i)))) { + throw new ParseMore('Malformed inline YAML string (' + scalar.slice(i) + ').'); + } + output = match[0].substr(1, match[0].length - 2); + if ('"' === scalar.charAt(i)) { + output = Unescaper.unescapeDoubleQuotedString(output); + } else { + output = Unescaper.unescapeSingleQuotedString(output); + } + i += match[0].length; + context.i = i; + return output; + }; + + Inline.parseSequence = function (sequence, context) { + var e, error, i, isQuoted, len, output, ref, value; + output = []; + len = sequence.length; + i = context.i; + i += 1; + while (i < len) { + context.i = i; + switch (sequence.charAt(i)) { + case '[': + output.push(this.parseSequence(sequence, context)); + i = context.i; + break; + case '{': + output.push(this.parseMapping(sequence, context)); + i = context.i; + break; + case ']': + return output; + case ',': + case ' ': + case "\n": + break; + default: + isQuoted = ((ref = sequence.charAt(i)) === '"' || ref === "'"); + value = this.parseScalar(sequence, [',', ']'], ['"', "'"], context); + i = context.i; + if (!isQuoted && typeof value === 'string' && (value.indexOf(': ') !== -1 || value.indexOf(":\n") !== -1)) { + try { + value = this.parseMapping('{' + value + '}'); + } catch (error) { + e = error; + } + } + output.push(value); + --i; + } + ++i; + } + throw new ParseMore('Malformed inline YAML string ' + sequence); + }; + + Inline.parseMapping = function (mapping, context) { + var done, i, key, len, output, shouldContinueWhileLoop, value; + output = {}; + len = mapping.length; + i = context.i; + i += 1; + shouldContinueWhileLoop = false; + while (i < len) { + context.i = i; + switch (mapping.charAt(i)) { + case ' ': + case ',': + case "\n": + ++i; + context.i = i; + shouldContinueWhileLoop = true; + break; + case '}': + return output; + } + if (shouldContinueWhileLoop) { + shouldContinueWhileLoop = false; + continue; + } + key = this.parseScalar(mapping, [':', ' ', "\n"], ['"', "'"], context, false); + i = context.i; + done = false; + while (i < len) { + context.i = i; + switch (mapping.charAt(i)) { + case '[': + value = this.parseSequence(mapping, context); + i = context.i; + if (output[key] === void 0) { + output[key] = value; + } + done = true; + break; + case '{': + value = this.parseMapping(mapping, context); + i = context.i; + if (output[key] === void 0) { + output[key] = value; + } + done = true; + break; + case ':': + case ' ': + case "\n": + break; + default: + value = this.parseScalar(mapping, [',', '}'], ['"', "'"], context); + i = context.i; + if (output[key] === void 0) { + output[key] = value; + } + done = true; + --i; + } + ++i; + if (done) { + break; + } + } + } + throw new ParseMore('Malformed inline YAML string ' + mapping); + }; + + Inline.evaluateScalar = function (scalar, context) { + var cast, date, exceptionOnInvalidType, firstChar, firstSpace, firstWord, objectDecoder, raw, + scalarLower, + subValue, trimmedScalar; + scalar = Utils.trim(scalar); + scalarLower = scalar.toLowerCase(); + switch (scalarLower) { + case 'null': + case '': + case '~': + return null; + case 'true': + return true; + case 'false': + return false; + case '.inf': + return Infinity; + case '.nan': + return NaN; + case '-.inf': + return Infinity; + default: + firstChar = scalarLower.charAt(0); + switch (firstChar) { + case '!': + firstSpace = scalar.indexOf(' '); + if (firstSpace === -1) { + firstWord = scalarLower; + } else { + firstWord = scalarLower.slice(0, firstSpace); + } + switch (firstWord) { + case '!': + if (firstSpace !== -1) { + return parseInt(this.parseScalar(scalar.slice(2))); + } + return null; + case '!str': + return Utils.ltrim(scalar.slice(4)); + case '!!str': + return Utils.ltrim(scalar.slice(5)); + case '!!int': + return parseInt(this.parseScalar(scalar.slice(5))); + case '!!bool': + return Utils.parseBoolean(this.parseScalar(scalar.slice(6)), false); + case '!!float': + return parseFloat(this.parseScalar(scalar.slice(7))); + case '!!timestamp': + return Utils.stringToDate(Utils.ltrim(scalar.slice(11))); + default: + if (context == null) { + context = { + exceptionOnInvalidType: this.settings.exceptionOnInvalidType, + objectDecoder: this.settings.objectDecoder, + i: 0 + }; + } + objectDecoder = context.objectDecoder, exceptionOnInvalidType = context.exceptionOnInvalidType; + if (objectDecoder) { + trimmedScalar = Utils.rtrim(scalar); + firstSpace = trimmedScalar.indexOf(' '); + if (firstSpace === -1) { + return objectDecoder(trimmedScalar, null); + } else { + subValue = Utils.ltrim(trimmedScalar.slice(firstSpace + 1)); + if (!(subValue.length > 0)) { + subValue = null; + } + return objectDecoder(trimmedScalar.slice(0, firstSpace), subValue); + } + } + if (exceptionOnInvalidType) { + throw new ParseException('Custom object support when parsing a YAML file has been disabled.'); + } + return null; + } + break; + case '0': + if ('0x' === scalar.slice(0, 2)) { + return Utils.hexDec(scalar); + } else if (Utils.isDigits(scalar)) { + return Utils.octDec(scalar); + } else if (Utils.isNumeric(scalar)) { + return parseFloat(scalar); + } else { + return scalar; + } + break; + case '+': + if (Utils.isDigits(scalar)) { + raw = scalar; + cast = parseInt(raw); + if (raw === String(cast)) { + return cast; + } else { + return raw; + } + } else if (Utils.isNumeric(scalar)) { + return parseFloat(scalar); + } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { + return parseFloat(scalar.replace(',', '')); + } + return scalar; + case '-': + if (Utils.isDigits(scalar.slice(1))) { + if ('0' === scalar.charAt(1)) { + return -Utils.octDec(scalar.slice(1)); + } else { + raw = scalar.slice(1); + cast = parseInt(raw); + if (raw === String(cast)) { + return -cast; + } else { + return -raw; + } + } + } else if (Utils.isNumeric(scalar)) { + return parseFloat(scalar); + } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { + return parseFloat(scalar.replace(',', '')); + } + return scalar; + default: + if (date = Utils.stringToDate(scalar)) { + return date; + } else if (Utils.isNumeric(scalar)) { + return parseFloat(scalar); + } else if (this.PATTERN_THOUSAND_NUMERIC_SCALAR.test(scalar)) { + return parseFloat(scalar.replace(',', '')); + } + return scalar; + } + } + }; + + return Inline; + + })(); + + module.exports = Inline; + + + }, { + "./Escaper": 2, + "./Exception/DumpException": 3, + "./Exception/ParseException": 4, + "./Exception/ParseMore": 5, + "./Pattern": 8, + "./Unescaper": 9, + "./Utils": 10 + }], + 7: [function (require, module, exports) { + var Inline, ParseException, ParseMore, Parser, Pattern, Utils; + + Inline = require('./Inline'); + + Pattern = require('./Pattern'); + + Utils = require('./Utils'); + + ParseException = require('./Exception/ParseException'); + + ParseMore = require('./Exception/ParseMore'); + + Parser = (function () { + Parser.prototype.PATTERN_FOLDED_SCALAR_ALL = new Pattern( + '^(?:(?![^\\|>]*)\\s+)?(?\\||>)(?\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(? +#.*)?$' + ); + + Parser.prototype.PATTERN_FOLDED_SCALAR_END = new Pattern( + '(?\\||>)(?\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(? +#.*)?$'); + + Parser.prototype.PATTERN_SEQUENCE_ITEM = new Pattern('^\\-((?\\s+)(?.+?))?\\s*$'); + + Parser.prototype.PATTERN_ANCHOR_VALUE = new Pattern('^&(?[^ ]+) *(?.*)'); + + Parser.prototype.PATTERN_COMPACT_NOTATION = new Pattern('^(?' + Inline.REGEX_QUOTED_STRING + + '|[^ \'"\\{\\[].*?) *\\:(\\s+(?.+?))?\\s*$'); + + Parser.prototype.PATTERN_MAPPING_ITEM = new Pattern('^(?' + Inline.REGEX_QUOTED_STRING + + '|[^ \'"\\[\\{].*?) *\\:(\\s+(?.+?))?\\s*$'); + + Parser.prototype.PATTERN_DECIMAL = new Pattern('\\d+'); + + Parser.prototype.PATTERN_INDENT_SPACES = new Pattern('^ +'); + + Parser.prototype.PATTERN_TRAILING_LINES = new Pattern('(\n*)$'); + + Parser.prototype.PATTERN_YAML_HEADER = new Pattern('^\\%YAML[: ][\\d\\.]+.*\n', 'm'); + + Parser.prototype.PATTERN_LEADING_COMMENTS = new Pattern('^(\\#.*?\n)+', 'm'); + + Parser.prototype.PATTERN_DOCUMENT_MARKER_START = new Pattern('^\\-\\-\\-.*?\n', 'm'); + + Parser.prototype.PATTERN_DOCUMENT_MARKER_END = new Pattern('^\\.\\.\\.\\s*$', 'm'); + + Parser.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION = {}; + + Parser.prototype.CONTEXT_NONE = 0; + + Parser.prototype.CONTEXT_SEQUENCE = 1; + + Parser.prototype.CONTEXT_MAPPING = 2; + + function Parser(offset) { + this.offset = offset != null ? offset : 0; + this.lines = []; + this.currentLineNb = -1; + this.currentLine = ''; + this.refs = {}; + } + + Parser.prototype.parse = function (value, exceptionOnInvalidType, objectDecoder) { + var alias, allowOverwrite, block, c, context, data, e, error, error1, error2, first, i, indent, isRef, + j, k, + key, l, lastKey, len, len1, len2, len3, lineCount, m, matches, mergeNode, n, name, parsed, + parsedItem, + parser, ref, ref1, ref2, refName, refValue, val, values; + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectDecoder == null) { + objectDecoder = null; + } + this.currentLineNb = -1; + this.currentLine = ''; + this.lines = this.cleanup(value).split("\n"); + data = null; + context = this.CONTEXT_NONE; + allowOverwrite = false; + while (this.moveToNextLine()) { + if (this.isCurrentLineEmpty()) { + continue; + } + if ("\t" === this.currentLine[0]) { + throw new ParseException('A YAML file cannot contain tabs as indentation.', this.getRealCurrentLineNb() + 1, + this.currentLine); + } + isRef = mergeNode = false; + if (values = this.PATTERN_SEQUENCE_ITEM.exec(this.currentLine)) { + if (this.CONTEXT_MAPPING === context) { + throw new ParseException('You cannot define a sequence item when in a mapping'); + } + context = this.CONTEXT_SEQUENCE; + if (data == null) { + data = []; + } + if ((values.value != null) && (matches = this.PATTERN_ANCHOR_VALUE.exec(values.value))) { + isRef = matches.ref; + values.value = matches.value; + } + if (!(values.value != null) || '' === Utils.trim(values.value, ' ') || Utils.ltrim(values.value, ' ').indexOf( + '#') === 0) { + if (this.currentLineNb < this.lines.length - 1 && !this.isNextLineUnIndentedCollection()) { + c = this.getRealCurrentLineNb() + 1; + parser = new Parser(c); + parser.refs = this.refs; + data.push(parser.parse(this.getNextEmbedBlock(null, true), exceptionOnInvalidType, objectDecoder)); + } else { + data.push(null); + } + } else { + if (((ref = values.leadspaces) != null ? ref.length : void 0) && (matches = this.PATTERN_COMPACT_NOTATION.exec( + values.value))) { + c = this.getRealCurrentLineNb(); + parser = new Parser(c); + parser.refs = this.refs; + block = values.value; + indent = this.getCurrentLineIndentation(); + if (this.isNextLineIndented(false)) { + block += "\n" + this.getNextEmbedBlock(indent + values.leadspaces.length + 1, true); + } + data.push(parser.parse(block, exceptionOnInvalidType, objectDecoder)); + } else { + data.push(this.parseValue(values.value, exceptionOnInvalidType, objectDecoder)); + } + } + } else if ((values = this.PATTERN_MAPPING_ITEM.exec(this.currentLine)) && values.key.indexOf(' #') === -1) { + if (this.CONTEXT_SEQUENCE === context) { + throw new ParseException('You cannot define a mapping item when in a sequence'); + } + context = this.CONTEXT_MAPPING; + if (data == null) { + data = {}; + } + Inline.configure(exceptionOnInvalidType, objectDecoder); + try { + key = Inline.parseScalar(values.key); + } catch (error) { + e = error; + e.parsedLine = this.getRealCurrentLineNb() + 1; + e.snippet = this.currentLine; + throw e; + } + if ('<<' === key) { + mergeNode = true; + allowOverwrite = true; + if (((ref1 = values.value) != null ? ref1.indexOf('*') : void 0) === 0) { + refName = values.value.slice(1); + if (this.refs[refName] == null) { + throw new ParseException('Reference "' + refName + '" does not exist.', this.getRealCurrentLineNb() + 1, + this.currentLine); + } + refValue = this.refs[refName]; + if (typeof refValue !== 'object') { + throw new ParseException('YAML merge keys used with a scalar value instead of an object.', this.getRealCurrentLineNb() + + 1, this.currentLine); + } + if (refValue instanceof Array) { + for (i = j = 0, len = refValue.length; j < len; i = ++j) { + value = refValue[i]; + if (data[name = String(i)] == null) { + data[name] = value; + } + } + } else { + for (key in refValue) { + value = refValue[key]; + if (data[key] == null) { + data[key] = value; + } + } + } + } else { + if ((values.value != null) && values.value !== '') { + value = values.value; + } else { + value = this.getNextEmbedBlock(); + } + c = this.getRealCurrentLineNb() + 1; + parser = new Parser(c); + parser.refs = this.refs; + parsed = parser.parse(value, exceptionOnInvalidType); + if (typeof parsed !== 'object') { + throw new ParseException('YAML merge keys used with a scalar value instead of an object.', this.getRealCurrentLineNb() + + 1, this.currentLine); + } + if (parsed instanceof Array) { + for (l = 0, len1 = parsed.length; l < len1; l++) { + parsedItem = parsed[l]; + if (typeof parsedItem !== 'object') { + throw new ParseException('Merge items must be objects.', this.getRealCurrentLineNb() + 1, parsedItem); + } + if (parsedItem instanceof Array) { + for (i = m = 0, len2 = parsedItem.length; m < len2; i = ++m) { + value = parsedItem[i]; + k = String(i); + if (!data.hasOwnProperty(k)) { + data[k] = value; + } + } + } else { + for (key in parsedItem) { + value = parsedItem[key]; + if (!data.hasOwnProperty(key)) { + data[key] = value; + } + } + } + } + } else { + for (key in parsed) { + value = parsed[key]; + if (!data.hasOwnProperty(key)) { + data[key] = value; + } + } + } + } + } else if ((values.value != null) && (matches = this.PATTERN_ANCHOR_VALUE.exec(values.value))) { + isRef = matches.ref; + values.value = matches.value; + } + if (mergeNode) { + + } else if (!(values.value != null) || '' === Utils.trim(values.value, ' ') || Utils.ltrim(values.value, ' ') + .indexOf('#') === 0) { + if (!(this.isNextLineIndented()) && !(this.isNextLineUnIndentedCollection())) { + if (allowOverwrite || data[key] === void 0) { + data[key] = null; + } + } else { + c = this.getRealCurrentLineNb() + 1; + parser = new Parser(c); + parser.refs = this.refs; + val = parser.parse(this.getNextEmbedBlock(), exceptionOnInvalidType, objectDecoder); + if (allowOverwrite || data[key] === void 0) { + data[key] = val; + } + } + } else { + val = this.parseValue(values.value, exceptionOnInvalidType, objectDecoder); + if (allowOverwrite || data[key] === void 0) { + data[key] = val; + } + } + } else { + lineCount = this.lines.length; + if (1 === lineCount || (2 === lineCount && Utils.isEmpty(this.lines[1]))) { + try { + value = Inline.parse(this.lines[0], exceptionOnInvalidType, objectDecoder); + } catch (error1) { + e = error1; + e.parsedLine = this.getRealCurrentLineNb() + 1; + e.snippet = this.currentLine; + throw e; + } + if (typeof value === 'object') { + if (value instanceof Array) { + first = value[0]; + } else { + for (key in value) { + first = value[key]; + break; + } + } + if (typeof first === 'string' && first.indexOf('*') === 0) { + data = []; + for (n = 0, len3 = value.length; n < len3; n++) { + alias = value[n]; + data.push(this.refs[alias.slice(1)]); + } + value = data; + } + } + return value; + } else if ((ref2 = Utils.ltrim(value).charAt(0)) === '[' || ref2 === '{') { + try { + return Inline.parse(value, exceptionOnInvalidType, objectDecoder); + } catch (error2) { + e = error2; + e.parsedLine = this.getRealCurrentLineNb() + 1; + e.snippet = this.currentLine; + throw e; + } + } + throw new ParseException('Unable to parse.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + if (isRef) { + if (data instanceof Array) { + this.refs[isRef] = data[data.length - 1]; + } else { + lastKey = null; + for (key in data) { + lastKey = key; + } + this.refs[isRef] = data[lastKey]; + } + } + } + if (Utils.isEmpty(data)) { + return null; + } else { + return data; + } + }; + + Parser.prototype.getRealCurrentLineNb = function () { + return this.currentLineNb + this.offset; + }; + + Parser.prototype.getCurrentLineIndentation = function () { + return this.currentLine.length - Utils.ltrim(this.currentLine, ' ').length; + }; + + Parser.prototype.getNextEmbedBlock = function (indentation, includeUnindentedCollection) { + var data, indent, isItUnindentedCollection, newIndent, removeComments, removeCommentsPattern, + unindentedEmbedBlock; + if (indentation == null) { + indentation = null; + } + if (includeUnindentedCollection == null) { + includeUnindentedCollection = false; + } + this.moveToNextLine(); + if (indentation == null) { + newIndent = this.getCurrentLineIndentation(); + unindentedEmbedBlock = this.isStringUnIndentedCollectionItem(this.currentLine); + if (!(this.isCurrentLineEmpty()) && 0 === newIndent && !unindentedEmbedBlock) { + throw new ParseException('Indentation problem.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + } else { + newIndent = indentation; + } + data = [this.currentLine.slice(newIndent)]; + if (!includeUnindentedCollection) { + isItUnindentedCollection = this.isStringUnIndentedCollectionItem(this.currentLine); + } + removeCommentsPattern = this.PATTERN_FOLDED_SCALAR_END; + removeComments = !removeCommentsPattern.test(this.currentLine); + while (this.moveToNextLine()) { + indent = this.getCurrentLineIndentation(); + if (indent === newIndent) { + removeComments = !removeCommentsPattern.test(this.currentLine); + } + if (removeComments && this.isCurrentLineComment()) { + continue; + } + if (this.isCurrentLineBlank()) { + data.push(this.currentLine.slice(newIndent)); + continue; + } + if (isItUnindentedCollection && !this.isStringUnIndentedCollectionItem(this.currentLine) && indent === + newIndent) { + this.moveToPreviousLine(); + break; + } + if (indent >= newIndent) { + data.push(this.currentLine.slice(newIndent)); + } else if (Utils.ltrim(this.currentLine).charAt(0) === '#') { + + } else if (0 === indent) { + this.moveToPreviousLine(); + break; + } else { + throw new ParseException('Indentation problem.', this.getRealCurrentLineNb() + 1, this.currentLine); + } + } + return data.join("\n"); + }; + + Parser.prototype.moveToNextLine = function () { + if (this.currentLineNb >= this.lines.length - 1) { + return false; + } + this.currentLine = this.lines[++this.currentLineNb]; + return true; + }; + + Parser.prototype.moveToPreviousLine = function () { + this.currentLine = this.lines[--this.currentLineNb]; + }; + + Parser.prototype.parseValue = function (value, exceptionOnInvalidType, objectDecoder) { + var e, error, foldedIndent, matches, modifiers, pos, ref, ref1, val; + if (0 === value.indexOf('*')) { + pos = value.indexOf('#'); + if (pos !== -1) { + value = value.substr(1, pos - 2); + } else { + value = value.slice(1); + } + if (this.refs[value] === void 0) { + throw new ParseException('Reference "' + value + '" does not exist.', this.currentLine); + } + return this.refs[value]; + } + if (matches = this.PATTERN_FOLDED_SCALAR_ALL.exec(value)) { + modifiers = (ref = matches.modifiers) != null ? ref : ''; + foldedIndent = Math.abs(parseInt(modifiers)); + if (isNaN(foldedIndent)) { + foldedIndent = 0; + } + val = this.parseFoldedScalar(matches.separator, this.PATTERN_DECIMAL.replace(modifiers, ''), foldedIndent); + if (matches.type != null) { + Inline.configure(exceptionOnInvalidType, objectDecoder); + return Inline.parseScalar(matches.type + ' ' + val); + } else { + return val; + } + } + if ((ref1 = value.charAt(0)) === '[' || ref1 === '{' || ref1 === '"' || ref1 === "'") { + while (true) { + try { + return Inline.parse(value, exceptionOnInvalidType, objectDecoder); + } catch (error) { + e = error; + if (e instanceof ParseMore && this.moveToNextLine()) { + value += "\n" + Utils.trim(this.currentLine, ' '); + } else { + e.parsedLine = this.getRealCurrentLineNb() + 1; + e.snippet = this.currentLine; + throw e; + } + } + } + } else { + if (this.isNextLineIndented()) { + value += "\n" + this.getNextEmbedBlock(); + } + return Inline.parse(value, exceptionOnInvalidType, objectDecoder); + } + }; + + Parser.prototype.parseFoldedScalar = function (separator, indicator, indentation) { + var isCurrentLineBlank, j, len, line, matches, newText, notEOF, pattern, ref, text; + if (indicator == null) { + indicator = ''; + } + if (indentation == null) { + indentation = 0; + } + notEOF = this.moveToNextLine(); + if (!notEOF) { + return ''; + } + isCurrentLineBlank = this.isCurrentLineBlank(); + text = ''; + while (notEOF && isCurrentLineBlank) { + if (notEOF = this.moveToNextLine()) { + text += "\n"; + isCurrentLineBlank = this.isCurrentLineBlank(); + } + } + if (0 === indentation) { + if (matches = this.PATTERN_INDENT_SPACES.exec(this.currentLine)) { + indentation = matches[0].length; + } + } + if (indentation > 0) { + pattern = this.PATTERN_FOLDED_SCALAR_BY_INDENTATION[indentation]; + if (pattern == null) { + pattern = new Pattern('^ {' + indentation + '}(.*)$'); + Parser.prototype.PATTERN_FOLDED_SCALAR_BY_INDENTATION[indentation] = pattern; + } + while (notEOF && (isCurrentLineBlank || (matches = pattern.exec(this.currentLine)))) { + if (isCurrentLineBlank) { + text += this.currentLine.slice(indentation); + } else { + text += matches[1]; + } + if (notEOF = this.moveToNextLine()) { + text += "\n"; + isCurrentLineBlank = this.isCurrentLineBlank(); + } + } + } else if (notEOF) { + text += "\n"; + } + if (notEOF) { + this.moveToPreviousLine(); + } + if ('>' === separator) { + newText = ''; + ref = text.split("\n"); + for (j = 0, len = ref.length; j < len; j++) { + line = ref[j]; + if (line.length === 0 || line.charAt(0) === ' ') { + newText = Utils.rtrim(newText, ' ') + line + "\n"; + } else { + newText += line + ' '; + } + } + text = newText; + } + if ('+' !== indicator) { + text = Utils.rtrim(text); + } + if ('' === indicator) { + text = this.PATTERN_TRAILING_LINES.replace(text, "\n"); + } else if ('-' === indicator) { + text = this.PATTERN_TRAILING_LINES.replace(text, ''); + } + return text; + }; + + Parser.prototype.isNextLineIndented = function (ignoreComments) { + var EOF, currentIndentation, ret; + if (ignoreComments == null) { + ignoreComments = true; + } + currentIndentation = this.getCurrentLineIndentation(); + EOF = !this.moveToNextLine(); + if (ignoreComments) { + while (!EOF && this.isCurrentLineEmpty()) { + EOF = !this.moveToNextLine(); + } + } else { + while (!EOF && this.isCurrentLineBlank()) { + EOF = !this.moveToNextLine(); + } + } + if (EOF) { + return false; + } + ret = false; + if (this.getCurrentLineIndentation() > currentIndentation) { + ret = true; + } + this.moveToPreviousLine(); + return ret; + }; + + Parser.prototype.isCurrentLineEmpty = function () { + var trimmedLine; + trimmedLine = Utils.trim(this.currentLine, ' '); + return trimmedLine.length === 0 || trimmedLine.charAt(0) === '#'; + }; + + Parser.prototype.isCurrentLineBlank = function () { + return '' === Utils.trim(this.currentLine, ' '); + }; + + Parser.prototype.isCurrentLineComment = function () { + var ltrimmedLine; + ltrimmedLine = Utils.ltrim(this.currentLine, ' '); + return ltrimmedLine.charAt(0) === '#'; + }; + + Parser.prototype.cleanup = function (value) { + var count, i, indent, j, l, len, len1, line, lines, ref, ref1, ref2, smallestIndent, trimmedValue; + if (value.indexOf("\r") !== -1) { + value = value.split("\r\n").join("\n").split("\r").join("\n"); + } + count = 0; + ref = this.PATTERN_YAML_HEADER.replaceAll(value, ''), value = ref[0], count = ref[1]; + this.offset += count; + ref1 = this.PATTERN_LEADING_COMMENTS.replaceAll(value, '', 1), trimmedValue = ref1[0], count = ref1[1]; + if (count === 1) { + this.offset += Utils.subStrCount(value, "\n") - Utils.subStrCount(trimmedValue, "\n"); + value = trimmedValue; + } + ref2 = this.PATTERN_DOCUMENT_MARKER_START.replaceAll(value, '', 1), trimmedValue = ref2[0], count = ref2[1]; + if (count === 1) { + this.offset += Utils.subStrCount(value, "\n") - Utils.subStrCount(trimmedValue, "\n"); + value = trimmedValue; + value = this.PATTERN_DOCUMENT_MARKER_END.replace(value, ''); + } + lines = value.split("\n"); + smallestIndent = -1; + for (j = 0, len = lines.length; j < len; j++) { + line = lines[j]; + if (Utils.trim(line, ' ').length === 0) { + continue; + } + indent = line.length - Utils.ltrim(line).length; + if (smallestIndent === -1 || indent < smallestIndent) { + smallestIndent = indent; + } + } + if (smallestIndent > 0) { + for (i = l = 0, len1 = lines.length; l < len1; i = ++l) { + line = lines[i]; + lines[i] = line.slice(smallestIndent); + } + value = lines.join("\n"); + } + return value; + }; + + Parser.prototype.isNextLineUnIndentedCollection = function (currentIndentation) { + var notEOF, ret; + if (currentIndentation == null) { + currentIndentation = null; + } + if (currentIndentation == null) { + currentIndentation = this.getCurrentLineIndentation(); + } + notEOF = this.moveToNextLine(); + while (notEOF && this.isCurrentLineEmpty()) { + notEOF = this.moveToNextLine(); + } + if (false === notEOF) { + return false; + } + ret = false; + if (this.getCurrentLineIndentation() === currentIndentation && this.isStringUnIndentedCollectionItem(this.currentLine)) { + ret = true; + } + this.moveToPreviousLine(); + return ret; + }; + + Parser.prototype.isStringUnIndentedCollectionItem = function () { + return this.currentLine === '-' || this.currentLine.slice(0, 2) === '- '; + }; + + return Parser; + + })(); + + module.exports = Parser; + + + }, { + "./Exception/ParseException": 4, + "./Exception/ParseMore": 5, + "./Inline": 6, + "./Pattern": 8, + "./Utils": 10 + }], + 8: [function (require, module, exports) { + var Pattern; + + Pattern = (function () { + Pattern.prototype.regex = null; + + Pattern.prototype.rawRegex = null; + + Pattern.prototype.cleanedRegex = null; + + Pattern.prototype.mapping = null; + + function Pattern(rawRegex, modifiers) { + var _char, capturingBracketNumber, cleanedRegex, i, len, mapping, name, part, subChar; + if (modifiers == null) { + modifiers = ''; + } + cleanedRegex = ''; + len = rawRegex.length; + mapping = null; + capturingBracketNumber = 0; + i = 0; + while (i < len) { + _char = rawRegex.charAt(i); + if (_char === '\\') { + cleanedRegex += rawRegex.slice(i, +(i + 1) + 1 || 9e9); + i++; + } else if (_char === '(') { + if (i < len - 2) { + part = rawRegex.slice(i, +(i + 2) + 1 || 9e9); + if (part === '(?:') { + i += 2; + cleanedRegex += part; + } else if (part === '(?<') { + capturingBracketNumber++; + i += 2; + name = ''; + while (i + 1 < len) { + subChar = rawRegex.charAt(i + 1); + if (subChar === '>') { + cleanedRegex += '('; + i++; + if (name.length > 0) { + if (mapping == null) { + mapping = {}; + } + mapping[name] = capturingBracketNumber; + } + break; + } else { + name += subChar; + } + i++; + } + } else { + cleanedRegex += _char; + capturingBracketNumber++; + } + } else { + cleanedRegex += _char; + } + } else { + cleanedRegex += _char; + } + i++; + } + this.rawRegex = rawRegex; + this.cleanedRegex = cleanedRegex; + this.regex = new RegExp(this.cleanedRegex, 'g' + modifiers.replace('g', '')); + this.mapping = mapping; + } + + Pattern.prototype.exec = function (str) { + var index, matches, name, ref; + this.regex.lastIndex = 0; + matches = this.regex.exec(str); + if (matches == null) { + return null; + } + if (this.mapping != null) { + ref = this.mapping; + for (name in ref) { + index = ref[name]; + matches[name] = matches[index]; + } + } + return matches; + }; + + Pattern.prototype.test = function (str) { + this.regex.lastIndex = 0; + return this.regex.test(str); + }; + + Pattern.prototype.replace = function (str, replacement) { + this.regex.lastIndex = 0; + return str.replace(this.regex, replacement); + }; + + Pattern.prototype.replaceAll = function (str, replacement, limit) { + var count; + if (limit == null) { + limit = 0; + } + this.regex.lastIndex = 0; + count = 0; + while (this.regex.test(str) && (limit === 0 || count < limit)) { + this.regex.lastIndex = 0; + str = str.replace(this.regex, replacement); + count++; + } + return [str, count]; + }; + + return Pattern; + + })(); + + module.exports = Pattern; + + + }, {}], + 9: [function (require, module, exports) { + var Pattern, Unescaper, Utils; + + Utils = require('./Utils'); + + Pattern = require('./Pattern'); + + Unescaper = (function () { + function Unescaper() { + } + + Unescaper.PATTERN_ESCAPED_CHARACTER = new Pattern( + '\\\\([0abt\tnvfre "\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})'); + + Unescaper.unescapeSingleQuotedString = function (value) { + return value.replace(/\'\'/g, '\''); + }; + + Unescaper.unescapeDoubleQuotedString = function (value) { + if (this._unescapeCallback == null) { + this._unescapeCallback = (function (_this) { + return function (str) { + return _this.unescapeCharacter(str); + }; + })(this); + } + return this.PATTERN_ESCAPED_CHARACTER.replace(value, this._unescapeCallback); + }; + + Unescaper.unescapeCharacter = function (value) { + var ch; + ch = String.fromCharCode; + switch (value.charAt(1)) { + case '0': + return ch(0); + case 'a': + return ch(7); + case 'b': + return ch(8); + case 't': + return "\t"; + case "\t": + return "\t"; + case 'n': + return "\n"; + case 'v': + return ch(11); + case 'f': + return ch(12); + case 'r': + return ch(13); + case 'e': + return ch(27); + case ' ': + return ' '; + case '"': + return '"'; + case '/': + return '/'; + case '\\': + return '\\'; + case 'N': + return ch(0x0085); + case '_': + return ch(0x00A0); + case 'L': + return ch(0x2028); + case 'P': + return ch(0x2029); + case 'x': + return Utils.utf8chr(Utils.hexDec(value.substr(2, 2))); + case 'u': + return Utils.utf8chr(Utils.hexDec(value.substr(2, 4))); + case 'U': + return Utils.utf8chr(Utils.hexDec(value.substr(2, 8))); + default: + return ''; + } + }; + + return Unescaper; + + })(); + + module.exports = Unescaper; + + + }, { + "./Pattern": 8, + "./Utils": 10 + }], + 10: [function (require, module, exports) { + var Pattern, Utils, + hasProp = {}.hasOwnProperty; + + Pattern = require('./Pattern'); + + Utils = (function () { + function Utils() { + } + + Utils.REGEX_LEFT_TRIM_BY_CHAR = {}; + + Utils.REGEX_RIGHT_TRIM_BY_CHAR = {}; + + Utils.REGEX_SPACES = /\s+/g; + + Utils.REGEX_DIGITS = /^\d+$/; + + Utils.REGEX_OCTAL = /[^0-7]/gi; + + Utils.REGEX_HEXADECIMAL = /[^a-f0-9]/gi; + + Utils.PATTERN_DATE = new Pattern('^' + '(?[0-9][0-9][0-9][0-9])' + '-(?[0-9][0-9]?)' + + '-(?[0-9][0-9]?)' + '(?:(?:[Tt]|[ \t]+)' + '(?[0-9][0-9]?)' + ':(?[0-9][0-9])' + + ':(?[0-9][0-9])' + '(?:\.(?[0-9]*))?' + + '(?:[ \t]*(?Z|(?[-+])(?[0-9][0-9]?)' + '(?::(?[0-9][0-9]))?))?)?' + '$', 'i' + ); + + Utils.LOCAL_TIMEZONE_OFFSET = new Date().getTimezoneOffset() * 60 * 1000; + + Utils.trim = function (str, _char) { + var regexLeft, regexRight; + if (_char == null) { + _char = '\\s'; + } + regexLeft = this.REGEX_LEFT_TRIM_BY_CHAR[_char]; + if (regexLeft == null) { + this.REGEX_LEFT_TRIM_BY_CHAR[_char] = regexLeft = new RegExp('^' + _char + '' + _char + '*'); + } + regexLeft.lastIndex = 0; + regexRight = this.REGEX_RIGHT_TRIM_BY_CHAR[_char]; + if (regexRight == null) { + this.REGEX_RIGHT_TRIM_BY_CHAR[_char] = regexRight = new RegExp(_char + '' + _char + '*$'); + } + regexRight.lastIndex = 0; + return str.replace(regexLeft, '').replace(regexRight, ''); + }; + + Utils.ltrim = function (str, _char) { + var regexLeft; + if (_char == null) { + _char = '\\s'; + } + regexLeft = this.REGEX_LEFT_TRIM_BY_CHAR[_char]; + if (regexLeft == null) { + this.REGEX_LEFT_TRIM_BY_CHAR[_char] = regexLeft = new RegExp('^' + _char + '' + _char + '*'); + } + regexLeft.lastIndex = 0; + return str.replace(regexLeft, ''); + }; + + Utils.rtrim = function (str, _char) { + var regexRight; + if (_char == null) { + _char = '\\s'; + } + regexRight = this.REGEX_RIGHT_TRIM_BY_CHAR[_char]; + if (regexRight == null) { + this.REGEX_RIGHT_TRIM_BY_CHAR[_char] = regexRight = new RegExp(_char + '' + _char + '*$'); + } + regexRight.lastIndex = 0; + return str.replace(regexRight, ''); + }; + + Utils.isEmpty = function (value) { + return !value || value === '' || value === '0' || (value instanceof Array && value.length === 0) || this.isEmptyObject( + value); + }; + + Utils.isEmptyObject = function (value) { + var k; + return value instanceof Object && ((function () { + var results; + results = []; + for (k in value) { + if (!hasProp.call(value, k)) continue; + results.push(k); + } + return results; + })()).length === 0; + }; + + Utils.subStrCount = function (string, subString, start, length) { + var c, i, j, len, ref, sublen; + c = 0; + string = '' + string; + subString = '' + subString; + if (start != null) { + string = string.slice(start); + } + if (length != null) { + string = string.slice(0, length); + } + len = string.length; + sublen = subString.length; + for (i = j = 0, ref = len; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { + if (subString === string.slice(i, sublen)) { + c++; + i += sublen - 1; + } + } + return c; + }; + + Utils.isDigits = function (input) { + this.REGEX_DIGITS.lastIndex = 0; + return this.REGEX_DIGITS.test(input); + }; + + Utils.octDec = function (input) { + this.REGEX_OCTAL.lastIndex = 0; + return parseInt((input + '').replace(this.REGEX_OCTAL, ''), 8); + }; + + Utils.hexDec = function (input) { + this.REGEX_HEXADECIMAL.lastIndex = 0; + input = this.trim(input); + if ((input + '').slice(0, 2) === '0x') { + input = (input + '').slice(2); + } + return parseInt((input + '').replace(this.REGEX_HEXADECIMAL, ''), 16); + }; + + Utils.utf8chr = function (c) { + var ch; + ch = String.fromCharCode; + if (0x80 > (c %= 0x200000)) { + return ch(c); + } + if (0x800 > c) { + return ch(0xC0 | c >> 6) + ch(0x80 | c & 0x3F); + } + if (0x10000 > c) { + return ch(0xE0 | c >> 12) + ch(0x80 | c >> 6 & 0x3F) + ch(0x80 | c & 0x3F); + } + return ch(0xF0 | c >> 18) + ch(0x80 | c >> 12 & 0x3F) + ch(0x80 | c >> 6 & 0x3F) + ch(0x80 | c & 0x3F); + }; + + Utils.parseBoolean = function (input, strict) { + var lowerInput; + if (strict == null) { + strict = true; + } + if (typeof input === 'string') { + lowerInput = input.toLowerCase(); + if (!strict) { + if (lowerInput === 'no') { + return false; + } + } + if (lowerInput === '0') { + return false; + } + if (lowerInput === 'false') { + return false; + } + if (lowerInput === '') { + return false; + } + return true; + } + return !!input; + }; + + Utils.isNumeric = function (input) { + this.REGEX_SPACES.lastIndex = 0; + return typeof input === 'number' || typeof input === 'string' && !isNaN(input) && input.replace(this.REGEX_SPACES, + '') !== ''; + }; + + Utils.stringToDate = function (str) { + var date, day, fraction, hour, info, minute, month, second, tz_hour, tz_minute, tz_offset, year; + if (!(str != null ? str.length : void 0)) { + return null; + } + info = this.PATTERN_DATE.exec(str); + if (!info) { + return null; + } + year = parseInt(info.year, 10); + month = parseInt(info.month, 10) - 1; + day = parseInt(info.day, 10); + if (info.hour == null) { + date = new Date(Date.UTC(year, month, day)); + return date; + } + hour = parseInt(info.hour, 10); + minute = parseInt(info.minute, 10); + second = parseInt(info.second, 10); + if (info.fraction != null) { + fraction = info.fraction.slice(0, 3); + while (fraction.length < 3) { + fraction += '0'; + } + fraction = parseInt(fraction, 10); + } else { + fraction = 0; + } + if (info.tz != null) { + tz_hour = parseInt(info.tz_hour, 10); + if (info.tz_minute != null) { + tz_minute = parseInt(info.tz_minute, 10); + } else { + tz_minute = 0; + } + tz_offset = (tz_hour * 60 + tz_minute) * 60000; + if ('-' === info.tz_sign) { + tz_offset *= -1; + } + } + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + if (tz_offset) { + date.setTime(date.getTime() - tz_offset); + } + return date; + }; + + Utils.strRepeat = function (str, number) { + var i, res; + res = ''; + i = 0; + while (i < number) { + res += str; + i++; + } + return res; + }; + + Utils.getStringFromFile = function (path, callback) { + var data, fs, j, len1, name, ref, req, xhr; + if (callback == null) { + callback = null; + } + xhr = null; + if (typeof window !== "undefined" && window !== null) { + if (window.XMLHttpRequest) { + xhr = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + ref = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]; + for (j = 0, len1 = ref.length; j < len1; j++) { + name = ref[j]; + try { + xhr = new ActiveXObject(name); + } catch (undefined) { + } + } + } + } + if (xhr != null) { + if (callback != null) { + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status === 200 || xhr.status === 0) { + return callback(xhr.responseText); + } else { + return callback(null); + } + } + }; + xhr.open('GET', path, true); + return xhr.send(null); + } else { + xhr.open('GET', path, false); + xhr.send(null); + if (xhr.status === 200 || xhr.status === 0) { + return xhr.responseText; + } + return null; + } + } else { + req = require; + fs = req('fs'); + if (callback != null) { + return fs.readFile(path, function (err, data) { + if (err) { + return callback(null); + } else { + return callback(String(data)); + } + }); + } else { + data = fs.readFileSync(path); + if (data != null) { + return String(data); + } + return null; + } + } + }; + + return Utils; + + })(); + + module.exports = Utils; + + + }, { + "./Pattern": 8 + }], + 11: [function (require, module, exports) { + var Dumper, Parser, Utils, Yaml; + + Parser = require('./Parser'); + + Dumper = require('./Dumper'); + + Utils = require('./Utils'); + + Yaml = (function () { + function Yaml() { + } + + Yaml.parse = function (input, exceptionOnInvalidType, objectDecoder) { + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectDecoder == null) { + objectDecoder = null; + } + return new Parser().parse(input, exceptionOnInvalidType, objectDecoder); + }; + + Yaml.parseFile = function (path, callback, exceptionOnInvalidType, objectDecoder) { + var input; + if (callback == null) { + callback = null; + } + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectDecoder == null) { + objectDecoder = null; + } + if (callback != null) { + return Utils.getStringFromFile(path, (function (_this) { + return function (input) { + var result; + result = null; + if (input != null) { + result = _this.parse(input, exceptionOnInvalidType, objectDecoder); + } + callback(result); + }; + })(this)); + } else { + input = Utils.getStringFromFile(path); + if (input != null) { + return this.parse(input, exceptionOnInvalidType, objectDecoder); + } + return null; + } + }; + + Yaml.dump = function (input, inline, indent, exceptionOnInvalidType, objectEncoder) { + var yaml; + if (inline == null) { + inline = 2; + } + if (indent == null) { + indent = 4; + } + if (exceptionOnInvalidType == null) { + exceptionOnInvalidType = false; + } + if (objectEncoder == null) { + objectEncoder = null; + } + yaml = new Dumper(); + yaml.indentation = indent; + return yaml.dump(input, inline, 0, exceptionOnInvalidType, objectEncoder); + }; + + Yaml.stringify = function (input, inline, indent, exceptionOnInvalidType, objectEncoder) { + return this.dump(input, inline, indent, exceptionOnInvalidType, objectEncoder); + }; + + Yaml.load = function (path, callback, exceptionOnInvalidType, objectDecoder) { + return this.parseFile(path, callback, exceptionOnInvalidType, objectDecoder); + }; + + return Yaml; + + })(); + + if (typeof window !== "undefined" && window !== null) { + window.YAML = Yaml; + } + + if (typeof window === "undefined" || window === null) { + this.YAML = Yaml; + } + + module.exports = Yaml; + + + }, { + "./Dumper": 1, + "./Parser": 7, + "./Utils": 10 + }] +}, {}, [11]); diff --git a/static/component/pear/module/fullscreen.js b/static/component/pear/module/fullscreen.js new file mode 100644 index 0000000..b93f4a5 --- /dev/null +++ b/static/component/pear/module/fullscreen.js @@ -0,0 +1,60 @@ +layui.define(['jquery', 'element'], + function (exports) { + + var $ = layui.jquery; + var defer = $.Deferred(); + var fullScreen = new function () { + + this.func = null; + + this.onFullchange = function (func) { + this.func = func; + var evts = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']; + for (var i = 0; i < evts.length && func; i++) { + window.addEventListener(evts[i], this.func); + } + } + + this.fullScreen = function (dom) { + var docElm = dom && document.querySelector(dom) || document.documentElement; + if (docElm.requestFullscreen) { + docElm.requestFullscreen(); + } else if (docElm.mozRequestFullScreen) { + docElm.mozRequestFullScreen(); + } else if (docElm.webkitRequestFullScreen) { + docElm.webkitRequestFullScreen(); + } else if (docElm.msRequestFullscreen) { + docElm.msRequestFullscreen(); + } else { + defer.reject(""); + } + defer.resolve("返回值"); + return defer.promise(); + } + + this.fullClose = function () { + if (this.isFullscreen()) { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitCancelFullScreen) { + document.webkitCancelFullScreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } + } + defer.resolve("返回值"); + return defer.promise(); + } + + this.isFullscreen = function () { + return document.fullscreenElement || + document.msFullscreenElement || + document.mozFullScreenElement || + document.webkitFullscreenElement || false; + } + }; + + exports('fullscreen', fullScreen); + }) diff --git a/static/component/pear/module/menu.js b/static/component/pear/module/menu.js new file mode 100644 index 0000000..ac3309a --- /dev/null +++ b/static/component/pear/module/menu.js @@ -0,0 +1,537 @@ +layui.define(['table', 'jquery', 'element'], function (exports) { + "use strict"; + + var MOD_NAME = 'menu', + $ = layui.jquery, + element = layui.element; + + var menu = function (opt) { + this.option = opt; + }; + + menu.prototype.render = function (opt) { + + var option = { + elem: opt.elem, + async: opt.async || true, + parseData: opt.parseData, + url: opt.url, + method: opt.method ? opt.method : "GET", + defaultOpen: opt.defaultOpen, + defaultSelect: opt.defaultSelect, + control: opt.control, + controlWidth: opt.controlWidth ? opt.controlWidth : "auto", + defaultMenu: opt.defaultMenu || 0, + accordion: opt.accordion, + height: opt.height || "100%", + theme: opt.theme || "dark-theme", + data: opt.data ? opt.data : [], + change: opt.change ? opt.change : function () { + }, + done: opt.done ? opt.done : function () { + } + } + + var tempDone = option.done; + + option.done = function () { + if (option.control) { + rationalizeHeaderControlWidthAuto(option); + } + tempDone(); + } + + if (option.async) { + if (option.method === "GET") { + getData(option.url).then(function (data) { + option.data = data; + renderMenu(option); + }); + } else { + postData(option.url).then(function (data) { + option.data = data; + renderMenu(option); + }); + } + } else { + window.setTimeout(function () { + renderMenu(option); + }, 500); + } + + $("#" + opt.elem).height(option.height) + + setTimeout(function () { + $("#" + opt.control + " .control").on("mousewheel DOMMouseScroll", function (event) { + + var delta = (event.originalEvent.wheelDelta && (event.originalEvent.wheelDelta > 0 ? 1 : -1)) || // chrome & ie + (event.originalEvent.detail && (event.originalEvent.detail > 0 ? -1 : 1)); // firefox + + if (delta > 0) { + for (var num = 1; num < 20; num++) { + setTimeout(function () { + if ($("#" + opt.control + " .control ul").css('left').replace("px", "") < 0) { + $("#" + opt.control + " .control ul").css("left", "+=2px"); + } + }, 10) + } + } else if (delta < 0) { + if (((Number)($("#" + opt.control + " .control ul").css("left").replace("px", "")) + ($("#" + opt.control + " .control ul").width() - $("#" + opt.control + " .control").width())) > 0) { + for (var num = 1; num < 20; num++) { + setTimeout(function () { + $("#" + opt.control + " .control ul").css("left", "-=2px"); + }, 10) + } + } + } + }); + }, 1000) + + return new menu(option); + } + + menu.prototype.cache = function () { + return this.option.data; + } + + menu.prototype.click = function (clickEvent) { + var _this = this; + $("body").on("click", "#" + _this.option.elem + " .site-demo-active", function () { + var dom = $(this); + var data = { + menuId: dom.attr("menu-id"), + menuTitle: dom.attr("menu-title"), + menuPath: dom.attr("menu-title"), + menuIcon: dom.attr("menu-icon"), + menuUrl: dom.attr("menu-url"), + menuType: dom.attr("menu-type"), + menuOpenType: dom.attr("menu-open-type") + }; + var doms = hash(dom); + if (doms != null) { + if (doms.text() != '') { + data['menuPath'] = doms.find("span").text() + " / " + data['menuPath']; + } + } + if (doms != null) { + var domss = hash(doms); + if (domss != null) { + if (domss.text() != '') { + data['menuPath'] = domss.find("span").text() + " / " + data['menuPath']; + } + } + } + if (domss != null) { + var domsss = hash(domss); + if (domsss != null) { + if (domsss.text() != '') { + data['menuPath'] = domsss.find("span").text() + " / " + data['menuPath']; + } + } + } + if ($("#" + _this.option.elem).is(".pear-nav-mini")) { + if (_this.option.accordion) { + activeMenus = $(this).parent().parent().parent().children("a"); + } else { + activeMenus.push($(this).parent().parent().parent().children("a")); + } + } + clickEvent(dom, data); + }) + } + + function hash(dom) { + var d = dom.parent().parent().prev(); + if (d.prop("tagName") === "UL") { + return null; + } + return d; + } + + menu.prototype.skin = function (skin) { + var menu = $(".pear-nav-tree[lay-filter='" + this.option.elem + "']").parent(); + menu.removeClass("dark-theme"); + menu.removeClass("light-theme"); + menu.addClass(skin); + } + + menu.prototype.selectItem = function (pearId) { + if (this.option.control != false) { + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents(".layui-side-scroll ").find("ul").css({ + display: "none" + }); + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents(".layui-side-scroll ").find(".layui-this").removeClass( + "layui-this"); + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents("ul").css({ + display: "block" + }); + var controlId = $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents("ul").attr("pear-id"); + if (controlId != undefined) { + $("#" + this.option.control).find(".layui-this").removeClass("layui-this"); + $("#" + this.option.control).find("[pear-id='" + controlId + "']").addClass("layui-this"); + } + } + + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents(".pear-nav-tree").find(".layui-this").removeClass( + "layui-this"); + if (!$("#" + this.option.elem).is(".pear-nav-mini")) { + var openEle = null; + var openEleHeight = 0; + $($("#" + this.option.elem + " a[menu-id='" + pearId + "']").parents('.layui-nav-child').get().reverse()).each(function () { + if (!$(this).parent().is('.layui-nav-itemed')) { + if (openEleHeight == 0) { + openEle = $(this); + } else { + $(this).parent().addClass('layui-nav-itemed'); + $(this).css({ + height: 'auto', + }); + } + openEleHeight += $(this).children("dd").length * 48; + } + }); + if (this.option.accordion) { + if (openEleHeight > 0) { + var currentDom = openEle.parent().siblings('.layui-nav-itemed').children(".layui-nav-child"); + currentDom.animate({ + height: "0px" + }, 240, function () { + currentDom.css({ + height: "auto" + }); + $(this).parent().removeClass("layui-nav-itemed"); + $(this).find('.layui-nav-itemed').removeClass("layui-nav-itemed"); + }); + } + } + if (openEleHeight > 0) { + openEle.parent().addClass("layui-nav-itemed"); + openEle.height(0); + openEle.animate({ + height: openEleHeight + "px" + }, 240, function () { + $(this).css({height: 'auto'}); + }); + } + } + $("#" + this.option.elem + " a[menu-id='" + pearId + "']").parent().addClass("layui-this"); + } + + var activeMenus; + menu.prototype.collapse = function (time) { + var elem = this.option.elem; + var config = this.option; + if ($("#" + this.option.elem).is(".pear-nav-mini")) { + $.each(activeMenus, function (i, item) { + $("#" + elem + " a[menu-id='" + $(this).attr("menu-id") + "']").parent().addClass("layui-nav-itemed"); + }) + $("#" + this.option.elem).removeClass("pear-nav-mini"); + $("#" + this.option.elem).animate({ + width: "220px" + }, 180); + isHoverMenu(false, config); + var that = this; + $("#" + this.option.elem) + .promise() + .done(function () { + if (that.option.control) { + rationalizeHeaderControlWidth(that.option); + } + }) + } else { + activeMenus = $("#" + this.option.elem).find(".layui-nav-itemed>a"); + $("#" + this.option.elem).find(".layui-nav-itemed").removeClass("layui-nav-itemed"); + $("#" + this.option.elem).addClass("pear-nav-mini"); + $("#" + this.option.elem).animate({ + width: "60px" + }, 400); + var that = this; + $("#" + this.option.elem) + .promise() + .done(function () { + isHoverMenu(true, config); + if (that.option.control) { + rationalizeHeaderControlWidth(that.option); + } + }) + } + } + + function getData(url) { + var defer = $.Deferred(); + var symbol = url.indexOf('?') !== -1 ? '&' : '?'; + $.get(url + symbol + "fresh=" + Math.random(), function (result) { + defer.resolve(result) + }); + return defer.promise(); + } + + function postData(url) { + var defer = $.Deferred(); + var symbol = url.indexOf('?') !== -1 ? '&' : '?'; + $.post(url + symbol + "fresh=" + Math.random(), function (result) { + defer.resolve(result) + }, "json"); + return defer.promise(); + } + + function renderMenu(option) { + if (option.parseData != false) { + option.parseData(option.data); + } + if (option.data.length > 0) { + if (option.control != false) { + createMenuAndControl(option); + } else { + createMenu(option); + } + } + element.init(); + option.done(); + } + + function createMenu(option) { + var menuHtml = '
              ' + $.each(option.data, function (i, item) { + var content = '
            • '; + if (i == option.defaultOpen) { + content = '
            • '; + } + var href = "javascript:;"; + var target = ""; + var className = "site-demo-active" + if (item.openType == "_blank" && item.type == 1) { + href = item.href; + target = "target='_blank'"; + className = ""; + } + if (item.type == 0) { + // 创 建 目 录 结 构 + content += '' + item.title + + ''; + } else if (item.type == 1) { + content += '' + item.title + ''; + } + // 调 用 递 归 方 法 加 载 无 限 层 级 的 子 菜 单 + content += loadchild(item); + // 结 束 一 个 根 菜 单 项 + content += '
            • '; + menuHtml += content; + }); + // 结 束 菜 单 结 构 的 初 始 化 + menuHtml += "
            "; + // 将 菜 单 拼 接 到 初 始 化 容 器 中 + $("#" + option.elem).html(menuHtml); + } + + function createMenuAndControl(option) { + var control = '
              '; + var controlPe = '
                '; + // 声 明 头 部 + var menu = '
                ' + // 开 启 同 步 操 作 + var index = 0; + var controlItemPe = '
                '; + $.each(option.data, function (i, item) { + var menuItem = ''; + var controlItem = ''; + if (i === option.defaultMenu) { + controlItem = '
              • ' + item.title + '
              • '; + menuItem = '
                  '; + + controlPe += '
                • ' + item.title + ''; + + controlItemPe += '
                  ' + item.title + '
                  '; + } else { + + controlItem = '
                • ' + item.title + '
                • '; + + menuItem = ''; + control += controlItem; + }) + controlItemPe += "
              " + controlPe += controlItemPe; + $("#" + option.control).html(control + "
            "); + $("#" + option.control).append(controlPe); + $("#" + option.elem).html(menu); + $("#" + option.control + " .pear-nav-control").on("click", "[pear-id]", function () { + $("#" + option.elem).find(".pear-nav-tree").css({ + display: 'none' + }); + $("#" + option.elem).find(".pear-nav-tree[pear-id='" + $(this).attr("pear-id") + "']").css({ + display: 'block' + }); + $("#" + option.control).find(".pe-title").html($(this).attr("pear-title")); + $("#" + option.control).find("") + option.change($(this).attr("pear-id"), $(this).attr("pear-title"), $(this).attr("pear-href")) + }) + } + + /** 加载子菜单 (递归)*/ + function loadchild(obj) { + // 判 单 是 否 是 菜 单, 如 果 是 菜 单 直 接 返 回 + if (obj.type == 1) { + return ""; + } + // 创 建 子 菜 单 结 构 + var content = '
            '; + // 如 果 嵌 套 不 等 于 空 + if (obj.children != null && obj.children.length > 0) { + // 遍 历 子 项 目 + $.each(obj.children, function (i, note) { + // 创 建 子 项 结 构 + content += '
            '; + var href = "javascript:;"; + var target = ""; + var className = "site-demo-active"; + if (note.openType == "_blank" && note.type == 1) { + href = note.href; + target = "target='_blank'"; + className = ""; + } + // 判 断 子 项 类 型 + if (note.type == 0) { + // 创 建 目 录 结 构 + content += '' + note.title + ''; + } else if (note.type == 1) { + // 创 建 菜 单 结 构 + content += '' + note.title + ''; + } + // 加 载 子 项 目 录 + content += loadchild(note); + // 结 束 当 前 子 菜 单 + content += '
            '; + }); + // 封 装 + } else { + content += '
            目录为空
            '; + } + content += '
            '; + return content; + } + + /** 二 级 悬 浮 菜 单*/ + function isHoverMenu(b, option) { + if (b) { + var navItem = "#" + option.elem + ".pear-nav-mini .layui-nav-item"; + var navChildDl = navItem + " .layui-nav-child>dl"; + var navChildDd = navItem + " .layui-nav-child>dd"; + + $(navItem + "," + navChildDd).mouseenter(function () { + var _this = $(this); + _this.siblings().find(".layui-nav-child") + .removeClass("layui-nav-hover").css({ + left: 0, + top: 0 + }); + _this.children(".layui-nav-child").addClass("layui-nav-hover"); + var height = $(window).height(); + var topLength = _this.offset().top; + var thisHeight = _this.children(".layui-nav-child").height(); + if ((thisHeight + topLength) > height) { + topLength = height - thisHeight - 10; + } + var left = _this.offset().left + 60; + if (!_this.hasClass("layui-nav-item")) { + left = _this.offset().left + _this.width(); + } + _this.children(".layui-nav-child").offset({ + top: topLength, + left: left + }); + }); + + $(navItem + "," + navChildDl).mouseleave(function () { + var _this = $(this); + _this.closest('.layui-nav-item') + .find(".layui-nav-child") + .removeClass("layui-nav-hover") + .css({ + left: 0, + top: 0 + }); + }); + + } else { + $("#" + option.elem + " .layui-nav-item").off('mouseenter').unbind('mouseleave'); + $("#" + option.elem + " dd").off('mouseenter').unbind('mouseleave'); + } + } + + function rationalizeHeaderControlWidth(option) { + var $headerControl = $("#" + option.control); + var $nextEl = $headerControl.next(); + var rationalizeWidth; + if ($nextEl.length) { + rationalizeWidth = $nextEl.position().left - $headerControl.position().left; + } else { + rationalizeWidth = $headerControl.parent().innerWidth() - $headerControl.position().left; + } + + if (option.controlWidth && rationalizeWidth >= option.controlWidth) { + rationalizeWidth = option.controlWidth; + } + $("#" + option.control + " .control").css({"width": rationalizeWidth, "transition": "width .15s"}); + } + + function rationalizeHeaderControlWidthAuto(option) { + $(window).on('resize', function () { + rationalizeHeaderControlWidth(option); + }) + $(document).ready(function () { + setTimeout(() => { + rationalizeHeaderControlWidth(option); + }, 1000); + }); + } + + exports(MOD_NAME, new menu()); +}) \ No newline at end of file diff --git a/static/component/pear/module/menuSearch.js b/static/component/pear/module/menuSearch.js new file mode 100644 index 0000000..9a01a45 --- /dev/null +++ b/static/component/pear/module/menuSearch.js @@ -0,0 +1,233 @@ +layui.define(['jquery', 'tools'], function (exports) { + "use strict"; + + /** + * @since Pear Admin 4.0 + * + * Button component + * */ + var MOD_NAME = 'menuSearch', + tools = layui.tools, + $ = layui.jquery; + + var menuSearch = function (opt) { + this.option = opt; + }; + + /** + * @since Pear Admin 4.0 + * + * Button start loading + * */ + menuSearch.prototype.render = function (opt) { + + var options = { + select: opt.select, + elem: opt.elem, + dataProvider: opt.dataProvider, + } + + $('body').on("click", options.elem, function () { + + var _html = [ + `` + ].join(''); + + layer.open({ + type: 1, + offset: "10%", + area: ['600px'], + title: false, + closeBtn: 0, + shadeClose: true, + anim: 0, + move: false, + content: _html, + success: function (layero, layeridx) { + + var $layer = layero; + var $content = $(layero).children('.layui-layer-content'); + var $input = $(".menu-search-input-wrapper input"); + var $noData = $(".menu-search-no-data"); + var $list = $(".menu-search-list"); + var menuData = options.dataProvider(); + + $layer.css("border-radius", "6px"); + $input.off("focus").focus(); + + // 搜索输入事件 + $input.off("input").on("input", tools.debounce(function () { + var keywords = $input.val().trim(); + var filteredMenus = filterHandle(menuData, keywords); + + if (filteredMenus.length) { + var tiledMenus = tiledHandle(filteredMenus); + var listHtml = createList(tiledMenus); + $noData.css("display", "none"); + $list.html("").append(listHtml).children(":first").addClass("this") + } else { + $list.html(""); + $noData.css("display", "flex"); + } + var currentHeight = $(".menu-search-content").outerHeight() + $layer.css("height", currentHeight); + $content.css("height", currentHeight); + }, 500) + ) + + // 列表点击事件 + $list.off("click").on("click", "li", function () { + var id = $(this).attr("smenu-id"); + var title = $(this).attr("smenu-title"); + var url = $(this).attr("smenu-url"); + var type = $(this).attr("smenu-type"); + var openType = $(this).attr("smenu-open-type"); + + options.select({id, title, url, type, openType}); + + layer.close(layeridx); + }) + + $list.off('mouseenter').on("mouseenter", "li", function () { + $(".menu-search-list li.this").removeClass("this"); + $(this).addClass("this"); + }).off("mouseleave").on("mouseleave", "li", function () { + $(this).removeClass("this"); + }) + + // 监听键盘事件 + $('.menu-search-content').off("keydown").keydown(function (e) { + if (e.keyCode === 13 || e.keyCode === 32) { + e.preventDefault(); + var that = $(".menu-search-list li.this"); + var id = that.attr("smenu-id"); + var title = that.attr("smenu-title"); + var url = that.attr("smenu-url"); + var type = that.attr("smenu-type"); + var openType = that.attr("smenu-open-type"); + + options.select({id, title, url, type, openType}); + + layer.close(layeridx); + } else if (e.keyCode === 38) { + e.preventDefault(); + var prevEl = $(".menu-search-list li.this").prev(); + $(".menu-search-list li.this").removeClass("this"); + if (prevEl.length !== 0) { + prevEl.addClass("this"); + } else { + $list.children().last().addClass("this"); + } + } else if (e.keyCode === 40) { + e.preventDefault(); + var nextEl = $(".menu-search-list li.this").next(); + $(".menu-search-list li.this").removeClass("this"); + if (nextEl.length !== 0) { + nextEl.addClass("this"); + } else { + $list.children().first().addClass("this"); + } + } else if (e.keyCode === 27) { + e.preventDefault(); + layer.close(layeridx); + } + }) + } + }) + }); + + return new menuSearch(options); + } + + /** + * @since Pear Admin 4.0 + * + * 创建结果列表 + */ + var createList = function (data) { + var listHtml = ''; + $.each(data, function (index, item) { + listHtml += `
          • + ${item.path} + +
          • ` + }) + return listHtml; + } + + /** + * @since Pear Admin 4.0 + * + * Tree 转 path 列表 + */ + var tiledHandle = function (data) { + var tiledMenus = []; + var treeTiled = function (data, content) { + var path = ""; + var separator = " / "; + if (!content) content = ""; + $.each(data, function (index, item) { + if (item.children && item.children.length) { + path += content + item.title + separator; + var childPath = treeTiled(item.children, path); + path += childPath; + if (!childPath) path = ""; // 重置路径 + } else { + path += content + item.title + tiledMenus.push({path: path, info: item}); + path = ""; //重置路径 + } + }) + return path; + }; + treeTiled(data); + + return tiledMenus; + } + + /** + * @since Pear Admin 4.0 + * + * 查询匹配算法 + */ + var filterHandle = function (filterData, val) { + if (!val) return []; + var filteredMenus = []; + filterData = $.extend(true, {}, filterData); + $.each(filterData, function (index, item) { + if (item.children && item.children.length) { + var children = filterHandle(item.children, val) + var obj = $.extend({}, item, {children: children}); + if (children && children.length) { + filteredMenus.push(obj); + } else if (item.title.indexOf(val) >= 0) { + item.children = []; // 父级匹配但子级不匹配,就去除子级 + filteredMenus.push($.extend({}, item)); + } + } else if (item.title.indexOf(val) >= 0) { + filteredMenus.push(item); + } + }) + return filteredMenus; + } + + exports(MOD_NAME, new menuSearch()); +}); diff --git a/static/component/pear/module/messageCenter.js b/static/component/pear/module/messageCenter.js new file mode 100644 index 0000000..f56873f --- /dev/null +++ b/static/component/pear/module/messageCenter.js @@ -0,0 +1,85 @@ +layui.define(['table', 'jquery', 'element', 'dropdown'], function (exports) { + "use strict"; + + var MOD_NAME = 'messageCenter', + $ = layui.jquery, + dropdown = layui.dropdown; + + var message = function (opt) { + this.option = opt; + }; + + message.prototype.render = function (opt) { + var option = { + elem: opt.elem, + url: opt.url ? opt.url : false, + height: opt.height, + data: opt.data + } + if (option.url != false) { + $.get(option.url, function (result) { + const {code, success, data} = result; + $(`${opt.elem}`).append(`
          • + +
          • `); + if (code == 200 || success) { + option.data = data; + dropdown.render({ + elem: option.elem, + align: "center", + content: createHtml(option), + }) + } + }); + } + return new message(option); + } + + message.prototype.click = function (callback) { + $("*[notice-id]").click(function (event) { + event.preventDefault(); + var id = $(this).attr("notice-id"); + var title = $(this).attr("notice-title"); + var context = $(this).attr("notice-context"); + var form = $(this).attr("notice-form"); + callback(id, title, context, form); + }) + } + + function createHtml(option) { + + var count = 0; + var notice = '
            ' + var noticeTitle = '
              '; + var noticeContent = '
              '; + + $.each(option.data, function (i, item) { + + noticeTitle += `
            • ${item.title}
            • `; + noticeContent += '
              '; + + + $.each(item.children, function (i, note) { + count++; + noticeContent += '
              '; + + noticeContent += '
              ' + note.title + '
              ' + + '
              ' + note.time + '
              ' + + '
              '; + }) + + noticeContent += '
              '; + }) + + noticeTitle += '
            '; + noticeContent += '
            '; + notice += noticeTitle; + notice += noticeContent; + notice += "
            " + + return notice; + } + + exports(MOD_NAME, new message()); +}) \ No newline at end of file diff --git a/static/component/pear/module/page.js b/static/component/pear/module/page.js new file mode 100644 index 0000000..e5a31ba --- /dev/null +++ b/static/component/pear/module/page.js @@ -0,0 +1,119 @@ +layui.define(['jquery', 'element'], function (exports) { + "use strict"; + + var $ = layui.jquery; + var element = layui.element; + + var page = function (opt) { + this.option = opt; + }; + + /** + * @since Pear Admin 4.0 + * + * 创建 Page 页面 + */ + page.prototype.render = function (opt) { + var option = { + elem: opt.elem, + url: opt.url, + width: opt.width || "100%", + height: opt.height || "100%", + title: opt.title + } + renderContent(option); + return new page(option); + } + + /** + * @since Pear Admin 4.0 + * + * 切换 Page 页面 + */ + page.prototype.changePage = function (options) { + const $frame = $(`#${this.option.elem} .pear-page-content`); + if (options.type === "_iframe") { + $frame.html(``); + } else { + $.ajax({ + url: options.href, + type: 'get', + dataType: 'html', + success: function (data) { + $frame.html(data) + }, + error: function (xhr) { + return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!'); + } + }); + } + $frame.attr("type", options.type); + $frame.attr("href", options.href); + } + + page.prototype.refresh = function (loading) { + var $frameLoad = $(`#${this.option.elem} .pear-page-loading`); + var $frame = $(`#${this.option.elem} .pear-page-content`); + if (loading) { + $frameLoad.css({ + display: 'block' + }); + } + if ($frame.attr("type") === "_iframe") { + $frame.html(``); + const $contentFrame = $frame.find("iframe"); + $contentFrame.on("load", () => { + $frameLoad.fadeOut(1000); + }) + } else { + $.ajax({ + type: 'get', + url: $frame.attr("href"), + dataType: 'html', + success: function (data) { + $frame.html(data) + $frameLoad.fadeOut(1000); + element.init(); + }, + error: function (xhr) { + return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!'); + } + }); + } + } + + function renderContent(option) { + $("#" + option.elem).html(` +
            +
            +
            +
            + + + + +
            +
            +
            `); + + var $frame = $("#" + option.elem).find(".pear-page-content"); + + if (option.type === "_iframe") { + $frame.html(``); + } else { + $.ajax({ + url: option.url, + type: 'get', + dataType: 'html', + success: function (data) { + $frame.html(data); + }, + error: function (xhr) { + return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!'); + } + }); + } + } + + exports('page', new page()); +}); \ No newline at end of file diff --git a/static/component/pear/module/tabPage.js b/static/component/pear/module/tabPage.js new file mode 100644 index 0000000..a8618df --- /dev/null +++ b/static/component/pear/module/tabPage.js @@ -0,0 +1,661 @@ +layui.define(['jquery', 'element', 'dropdown'], function (exports) { + "use strict"; + + var MOD_NAME = 'tabPage', + $ = layui.jquery, + dropdown = layui.dropdown, + element = layui.element; + + var tabPage = function (opt) { + this.option = opt; + }; + + var tabData = new Array(); + var tabDataCurrent = 0; + var contextTabDOM; + + tabPage.prototype.render = function (opt) { + + var option = { + elem: opt.elem, + data: opt.data, + index: opt.index, + tool: opt.tool || true, + roll: opt.roll || true, + success: opt.success ? opt.success : function (id) { + }, + session: opt.session ? opt.session : false, + preload: opt.preload ? opt.preload : false, + height: opt.height || "100%", + width: opt.width || "100%", + closeEvent: opt.closeEvent, + tabMax: opt.tabMax, + } + + if (option.session) { + if (sessionStorage.getItem(option.elem + "-pear-tab-page-data") != null) { + tabData = JSON.parse(sessionStorage.getItem(option.elem + "-pear-tab-page-data")); + option.data = JSON.parse(sessionStorage.getItem(option.elem + "-pear-tab-page-data")); + tabDataCurrent = sessionStorage.getItem(option.elem + "-pear-tab-page-data-current"); + tabData.forEach(function (item, index) { + if (item.id == tabDataCurrent) { + option.index = index; + } + }) + } else { + tabData = opt.data; + } + } + + var lastIndex; + var tab = createTab(option); + $("#" + option.elem).html(tab); + $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-prev").click(function () { + rollPage("left", option); + }) + $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-next").click(function () { + rollPage("right", option); + }) + element.init(); + + $("#" + option.elem).width(opt.width); + $("#" + option.elem).height(opt.height); + $("#" + option.elem).css({ + position: "relative" + }); + + closeEvent(option); + + option.success(sessionStorage.getItem(option.elem + "-pear-tab-page-data-current")); + + dropdown.render({ + elem: `#${option.elem} .layui-tab-control > .layui-icon-down`, + trigger: 'hover', + data: [{ + title: '关 闭 当 前', + id: 1 + }, { + title: '关 闭 其 他', + id: 2 + }, { + title: '关 闭 全 部', + id: 3 + }], + click: function (obj) { + + const id = obj.id; + + if (id === 1) { + var currentTab = $(".layui-tab[lay-filter='" + option.elem + + "'] .layui-tab-title .layui-this"); + if (currentTab.find("span").is(".able-close")) { + var currentId = currentTab.attr("lay-id"); + tabDelete(option.elem, currentId, option.closeEvent, option); + } else { + layer.msg("当前页面不允许关闭", { + icon: 3, + time: 1000 + }) + } + } else if (id === 2) { + var currentId = $(".layui-tab[lay-filter='" + option.elem + + "'] .layui-tab-title .layui-this").attr("lay-id"); + var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); + $.each(tabtitle, function (i) { + if ($(this).attr("lay-id") != currentId) { + if ($(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, + option); + } + } + }) + } else { + var currentId = $(".layui-tab[lay-filter='" + option.elem + + "'] .layui-tab-title .layui-this").attr("lay-id"); + var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); + $.each(tabtitle, function (i) { + if ($(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option); + } + }) + } + + } + }) + + $("body .layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title").on("contextmenu", "li", + function (e) { + var top = e.clientY; + var left = e.clientX; + var menuWidth = 100; + var menu = `
              +
            • 关闭当前
            • +
            • 关闭其他
            • +
            • 关闭所有
            • +
            `; + + contextTabDOM = $(this); + var isOutsideBounds = (left + menuWidth) > $(window).width(); + if (isOutsideBounds) { + left = $(window).width() - menuWidth; + } + + layer.open({ + type: 1, + title: false, + shade: false, + skin: 'pear-tab-page-menu', + closeBtn: false, + area: [menuWidth + 'px', '108px'], + fixed: true, + anim: false, + isOutAnim: false, + offset: [top, left], + content: menu, + success: function (layero, index) { + layer.close(lastIndex); + lastIndex = index; + menuEvent(option, index); + var timer; + $(layero).on('mouseout', function () { + timer = setTimeout(function () { + layer.close(index); + }, 30) + }); + + $(layero).on('mouseover', function () { + clearTimeout(timer); + }); + + $(layero).on('contextmenu', function () { + return false; + }) + } + }); + return false; + }) + + mousewheelAndTouchmoveHandler(option) + return new tabPage(option); + } + + tabPage.prototype.click = function (callback) { + var option = this.option; + var elem = this.option.elem; + element.on('tab(' + this.option.elem + ')', function (data) { + var id = $("#" + elem + " .layui-tab-title .layui-this").attr("lay-id"); + sessionStorage.setItem(option.elem + "-pear-tab-page-data-current", id); + callback(id); + }); + } + + tabPage.prototype.positionTab = function () { + var $tabTitle = $('.layui-tab[lay-filter=' + this.option.elem + '] .layui-tab-title'); + var autoLeft = 0; + $tabTitle.children("li").each(function () { + if ($(this).hasClass('layui-this')) { + return false; + } else { + autoLeft += $(this).outerWidth(); + } + }); + $tabTitle.animate({ + scrollLeft: autoLeft - $tabTitle.width() / 3 + }, 200); + } + + tabPage.prototype.clear = function () { + sessionStorage.removeItem(this.option.elem + "-pear-tab-page-data"); + sessionStorage.removeItem(this.option.elem + "-pear-tab-page-data-current"); + } + + tabPage.prototype.changeTabTitleById = function (id, title) { + var currentTab = $(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title [lay-id='" + id + "'] .title"); + currentTab.html(title); + } + + /** + * @since Pear Admin 4.0 + * + * 删除指定选项卡 + * + * @param id 编号 + */ + tabPage.prototype.removeTab = function (id) { + var elem = this.option.elem; + if (id != undefined) { + var currentTab = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title [lay-id='" + id + "']"); + if (currentTab.find("span").is(".able-close")) { + tabDelete(elem, id, () => { + }); + } + } else { + var tabtitle = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li"); + $.each(tabtitle, function () { + if ($(this).find("span").is(".able-close")) { + tabDelete(elem, $(this).attr("lay-id"), () => { + }); + } + }) + } + } + + /** + * @since Pear Admin 4.0 + * + * 删除其他选项卡 + */ + tabPage.prototype.removeOtherTab = function () { + var elem = this.option.elem; + var currentId = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title .layui-this").attr("lay-id"); + var tabtitle = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li"); + $.each(tabtitle, function () { + if ($(this).attr("lay-id") != currentId) { + if ($(this).find("span").is(".able-close")) { + tabDelete(elem, $(this).attr("lay-id"), () => { + }); + } + } + }) + } + + /** + * @since Pear Admin 4.0 + * + * 删除选中选项卡 + */ + tabPage.prototype.removeCurrentTab = function () { + var currentTab = $(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title .layui-this"); + if (currentTab.find("span").is(".able-close")) { + var currentId = currentTab.attr("lay-id"); + tabDelete(this.option.elem, currentId, () => { + }); + } + } + + /** + * @since Pear Admin 4.0 + * + * 切换选项卡 + * + * @param opt 内容 + */ + tabPage.prototype.changePage = function (opt) { + + var title = ` + ${opt.title} + `; + + if ($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]").length <= + 0) { + + var that = this; + + if (opt.type === "_iframe") { + + element.tabAdd(this.option.elem, { + id: opt.id, + title: title, + content: `` + }); + + } else { + + $.ajax({ + url: opt.url, + type: 'get', + dataType: 'html', + async: false, + success: function (data) { + element.tabAdd(that.option.elem, { + id: opt.id, + title: title, + content: `
            ${data}
            `, + }); + }, + error: function (xhr, textstatus, thrown) { + return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!'); + } + }); + } + + tabData.push(opt); + sessionStorage.setItem(that.option.elem + "-pear-tab-page-data", JSON.stringify(tabData)); + sessionStorage.setItem(that.option.elem + "-pear-tab-page-data-current", opt.id); + + } else { + + var isData = false; + $.each($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]"), + function () { + if ($(this).attr("lay-id") == opt.id) { + isData = true; + } + }) + + if (isData == false) { + + if (this.option.tabMax != false) { + if ($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]") + .length >= this.option.tabMax) { + layer.msg("最多打开" + this.option.tabMax + "个标签页", { + icon: 2, + time: 1000, + shift: 6 + }); + return false; + } + } + + var that = this; + if (opt.type === "_iframe") { + element.tabAdd(this.option.elem, { + id: opt.id, + title: title, + content: `` + }); + } else { + $.ajax({ + url: opt.url, + type: 'get', + dataType: 'html', + async: false, + success: function (data) { + element.tabAdd(that.option.elem, { + id: opt.id, + title: title, + content: `
            ${data}
            `, + }); + }, + error: function (xhr, textstatus, thrown) { + return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!'); + } + }); + } + tabData.push(opt); + sessionStorage.setItem(that.option.elem + "-pear-tab-page-data", JSON.stringify(tabData)); + sessionStorage.setItem(that.option.elem + "-pear-tab-page-data-current", opt.id); + } + } + element.tabChange(this.option.elem, opt.id); + sessionStorage.setItem(this.option.elem + "-pear-tab-page-data-current", opt.id); + } + + /** + * 刷新当前选型卡 + * + * @param time 动画时长 + */ + tabPage.prototype.refresh = function (time) { + + var $iframe = $(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-content .layui-show > *"); + var $iframeLoad; + + if (time != false && time != 0) { + $iframeLoad = $("#" + this.option.elem).find(".pear-tab-page-loading"); + $iframeLoad.css({ + display: "block" + }); + } + + if ($iframe.attr("type") === "_iframe") { + $iframe.attr("src", $iframe.attr("src")); + $iframe.on("load", function () { + $iframeLoad.fadeOut(1000, function () { + $iframeLoad.css({ + display: "none" + }); + }); + }) + } else { + $.ajax({ + url: $iframe.attr("src"), + type: 'get', + dataType: 'html', + success: function (data) { + $iframe.html(data); + if ($iframeLoad != undefined) { + $iframeLoad.fadeOut(1000, function () { + $iframeLoad.css({ + display: "none" + }); + }); + } + }, + error: function (xhr) { + return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!'); + } + }); + } + } + + function tabDelete(elem, id, callback) { + var tabTitle = $(".layui-tab[lay-filter='" + elem + "']").find(".layui-tab-title"); + var removeTab = tabTitle.find("li[lay-id='" + id + "']"); + var nextNode = removeTab.next("li"); + if (!removeTab.hasClass("layui-this")) { + removeTab.remove(); + var tabContent = $(".layui-tab[lay-filter='" + elem + "']").find("*[id='" + id + "']") + .parent(); + tabContent.remove(); + + tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-page-data")); + tabDataCurrent = sessionStorage.getItem(elem + "-pear-tab-page-data-current"); + tabData = tabData.filter(function (item) { + return item.id != id; + }) + sessionStorage.setItem(elem + "-pear-tab-page-data", JSON.stringify(tabData)); + return false; + } + + var currId; + if (nextNode.length) { + nextNode.addClass("layui-this"); + currId = nextNode.attr("lay-id"); + $("#" + elem + " [id='" + currId + "']").parent().addClass("layui-show"); + } else { + var prevNode = removeTab.prev("li"); + prevNode.addClass("layui-this"); + currId = prevNode.attr("lay-id"); + $("#" + elem + " [id='" + currId + "']").parent().addClass("layui-show"); + } + callback(currId); + tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-page-data")); + tabDataCurrent = sessionStorage.getItem(elem + "-pear-tab-page-data-current"); + tabData = tabData.filter(function (item) { + return item.id != id; + }) + sessionStorage.setItem(elem + "-pear-tab-page-data", JSON.stringify(tabData)); + sessionStorage.setItem(elem + "-pear-tab-page-data-current", currId); + removeTab.remove(); + var tabContent = $(".layui-tab[lay-filter='" + elem + "']").find("*[id='" + id + "']").parent(); + tabContent.remove(); + } + + /** + * @since Pear Admin 4.0 + */ + function createTab(option) { + + var type = ""; + if (option.roll == true) { + type = "layui-tab-roll"; + } + if (option.tool != false) { + type = "layui-tab-tool"; + } + if (option.roll == true && option.tool != false) { + type = "layui-tab-rollTool"; + } + var tab = '
            '; + + var headers = '
              '; + var content = '
              '; + var loading = '
              ' + var control = `
              +
            • +
            • +
            • +
              `; + + // 处 理 选 项 卡 头 部 + var index = 0; + + $.each(option.data, function (i, item) { + + var titleItem = `
            • + + + ${item.title} + +
            • + `; + + headers += titleItem; + + if (item.type === "_iframe") { + + content += `
              ` + + } else { + + $.ajax({ + url: item.url, + type: 'get', + dataType: 'html', + async: false, + success: function (data) { + content += `
              ${data}
              `; + }, + error: function (xhr) { + return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!'); + } + }); + } + + index++; + }); + + headers += '
            '; + content += '
            '; + + tab += headers; + tab += control; + tab += content; + tab += loading; + tab += ''; + tab += '' + return tab; + } + + function rollPage(d, option) { + var $tabTitle = $('#' + option.elem + ' .layui-tab-title'); + var left = $tabTitle.scrollLeft(); + if ('left' === d) { + $tabTitle.animate({ + scrollLeft: left - 450 + }, 200); + } else { + $tabTitle.animate({ + scrollLeft: left + 450 + }, 200); + } + } + + function closeEvent(option) { + $(".layui-tab[lay-filter='" + option.elem + "']") + .on("click", ".layui-tab-close", function () { + var layid = $(this).parent().attr("lay-id"); + tabDelete(option.elem, layid, option.closeEvent, option); + }) + .on("mousedown", ".layui-tab-title li", function (e) { + if (e.buttons === 4 && $(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option); + } + }); + } + + function menuEvent(option, index) { + + $("#" + option.elem + "closeThis").click(function () { + var currentTab = contextTabDOM; + + if (currentTab.find("span").is(".able-close")) { + var currentId = currentTab.attr("lay-id"); + tabDelete(option.elem, currentId, option.closeEvent, option); + } else { + layer.msg("当前页面不允许关闭", { + icon: 3, + time: 800 + }) + } + layer.close(index); + }) + + $("#" + option.elem + "closeOther").click(function () { + var currentId = contextTabDOM.attr("lay-id"); + var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); + $.each(tabtitle, function (i) { + if ($(this).attr("lay-id") != currentId) { + if ($(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, + option); + } + } + }) + layer.close(index); + }) + + $("#" + option.elem + "closeAll").click(function () { + var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); + $.each(tabtitle, function (i) { + if ($(this).find("span").is(".able-close")) { + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option); + } + }) + layer.close(index); + }) + } + + function mousewheelAndTouchmoveHandler(option) { + var $bodyTab = $("body .layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title") + var $tabTitle = $('#' + option.elem + ' .layui-tab-title'); + var mouseScrollStep = 100 + // 鼠标滚轮 + $bodyTab.on("mousewheel DOMMouseScroll", function (e) { + e.originalEvent.preventDefault() + var delta = (e.originalEvent.wheelDelta && (e.originalEvent.wheelDelta > 0 ? "top" : + "down")) || // chrome & ie + (e.originalEvent.detail && (e.originalEvent.detail > 0 ? "down" : "top")); // firefox + var scrollLeft = $tabTitle.scrollLeft(); + + if (delta === "top") { + scrollLeft -= mouseScrollStep + } else if (delta === "down") { + scrollLeft += mouseScrollStep + } + $tabTitle.scrollLeft(scrollLeft) + }); + + // 触摸移动 + var touchX = 0; + $bodyTab.on("touchstart", function (e) { + var touch = e.originalEvent.targetTouches[0]; + touchX = touch.pageX + }) + + $bodyTab.on("touchmove", function (e) { + var event = e.originalEvent; + if (event.targetTouches.length > 1) return; + event.preventDefault(); + var touch = event.targetTouches[0]; + var distanceX = touchX - touch.pageX + var scrollLeft = $tabTitle.scrollLeft(); + touchX = touch.pageX + $tabTitle.scrollLeft(scrollLeft += distanceX) + }); + } + + exports(MOD_NAME, new tabPage()); +}) diff --git a/static/component/pear/module/tools.js b/static/component/pear/module/tools.js new file mode 100644 index 0000000..e8159fc --- /dev/null +++ b/static/component/pear/module/tools.js @@ -0,0 +1,40 @@ +layui.define(['jquery', 'element'], + function (exports) { + + var $ = layui.jquery; + var tools = new function () { + + /** + * @since 防抖算法 + * + * @param fn 要执行的方法 + * @param time 防抖时间参数 + */ + this.debounce = function (fn, time) { + var timer = null + return function () { + var arguments = arguments[0] + if (timer) { + clearTimeout(timer) + } + timer = setTimeout(function () { + fn(arguments) + }, time) + } + } + + // image 转 base64 + this.imageToBase64 = function (img) { + var canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0, img.width, img.height); + var ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase(); + var dataURL = canvas.toDataURL("image/" + ext); + return dataURL; + } + }; + + exports('tools', tools); + }) diff --git a/static/component/pear/pear.js b/static/component/pear/pear.js new file mode 100644 index 0000000..30570a6 --- /dev/null +++ b/static/component/pear/pear.js @@ -0,0 +1,29 @@ +window.rootPath = (function (src) { + src = document.currentScript + ? document.currentScript.src + : document.scripts[document.scripts.length - 1].src; + return src.substring(0, src.lastIndexOf("/") + 1); +})(); + +layui.config({ + base: rootPath + "module/", + version: "4.0.3" +}).extend({ + admin: "admin", + page: "page", + tabPage: "tabPage", + menu: "menu", + fullscreen: "fullscreen", + messageCenter: "messageCenter", + menuSearch: "menuSearch", + button: "button", + tools: "tools", + popup: "extends/popup", + count: "extends/count", + toast: "extends/toast", + nprogress: "extends/nprogress", + echarts: "extends/echarts", + echartsTheme: "extends/echartsTheme", + yaml: "extends/yaml" +}).use([], function () { +}); \ No newline at end of file diff --git a/views/login.html b/views/login.html index da18fa5..17e6f84 100644 --- a/views/login.html +++ b/views/login.html @@ -1,132 +1,162 @@ - - - - - - - + - - 管理后台系统 - - - - + + 登录 + + + + -
            -
            + + + + - - \ No newline at end of file + diff --git a/views/login_bak.html b/views/login_bak.html new file mode 100644 index 0000000..89e5f39 --- /dev/null +++ b/views/login_bak.html @@ -0,0 +1,129 @@ + + + + + + + + + + + + 管理后台系统 + + + + + + + +
            + +
            + + + + \ No newline at end of file

            DxQ`v5c13}sM4y6;8RZ5(9J1Q4m0En= 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ζYS0K7u`k6klSe{Zl!|6+%R9ObxT2UTD}$`40( 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 ?7o=22wHK4cDWYX8-K| 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