diff options
Diffstat (limited to 'ecomp-sdk')
17 files changed, 1784 insertions, 821 deletions
diff --git a/ecomp-sdk/epsdk-app-overlay/README.md b/ecomp-sdk/epsdk-app-overlay/README.md index 174d4458..affe1b9c 100644 --- a/ecomp-sdk/epsdk-app-overlay/README.md +++ b/ecomp-sdk/epsdk-app-overlay/README.md @@ -18,7 +18,8 @@ AngularJS version 1.5.0. ### OpenECOMP Distributions Version 1.1.0 -- [Portal-7] Improvements added as part of the rebasing process - +[Portal-7] Improvements added as part of the rebasing process +[Portal-10] Enhancing Drill Down Capabilities of EcompSDK Analytics + Version 1.0.0 - Initial release diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/css/b2b-angular/b2b-angular.css b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/css/b2b-angular/b2b-angular.css index d1246179..69f8d96d 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/css/b2b-angular/b2b-angular.css +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/css/b2b-angular/b2b-angular.css @@ -1,48 +1,41 @@ -/*! b2b-angular-library - v1.0.1 - Last updated: 2017-03-02. Copyright (c) 2016 AT&T Services, Inc. */ -.b2b-horizontal-table { - border: 1px solid; - width: 651px; } - .b2b-horizontal-table ::-webkit-scrollbar { - height: 10px; } - .b2b-horizontal-table ::-webkit-scrollbar-thumb { - background: #666666; - border-radius: 5px; } - .b2b-horizontal-table .b2b-horizontal-table-inner-container { - width: 650px; - padding-left: 150px; - overflow-x: scroll; } - .b2b-horizontal-table th:first-child { - background-color: #FFFFFF; } - .b2b-horizontal-table td:first-child { - background-color: #FFFFFF; - border-top: 1px solid #cccccc; - border-right: 1px solid #cccccc; - margin-top: -0.5px; } - .b2b-horizontal-table tr th:nth-child(2), .b2b-horizontal-table tr td:nth-child(2) { - border-left: none; } - .b2b-horizontal-table .b2b-horizontal-table-column-info { - padding-top: 16px; - text-align: center; } - .b2b-horizontal-table .b2b-horizontal-table-arrows .btn-arrow:hover, .b2b-horizontal-table .b2b-horizontal-table-arrows .btn-arrow:focus { - text-decoration: none; } - .b2b-horizontal-table .b2b-horizontal-table-arrows .left { - float: left; - margin: 10px; - color: #0568ae; } - .b2b-horizontal-table .b2b-horizontal-table-arrows .left[disabled] { - color: #767676; - cursor: not-allowed; } - .b2b-horizontal-table .b2b-horizontal-table-arrows .right { - float: right; - clear: right; - margin: 10px; - color: #0568ae; } - .b2b-horizontal-table .b2b-horizontal-table-arrows .right[disabled] { - color: #767676; - cursor: not-allowed; } - .b2b-horizontal-table .b2b-horizontal-table-arrows .right.btn-arrow .btn { - margin-right: 0; - margin-left: 10px; } +/*! b2b-angular-library - v1.0.4 - Last updated: 2017-05-03. Copyright (c) 2016 AT&T Services, Inc. */ +.b2b-horizontal-table ::-webkit-scrollbar { + height: 10px; } + +.b2b-horizontal-table ::-webkit-scrollbar-thumb { + background: #666666; + border-radius: 5px; } + +.b2b-horizontal-table .b2b-frozen-col { + font-size: 12px; + font-weight: normal; + font-style: italic; } + +.b2b-horizontal-table .b2b-horizontal-table-inner-container { + overflow-x: scroll; } + +.b2b-horizontal-table .b2b-horizontal-table-column-info { + text-align: center; } + +.b2b-horizontal-table .b2b-horizontal-table-legend div[b2b-flyout-toggler] { + color: #0568ae; + cursor: pointer; } + +.b2b-horizontal-table .b2b-horizontal-table-legend .b2b-frozen-cell { + width: 16px; + height: 16px; + background-color: #F2F2F2; + display: inline-block; + margin-right: 10px; } + +.b2b-horizontal-table .b2b-horizontal-table-arrows { + margin-bottom: 20px; } + .b2b-horizontal-table .b2b-horizontal-table-arrows .b2b-disabled-text { + color: #767676; } + .b2b-horizontal-table .b2b-horizontal-table-arrows .b2b-next-link { + padding-right: 15px; } + .b2b-horizontal-table .b2b-horizontal-table-arrows .b2b-prev-link { + padding-left: 15px; } @-moz-document url-prefix() { .b2b-horizontal-table td:first-child { @@ -193,57 +186,57 @@ small { @font-face { font-family: "Omnes-ECOMP-W02"; - src: url("fonts/Omnes_ATTW02.eot"); - src: url("fonts/Omnes_ATTW02.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02.woff") format("woff"), url("fonts/Omnes_ATTW02.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Medium"; - src: url("fonts/Omnes_ATTW02Medium.eot"); - src: url("fonts/Omnes_ATTW02Medium.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Medium.woff") format("woff"), url("fonts/Omnes_ATTW02Medium.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Medium.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Medium.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Medium.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Medium.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Italic"; - src: url("fonts/Omnes_ATTW02Italic.eot"); - src: url("fonts/Omnes_ATTW02Italic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Italic.woff") format("woff"), url("fonts/Omnes_ATTW02Italic.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Italic.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Italic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Italic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Italic.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Light"; - src: url("fonts/Omnes_ATTW02Light.eot"); - src: url("fonts/Omnes_ATTW02Light.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Light.woff") format("woff"), url("fonts/Omnes_ATTW02Light.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Light.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Light.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Light.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Light.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Bold"; - src: url("fonts/Omnes_ATTW02Bold.eot"); - src: url("fonts/Omnes_ATTW02Bold.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Bold.woff") format("woff"), url("fonts/Omnes_ATTW02Bold.woff2") format("woff2"), url("fonts/Omnes_ATTW02Bold.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Bold.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Bold.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Light-Italic"; - src: url("fonts/Omnes_ATTW02LightItalic.eot"); - src: url("fonts/Omnes_ATTW02LightItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02LightItalic.woff") format("woff"), url("fonts/Omnes_ATTW02LightItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02LightItalic.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Medium-Italic"; - src: url("fonts/Omnes_ATTW02MediumItalic.eot"); - src: url("fonts/Omnes_ATTW02MediumItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02MediumItalic.woff") format("woff"), url("fonts/Omnes_ATTW02MediumItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02MediumItalic.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Bold-Italic"; - src: url("fonts/Omnes_ATTW02BoldItalic.eot"); - src: url("fonts/Omnes_ATTW02BoldItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02BoldItalic.woff") format("woff"), url("fonts/Omnes_ATTW02BoldItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02BoldItalic.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.ttf") format("truetype"); font-weight: normal; font-style: normal; } @@ -824,8 +817,8 @@ small { @font-face { font-family: 'icoPrimary'; - src: url("fonts/icons/icoPrimary.eot?timestamp=@@timestamp"); - src: url("fonts/icons/icoPrimary.eot?timestamp=@@timestamp#iefix") format("embedded-opentype"), url("data:font/woff2; charset=utf-8;base64,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") format("woff2"), url("data:application/font-woff; charset=utf-8;base64,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") format("woff"), url("fonts/icons/icoPrimary.ttf?timestamp=@@timestamp") format("truetype"); + src: url("../b2b-angular/fonts/icons/icoPrimary.eot?timestamp=@@timestamp"); + src: url("../b2b-angular/fonts/icons/icoPrimary.eot?timestamp=@@timestamp#iefix") format("embedded-opentype"), url("data:font/woff2; charset=utf-8;base64,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") format("woff2"), url("data:application/font-woff; charset=utf-8;base64,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") format("woff"), url("../b2b-angular/fonts/icons/icoPrimary.ttf?timestamp=@@timestamp") format("truetype"); font-weight: normal; font-style: normal; } @@ -864,6 +857,27 @@ small { vertical-align: middle; width: 1em; } +[class*="icoWeather-"],[class*="icoTrans-"],[class*="icoBubble-"],[class*="icoRetail-"],[class*="icoPeople-"],[class*="icoNumslets-"],[class*="icoLocation-"],[class*="icoHealthcare-"],[class*="icoDocuments-"],[class*="icoDevices-"],[class*="icoDatanetwork-"],[class*="icoControls-"],[class*="icoBuilding-"],[class*="icoArrows-"]{ + color: #0568ae; + display: inline-block; + font-size: 20px; + font-weight: normal; + font-variant: normal; + font-style: normal; + width: 20px; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + position: relative; + speak: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + vertical-align: middle; + } + [class*="icon-primary-"]:before, [class*="icon-primary-"]:after { box-sizing: border-box; @@ -1067,16 +1081,16 @@ small { margin-left: -1em; position: absolute; } -[class*="icon-primary-"].white { +[class*="icon-primary-"].white, [class^="ico"][class*="-"].white { color: #fff; } -[class*="icon-primary-"].black { +[class*="icon-primary-"].black, [class^="ico"][class*="-"].black { color: #000; } -[class*="icon-primary-"].blue { +[class*="icon-primary-"].blue, [class^="ico"][class*="-"].blue { color: #0568ae; } -[class*="icon-primary-"].green { +[class*="icon-primary-"].green, [class^="ico"][class*="-"].green { color: #007a3e; } @-webkit-viewport { @@ -1458,7 +1472,7 @@ h6 { .heading-small { font-size: 1.8rem !important; - font-family: "Omnes-ECOMP-W02"; + font-family: "Omnes-ECOMP-W02", Arial; margin-bottom: 20px; } .heading-small-emphasis { @@ -1468,7 +1482,7 @@ h6 { .heading-micro { font-size: 1.3rem !important; - font-family: "Omnes-ECOMP-W02-Medium", Arial + font-family: "Omnes-ECOMP-W02-Medium", Arial; text-transform: uppercase; color: #da0081; margin-bottom: 10px; } @@ -1499,7 +1513,7 @@ h6 { .lead { color: #666; - font-family: "Omnes-ECOMP-W02-Light-Italic", Arial + font-family: "Omnes-ECOMP-W02-Light-Italic", Arial; font-size: 2.4rem; line-height: 2.8rem; margin-top: 10px; @@ -1512,7 +1526,7 @@ h6 { .eyebrow, .subheading { font-size: 1.4rem !important; - font-family: "Omnes-ECOMP-W02-Medium", Arial + font-family: "Omnes-ECOMP-W02-Medium", Arial; color: #666; } .eyebrow + .heading-major-section, @@ -1531,11 +1545,11 @@ h6 { h6, .heading-page { font-size: 2rem; - font-family: "Omnes-ECOMP-W02", Arial + font-family: "Omnes-ECOMP-W02", Arial; margin-bottom: 30px; } .heading-major-section { font-size: 2rem; - font-family: "Omnes-ECOMP-W02", Arial + font-family: "Omnes-ECOMP-W02", Arial; margin-bottom: 30px; } .heading-sub-section { font-size: 2rem; @@ -1659,7 +1673,7 @@ p + .p-max { b, strong { - font-family: "Omnes-ECOMP-W02-Medium"; + font-family: "Omnes-ECOMP-W02-Medium", Arial; font-weight: normal; } i, @@ -2717,6 +2731,14 @@ button.close { .ds2_touchevents textarea.hasScrollbar:focus + .reset-field { right: 22px; } +.ds2-no-colors .b2b-tmpl-card-corner-button { + border: none !important; } + +.ds2-no-colors .b2b-tmpl-card-corner-button .close { + border: 1px solid black; + top: 0px !important; + right: 0px !important; } + .form-row.error .error-msg { display: block; font-size: 14px; @@ -2972,13 +2994,13 @@ select[disabled], select[readonly], textarea[disabled], textarea[readonly], -span.icon-primary-calendar.disabled, +i.icon-primary-calendar.disabled, span.icon-primary-calendar.readonly { cursor: not-allowed; background-color: #f2f2f2; box-shadow: none; } -span.icon-primary-calendar.disabled input, +i.icon-primary-calendar.disabled input, span.icon-primary-calendar.readonly input { color: #959595 !important; } @@ -3080,24 +3102,22 @@ legend + .form-row { .ds2_touchevents .tooltip-onclick input:focus { padding-right: 95px; } -span.icon-primary-calendar { - display: block; - position: relative; - background-color: #fff; - border-radius: 4px; - overflow: hidden; - height: 36px; } +.btn-calendar-icon { + position: absolute; + background-color: transparent !important; + top: 8px; + border: 0 !important; + width: 30px; + right: 15px; } -span.icon-primary-calendar:before { +.btn-calendar-icon .icon-primary-calendar:before { position: absolute; - top: 7px; - left: 13px; color: #0568ae; } -span.icon-primary-calendar.disabled { +.btn-calendar-icon .icon-primary-calendar.disabled { background-color: #f2f2f2; } -span.icon-primary-calendar.disabled:before { +.btn-calendar-icon .icon-primary-calendar.disabled:before { color: #959595; } span.icon-primary-calendar input { @@ -4077,7 +4097,7 @@ hr.bottom-space-only { height: 18px; } .b2b-badge { - font-family: "Omnes-ECOMP-W02-Medium"; + font-family: "Omnes-ECOMP-W02-Medium", Arial; background-color: #5A5A5A; border-radius: 12px; color: #FFFFFF; @@ -4929,7 +4949,7 @@ a > .b2b-badge { display: block; } .show-date { - font-family: "Omnes-ECOMP-W02-Medium"; + font-family: "Omnes-ECOMP-W02-Medium", Arial; color: #0568ae; height: 26px; line-height: 26px; @@ -5217,7 +5237,7 @@ a > .b2b-badge { .datepicker-dropdown.datepicker-orient-left:before, .datepicker-dropdown.datepicker-orient-left:after { - left: 16px; } + left: 255px; } .datepicker-dropdown.datepicker-orient-right:before, .datepicker-dropdown.datepicker-orient-right:after { @@ -5705,6 +5725,15 @@ a > .b2b-badge { .j { background-position: 0 0; } +.datepicker-container { + position: relative; } + +.btn-calendar-icon:focus .icon-primary-calendar { + outline: 1px dotted #191919; } + +.btn-calendar-icon:focus { + outline: none; } + /* remove focus outline when dropdown is opened */ /*resolve blue focus outline over dropdown with error*/ select { @@ -5725,7 +5754,7 @@ select { .selectWrap.disabled button.awd-select { z-index: 0; - text-indent: 15; } + text-indent: 15px; } .selectWrap.disabled:after { color: #5A5A5A; @@ -5743,7 +5772,6 @@ input.awd-select { height: 36px; line-height: 0; margin-bottom: 0; - padding: 12px 45px 8px 0; position: relative; text-align: left; top: 0; @@ -5752,7 +5780,9 @@ input.awd-select { padding: 12px 45px 8px 15px; user-select: none; } input.awd-select:focus { - border-color: #0568ae !important; } + border-color: #0568ae !important; + text-overflow: ellipsis; + padding-right: 45px; } button.awd-select { background-color: transparent; @@ -5766,7 +5796,6 @@ button.awd-select { height: 36px; line-height: 36px; margin-bottom: 0; - /*padding-right: 41px;*/ position: relative; text-align: left; top: 0; @@ -5864,12 +5893,10 @@ span.selectWrap input[readonly]:focus { cursor: pointer; height: 100%; min-height: 36px; - line-height: 38px; + line-height: 20px; overflow: hidden; - padding: 0 15px; + padding: 8px 15px; position: relative; - text-overflow: ellipsis; - white-space: nowrap; z-index: 1000; } .awd-select-list-item:hover { cursor: pointer; @@ -5909,7 +5936,7 @@ span.selectWrap input[readonly]:focus { padding-bottom: 9px; padding-top: 20px; } -.awd-select-list-item[aria-selected="true"] { +.awd-select-list-item[data-hover="true"] { background-color: #d2d2d2; } span input.awd-select { @@ -6240,12 +6267,6 @@ input.awd-select { -ms-user-select: text; user-select: text; } -input.awd-select.focused { - -webkit-user-select: none !important; - -moz-user-select: none !important; - -ms-user-select: none !important; - user-select: none !important; } - /**********************Dropdown Chrome scrolling fix end ********************/ .mpc-expanders { border-bottom: 1px solid #e4e4e4; @@ -6903,7 +6924,7 @@ input.awd-select.focused { .b2b-header-tabs .selectWrap button.awd-select, .b2b-header-tabs .selectWrap input.awd-select { height: 36px; - line-height: 8px; + line-height: 31px; font-size: 1rem; display: inline-block; } @@ -6932,7 +6953,7 @@ input.awd-select.focused { top: 20px; } .b2b-header-tabs { height: 90px; } - .selectWrap { + .header__item .selectWrap { bottom: 15px; } .b2b-header-tabs .header__items { padding-top: 25px; } @@ -6999,78 +7020,78 @@ input.awd-select.focused { @font-face { font-family: "Omnes-ECOMP-W02"; - src: url("fonts/Omnes_ATTW02.eot"); - src: url("fonts/Omnes_ATTW02.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02.woff") format("woff"), url("fonts/Omnes_ATTW02.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Medium"; - src: url("fonts/Omnes_ATTW02Medium.eot"); - src: url("fonts/Omnes_ATTW02Medium.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Medium.woff") format("woff"), url("fonts/Omnes_ATTW02Medium.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Medium.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Medium.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Medium.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Medium.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Italic"; - src: url("fonts/Omnes_ATTW02Italic.eot"); - src: url("fonts/Omnes_ATTW02Italic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Italic.woff") format("woff"), url("fonts/Omnes_ATTW02Italic.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Italic.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Italic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Italic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Italic.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Light"; - src: url("fonts/Omnes_ATTW02Light.eot"); - src: url("fonts/Omnes_ATTW02Light.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Light.woff") format("woff"), url("fonts/Omnes_ATTW02Light.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Light.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Light.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Light.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Light.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Bold"; - src: url("fonts/Omnes_ATTW02Bold.eot"); - src: url("fonts/Omnes_ATTW02Bold.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Bold.woff") format("woff"), url("fonts/Omnes_ATTW02Bold.woff2") format("woff2"), url("fonts/Omnes_ATTW02Bold.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Bold.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02Bold.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Light-Italic"; - src: url("fonts/Omnes_ATTW02LightItalic.eot"); - src: url("fonts/Omnes_ATTW02LightItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02LightItalic.woff") format("woff"), url("fonts/Omnes_ATTW02LightItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02LightItalic.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Medium-Italic"; - src: url("fonts/Omnes_ATTW02MediumItalic.eot"); - src: url("fonts/Omnes_ATTW02MediumItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02MediumItalic.woff") format("woff"), url("fonts/Omnes_ATTW02MediumItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02MediumItalic.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "Omnes-ECOMP-W02-Bold-Italic"; - src: url("fonts/Omnes_ATTW02BoldItalic.eot"); - src: url("fonts/Omnes_ATTW02BoldItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02BoldItalic.woff") format("woff"), url("fonts/Omnes_ATTW02BoldItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02BoldItalic.ttf") format("truetype"); + src: url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.eot"); + src: url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.ttf") format("truetype"); font-weight: normal; font-style: normal; } /* TODO: Build a reference page for these classes */ .font-regular { - font-family: "Omnes-ECOMP-W02" !important; } + font-family: "Omnes-ECOMP-W02", Arial !important; } .font-light { - font-family: "Omnes-ECOMP-W02-Light" !important; } + font-family: "Omnes-ECOMP-W02-Light", Arial !important; } .font-italic { - font-family: "Omnes-ECOMP-W02-Italic" !important; } + font-family: "Omnes-ECOMP-W02-Italic", Arial !important; } .font-light-italic { - font-family: "Omnes-ECOMP-W02-Light-Italic" !important; } + font-family: "Omnes-ECOMP-W02-Light-Italic", Arial !important; } .font-medium { - font-family: "Omnes-ECOMP-W02-Medium" !important; } + font-family: "Omnes-ECOMP-W02-Medium", Arial !important; } .font-medium-italic { - font-family: "Omnes-ECOMP-W02-Medium-Italic" !important; } + font-family: "Omnes-ECOMP-W02-Medium-Italic", Arial !important; } .font-reset { font-style: normal; @@ -7208,6 +7229,14 @@ input.awd-select.focused { top: 50%; left: 50%; } +.small-modal-loader { + width: 420px !important; + height: 212px !important; + text-align: center; } + +.small-modal-loader .icon-primary-spinner { + margin-bottom: 5px; } + .body.styled-by-modal { position: fixed; } @@ -7333,9 +7362,6 @@ input.awd-select.focused { :not(.modal-docked) .b2b-modal-footer { position: relative; } -.modal-docked .b2b-modal-footer { - border-top: 1px solid #d2d2d2; } - .modal-landscape .b2b-modal-footer { position: relative; } @@ -7343,7 +7369,8 @@ input.awd-select.focused { display: flex; justify-content: flex-end; padding: 20px 0 5px; - width: 100%; } + width: 100%; + border-top: 1px solid #d2d2d2; } .b2b-modal-footer .cta-button-group .btn { margin-left: auto; @@ -7523,7 +7550,7 @@ input.awd-select.focused { padding: 0 0 5px 30px; line-height: 22px; margin-left: -10px; - color: #333; + color: #0568ae; font-size: 1.4rem; } .b2b-ml-nav a:focus { @@ -7558,9 +7585,6 @@ input.awd-select.focused { .b2b-ml-nav a > span > i { font-size: 20px; } -.b2b-ml-nav a:only-child { - color: #0574ac; } - .b2b-ml-nav a:only-child > span { left: -6px; border-radius: 50%; @@ -7584,6 +7608,9 @@ input.awd-select.focused { .b2b-ml-nav li a.active + ul { display: block; } +.b2b-ml-nav .selected { + color: #333; } + /*to overide ng-doc inline property for library demo - TODO: Move to docs.css*/ .b2b-ml-nav a [class^="icon-primary-"], a [class*=" icon-primary-"], a [class^="icon-primary-"]:before, a [class*=" icon-primary-"]:before { display: inline-block; } @@ -7595,7 +7622,10 @@ input.awd-select.focused { .b2b-alerts-messages h3 { color: #333 !important; font-family: "Omnes-ECOMP-W02-Medium", Arial; - margin-bottom: 0 !important; } + margin-bottom: 0 !important; + margin: 1em 0 5px; + line-height: 27px; + font-size: 18px;} .b2b-alerts-messages h4 { color: #333 !important; font-family: "Omnes-ECOMP-W02-Medium", Arial; @@ -7764,7 +7794,7 @@ a.pager__item--next:focus, a.pager__item--prev:focus { font-size: 1.6rem; margin-top: 20px; display: inline-block; - font-family: "Omnes-ECOMP-w02-medium", Arial; } + font-family: "Omnes-ECOMP-W02-Medium", Arial; } .mobile-view > .pager__item { margin: 5px 10px; @@ -8736,7 +8766,8 @@ ul.module-optinalcta { width: 100%; height: 6px; background-color: #cccccc; - border-radius: 10px; } + border-radius: 10px; + border: 1px solid #cccccc; } .b2b-slider-container .slider-track-fill { width: 100%; height: 6px; @@ -8744,7 +8775,8 @@ ul.module-optinalcta { border-radius: 10px; width: 0; background-color: #157BB2; - transition: width 0s linear; } + transition: width 0s linear; + border: 1px solid #cccccc; } .b2b-slider-container .slider-knob-container { transition: left 0s linear; } .b2b-slider-container .slider-knob-container.slider-knob-hidden { @@ -8854,36 +8886,46 @@ ul.module-optinalcta { margin-left: 5px; } .b2b-status-tracker > .b2b-status-tracker-step .b2b-status-tracker-heading { - font-family: "Omnes-ECOMP-W02", Arial; + font-family: "Omnes-ECOMP-W02-Medium", Arial; font-size: 14px; - color: #767676; + color: #191919; margin-bottom: 10px; } -.b2b-status-tracker > .b2b-status-tracker-step.complete > .b2b-status-tracker-heading { - font-family: "Omnes-ECOMP-W02-Medium", Arial; - color: #1b7e28; } - .b2b-status-tracker > .b2b-status-tracker-step.complete > .progress > .progress-bar { width: 100%; background-color: #1b7e28; } -.b2b-status-tracker > .b2b-status-tracker-step.complete > .b2b-status-tracker-estimate { - font-family: "Omnes-ECOMP-W02-Medium", Arial; - color: #333333; } - .b2b-status-tracker > .b2b-status-tracker-step.complete > .b2b-status-tracker-estimate > .icoControls-approval { - color: #1b7e28; } - -.b2b-status-tracker > .b2b-status-tracker-step.current > .b2b-status-tracker-heading { - font-family: "Omnes-ECOMP-W02-Medium", Arial; - color: #333333; } +.b2b-status-tracker > .b2b-status-tracker-step.complete .icoControls-approval { + color: #1b7e28; } .b2b-status-tracker > .b2b-status-tracker-step.current > .progress > .progress-bar { width: 100%; background-color: #333333; } -.b2b-status-tracker > .b2b-status-tracker-step.current > .b2b-status-tracker-estimate > .icon-misc-time { +.b2b-status-tracker > .b2b-status-tracker-step.current .icon-misc-time { color: #333333; } +.b2b-status-tracker > .b2b-status-tracker-step.pending > .progress > .progress-bar { + width: 100%; + background-color: #ffb81c; } + +.b2b-status-tracker > .b2b-status-tracker-step.pending .icoControls-statusokay { + color: #ffb81c; } + +.b2b-status-tracker > .b2b-status-tracker-step.actionRequired > .progress > .progress-bar { + width: 100%; + background-color: #cf2a2a; } + +.b2b-status-tracker > .b2b-status-tracker-step.actionRequired .icon-primary-securityalerts-alert { + color: #cf2a2a; } + +.b2b-status-tracker > .b2b-status-tracker-step.notAvailable > .progress > .progress-bar { + width: 100%; + background-color: #767676; } + +.b2b-status-tracker > .b2b-status-tracker-step.notAvailable .icoControls-restricted { + color: #767676; } + .b2b-status-tracker > .b2b-status-tracker-step > .progress { position: relative; border-radius: 1.5px; @@ -8895,18 +8937,18 @@ ul.module-optinalcta { height: 3px; } .b2b-status-tracker > .b2b-status-tracker-step > .b2b-status-tracker-estimate { - font-family: "Omnes-ECOMP-W02", Arial; + font-family: "Omnes-ECOMP-W02-Medium", Arial; font-size: 14px; - color: #767676; + color: #191919; margin-bottom: 10px; } - .b2b-status-tracker > .b2b-status-tracker-step > .b2b-status-tracker-estimate > .icon-misc-time { - color: #767676; } .b2b-status-tracker > .b2b-status-tracker-step > .b2b-status-tracker-description { font-family: "Omnes-ECOMP-W02", Arial; font-size: 12px; color: #767676; padding-right: 15px; } + .b2b-status-tracker > .b2b-status-tracker-step > .b2b-status-tracker-description a { + cursor: pointer; } .step-indicator { height: auto; @@ -9483,6 +9525,10 @@ ul.module-optinalcta { height: 16px; width: 16px; } +.btn-switch.focused { + outline: 1px dotted #000; + outline-offset: 5px; } + table { max-width: 100%; background-color: transparent; @@ -9701,7 +9747,6 @@ th:nth-child(8) { .b2b-table-div .selectWrap { width: 290px; position: relative; - left: 10px; display: inline-table; margin-bottom: 0px; } @@ -9713,7 +9758,11 @@ th:nth-child(8) { font-size: 36px; border: 1px solid #ccc; background: #FFF; - border-radius: 6px; } + border-radius: 6px; + text-align: center; + background: linear-gradient(#fcfcfc, #f2f2f2); + background-blend-mode: multiply; + width: 1em;} .b2b-external-sort-label { padding-bottom: 10px; } @@ -9725,8 +9774,17 @@ th:nth-child(8) { text-decoration: none; } .b2b-external-sort-label label { - position: relative; - left: 10px; } + position: relative; } + +.b2b-external-sort-margin { + margin-right: 13px !important; } + +.b2b-table-sorter-icon [class*="icoArrows-"]:before { + font-size: 20px; } + +@media screen and (max-width: 950px) { + .b2b-external-sort-margin .selectWrap { + bottom: 0px !important; } } .tablesorter-default .tablesorter-header.sorter-false .tablesorter-header-inner { background: 0 0; @@ -9862,7 +9920,8 @@ th:nth-child(8) { .b2b-table-scrollbar { border: 1px solid; - width: 651px; } + width: 651px; + position: relative; } .b2b-table-scrollbar .b2b-table-inner-container { width: 650px; padding-left: 150px; @@ -10154,7 +10213,8 @@ label .tooltip { bottom: 0; left: 0; opacity: 0; - transform: rotate(45deg); } + transform: rotate(45deg); + z-index: 20; } .tooltip.active .icon-primary-tooltip[data-placement="top"] .arrow { display: block; @@ -10348,7 +10408,7 @@ label .tooltip { border-left: 1px solid #ccc; } .b2b-tree ul li.bg > a { color: #333; - background-image: url("../style/images/treebg.png"); } + background-image: url("./style/images/treebg.png"); } .b2b-tree ul li .b2b-tree-tooltip { display: none; position: absolute; @@ -10667,7 +10727,7 @@ label .tooltip { .filter-selected > span, .filter-selected > a.clear-all-filters { - font-family: Omnes-ECOMP-W02-Medium; } + font-family: "Omnes-ECOMP-W02-Medium", Arial; } .filter-selected-group { padding-top: 15px; } @@ -10716,7 +10776,7 @@ label .tooltip { padding: 15px 20px 15px 0; color: #0574ac !important; cursor: pointer !important; - font-family: "Omnes-ECOMP-W02" !important; + font-family: "Omnes-ECOMP-W02", Arial !important; outline-offset: inherit !important; position: relative; height: auto; @@ -10939,7 +10999,7 @@ label .tooltip { /********************* Utility CSS Ends **********************/ /* Fix for alignment issue on Cancel link inside modal */ -.b2b-modal-footer > .cta-button-group { +.modal-footer > .cta-button-group { line-height: 40px; } /* .att-dark-green { // Not used @@ -11025,7 +11085,7 @@ button .colors-off-msg { } .fixed-230-subnav > li > a.live { color: #333333; - font-family: "Omnes-ECOMP-W02-Medium"; + font-family: "Omnes-ECOMP-W02-Medium", Arial; } .fixed-230-subnav a > i { right: 10px; @@ -11043,7 +11103,7 @@ button .colors-off-msg { } .fixed-230-subnav > li li > a.active { color: #333333; - font-family: "Omnes-ECOMP-W02-Medium"; + font-family: "Omnes-ECOMP-W02-Medium", Arial; text-decoration: none; } .fixed-230-subnav ul { @@ -11051,7 +11111,7 @@ button .colors-off-msg { } */ .unlinked { color: #0568ae !important; - font-family: "Omnes-ECOMP-W02" !important; } + font-family: "Omnes-ECOMP-W02", Arial !important; } .unlinked.active { color: inherit !important; } @@ -11094,7 +11154,7 @@ button .colors-off-msg { } .fixed-230-subnav > li li > a.active { color: inherit; - font-family: "Omnes-ECOMP-W02-Medium"; + font-family: "Omnes-ECOMP-W02-Medium", Arial; } } */ @keyframes DOMinsertion { @@ -11128,9 +11188,9 @@ button .colors-off-msg { outline-color: transparent; } } .ajaxed, -.modal.fade.in .b2b-modal-header, -.modal.fade.in .b2b-modal-body, -.modal.fade.in .b2b-modal-footer { +.modal.fade.in .modal-header, +.modal.fade.in .modal-body, +.modal.fade.in .modal-footer { animation-duration: 0.01s; -o-animation-duration: 0.01s; -ms-animation-duration: 0.01s; @@ -11237,13 +11297,6 @@ button .colors-off-msg { position: absolute; top: 0; z-index: 1; } - -.icon-primary-primary-circle:before { - background-image: url("data:image/svg+xml,%3Csvg%20baseProfile%3D%22tiny%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2036%2036%22%3E%3Ccircle%20fill%3D%22transparent%22%20stroke%3D%22%23666%22%20stroke-miterlimit%3D%2210%22%20cx%3D%2218%22%20cy%3D%2218%22%20r%3D%2216%22%2F%3E%3C%2Fsvg%3E"); - content: ""; - position: absolute; - top: 0; - z-index: 1; } /* Flyout inputs color is not aligned */ textarea, input { color: #333; } @@ -11480,30 +11533,38 @@ textarea, input { margin-left: -115px; margin-top: 100px; } -.b2b-directory-listing .btn-right { - margin-bottom: 15px !important; } - .b2b-directory-listing .btn-right:after { - content: " \27A1"; } - -.b2b-directory-listing .btn-left { - margin-top: 10px !important; } - .b2b-directory-listing .btn-remove { margin-right: auto !important; margin-bottom: 15px; } + .b2b-directory-listing .btn-remove i { + margin-right: 0; + color: #fff; + top: -1px; } .b2b-directory-listing .btn-remove-all { margin-top: 0; margin-bottom: 61px !important; /* need to be removed */ margin-right: auto !important; } + .b2b-directory-listing .btn-remove-all i { + margin-right: 0; + color: #fff; + top: -1px; } + +.b2b-directory-listing .btn-add { + margin-bottom: 15px !important; } + .b2b-directory-listing .btn-add i { + margin-right: 0; + color: #fff; + top: -1px; } .b2b-directory-listing .btn-add-all { margin-top: 0; margin-bottom: 61px !important; } - -.b2b-directory-listing .btn-left:before { - content: "\2B05 "; } + .b2b-directory-listing .btn-add-all i { + margin-right: 0; + color: #fff; + top: -1px; } .b2b-directory-listing .btn-search[class*="btn"] { right: 0.09rem; } @@ -11517,7 +11578,10 @@ textarea, input { .b2b-directory-listing-label-heading { margin-top: 24px; padding-bottom: 5px; } - +.b2b-directory-listing .center { + display: block; + margin: 2em auto; +} .b2b-dl-list-box option { padding-top: 13px; padding-bottom: 7px; @@ -11799,11 +11863,7 @@ label.b2b-static-route-label-heading { display: inline-block; } -/* -To Remove later -*/ - -.selectWrap::after { + .selectWrap::after { align-items: center; background-position: 7px 7px; background-repeat: no-repeat; diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js index 0e62a349..3d211ec7 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js @@ -1,5 +1,5 @@ -/*! b2b-angular-library - v1.0.1 - Last updated: 2017-03-02. Copyright (c) 2016 AT&T Services, Inc. */ -angular.module("b2b.att.tpls", ['b2bTemplate/audioPlayer/audioPlayer.html', 'b2bTemplate/audioRecorder/audioRecorder.html', 'b2bTemplate/backToTop/backToTop.html', 'b2bTemplate/boardstrip/b2bAddBoard.html', 'b2bTemplate/boardstrip/b2bBoard.html', 'b2bTemplate/boardstrip/b2bBoardstrip.html', 'b2bTemplate/calendar/datepicker-popup.html', 'b2bTemplate/calendar/datepicker.html', 'b2bTemplate/coachmark/coachmark.html', 'b2bTemplate/dropdowns/b2bDropdownDesktop.html', 'b2bTemplate/dropdowns/b2bDropdownGroupDesktop.html', 'b2bTemplate/dropdowns/b2bDropdownListDesktop.html', 'b2bTemplate/fileUpload/fileUpload.html', 'b2bTemplate/flyout/flyout.html', 'b2bTemplate/flyout/flyoutContent.html', 'b2bTemplate/footer/footer_column_switch_tpl.html', 'b2bTemplate/horizontalTable/horizontalTable.html', 'b2bTemplate/hourPicker/b2bHourpicker.html', 'b2bTemplate/hourPicker/b2bHourpickerPanel.html', 'b2bTemplate/hourPicker/b2bHourpickerValue.html', 'b2bTemplate/leftNavigation/leftNavigation.html', 'b2bTemplate/listbox/listbox.html', 'b2bTemplate/modalsAndAlerts/b2b-backdrop.html', 'b2bTemplate/modalsAndAlerts/b2b-window.html', 'b2bTemplate/monthSelector/monthSelector-popup.html', 'b2bTemplate/monthSelector/monthSelector.html', 'b2bTemplate/monthSelector/monthSelectorLink.html', 'b2bTemplate/pagination/b2b-pagination.html', 'b2bTemplate/paneSelector/paneSelector.html', 'b2bTemplate/paneSelector/paneSelectorPane.html', 'b2bTemplate/profileCard/profileCard-addUser.html', 'b2bTemplate/profileCard/profileCard.html', 'b2bTemplate/searchField/searchField.html', 'b2bTemplate/seekBar/seekBar.html', 'b2bTemplate/slider/slider.html', 'b2bTemplate/spinButton/spinButton.html', 'b2bTemplate/statusTracker/statusTracker.html', 'b2bTemplate/stepTracker/stepTracker.html', 'b2bTemplate/switches/switches-spanish.html', 'b2bTemplate/switches/switches.html', 'b2bTemplate/tableMessages/tableMessage.html', 'b2bTemplate/tables/b2bTable.html', 'b2bTemplate/tables/b2bTableBody.html', 'b2bTemplate/tables/b2bTableHeaderSortable.html', 'b2bTemplate/tables/b2bTableHeaderUnsortable.html', 'b2bTemplate/tableScrollbar/tableScrollbar.html', 'b2bTemplate/tabs/b2bTab.html', 'b2bTemplate/tabs/b2bTabset.html', 'b2bTemplate/treeNav/groupedTree.html', 'b2bTemplate/treeNav/treeMember.html', 'b2bTemplate/treeNav/ungroupedTree.html', 'b2bTemplate/treeNodeCheckbox/groupedTree.html', 'b2bTemplate/treeNodeCheckbox/treeMember.html', 'b2bTemplate/treeNodeCheckbox/ungroupedTree.html']);angular.module("b2b.att", ["b2b.att.tpls", 'b2b.att.addressInputTemplate','b2b.att.arrows','b2b.att.audioPlayer','b2b.att.audioRecorder','b2b.att.backToTop','b2b.att.badgesForAlerts','b2b.att.boardstrip','b2b.att.breadcrumbs','b2b.att.buttonGroups','b2b.att.buttons','b2b.att.calendar','b2b.att.checkboxes','b2b.att.coachmark','b2b.att.configurationSection','b2b.att.directoryListingTemplate','b2b.att.dropdowns','b2b.att.fileUpload','b2b.att.filters','b2b.att.flyout','b2b.att.footer','b2b.att.header','b2b.att.headings','b2b.att.horizontalTable','b2b.att.hourPicker','b2b.att.inputTemplate','b2b.att.leftNavigation','b2b.att.links','b2b.att.listbox','b2b.att.loaderAnimation','b2b.att.messageWrapper','b2b.att.modalsAndAlerts','b2b.att.monthSelector','b2b.att.multiLevelNavigation','b2b.att.multipurposeExpander','b2b.att.notesMessagesAndErrors','b2b.att.notificationCardTemplate','b2b.att.orderConfirmationTemplate','b2b.att.pagination','b2b.att.paneSelector','b2b.att.phoneNumberInput','b2b.att.profileBlockTemplate','b2b.att.profileCard','b2b.att.radios','b2b.att.searchField','b2b.att.seekBar','b2b.att.selectorModule','b2b.att.separators','b2b.att.slider','b2b.att.spinButton','b2b.att.staticRouteTemplate','b2b.att.statusTracker','b2b.att.stepTracker','b2b.att.switches','b2b.att.tableMessages','b2b.att.tables','b2b.att.tableScrollbar','b2b.att.tabs','b2b.att.tagBadges','b2b.att.textArea','b2b.att.tooltipsForForms','b2b.att.treeNav','b2b.att.treeNodeCheckbox','b2b.att.utilities']);/** +/*! b2b-angular-library - v1.0.4 - Last updated: 2017-05-03. Copyright (c) 2016 AT&T Services, Inc. */ +angular.module("b2b.att.tpls", ['b2bTemplate/audioPlayer/audioPlayer.html', 'b2bTemplate/audioRecorder/audioRecorder.html', 'b2bTemplate/backToTop/backToTop.html', 'b2bTemplate/boardstrip/b2bAddBoard.html', 'b2bTemplate/boardstrip/b2bBoard.html', 'b2bTemplate/boardstrip/b2bBoardstrip.html', 'b2bTemplate/calendar/datepicker-popup.html', 'b2bTemplate/calendar/datepicker.html', 'b2bTemplate/coachmark/coachmark.html', 'b2bTemplate/dropdowns/b2bDropdownDesktop.html', 'b2bTemplate/dropdowns/b2bDropdownGroupDesktop.html', 'b2bTemplate/dropdowns/b2bDropdownListDesktop.html', 'b2bTemplate/fileUpload/fileUpload.html', 'b2bTemplate/flyout/flyout.html', 'b2bTemplate/flyout/flyoutContent.html', 'b2bTemplate/footer/footer_column_switch_tpl.html', 'b2bTemplate/horizontalTable/horizontalTable.html', 'b2bTemplate/hourPicker/b2bHourpicker.html', 'b2bTemplate/hourPicker/b2bHourpickerPanel.html', 'b2bTemplate/hourPicker/b2bHourpickerValue.html', 'b2bTemplate/leftNavigation/leftNavigation.html', 'b2bTemplate/listbox/listbox.html', 'b2bTemplate/modalsAndAlerts/b2b-backdrop.html', 'b2bTemplate/modalsAndAlerts/b2b-window.html', 'b2bTemplate/monthSelector/monthSelector-popup.html', 'b2bTemplate/monthSelector/monthSelector.html', 'b2bTemplate/monthSelector/monthSelectorLink.html', 'b2bTemplate/pagination/b2b-pagination.html', 'b2bTemplate/paneSelector/paneSelector.html', 'b2bTemplate/paneSelector/paneSelectorPane.html', 'b2bTemplate/profileCard/profileCard-addUser.html', 'b2bTemplate/profileCard/profileCard.html', 'b2bTemplate/searchField/searchField.html', 'b2bTemplate/seekBar/seekBar.html', 'b2bTemplate/slider/slider.html', 'b2bTemplate/spinButton/spinButton.html', 'b2bTemplate/statusTracker/statusTracker.html', 'b2bTemplate/stepTracker/stepTracker.html', 'b2bTemplate/switches/switches-spanish.html', 'b2bTemplate/switches/switches.html', 'b2bTemplate/tableMessages/tableMessage.html', 'b2bTemplate/tables/b2bTable.html', 'b2bTemplate/tables/b2bTableBody.html', 'b2bTemplate/tables/b2bTableHeaderSortable.html', 'b2bTemplate/tables/b2bTableHeaderUnsortable.html', 'b2bTemplate/tableScrollbar/tableScrollbar.html', 'b2bTemplate/tabs/b2bTab.html', 'b2bTemplate/tabs/b2bTabset.html', 'b2bTemplate/treeNav/groupedTree.html', 'b2bTemplate/treeNav/treeMember.html', 'b2bTemplate/treeNav/ungroupedTree.html', 'b2bTemplate/treeNodeCheckbox/groupedTree.html', 'b2bTemplate/treeNodeCheckbox/treeMember.html', 'b2bTemplate/treeNodeCheckbox/ungroupedTree.html']);angular.module("b2b.att", ["b2b.att.tpls", 'b2b.att.addressInputTemplate','b2b.att.arrows','b2b.att.audioPlayer','b2b.att.audioRecorder','b2b.att.backToTop','b2b.att.badgesForAlerts','b2b.att.boardstrip','b2b.att.bootstrapGridTemplate','b2b.att.breadcrumbs','b2b.att.buttonGroups','b2b.att.buttons','b2b.att.calendar','b2b.att.checkboxes','b2b.att.coachmark','b2b.att.configurationSection','b2b.att.directoryListingTemplate','b2b.att.dropdowns','b2b.att.dropdowns','b2b.att.fileUpload','b2b.att.filters','b2b.att.flyout','b2b.att.footer','b2b.att.header','b2b.att.headingsAndCopy','b2b.att.horizontalTable','b2b.att.hourPicker','b2b.att.inputTemplate','b2b.att.leftNavigation','b2b.att.links','b2b.att.listbox','b2b.att.loaderAnimation','b2b.att.messageWrapper','b2b.att.modalsAndAlerts','b2b.att.monthSelector','b2b.att.multiLevelNavigation','b2b.att.multipurposeExpander','b2b.att.notesMessagesAndErrors','b2b.att.notificationCardTemplate','b2b.att.orderConfirmationTemplate','b2b.att.pagination','b2b.att.paneSelector','b2b.att.phoneNumberInput','b2b.att.profileBlockTemplate','b2b.att.profileCard','b2b.att.radios','b2b.att.searchField','b2b.att.seekBar','b2b.att.separators','b2b.att.slider','b2b.att.spinButton','b2b.att.staticRouteTemplate','b2b.att.statusTracker','b2b.att.stepTracker','b2b.att.switches','b2b.att.tableMessages','b2b.att.tables','b2b.att.tableScrollbar','b2b.att.tabs','b2b.att.tagBadges','b2b.att.textArea','b2b.att.timeInputField','b2b.att.tooltipsForForms','b2b.att.treeNav','b2b.att.treeNodeCheckbox','b2b.att.utilities']);/** * @ngdoc directive * @name Template.att:Address Input * @@ -1005,6 +1005,24 @@ angular.module('b2b.att.boardstrip', ['b2b.att.utilities']) } }; }]); +/** + * @ngdoc directive + * @name Template.att:Bootstrap Grid Template + * + * @description + * <file src="src/bootstrapGridTemplate/docs/readme.md" /> + * + * @example + * <section id="code"> + <example module="b2b.att"> + <file src="src/bootstrapGridTemplate/docs/demo.html" /> + <file src="src/bootstrapGridTemplate/docs/demo.js" /> + </example> + </section> + * + */ +angular.module('b2b.att.bootstrapGridTemplate', []) + /** * @ngdoc directive * @name Navigation.att:breadcrumbs @@ -1295,7 +1313,7 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) legendMessage: null, calendarDisabled: false, collapseWait: 0, - orientation: 'left', + orientation: 'right', inline: false, helperText: 'The date you selected is $date. In case of mobile double tap to open calendar. Select a date to close the calendar.', datepickerEvalAttributes: ['dateFormat', 'dayFormat', 'monthFormat', 'yearFormat', 'dayHeaderFormat', 'dayTitleFormat', 'disableWeekend', 'disableSunday', 'startingDay', 'collapseWait', 'orientation'], @@ -1359,11 +1377,15 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) dayHeader: getValue($attrs.dayHeaderFormat, dtConfig.dayHeaderFormat), dayTitle: getValue($attrs.dayTitleFormat, dtConfig.dayTitleFormat), disableWeekend: getValue($attrs.disableWeekend, dtConfig.disableWeekend), - disableSunday: getValue($attrs.disableSunday, dtConfig.disableSunday), - disableDates: getValue($attrs.disableDates, dtConfig.disableDates) + disableSunday: getValue($attrs.disableSunday, dtConfig.disableSunday) }, startingDay = getValue($attrs.startingDay, dtConfig.startingDay); + if($attrs.disableDates !== undefined) { + format.disableDates = $attrs.disableDates; + } else { + format.disableDates = dtConfig.disableDates; + } $scope.minDate = dtConfig.minDate ? $scope.resetTime(dtConfig.minDate) : null; $scope.maxDate = dtConfig.maxDate ? $scope.resetTime(dtConfig.maxDate) : null; $scope.dueDate = dtConfig.dueDate ? $scope.resetTime(dtConfig.dueDate) : null; @@ -1398,12 +1420,35 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) this.updatePosition = function (b2bDatepickerPopupTemplate) { $scope.position = $position.offset($element); - $scope.position.top = $scope.position.top + $element.find('input').prop('offsetHeight'); - if ($scope.orientation === 'right') { - $scope.position.left = $scope.position.left - (((b2bDatepickerPopupTemplate && b2bDatepickerPopupTemplate.prop('offsetWidth')) || 290) - $element.find('input').prop('offsetWidth')); - } + $scope.position.top = $scope.position.top + $element.prop('offsetHeight'); + $scope.position.left = $scope.position.left - (((b2bDatepickerPopupTemplate && b2bDatepickerPopupTemplate.prop('offsetWidth')) || 290) - $element.prop('offsetWidth')); }; + this.isDateInRange = function(date) { + if ((compare(date, $scope.minDate) >= 0) && (compare(date, $scope.maxDate) <= 0)) { + return true; + } else { + return false; + } + return false; + } + + this.isDisbaledDate = function(date) { + if ($attrs.from && !angular.isDate($scope.fromDate)) { + return true; + } + if (format.disableWeekend === true && (dateFilter(date, format.dayHeader) === "Saturday" || dateFilter(date, format.dayHeader) === "Sunday")) { + return true; + } + if (format.disableSunday === true && (dateFilter(date, format.dayHeader) === "Sunday")) { + return true; + } + + return (($scope.minDate && compare(date, $scope.minDate) < 0) || ($scope.maxDate && compare(date, $scope.maxDate) > 0) || ($scope.datesCallBack({ + date: date + }))); + + } function isSelected(dt) { if (dt && angular.isDate($scope.currentDate) && compare(dt, $scope.currentDate) === 0) { return true; @@ -1470,7 +1515,7 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) if (isOld(date, currentMonthDate) || isNew(date, currentMonthDate)) { return true; } - return (($scope.minDate && compare(date, $scope.minDate) < 0) || ($scope.maxDate && compare(date, $scope.maxDate) > 0) || (format.disableDates && format.disableDates({ + return (($scope.minDate && compare(date, $scope.minDate) < 0) || ($scope.maxDate && compare(date, $scope.maxDate) > 0) || ($scope.datesCallBack({ date: date }))); }; @@ -1582,36 +1627,69 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) ]; }]) -.directive('b2bDatepickerPopup', ['$parse', '$log', '$timeout', '$document', '$documentBind', '$isElement', '$templateCache', '$compile', 'trapFocusInElement', '$position', '$window', function ($parse, $log, $timeout, $document, $documentBind, $isElement, $templateCache, $compile, trapFocusInElement, $position, $window) { +.directive('b2bDatepicker', ['$parse', '$log', '$timeout', '$document', '$documentBind', '$isElement', '$templateCache', '$compile', 'trapFocusInElement', '$position', '$window', '$filter', 'b2bDatepickerConfig', function ($parse, $log, $timeout, $document, $documentBind, $isElement, $templateCache, $compile, trapFocusInElement, $position, $window, $filter, b2bDatepickerConfig) { return { restrict: 'EA', - replace: true, - transclude: true, - templateUrl: function (elem, attr) { - if (attr.inline === 'true') { - return 'b2bTemplate/calendar/datepicker-popup.html'; - } else { - return 'b2bTemplate/calendar/datepicker.html'; - } + scope: { + model: '=ngModel', + datesCallBack: '&disableDates', + onSelectClose: '&', + disabledInput: '=?ngDisabled' }, - scope: {}, - require: ['b2bDatepickerPopup', 'ngModel', '?^b2bDatepickerGroup'], + require: ['b2bDatepicker', 'ngModel', '?^b2bDatepickerGroup'], controller: 'b2bDatepickerController', link: function (scope, element, attrs, ctrls) { var datepickerCtrl = ctrls[0], ngModel = ctrls[1], b2bDatepickerGroupCtrl = ctrls[2]; var b2bDatepickerPopupTemplate; + var isCalendarOpened = false; + if(scope.disabledInput === undefined || scope.disabledInput === '') { + scope.disabledInput = false; + } + if(attrs.inline == 'true'){ + element.after($compile($templateCache.get('b2bTemplate/calendar/datepicker-popup.html'))(scope)); + var temp = element.after(); + element.remove(); + element = temp; + } else { + var buttonTabIndex = scope.disabledInput===true ? -1 : 0; + + element.after($compile('<button class="btn-calendar-icon" ng-disabled='+scope.disabledInput+' ><i class="icon-primary-calendar b2b-calendar-icon" aria-haspopup="true" aria-expanded="false" ng-class=\"{\'disabled\': '+scope.disabledInput+'}\" ></i></button>')(scope)); + element.attr('placeholder', 'MM/dd/yyyy'); + element.attr('b2b-format-date', b2bDatepickerConfig.dateFormat); + } + scope.$watch('model', function(val) { + + if(val !== undefined && val !== '') { + var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ; + + if(!date_regex.test(element[0].value)) { + ngModel.$setValidity('datePattern', false); + } else { + ngModel.$setValidity('datePattern', true); + } + + } else { + ngModel.$setValidity('datePattern', true); + } + + }); if (!ngModel) { $log.error("ng-model is required."); return; // do nothing if no ng-model } + if(scope.model !== undefined && scope.model !== '') { + element[0].value = $filter('date')(scope.model, "MM/dd/yyyy"); + } + // Configuration parameters var mode = 0, selected; scope.isOpen = false; + var isValidDate = false; scope.headers = []; scope.footers = []; @@ -1620,21 +1698,66 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) b2bDatepickerGroupCtrl.registerDatepickerScope(scope); } - element.find('button').bind('click', function () { - element.find('input')[0].click(); - }); + var calendarButton = angular.element(element[0].nextElementSibling); - element.find('input').bind('click', function () { + calendarButton.bind('click',function(){ + openCalendarPopup = false; if (!scope.ngDisabled) { scope.isOpen = !scope.isOpen; toggleCalendar(scope.isOpen); scope.$apply(); datepickerCtrl.updatePosition(b2bDatepickerPopupTemplate); $timeout(function () { - angular.element(element[0].querySelector('.datepicker-input')).scrollTop=0; + // angular.element(element[0].querySelector('.datepicker-input')).scrollTop=0; },10); } - }); + }) + var openCalendarPopup = false; + + element.bind('blur', function() { + if(scope.model !== undefined && scope.model !== '') { + var dateEntered = scope.model; + + var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ; + + if(date_regex.test(dateEntered)) { + var parts = dateEntered.split('/'); + var enteredDate = new Date(parts[2],parts[0]-1,parts[1]); + + if(datepickerCtrl.isDateInRange(enteredDate)) { + isValidDate -= 1; + ngModel.$setValidity('outOfRange', true); + $timeout(function(){ + ngModel.$setValidity('outOfRange', true); + },10); + isValidDate = true; + if(!datepickerCtrl.isDisbaledDate(enteredDate)) { + $timeout(function(){ + ngModel.$setValidity('disabledDate', true); + },10); + scope.select(enteredDate); + openCalendarPopup = true; + } else { + $timeout(function(){ + ngModel.$setValidity('disabledDate', false); + },10); + isValidDate = false; + openCalendarPopup = false; + } + + } else { + isValidDate += 1; + $timeout(function(){ + ngModel.$setValidity('outOfRange', false); + },10); + isValidDate = false; + openCalendarPopup = false; + } + + } + } + }); + var toggleCalendar = function (flag) { if (!scope.inline) { if (flag) { @@ -1650,17 +1773,45 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) scope.getFocus = false; scope.$apply(); }, 100); + handleTabEvent(); }); + angular.element(document.querySelector('.b2b-calendar-icon')).attr('aria-expanded','true'); } else { - b2bDatepickerPopupTemplate.unbind('keydown', keyPress); - b2bDatepickerPopupTemplate.remove(); - element.find('button')[0].focus(); + if(!openCalendarPopup) { + b2bDatepickerPopupTemplate.unbind('keydown', keyPress); + b2bDatepickerPopupTemplate.remove(); + } + element[0].focus(); scope.getFocus = false; + angular.element(document.querySelector('.b2b-calendar-icon')).attr('aria-expanded','false'); trapFocusInElement(flag, b2bDatepickerPopupTemplate); } } }; + var handleTabEvent = function(){ + b2bDatepickerPopupTemplate.find('td').on('keydown', function (e) { + if (e.keyCode == '9') { + if(e.shiftKey){ + if(b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.next')){ + b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.next').focus(); + }else{ + b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.datepicker-switch').focus() + } + }else{ + if(b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.prev')){ + b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.prev').focus(); + }else{ + b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.datepicker-switch').focus() + } + } + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + var outsideClick = function (e) { var isElement = $isElement(angular.element(e.target), element, $document); var isb2bDatepickerPopupTemplate = $isElement(angular.element(e.target), b2bDatepickerPopupTemplate, $document); @@ -1871,6 +2022,8 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) date: dt }) !== false)) { scope.currentDate = dt; + element[0].value = $filter('date')(dt, "MM/dd/yyyy"); + ngModel.$setValidity('outOfRange', true); if (angular.isNumber(scope.collapseWait)) { $timeout(function () { scope.isOpen = false; @@ -1892,6 +2045,7 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) $timeout(function () { trapFocusInElement(); + handleTabEvent(); }, 100); $event.preventDefault(); @@ -1928,73 +2082,6 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities']) }; }]) -.directive('b2bDatepicker', ['$compile', '$log', 'b2bDatepickerConfig', 'b2bDatepickerService', function ($compile, $log, b2bDatepickerConfig, b2bDatepickerService) { - return { - restrict: 'A', - scope: { - disableDates: '&', - onSelectClose: '&' - }, - require: 'ngModel', - controller: ['$scope', '$element', '$attrs', function (scope, elem, attr) { - var dateFormatString = angular.isDefined(attr.dateFormat) ? scope.$parent.$eval(attr.dateFormat) : b2bDatepickerConfig.dateFormat; - var helperText = angular.isDefined(attr.helperText) ? scope.$parent.$eval(attr.helperText) : b2bDatepickerConfig.helperText; - helperText = helperText.replace('$date', '{{dt | date : \'' + dateFormatString + '\'}}'); - - var inline = false; - if (elem.prop('nodeName') !== 'INPUT') { - inline = true; - } - - var calendarIcon = '<i class="icon-primary-calendar" aria-hidden="true"></i>' - var selectedDateMessage = '<button id="' + attr.btnId + '" type="button" class="span12 faux-input" ng-disabled="ngDisabled"><span class="hidden-spoken">' + helperText + '</span></button>'; - - elem.removeAttr('b2b-datepicker'); - elem.removeAttr('ng-model'); - elem.removeAttr('ng-disabled'); - elem.addClass('datepicker-input'); - elem.attr('ng-model', 'dt'); - elem.attr('aria-describedby', 'datepicker'); - elem.attr('aria-hidden', 'true'); - elem.attr('tabindex', '-1'); - elem.attr('readonly', 'true'); - elem.attr('ng-disabled', 'ngDisabled'); - elem.attr('b2b-format-date', dateFormatString); - - var wrapperElement = angular.element('<div></div>'); - wrapperElement.attr('b2b-datepicker-popup', ''); - wrapperElement.attr('ng-model', 'dt'); - if (inline) { - wrapperElement.attr('inline', inline); - } - - b2bDatepickerService.setAttributes(attr, wrapperElement); - b2bDatepickerService.bindScope(attr, scope); - - wrapperElement.html(''); - wrapperElement.append(calendarIcon); - wrapperElement.append(selectedDateMessage); - wrapperElement.append(elem.prop('outerHTML')); - - var elm = wrapperElement.prop('outerHTML'); - elm = $compile(elm)(scope); - elem.replaceWith(elm); - }], - link: function (scope, elem, attr, ctrl) { - if (!ctrl) { - $log.error("ng-model is required."); - return; // do nothing if no ng-model - } - - scope.$watch('dt', function (value) { - ctrl.$setViewValue(value); - }); - ctrl.$render = function () { - scope.dt = ctrl.$viewValue; - }; - } - }; -}]) .directive('b2bDatepickerGroup', [function () { return { @@ -2146,7 +2233,7 @@ angular.module('b2b.att.checkboxes', ['b2b.att.utilities']) angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position']) - .directive('b2bCoachmark', ['$document', '$compile', '$position', '$timeout', function($document, $compile, $position, $timeout) { + .directive('b2bCoachmark', ['$document', '$compile', '$position', '$timeout', 'b2bViewport', 'keymap', function($document, $compile, $position, $timeout, b2bViewport, keymap) { return { restrict: 'A', scope: { @@ -2210,8 +2297,39 @@ angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position']) } element[0].focus(); } + + var realStyle = function(_elem, _style) { + var computedStyle; + if ( typeof _elem.currentStyle != 'undefined' ) { + computedStyle = _elem.currentStyle; + } else { + computedStyle = document.defaultView.getComputedStyle(_elem, null); + } + + return _style ? computedStyle[_style] : computedStyle; + }; + + var copyComputedStyle = function(src, dest) { + var s = realStyle(src); + for ( var i in s ) { + // Do not use `hasOwnProperty`, nothing will get copied + if ( typeof i == "string" && i != "cssText" && !/\d/.test(i) && i.indexOf('webkit') !== 0 ) { + // The try is for setter only properties + try { + dest.style[i] = s[i]; + // `fontSize` comes before `font` If `font` is empty, `fontSize` gets + // overwritten. So make sure to reset this property. (hackyhackhack) + // Other properties may need similar treatment + if ( i == "font" ) { + dest.style.fontSize = s.fontSize; + } + } catch (e) {} + } + } + }; function showCoachmark(targetElement) { + scope.currentCoachmark = targetElement; if(coachMarkElement !== undefined && coachMarkElement !==""){ coachMarkElement.removeClass('b2b-coachmark-label') @@ -2219,16 +2337,32 @@ angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position']) coachmarkHighlight.remove(); } coachMarkElement = angular.element(document.querySelector(targetElement.elementId)); - coachMarkElement.addClass('b2b-coachmark-label'); + var elementPosition = $position.offset(coachMarkElement); coachmarkHighlight = angular.element('<div class="b2b-coachmark-highlight"></div><div class="b2b-coachmark-highlight b2b-coachmark-highlight-mask"></div>'); coachmarkHighlight.css({ - 'width': (elementPosition.width + 20) +'px', + 'width': (elementPosition.width + 25) +'px', 'top': (elementPosition.top -10) + 'px', 'left': (elementPosition.left - 10) + 'px', 'height': (elementPosition.height + 20) +'px' - }); + }); + if(targetElement.cloneHtml){ + var copy = coachMarkElement[0].cloneNode(true); + copy.id = "b2b-unique-"+targetElement.elementId.slice(1); + copyComputedStyle(coachMarkElement[0],copy); + var copychildNodes = copy.childNodes; + var coachmarkChildNodes = coachMarkElement[0].childNodes; + for(i=0;i<copychildNodes.length;i++){ + if(copychildNodes[i].nodeType === '3'){ + copyComputedStyle(coachmarkChildNodes[i],copychildNodes[i]) + } + } + coachmarkHighlight[0].appendChild(copy); // IE11 only supports appendChild, not append + }else{ + coachMarkElement.addClass('b2b-coachmark-label'); + } + body.append(coachmarkHighlight); scope.coackmarkElPos.top = (elementPosition.top + elementPosition.height + 32) + 'px'; @@ -2237,14 +2371,29 @@ angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position']) coackmarkContainer = $compile(coackmarkJqContainer)(scope); body.append(coackmarkContainer); + $timeout(function () { var currentCoachmarkContainer = document.getElementsByClassName('b2b-coachmark-container')[0]; currentCoachmarkContainer.focus(); + + newElem = angular.element(currentCoachmarkContainer); + newElem.bind('keydown', function (e) { + if(e.keyCode == keymap.KEY.TAB){ + if(e.shiftKey) { + if(e.target.className === 'b2b-coachmark-container'){ + e.preventDefault(); + e.stopPropagation(); + } + } + } + }); var coachmarkHeight = window.getComputedStyle(currentCoachmarkContainer).height.split('px')[0]; - var newOffsetHeight = (Math.round(elementPosition.top) - Math.round(coachmarkHeight)); + var newOffsetHeight = Math.round(elementPosition.top) - elementPosition.height; // We need a slight offset to show the lightboxed item - TweenLite.to(window, 2, {scrollTo:{x: (scope.coackmarkElPos.left.split('px')[0]-100), y: newOffsetHeight}}); + if(!targetElement.cloneHtml){ + TweenLite.to(window, 2, {scrollTo:{x: (scope.coackmarkElPos.left.split('px')[0] - 100), y: newOffsetHeight-200}}); + } }, 200); } @@ -2275,6 +2424,32 @@ angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position']) }); }); + + //performance technique to ensure scroll event doesn't cause lag + var throttle = function(type, name, obj) { + obj = obj || window; + var running = false; + var func = function() { + if (running) { return; } + running = true; + requestAnimationFrame(function() { + obj.dispatchEvent(new CustomEvent(name)); + running = false; + }); + }; + obj.addEventListener(type, func); + }; + + scope.viewportWidth = b2bViewport.viewportWidth(); + /* init - you can init any event */ + throttle("resize", "optimizedResize"); + window.addEventListener("optimizedResize", function() { + if(initaitedCoachmark){ + showCoachmark(coachmarkItems[scope.coachmarkIndex]); + scope.viewportWidth = b2bViewport.viewportWidth(); + scope.$digest(); + } + }); } }; }]) @@ -2436,13 +2611,11 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n set(); }); } + }], link: function (scope, elem, attr, ctrl) { if ((scope.isInputDropdown && b2bUserAgent.notMobile()) || (!scope.isInputDropdown)) { scope.updateModel = function () { - if (ctrl.$dirty) { - debugger; - } ctrl.$setViewValue(scope.currentSelected.value); if (scope.dropdownRequired && scope.currentSelected.value === '') { scope.setRequired(false); @@ -2457,22 +2630,23 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n } }; ctrl.$render = function () { -// if(ctrl.$dirty || ctrl.$pristine) { - $timeout(function () { - if ((angular.isUndefined(ctrl.$viewValue) || ctrl.$viewValue == '') && (angular.isUndefined(scope.placeHoldertext) || scope.placeHoldertext == '')) { - scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue(); - } else if ((angular.isUndefined(scope.placeHoldertext) || scope.placeHoldertext == '') && ctrl.$viewValue !== '' ) { - scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue(); - } else if ((angular.isUndefined(ctrl.$viewValue) || ctrl.$viewValue == '') && scope.placeHoldertext !== '' ) { - scope.currentSelected.text = scope.placeHoldertext; - } else { - scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue(); - } + $timeout(function () { + + if ((angular.isUndefined(ctrl.$viewValue) || ctrl.$viewValue == '') && (angular.isUndefined(scope.placeHoldertext) || scope.placeHoldertext == '')) { + scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue(); + } else if ((angular.isUndefined(scope.placeHoldertext) || scope.placeHoldertext == '') && ctrl.$viewValue !== '' ) { + scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue(); + } else if ((angular.isUndefined(ctrl.$viewValue) || ctrl.$viewValue == '') && scope.placeHoldertext !== '' ) { + scope.currentSelected.text = scope.placeHoldertext; + ctrl.$setViewValue(scope.placeHoldertext); + } else { + scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue(); + } + + }, 100); + }; - }, 100); - }; -// } scope.disabled = false; scope.dropdownName = attr.name; scope.dropdownId = attr.id; @@ -2525,10 +2699,22 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n label: '', index: -1 }; + scope.dropdownTextList = []; var searchString = ''; + + var getDropdownText = function(){ + var dropdownItems = elem.parent().find('ul').children(); + var count = dropdownItems.length; + for(var i=0;i<count;i++){ + scope.dropdownTextList.push(dropdownItems.eq(i).text()); + } + }; var searchElement = function (searchExp) { - var regex = new RegExp("\\b" + searchExp, "gi"); - var position = scope.dropdownListValues.regexIndexOf(regex, scope.currentSelected.index + 1, true); + if(scope.dropdownTextList.length ==0){ + getDropdownText (); + } + var regex = new RegExp("^" + searchExp, "i"); + var position = scope.dropdownTextList.regexIndexOf(regex, scope.currentSelected.index + 1, true); if (position > -1) { return position; } @@ -2561,6 +2747,17 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n ctrl.resetCounter(scope.dropdownLists[scope.currentSelected.value][2]); } } + $timeout(function () { + if(scope.dropdownLists[scope.currentSelected.value] !== undefined){ + (scope.dropdownLists[scope.currentSelected.value][1])[0].focus(); + } else { + if (scope.isInputDropdown) { + elem.parent().find('input')[0].focus(); + } else { + elem.parent().find('button')[0].focus(); + } + } + }, 100); if (scope.dropdownType === b2bDropdownConfig.linkMenuKeyword) { scope.appendCaretPositionStyle(); } @@ -2579,7 +2776,7 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n if (!scope.toggleFlag) { if (ev.keyCode) { var currentIndex = scope.currentSelected.index; - if (ev.altKey === true && ev.keyCode === keymap.KEY.DOWN) { + if (ev.keyCode === keymap.KEY.DOWN) { scope.toggleDropdown(true); ev.preventDefault(); ev.stopPropagation(); @@ -2621,6 +2818,7 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n } }; $documentBind.click('toggleFlag', outsideClick, scope); + $documentBind.touch('toggleFlag', outsideClick, scope); } }; }]) @@ -2663,13 +2861,28 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n return { restrict: 'A', controller: ['$scope', '$element', '$attrs', function (scope, elem, attr) { + if(attr.optionRepeat && !scope.watchRegistered){ + var arrayName = attr.optionRepeat.split(" ").pop(); + if(arrayName.indexOf(']') == -1){ + scope.$watch(arrayName,function(){ + /*scope.dropdownLists ={};*/ + scope.dropdownListValues =[]; + scope.dropdown = { + totalIndex: -1 + }; + scope.dropdownTextList = []; + },true); + scope.watchRegistered = true; + } + } + if ((scope.isInputDropdown && b2bUserAgent.notMobile()) || (!scope.isInputDropdown)) { var innerHtml = angular.element('<div></div>').append(elem.html()); innerHtml = ($compile(innerHtml)(scope)).html(); var template = angular.element($templateCache.get('b2bTemplate/dropdowns/b2bDropdownListDesktop.html')); template.attr('ng-repeat', attr.optionRepeat); template.attr('value', elem.attr('value')); - template.attr('search-key', elem.attr('value')); + template.attr('search-key', elem.text()); if (elem.attr('aria-describedby')){ template.attr('aria-describedby', attr.ariaDescribedby); } @@ -2701,6 +2914,7 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n return { restrict: 'A', scope: true, + link: function (scope, elem, attr, ctrl) { var dropdownListValue = scope.dropdownListValue = attr.value; scope.dropdown.totalIndex++; @@ -2710,20 +2924,17 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n scope.dropdownLists[dropdownListValue][0] = scope; scope.dropdownLists[dropdownListValue][1] = elem; scope.dropdownLists[dropdownListValue][2] = dropdownListIndex; + scope.updateDropdownValue = function () { scope.currentSelected.value = dropdownListValue; if (scope.isInputDropdown) { scope.currentSelected.text = elem.text(); + scope.currentSelected.label = elem.text(); } else if ((scope.dropdownType === b2bDropdownConfig.linkMenuKeyword) || (scope.dropdownType === b2bDropdownConfig.menuKeyword && scope.dropdownSize === b2bDropdownConfig.smallKeyword)) { scope.currentSelected.text = dropdownListValue; - } else if (scope.dropdownType === b2bDropdownConfig.menuKeyword) { - scope.currentSelected.text = $sce.trustAsHtml(elem.html()); - } - if (scope.isInputDropdown) { - scope.currentSelected.label = elem.text(); - } else if (scope.dropdownType === b2bDropdownConfig.linkMenuKeyword) { scope.currentSelected.label = dropdownListValue; } else if (scope.dropdownType === b2bDropdownConfig.menuKeyword) { + scope.currentSelected.text = $sce.trustAsHtml(elem.html()); scope.currentSelected.label = elem.text(); } scope.currentSelected.index = dropdownListIndex; @@ -2740,13 +2951,14 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n elem.bind('mouseover', function (ev) { elem[0].focus(); }); + elem.bind('keydown', function (ev) { if (!ev.keyCode) { if (ev.which) { ev.keyCode = ev.which; } else if (ev.charCode) { ev.keyCode = ev.charCode; - } + } } if (ev.altKey === true && ev.keyCode === keymap.KEY.UP) { scope.toggleDropdown(false); @@ -3357,7 +3569,7 @@ angular.module('b2b.att.flyout', ['b2b.att.utilities', 'b2b.att.position']) closeFlyout: '&' }, link: function (scope, element, attrs, ctrl) { - element.bind('click', function (e) { + element.bind('click touchstart', function (e) { scope.closeFlyout(e); ctrl.closeFlyout(e); }); @@ -3801,42 +4013,21 @@ angular.module('b2b.att.header', ['b2b.att.dropdowns','b2b.att.utilities']) /** * @ngdoc directive - * @name Layouts.att:headings + * @name Layouts.att:headings & copy * * @description - * <file src="src/headings/docs/readme.md" /> + * <file src="src/headingsAndCopy/docs/readme.md" /> * - * @usage - <h1 class="heading-page">38px page heading</h1> - <h2 class="heading-major-section">30px major section heading</h2> - <h3 class="heading-sub-section">24px sub-section heading</h3> - <h2 class="heading-medium">20px medium heading</h2> - <h2 class="heading-medium-emphasis">20px medium emphasis heading</h2> - <h3 class="heading-small">18px small heading</h3> - <h3 class="heading-small-emphasis">18px small emphasis heading</h3> - <h3 class="heading-micro">13px micro heading</h3> - - <h2 class="heading-group">Lead</h2> - <h1 class="heading-page">This is 38px heading</h1> - <h2 class="lead">This is lead text...The next big thing since the last big thing we announced.</h2> - <h2 class="heading-group">Eyebrow</h2> - <h3 class="eyebrow">EYEBROW TEXT</h3> - <h2 class="heading-major-section">This is a 30px heading</h2> - <h3 class="eyebrow">EYEBROW TEXT</h3> - <h3 class="heading-sub-section">24px sub-section heading</h3> - <h2 class="heading-group">Subheading</h2> - <h2 class="heading-major-section">This is a 30px heading</h2> - <h3 class="subheading">A subheading here to support what was said above</h3> * @example <section id="code"> <b>HTML + AngularJS</b> <example module="b2b.att"> - <file src="src/headings/docs/demo.html" /> + <file src="src/headingsAndCopy/docs/demo.html" /> </example> </section> */ -var b2bLegalCopy = angular.module('b2b.att.headings', []); +var b2bLegalCopy = angular.module('b2b.att.headingsAndCopy', []); /** * @ngdoc directive * @name Tabs, tables & accordions.att:horizontalTable @@ -3847,6 +4038,8 @@ var b2bLegalCopy = angular.module('b2b.att.headings', []); * @usage * @param {int} sticky - Number of sticky columns to have. Maximum of 3. * @param {boolean} refresh - A boolean that when set to true will force a re-render of table. Only use when using 'bulk mode' + * @param {string} legendContent - A string of html to fill in the legend flyout. This should generally be a <ul> with <li> and should not rely on Angular for repeating. + * @param {boolean} retainColumnSet - A boolean that on re-render of the table, determines if the columns visible should reset to 0 or not. Default is false. * @example * <section id="code"> <example module="b2b.att"> @@ -3867,7 +4060,9 @@ angular.module('b2b.att.horizontalTable', []) transclude: true, scope: { numOfStickyCols: '=?sticky', - refresh: '=?' + refresh: '=?', + legendContent: '=?', + retainColumnSet: '=?' }, templateUrl: 'b2bTemplate/horizontalTable/horizontalTable.html', @@ -3875,29 +4070,6 @@ angular.module('b2b.att.horizontalTable', []) scope.numOfStickyCols = scope.numOfStickyCols || 1; scope.viewportIndex = scope.numOfStickyCols; - // JM520E: This is a temporary hack until I solve the ngRepeat issue - function hack() { - if (element.find('th').length < scope.numOfStickyCols) { - // DOM ngRepeat is not ready, let's check back in 10 ms - console.info('THs are not ready, trying again in 10ms'); - $timeout(hack, 10, false); - } else { - init(); - } - } - hack(); - - if (attrs.refresh !== undefined && attrs.refresh !== '') { - scope.$watch('refresh', function(oldVal, newVal) { - if (scope.refresh) { - // From testing it takes about 30 ms before ngRepeat executes, so let's set initial timeout - // NOTE: May need to expose timeout to developers. Application is known to have digest cycle of 3-5k watches. - $timeout(init, 100, false); - scope.refresh = false; - } - }); - } - var tableElement = element.find('table'); var thElements = element.find('th'); var innerContainer = angular.element(element[0].querySelector('.b2b-horizontal-table-inner-container')); @@ -3919,72 +4091,28 @@ angular.module('b2b.att.horizontalTable', []) var displayNoneCSS = {'display': 'none'}; var displayBlockCSS = {'display': 'table-cell'}; - function calculateVisibleColumns(startingPoint) { - var usedWidth = 0, - visibleColumns = startingPoint || scope.numOfStickyCols; - - while(usedWidth < stickyPixels && visibleColumns < collectiveColumnWidth.length) { - if (usedWidth+collectiveColumnWidth[visibleColumns] > stickyPixels) { - if (startingPoint === visibleColumns) { - return visibleColumns; // The next cell is too large to fit, it should be only thing to fit - } - visibleColumns--; - return visibleColumns; - } - usedWidth += collectiveColumnWidth[visibleColumns]; - visibleColumns++; - } - - if (usedWidth > stickyPixels) { - return --visibleColumns; - } - return visibleColumns; - } - - function updateCellDisplay(set) { - for (var i = scope.numOfStickyCols; i < tableColumns.length; i++) { - angular.element(tableColumns[i]).css(displayNoneCSS); - } - - for (var i = set[0]; i <= set[1]; i++) { - angular.element(tableColumns[i]).css(displayBlockCSS); - } - } - - function forceDigest() { - if (!scope.$$phase) { - scope.$digest(); - } - } - - function findMax(arr, prop) { - var max = 0; - var localVal = 0; - var prevDisplay; - var item; - for (var i = 0; i < arr.length; i++) { - item = arr[i]; - prevDisplay = angular.element(item).css('display'); - if (scope.$$phase) { - scope.$digest(); - } - if (prop === 'width') { - localVal = Math.ceil(parseInt(window.getComputedStyle(item).width.split('px')[0], 10)) + 30; // 30 px is padding - } else if (prop === 'offsetWidth') { - localVal = item.offsetWidth; - } else if (prop === 'height') { - localVal = item.offsetHeight; + // JM520E: This is a temporary hack until I solve the ngRepeat issue + function hack() { + if (element.find('th').length < scope.numOfStickyCols) { + // DOM ngRepeat is not ready, let's check back in 10 ms + $timeout(hack, 10, false); + } else { + if (scope.refresh !== undefined) { + scope.$watch('refresh', function(oldVal, newVal) { // this watch calls too many times + if (!angular.equals(oldVal, newVal)) { //hackFinished && oldVal < newVal + // From testing it takes about 30 ms before ngRepeat executes, so let's set initial timeout + // NOTE: May need to expose timeout to developers. Application is known to have digest cycle of 3-5k watches. + $timeout(init, 100, false); + scope.refresh = false; + } + }); } - if (localVal >= max) { - max = localVal; - } + init(); } - - return max; } - function init() { + var init = function() { // Reset this from a previous execution tableColumns = []; collectiveColumnWidth = []; @@ -3993,7 +4121,9 @@ angular.module('b2b.att.horizontalTable', []) maxHeight = 0; lastVisibleColumn = 0; columnSets = []; - setIndex = 0; + if ((!!scope.retainColumnSet)) { + setIndex = 0; + } visibleColumns = []; stickyPixels = 0; @@ -4002,20 +4132,16 @@ angular.module('b2b.att.horizontalTable', []) innerContainer = angular.element(element[0].querySelector('.b2b-horizontal-table-inner-container')); outerContainer = angular.element(element[0].querySelector('.b2b-horizontal-table')); totalWidth = element.children()[0].offsetWidth; - - tableRows = element.find('tr'); - totalWidth = element.children()[0].offsetWidth; scope.disableLeft = true; scope.disableRight = false; if (scope.numOfStickyCols > b2bHorizontalTableConfig.maxStickyColumns) { - throw new Error("Table can only support 3 sticky columns."); - } + throw new Error('Table can only support ' + b2bHorizontalTableConfig.maxStickyColumns + ' sticky columns.'); + } angular.forEach(tableRows, function(row, rowIndex) { - collectiveRowHeight.push(findMax(row.children, 'height')); for(var j = 0; j < row.children.length; j++) { if (tableColumns[j] === undefined) { tableColumns[j] = []; @@ -4029,38 +4155,52 @@ angular.module('b2b.att.horizontalTable', []) for (var i = scope.numOfStickyCols+1; i < tableColumns.length; i++) { angular.element(tableColumns[i]).css(displayBlockCSS); } - } + } + // We must calculate here as we need cells to be reset after re-render. + angular.forEach(tableRows, function(row, rowIndex) { + collectiveRowHeight.push(findMax(row.children, 'height')); // BUG: Keeping this here now causes row height bugs + }); + + console.log('tableColumns:', tableColumns); for (var i = 0; i < tableColumns.length; i++) { collectiveColumnWidth.push(findMax(tableColumns[i], 'width')); //offsetWidth doesn't take into account custom css inside } for(var i = 0; i < scope.numOfStickyCols; i++) { maxWidth += collectiveColumnWidth[i]; } - - stickyPixels = totalWidth-maxWidth; + // BUG: The code I put in to fix the table not spanning 100% width is now preventing + // table cells from laying out more than stickyPixels and thus we have weird wrapping + stickyPixels = totalWidth-maxWidth; // At this point, for each tr, I need to set the properties (height) and each numOfStickyCols children // should be set with sticky properties (margin-left and width) var width = maxWidth; + var additive = 0; + + if (angular.element(document).find('html').hasClass('isIE')) { + additive = 25; + } + var thObject = undefined; for(var i = 0; i < scope.numOfStickyCols; i++) { for (var j = 0; j < tableRows.length; j++) { - trObject = angular.element(tableRows[j].children[i]); - - angular.element(trObject).css({ + thObject = angular.element(tableRows[j].children[i]); + angular.element(thObject).css({ 'margin-left': -(width + 2) + 'px', 'width': (collectiveColumnWidth[i] + 3) + 'px', // instead of taking the max width, grab max width for that column - 'height': collectiveRowHeight[j] + 'px', + 'height': (collectiveRowHeight[j] + additive) + 'px', 'position': 'absolute', - 'background-color': 'lightgrey' + 'background-color': '#F2F2F2' }); } - - width -= collectiveColumnWidth[i]; } - + angular.element(tableRows[0]).css('height', collectiveRowHeight[0] + 'px'); + for(var i = 0; i < tableRows.length; i++) { + angular.element(tableRows[i]).css('height', (collectiveRowHeight[i] + additive) + 'px'); + } + innerContainer.css({ 'padding-left': (maxWidth + 2) + 'px' }); @@ -4074,23 +4214,93 @@ angular.module('b2b.att.horizontalTable', []) i = visibleColumns + 1; } + //columnSets = [[1, 1], [2,7]]; + updateCellDisplay(columnSets[setIndex]); checkScrollArrows(); scope.numOfCols = tableColumns.length; - console.log('Bulk Mode is ' + (attrs.bulkMode ? 'enabled': 'disabled')); - console.log('tableColumns', tableColumns); - console.log('collectiveColumnWidth: ', collectiveColumnWidth); - console.log('maxWidth: ', maxWidth); + console.log('collectiveColumnWidth', collectiveColumnWidth); + console.log('collectiveRowHeight: ', collectiveRowHeight); } + + + // Let's get started with some math! + hack(); + + function calculateVisibleColumns(startingPoint) { + var usedWidth = 0, + visibleColumns = startingPoint || scope.numOfStickyCols; + + while(usedWidth < stickyPixels && visibleColumns < collectiveColumnWidth.length) { + if (usedWidth+collectiveColumnWidth[visibleColumns] > stickyPixels) { + if (startingPoint === visibleColumns) { + return visibleColumns; // The next cell is too large to fit, it should be only thing to fit + } + visibleColumns--; + return visibleColumns; + } + usedWidth += collectiveColumnWidth[visibleColumns]; + visibleColumns++; + } + + if (usedWidth > stickyPixels) { + return --visibleColumns; + } + return visibleColumns; + } + + function updateCellDisplay(set) { + for (var i = scope.numOfStickyCols; i < tableColumns.length; i++) { + angular.element(tableColumns[i]).css(displayNoneCSS); + } + + for (var i = set[0]; i <= set[1]; i++) { + angular.element(tableColumns[i]).css(displayBlockCSS); + } + } + + function findMax(arr, prop) { + var max = 0; + var localVal = 0; + var prevDisplay; + var item; + for (var i = 0; i < arr.length; i++) { + item = arr[i]; + prevDisplay = angular.element(item).css('display'); + + if (scope.$$phase) { + scope.$digest(); + } + // Remove inline styles, they will mess up calculations from original run + angular.element(item).css('height', ''); + angular.element(item).css('width', ''); + if (prop === 'width') { + // If we do not undo previous run's inline styles, this will grow widths on each re-render. + localVal = Math.ceil(parseInt(window.getComputedStyle(item).width.split('px')[0], 10)) + 30; // 30 px is padding + } else if (prop === 'offsetWidth') { + localVal = item.offsetWidth; + } else if (prop === 'height') { + //localVal = item.offsetHeight; + localVal = Math.ceil(parseInt(window.getComputedStyle(item).height.split('px')[0], 10)) + } + + if (localVal >= max) { + max = localVal; + } + } + + return max; + } + + function checkScrollArrows() { scope.disableLeft = (setIndex === 0); scope.disableRight = !(setIndex < columnSets.length-1); } - scope.moveViewportLeft = function () { setIndex--; updateCellDisplay(columnSets[setIndex]); @@ -4517,29 +4727,13 @@ angular.module('b2b.att.leftNavigation', []) scope.idx = -1; scope.itemIdx = -1; scope.navIdx = -1; - scope.toggleNav = function (val,link) { - /**Added for ECOMP: make parent menu a link if no child menus.**/ - if(link!=null && link!=''){ - location.href = link; - return; - } - /**Ended**/ - if (val === scope.idx) { + scope.toggleNav = function (val) { + if (val === scope.idx) { scope.idx = -1; return; } scope.idx = val; }; - /*New function for ECOMP*/ - scope.toggleDrawer = function(showmenu){ - scope.idx=-1; /*hide the sunmenus*/ - if(showmenu){ - //scope.openList.length=0; - document.getElementById('page-content').style.marginLeft = "50px"; - } - else - document.getElementById('page-content').style.marginLeft = "250px"; - }; scope.liveLink = function (evt, val1, val2) { scope.itemIdx = val1; scope.navIdx = val2; @@ -4616,29 +4810,6 @@ angular.module('b2b.att.listbox', ['b2b.att.utilities']) 'listboxDataIndex': 0 }; - /*scope.$watch('currentIndex', function(oldVal, newVal) { - if (angular.equals(oldVal, newVal)) return; - if (!scope.multiselectable) { - // This doesn't garuntee anything. index will update on focus based on rules - currentIndexSet.listboxDataIndex = scope.currentIndex; - // Should this occur? - //scope.listboxData[currentIndexSet.listboxDataIndex].selected = true; - - // Update elementIndex - elements = elem.children(); - var indecies = Array.prototype.map.call(elements, function(item) { - return parseInt(angular.element(item).attr('data-index'), 10); - }).filter(function(item) { - return item === scope.currentIndex; - }); - currentIndex.elementIndex = indecies[0]; - //focusOnElement(currentIndexSet.elementIndex); // This isn't shifting focus - if (!scope.$$phase) { - scope.$apply(); - } - } - });*/ - function isTrue(item) { if (item.selected === true) { return true; @@ -4827,7 +4998,9 @@ angular.module('b2b.att.listbox', ['b2b.att.utilities']) // If no modifier keys are selected, all other items need to be unselected. prevDirection = undefined; selectItems(0, scope.listboxData.length, false); - scope.listboxData[currentIndexSet.listboxDataIndex].selected = true; + if(currentIndexSet.listboxDataIndex !== undefined && !isNaN(currentIndexSet.listboxDataIndex)){ + scope.listboxData[currentIndexSet.listboxDataIndex].selected = true; + } } focusOnElement(currentIndexSet.elementIndex); if(!scope.$$phase) { @@ -4861,7 +5034,9 @@ angular.module('b2b.att.listbox', ['b2b.att.utilities']) // If no modifier keys are selected, all other items need to be unselected. prevDirection = undefined; selectItems(0, scope.listboxData.length, false); - scope.listboxData[currentIndexSet.listboxDataIndex].selected = true; + if(currentIndexSet.listboxDataIndex !== undefined && !isNaN(currentIndexSet.listboxDataIndex)){ + scope.listboxData[currentIndexSet.listboxDataIndex].selected = true; + } } focusOnElement(currentIndexSet.elementIndex); @@ -5227,10 +5402,7 @@ angular.module('b2b.att.loaderAnimation', []) }); } }; -}]) - - -; +}]); /** * @ngdoc directive * @name Misc.att:messageWrapper @@ -5503,7 +5675,7 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti }; }]) -.directive('b2bModalWindow', ['$timeout', 'windowOrientation', '$window', function ($timeout, windowOrientation, $window) { +.directive('b2bModalWindow', ['$timeout', 'windowOrientation', '$window', 'keymap', function ($timeout, windowOrientation, $window, keymap) { return { restrict: 'EA', scope: { @@ -5516,6 +5688,7 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti scope.windowClass = attrs.windowClass || ''; scope.sizeClass = attrs.sizeClass || ''; scope.isNotifDialog = false; + scope.modalClose = attrs.modalClose || false; this.setTitle = function (title) { scope.title = title; @@ -5566,7 +5739,15 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti }); } } - + + if(scope.modalClose){ + element.bind('keydown', function (e) { + if(e.keyCode == keymap.KEY.ESC){ + e.preventDefault(); + e.stopPropagation(); + } + }); + } } }; }]) @@ -5742,6 +5923,7 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti angularDomEl.attr('window-class', modal.windowClass); angularDomEl.attr('size-class', modal.sizeClass); angularDomEl.attr('index', openedWindows.length() - 1); + angularDomEl.attr('modal-close', modal.modalClose); angularDomEl.html(modal.content); var modalDomEl = $compile(angularDomEl)(modal.scope); @@ -5882,7 +6064,8 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti backdrop: modalOptions.backdrop, keyboard: modalOptions.keyboard, windowClass: modalOptions.windowClass, - sizeClass: modalOptions.sizeClass + sizeClass: modalOptions.sizeClass, + modalClose: modalOptions.modalClose }); }, function resolveError(reason) { @@ -5914,7 +6097,8 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti modalOk: '&', modalCancel: '&', windowClass: '@', - sizeClass: '@' + sizeClass: '@', + modalClose: '@' }, link: function (scope, elm, attr) { elm.bind('click', function (ev) { @@ -5927,7 +6111,8 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti templateUrl: scope.b2bModal, controller: scope.modalController, windowClass: scope.windowClass, - sizeClass: scope.sizeClass + sizeClass: scope.sizeClass, + modalClose: scope.modalClose }).result.then(function (value) { scope.modalOk({ value: value @@ -7001,6 +7186,7 @@ angular.module('b2b.att.multiLevelNavigation', ['b2b.att.utilities']) } //for any expandable tree item on click var toggleState = function (e) { + if (angular.element(e.target).attr("b2b-ml-nav") !== "endNode") { var eLink = element.find('a').eq(0); if (eLink.hasClass('active')) { @@ -7087,6 +7273,14 @@ angular.module('b2b.att.multiLevelNavigation', ['b2b.att.utilities']) if(element.attr("b2b-ml-nav") !== "endNode") { toggleState(e); } + if (rootE==undefined){ + findRoot(element); + } + var currSelected = rootE.parent()[0].querySelector('.selected'); + if(currSelected){ + angular.element(currSelected).removeClass('selected'); + } + element.find('a').eq(0).addClass('selected'); e.stopPropagation(); }); element.bind('focus', function (e) { @@ -7808,20 +8002,18 @@ angular.module('b2b.att.phoneNumberInput', ['ngMessages', 'b2b.att.utilities']) phoneMaskDot: '___.___.____', phoneMaskHyphen: '___-___-____' }) - .directive('b2bPhoneMask', ['$parse', 'CoreFormsUiConfig', 'keymap', function ($parse, CoreFormsUiConfig, keymap) { + .directive('b2bPhoneMask', ['$parse', 'CoreFormsUiConfig', 'keymap', 'b2bUserAgent', function ($parse, CoreFormsUiConfig, keymap, b2bUserAgent) { return { require: 'ngModel', scope: { ngModel: '=' }, link: function (scope, iElement, iAttrs, ctrl) { - var navigatorAgent = navigator.userAgent.toLowerCase(), - isAndroid = navigatorAgent.indexOf("android") > -1, - oldIE = navigatorAgent.indexOf('msie 8.0') !== -1; + var mask = ''; var validPhoneNumber = false; var currentKey = ''; - if (isAndroid) { + if (b2bUserAgent.isMobile()) { mask = "__________"; } else { switch (iAttrs.b2bPhoneMask) { @@ -7912,13 +8104,13 @@ angular.module('b2b.att.phoneNumberInput', ['ngMessages', 'b2b.att.utilities']) // Allow: Ctrl+C/c (!(e.ctrlKey) && (e.which !== '99' || e.which !== '67')) && // Allow: Ctrl+X/x - (!(e.ctrlKey) && (e.which !== '120' || e.which !== '88'))) { + (!(e.ctrlKey) && (e.which !== '120' || e.which !== '88')) && + /* 229 key code will sent as placeholder key for andriod devices */ + (e.which != 229 )) { e.preventDefault ? e.preventDefault() : e.returnValue = false; - iElement.attr("aria-label", "Only numbers are allowed"); validPhoneNumber = false; } } else { - iElement.removeAttr("aria-label"); validPhoneNumber = true; } @@ -8773,38 +8965,6 @@ angular.module('b2b.att.seekBar', ['b2b.att.utilities','b2b.att.position']) }]); /** * @ngdoc directive - * @name Forms.att:selectorModule - * - * @description - * <file src="src/selectorModule/docs/readme.md" /> - * - * @usage - * <select name="myNameBig" type="large" b2b-dropdown ng-model="Controller Variable here"> - * <option b2b-dropdown-list option-repeat="option data here" imgsrc="image path" value="value">List Text</option> - * </select> - * - * <select name="myNameBig" type="large" b2b-dropdown ng-model="Controller Variable here"> - * <option b2b-dropdown-list option-repeat="option data here" imgsrc="image path" value="value">List Text</option> - * </select> - * - * <select name="myNameBig" b2b-dropdown ng-model="Controller Variable here"> - * <optgroup b2b-dropdown-group label="Group Label here"> - * <option b2b-dropdown-list option-repeat="option data here" imgsrc="image path" value="value">List Text</option> - * </optgroup> - * </select> - * - * @example - * <section id="code"> - <example module="b2b.att"> - <file src="src/selectorModule/docs/demo.html" /> - <file src="src/selectorModule/docs/demo.js" /> - </example> - </section> - * - */ -angular.module('b2b.att.selectorModule', ['b2b.att.dropdowns']); -/** - * @ngdoc directive * @name Layouts.att:separators * * @description @@ -9372,7 +9532,7 @@ angular.module('b2b.att.staticRouteTemplate', ['b2b.att.utilities']) * @name Progress & usage indicators.att:statusTracker * * @scope - * @param {array} statuses - An array of status objects + * @param {array} statusObject - An array of status objects that accept heading, estimate, description and state * @description * <file src="src/statusTracker/docs/readme.md" /> * @@ -9384,7 +9544,6 @@ angular.module('b2b.att.staticRouteTemplate', ['b2b.att.utilities']) * @example <section id="code"> - <b>HTML + AngularJS</b> <example module="b2b.att"> <file src="src/statusTracker/docs/demo.html" /> <file src="src/statusTracker/docs/demo.js" /> @@ -9394,7 +9553,14 @@ angular.module('b2b.att.staticRouteTemplate', ['b2b.att.utilities']) angular.module('b2b.att.statusTracker', ['b2b.att.utilities']) .constant('b2bStatusTrackerConfig', { - 'maxViewItems': 3 + 'maxViewItems': 3, + 'icons': { + 'complete': 'icoControls-approval', + 'current': 'icon-misc-time', + 'pending': 'icoControls-statusokay', + 'actionRequired': 'icon-primary-securityalerts-alert', + 'notAvailable': 'icoControls-restricted' + } }) .directive('b2bStatusTracker', ['b2bStatusTrackerConfig', function(b2bStatusTrackerConfig) { return { @@ -9424,19 +9590,10 @@ angular.module('b2b.att.statusTracker', ['b2b.att.utilities']) scope.isInViewport = function(index) { return (index < scope.currentViewIndex+3 && index >= scope.currentViewIndex); // && index > scope.currentViewIndex-2 }; - scope.currentStatus = function(index) { - if(index != undefined){ - if(!scope.statuses[index].complete) { - if(index > 0 && scope.statuses[index-1].complete) { - return true; - } else if(index == 0 && !scope.statuses[index].complete){ - return true; - } else { - return false; - } - } - } - }; + + scope.removeCamelCase = function(str) { + return str.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase(); + } } }; }]); @@ -9702,7 +9859,7 @@ angular.module('b2b.att.tableScrollbar', []) firstColumn = angular.element(trObject.children()[0]); angular.element(firstColumn).css({ - 'margin-left': -(firstColumnWidth + 2) + 'px', + 'left': '0px', 'width': (firstColumnWidth + 2) + 'px', 'position': 'absolute' }); @@ -9754,6 +9911,7 @@ angular.module('b2b.att.tableScrollbar', []) } }; + innerContainer.bind('scroll', function () { $timeout(function () { scope.checkScrollArrows(); @@ -10038,7 +10196,7 @@ angular.module('b2b.att.tables', ['b2b.att.utilities']) } else if (attr.type === 'body') { var html = elem.children(); if (attr.rowRepeat) { - html.attr('ng-repeat', attr.rowRepeat.concat(" | orderBy : columnIndex : reverse | filter : searchCriteria : false ")); + html.attr('ng-repeat', attr.rowRepeat.concat(" | orderBy : (reverse?'-':'')+ columnIndex | filter : searchCriteria : false ")); } html.attr('ng-class', "{'odd': $odd && zebraStripFlag}"); html.attr('class', 'data-row'); @@ -10583,6 +10741,51 @@ angular.module('b2b.att.textArea', ['b2b.att.utilities']) /** * @ngdoc directive + * @name Forms.att:timeInputField + * + * @description + * <file src="src/timeInputField/docs/readme.md" /> + * + + * @example + * <section id="code"> + <example module="b2b.att"> + <file src="src/timeInputField/docs/demo.html" /> + <file src="src/timeInputField/docs/demo.js" /> + </example> + </section> + * + */ +angular.module('b2b.att.timeInputField',['ngMessages', 'b2b.att.utilities']).directive('b2bTimeFormat',function(){ + return{ + restrict : 'A', + require : '^ngModel', + link : function(scope,elem,attr,ctrl){ + elem.on('keyup',function(evt){ + var modelValue = ctrl.$modelValue; + var format = attr.b2bTimeFormat; + modelValue = modelValue.split(':'); + if(format == "12"){ + if(!(modelValue[0] <= 12 && modelValue[0] > 0 ) || !(modelValue[1] <= 59)){ + ctrl.$setValidity('inValidTime',false); + }else{ + ctrl.$setValidity('inValidTime',true); + } + }else if(format =="24"){ + if(!(modelValue[0] <= 23) || !(modelValue[1] <= 59)){ + ctrl.$setValidity('inValidTime',false); + }else{ + ctrl.$setValidity('inValidTime',true); + } + } + scope.$apply(); + }); + } + } +}); + +/** + * @ngdoc directive * @name Forms.att:tooltipsForForms * * @description @@ -19400,7 +19603,7 @@ angular.module('b2b.att.utilities', ['ngSanitize']) searchText = searchText.toLowerCase(); angular.forEach(items, function(item) { angular.forEach(attrs, function(attr) { - if (item.hasOwnProperty(attr) && item[attr].toLowerCase().includes(searchText)) { + if (item.hasOwnProperty(attr) && (item[attr].toLowerCase().indexOf(searchText) != -1)) { filtered.push(item); return; } @@ -19820,6 +20023,18 @@ https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js }); }; + var _touch = function (flag, callbackFunc, scope) { + scope.$watch(flag, function (val) { + $timeout(function () { + if (val) { + $document.bind('touchstart', callbackFunc); + } else { + $document.unbind('touchstart', callbackFunc); + } + }); + }); + }; + var _scroll = function (flag, callbackFunc, scope) { scope.$watch(flag, function (val) { $timeout(function () { @@ -19863,6 +20078,7 @@ https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js return { click: _click, + touch: _touch, scroll: _scroll, event: _event }; @@ -21014,6 +21230,690 @@ https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js }; }]) +.constant('b2bMaskConfig', { + maskDefinitions: { + '9': /\d/, + 'A': /[a-zA-Z]/, + '*': /[a-zA-Z0-9]/ + }, + clearOnBlur: false, + clearOnBlurPlaceholder: false, + escChar: '\\', + eventsToHandle: ['input', 'keyup', 'click', 'focus'], + addDefaultPlaceholder: true, + allowInvalidValue: true +}) +/** + * @param {boolean} modelViewValue - If this is set to true, then the model value bound with ng-model will be the same as the $viewValue meaning it will contain any static mask characters present in the mask definition. This will not set the model value to a $viewValue that is considered invalid. + * @param {String} maskPlaceholder - Allows customizing the mask placeholder when a user has focused the input element and while typing in their value + * @param {String} maskPlaceholderChar - Allows customizing the mask placeholder character. The default mask placeholder is _. + * @param {boolean} addDefaultPlaceholder - The default placeholder is constructed from the ui-mask definition so a mask of 999-9999 would have a default placeholder of ___-____; unless you have overridden the default placeholder character. + */ +.directive('b2bMask', ['b2bMaskConfig', function(b2bMaskConfig) { + return { + require: 'ngModel', + restrict: 'A', + link: function(scope, element, attrs, ctrl) { + var maskProcessed = false, eventsBound = false, + maskCaretMap, maskPatterns, maskPlaceholder, maskComponents, + // Minimum required length of the value to be considered valid + minRequiredLength, + value, valueMasked, isValid, + // Vars for initializing/uninitializing + originalPlaceholder = attrs.placeholder, + originalMaxlength = attrs.maxlength, + // Vars used exclusively in eventHandler() + oldValue, oldValueUnmasked, oldCaretPosition, oldSelectionLength, + // Used for communicating if a backspace operation should be allowed between + // keydownHandler and eventHandler + preventBackspace; + + var options = b2bMaskConfig; + + function isFocused (elem) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + } + + var originalIsEmpty = ctrl.$isEmpty; + ctrl.$isEmpty = function(value) { + if (maskProcessed) { + return originalIsEmpty(unmaskValue(value || '')); + } else { + return originalIsEmpty(value); + } + }; + + function initialize(maskAttr) { + if (!angular.isDefined(maskAttr)) { + return uninitialize(); + } + processRawMask(maskAttr); + if (!maskProcessed) { + return uninitialize(); + } + initializeElement(); + bindEventListeners(); + return true; + } + + function initPlaceholder(placeholderAttr) { + if ( ! placeholderAttr) { + return; + } + maskPlaceholder = placeholderAttr; + /* If the mask is processed, then we need to update the value + but don't set the value if there is nothing entered into the element + and there is a placeholder attribute on the element because that + will only set the value as the blank maskPlaceholder + and override the placeholder on the element */ + if (maskProcessed && !(element.val().length === 0 && angular.isDefined(attrs.placeholder))) { + element.val(maskValue(unmaskValue(element.val()))); + } + } + + function initPlaceholderChar() { + return initialize(attrs.uiMask); + } + + var modelViewValue = false; + + attrs.$observe('modelViewValue', function(val) { + if (val === 'true') { + modelViewValue = true; + } + }); + + attrs.$observe('allowInvalidValue', function(val) { + linkOptions.allowInvalidValue = val === ''? true : !!val; + formatter(ctrl.$modelValue); + }); + + function formatter(fromModelValue) { + if (!maskProcessed) { + return fromModelValue; + } + value = unmaskValue(fromModelValue || ''); + isValid = validateValue(value); + ctrl.$setValidity('mask', isValid); + + if (!value.length) return undefined; + if (isValid || linkOptions.allowInvalidValue) { + return maskValue(value); + } else { + return undefined; + } + } + + function parser(fromViewValue) { + if (!maskProcessed) { + return fromViewValue; + } + value = unmaskValue(fromViewValue || ''); + isValid = validateValue(value); + /* We have to set viewValue manually as the reformatting of the input + value performed by eventHandler() doesn't happen until after + this parser is called, which causes what the user sees in the input + to be out-of-sync with what the ctrl's $viewValue is set to. */ + ctrl.$viewValue = value.length ? maskValue(value) : ''; + ctrl.$setValidity('mask', isValid); + + if (isValid || linkOptions.allowInvalidValue) { + return modelViewValue ? ctrl.$viewValue : value; + } + } + + var linkOptions = {}; + + // to do + if (attrs.b2bMaskOptions) { + linkOptions = scope.$eval('[' + attrs.b2bMaskOptions + ']'); + if (angular.isObject(linkOptions[0])) { + // we can't use angular.copy nor angular.extend, they lack the power to do a deep merge + linkOptions = (function(original, current) { + for (var i in original) { + if (Object.prototype.hasOwnProperty.call(original, i)) { + if (current[i] === undefined) { + current[i] = angular.copy(original[i]); + } else { + if (angular.isObject(current[i]) && !angular.isArray(current[i])) { + current[i] = angular.extend({}, original[i], current[i]); + } + } + } + } + return current; + })(options, linkOptions[0]); + } else { + linkOptions = options; //gotta be a better way to do this.. + } + } else { + linkOptions = options; + } + + attrs.$observe('b2bMask', initialize); + if (angular.isDefined(attrs.maskPlaceholder)) { + attrs.$observe('maskPlaceholder', initPlaceholder); + } + else { + attrs.$observe('placeholder', initPlaceholder); + } + if (angular.isDefined(attrs.maskPlaceholderChar)) { + attrs.$observe('maskPlaceholderChar', initPlaceholderChar); + } + + ctrl.$formatters.unshift(formatter); + ctrl.$parsers.unshift(parser); + + function uninitialize() { + maskProcessed = false; + unbindEventListeners(); + + if (angular.isDefined(originalPlaceholder)) { + element.attr('placeholder', originalPlaceholder); + } else { + element.removeAttr('placeholder'); + } + + if (angular.isDefined(originalMaxlength)) { + element.attr('maxlength', originalMaxlength); + } else { + element.removeAttr('maxlength'); + } + + element.val(ctrl.$modelValue); + ctrl.$viewValue = ctrl.$modelValue; + return false; + } + + function initializeElement() { + value = oldValueUnmasked = unmaskValue(ctrl.$modelValue || ''); + valueMasked = oldValue = maskValue(value); + isValid = validateValue(value); + if (attrs.maxlength) { // Double maxlength to allow pasting new val at end of mask + element.attr('maxlength', maskCaretMap[maskCaretMap.length - 1] * 2); + } + if ( ! originalPlaceholder && linkOptions.addDefaultPlaceholder) { + element.attr('placeholder', maskPlaceholder); + } + var viewValue = ctrl.$modelValue; + var idx = ctrl.$formatters.length; + while(idx--) { + viewValue = ctrl.$formatters[idx](viewValue); + } + ctrl.$viewValue = viewValue || ''; + ctrl.$render(); + } + + function bindEventListeners() { + if (eventsBound) { + return; + } + element.bind('blur', blurHandler); + element.bind('mousedown mouseup', mouseDownUpHandler); + element.bind('keydown', keydownHandler); + element.bind(linkOptions.eventsToHandle.join(' '), eventHandler); + eventsBound = true; + } + + function unbindEventListeners() { + if (!eventsBound) { + return; + } + element.unbind('blur', blurHandler); + element.unbind('mousedown', mouseDownUpHandler); + element.unbind('mouseup', mouseDownUpHandler); + element.unbind('keydown', keydownHandler); + element.unbind('input', eventHandler); + element.unbind('keyup', eventHandler); + element.unbind('click', eventHandler); + element.unbind('focus', eventHandler); + eventsBound = false; + } + + function validateValue(value) { + // Zero-length value validity is ngRequired's determination + return value.length ? value.length >= minRequiredLength : true; + } + + function unmaskValue(value) { + var valueUnmasked = '', + input = element[0], + maskPatternsCopy = maskPatterns.slice(), + selectionStart = oldCaretPosition, + selectionEnd = selectionStart + getSelectionLength(input), + valueOffset, valueDelta, tempValue = ''; + // Preprocess by stripping mask components from value + value = value.toString(); + valueOffset = 0; + valueDelta = value.length - maskPlaceholder.length; + angular.forEach(maskComponents, function(component) { + var position = component.position; + //Only try and replace the component if the component position is not within the selected range + //If component was in selected range then it was removed with the user input so no need to try and remove that component + if (!(position >= selectionStart && position < selectionEnd)) { + if (position >= selectionStart) { + position += valueDelta; + } + if (value.substring(position, position + component.value.length) === component.value) { + tempValue += value.slice(valueOffset, position);// + value.slice(position + component.value.length); + valueOffset = position + component.value.length; + } + } + }); + value = tempValue + value.slice(valueOffset); + angular.forEach(value.split(''), function(chr) { + if (maskPatternsCopy.length && maskPatternsCopy[0].test(chr)) { + valueUnmasked += chr; + maskPatternsCopy.shift(); + } + }); + + return valueUnmasked; + } + + function maskValue(unmaskedValue) { + var valueMasked = '', + maskCaretMapCopy = maskCaretMap.slice(); + + angular.forEach(maskPlaceholder.split(''), function(chr, i) { + if (unmaskedValue.length && i === maskCaretMapCopy[0]) { + valueMasked += unmaskedValue.charAt(0) || '_'; + unmaskedValue = unmaskedValue.substr(1); + maskCaretMapCopy.shift(); + } + else { + valueMasked += chr; + } + }); + return valueMasked; + } + + function getPlaceholderChar(i) { + var placeholder = angular.isDefined(attrs.uiMaskPlaceholder) ? attrs.uiMaskPlaceholder : attrs.placeholder, + defaultPlaceholderChar; + + if (angular.isDefined(placeholder) && placeholder[i]) { + return placeholder[i]; + } else { + defaultPlaceholderChar = angular.isDefined(attrs.uiMaskPlaceholderChar) && attrs.uiMaskPlaceholderChar ? attrs.uiMaskPlaceholderChar : '_'; + return (defaultPlaceholderChar.toLowerCase() === 'space') ? ' ' : defaultPlaceholderChar[0]; + } + } + + /* Generate array of mask components that will be stripped from a masked value + before processing to prevent mask components from being added to the unmasked value. + E.g., a mask pattern of '+7 9999' won't have the 7 bleed into the unmasked value. */ + function getMaskComponents() { + var maskPlaceholderChars = maskPlaceholder.split(''), + maskPlaceholderCopy, components; + + /* maskCaretMap can have bad values if the input has the ui-mask attribute implemented as an obversable property, e.g. the demo page */ + if (maskCaretMap && !isNaN(maskCaretMap[0])) { + /* Instead of trying to manipulate the RegEx based on the placeholder characters + we can simply replace the placeholder characters based on the already built + maskCaretMap to underscores and leave the original working RegEx to get the proper + mask components */ + angular.forEach(maskCaretMap, function(value) { + maskPlaceholderChars[value] = '_'; + }); + } + maskPlaceholderCopy = maskPlaceholderChars.join(''); + components = maskPlaceholderCopy.replace(/[_]+/g, '_').split('_'); + components = components.filter(function(s) { + return s !== ''; + }); + + /* need a string search offset in cases where the mask contains multiple identical components + E.g., a mask of 99.99.99-999.99 */ + var offset = 0; + return components.map(function(c) { + var componentPosition = maskPlaceholderCopy.indexOf(c, offset); + offset = componentPosition + 1; + return { + value: c, + position: componentPosition + }; + }); + } + + function processRawMask(mask) { + var characterCount = 0; + + maskCaretMap = []; + maskPatterns = []; + maskPlaceholder = ''; + + if (angular.isString(mask)) { + minRequiredLength = 0; + + var isOptional = false, + numberOfOptionalCharacters = 0, + splitMask = mask.split(''); + + var inEscape = false; + angular.forEach(splitMask, function(chr, i) { + if (inEscape) { + inEscape = false; + maskPlaceholder += chr; + characterCount++; + } + else if (linkOptions.escChar === chr) { + inEscape = true; + } + else if (linkOptions.maskDefinitions[chr]) { + maskCaretMap.push(characterCount); + + maskPlaceholder += getPlaceholderChar(i - numberOfOptionalCharacters); + maskPatterns.push(linkOptions.maskDefinitions[chr]); + + characterCount++; + if (!isOptional) { + minRequiredLength++; + } + + isOptional = false; + } + else if (chr === '?') { + isOptional = true; + numberOfOptionalCharacters++; + } + else { + maskPlaceholder += chr; + characterCount++; + } + }); + } + // Caret position immediately following last position is valid. + maskCaretMap.push(maskCaretMap.slice().pop() + 1); + + maskComponents = getMaskComponents(); + maskProcessed = maskCaretMap.length > 1 ? true : false; + } + + var prevValue = element.val(); + function blurHandler() { + if (linkOptions.clearOnBlur || ((linkOptions.clearOnBlurPlaceholder) && (value.length === 0) && attrs.placeholder)) { + oldCaretPosition = 0; + oldSelectionLength = 0; + if (!isValid || value.length === 0) { + valueMasked = ''; + element.val(''); + scope.$apply(function() { + //only $setViewValue when not $pristine to avoid changing $pristine state. + if (!ctrl.$pristine) { + ctrl.$setViewValue(''); + } + }); + } + } + //Check for different value and trigger change. + if (value !== prevValue) { + var currentVal = element.val(); + var isTemporarilyEmpty = value === '' && currentVal && angular.isDefined(attrs.uiMaskPlaceholderChar) && attrs.uiMaskPlaceholderChar === 'space'; + if(isTemporarilyEmpty) { + element.val(''); + } + triggerChangeEvent(element[0]); + if(isTemporarilyEmpty) { + element.val(currentVal); + } + } + prevValue = value; + } + + function triggerChangeEvent(element) { + var change; + if (angular.isFunction(window.Event) && !element.fireEvent) { + // modern browsers and Edge + try { + change = new Event('change', { + view: window, + bubbles: true, + cancelable: false + }); + } catch (ex) { + //this is for certain mobile browsers that have the Event object + //but don't support the Event constructor + change = document.createEvent('HTMLEvents'); + change.initEvent('change', false, true); + } finally { + element.dispatchEvent(change); + } + } else if ('createEvent' in document) { + // older browsers + change = document.createEvent('HTMLEvents'); + change.initEvent('change', false, true); + element.dispatchEvent(change); + } + else if (element.fireEvent) { + // IE <= 11 + element.fireEvent('onchange'); + } + } + + function mouseDownUpHandler(e) { + if (e.type === 'mousedown') { + element.bind('mouseout', mouseoutHandler); + } else { + element.unbind('mouseout', mouseoutHandler); + } + } + + element.bind('mousedown mouseup', mouseDownUpHandler); + + function mouseoutHandler() { + oldSelectionLength = getSelectionLength(this); + element.unbind('mouseout', mouseoutHandler); + } + + function keydownHandler(e) { + var isKeyBackspace = e.which === 8, + caretPos = getCaretPosition(this) - 1 || 0, //value in keydown is pre change so bump caret position back to simulate post change + isCtrlZ = e.which === 90 && e.ctrlKey; //ctrl+z pressed + + if (isKeyBackspace) { + while(caretPos >= 0) { + if (isValidCaretPosition(caretPos)) { + //re-adjust the caret position. + //Increment to account for the initial decrement to simulate post change caret position + setCaretPosition(this, caretPos + 1); + break; + } + caretPos--; + } + preventBackspace = caretPos === -1; + } + + if (isCtrlZ) { + // prevent IE bug - value should be returned to initial state + element.val(''); + e.preventDefault(); + } + } + + function eventHandler(e) { + e = e || {}; + // Allows more efficient minification + var eventWhich = e.which, + eventType = e.type; + + // Prevent shift and ctrl from mucking with old values + if (eventWhich === 16 || eventWhich === 91) { + return; + } + + var val = element.val(), + valOld = oldValue, + valMasked, + valAltered = false, + valUnmasked = unmaskValue(val), + valUnmaskedOld = oldValueUnmasked, + caretPos = getCaretPosition(this) || 0, + caretPosOld = oldCaretPosition || 0, + caretPosDelta = caretPos - caretPosOld, + caretPosMin = maskCaretMap[0], + caretPosMax = maskCaretMap[valUnmasked.length] || maskCaretMap.slice().shift(), + selectionLenOld = oldSelectionLength || 0, + isSelected = getSelectionLength(this) > 0, + wasSelected = selectionLenOld > 0, + // Case: Typing a character to overwrite a selection + isAddition = (val.length > valOld.length) || (selectionLenOld && val.length > valOld.length - selectionLenOld), + // Case: Delete and backspace behave identically on a selection + isDeletion = (val.length < valOld.length) || (selectionLenOld && val.length === valOld.length - selectionLenOld), + isSelection = (eventWhich >= 37 && eventWhich <= 40) && e.shiftKey, // Arrow key codes + + isKeyLeftArrow = eventWhich === 37, + // Necessary due to "input" event not providing a key code + isKeyBackspace = eventWhich === 8 || (eventType !== 'keyup' && isDeletion && (caretPosDelta === -1)), + isKeyDelete = eventWhich === 46 || (eventType !== 'keyup' && isDeletion && (caretPosDelta === 0) && !wasSelected), + // Handles cases where caret is moved and placed in front of invalid maskCaretMap position. Logic below + // ensures that, on click or leftward caret placement, caret is moved leftward until directly right of + // non-mask character. Also applied to click since users are (arguably) more likely to backspace + // a character when clicking within a filled input. + caretBumpBack = (isKeyLeftArrow || isKeyBackspace || eventType === 'click') && caretPos > caretPosMin; + + oldSelectionLength = getSelectionLength(this); + + // These events don't require any action + if (isSelection || (isSelected && (eventType === 'click' || eventType === 'keyup' || eventType === 'focus'))) { + return; + } + + if (isKeyBackspace && preventBackspace) { + element.val(maskPlaceholder); + // This shouldn't be needed but for some reason after aggressive backspacing the ctrl $viewValue is incorrect. + // This keeps the $viewValue updated and correct. + scope.$apply(function () { + ctrl.$setViewValue(''); // $setViewValue should be run in angular context, otherwise the changes will be invisible to angular and user code. + }); + setCaretPosition(this, caretPosOld); + return; + } + + // User attempted to delete but raw value was unaffected--correct this grievous offense + if ((eventType === 'input') && isDeletion && !wasSelected && valUnmasked === valUnmaskedOld) { + while (isKeyBackspace && caretPos > caretPosMin && !isValidCaretPosition(caretPos)) { + caretPos--; + } + while (isKeyDelete && caretPos < caretPosMax && maskCaretMap.indexOf(caretPos) === -1) { + caretPos++; + } + var charIndex = maskCaretMap.indexOf(caretPos); + // Strip out non-mask character that user would have deleted if mask hadn't been in the way. + valUnmasked = valUnmasked.substring(0, charIndex) + valUnmasked.substring(charIndex + 1); + + // If value has not changed, don't want to call $setViewValue, may be caused by IE raising input event due to placeholder + if (valUnmasked !== valUnmaskedOld) + valAltered = true; + } + + // Update values + valMasked = maskValue(valUnmasked); + + oldValue = valMasked; + oldValueUnmasked = valUnmasked; + + //additional check to fix the problem where the viewValue is out of sync with the value of the element. + //better fix for commit 2a83b5fb8312e71d220a497545f999fc82503bd9 (I think) + if (!valAltered && val.length > valMasked.length) + valAltered = true; + + element.val(valMasked); + + //we need this check. What could happen if you don't have it is that you'll set the model value without the user + //actually doing anything. Meaning, things like pristine and touched will be set. + if (valAltered) { + scope.$apply(function () { + ctrl.$setViewValue(valMasked); // $setViewValue should be run in angular context, otherwise the changes will be invisible to angular and user code. + }); + } + + // Caret Repositioning + // Ensure that typing always places caret ahead of typed character in cases where the first char of + // the input is a mask char and the caret is placed at the 0 position. + if (isAddition && (caretPos <= caretPosMin)) { + caretPos = caretPosMin + 1; + } + + if (caretBumpBack) { + caretPos--; + } + + // Make sure caret is within min and max position limits + caretPos = caretPos > caretPosMax ? caretPosMax : caretPos < caretPosMin ? caretPosMin : caretPos; + + // Scoot the caret back or forth until it's in a non-mask position and within min/max position limits + while (!isValidCaretPosition(caretPos) && caretPos > caretPosMin && caretPos < caretPosMax) { + caretPos += caretBumpBack ? -1 : 1; + } + + if ((caretBumpBack && caretPos < caretPosMax) || (isAddition && !isValidCaretPosition(caretPosOld))) { + caretPos++; + } + oldCaretPosition = caretPos; + setCaretPosition(this, caretPos); + } + + function isValidCaretPosition(pos) { + return maskCaretMap.indexOf(pos) > -1; + } + + function getCaretPosition(input) { + if (!input) + return 0; + if (input.selectionStart !== undefined) { + return input.selectionStart; + } else if (document.selection) { + if (isFocused(element[0])) { + // For IE + input.focus(); + var selection = document.selection.createRange(); + selection.moveStart('character', input.value ? -input.value.length : 0); + return selection.text.length; + } + } + return 0; + } + + function setCaretPosition(input, pos) { + if (!input) + return 0; + if (input.offsetWidth === 0 || input.offsetHeight === 0) { + return; // Input's hidden + } + if (input.setSelectionRange) { + if (isFocused(element[0])) { + input.focus(); + input.setSelectionRange(pos, pos); + } + } + else if (input.createTextRange) { + // For IE + var range = input.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + } + + function getSelectionLength(input) { + if (!input) + return 0; + if (input.selectionStart !== undefined) { + return (input.selectionEnd - input.selectionStart); + } + if (window.getSelection) { + return (window.getSelection().toString().length); + } + if (document.selection) { + return (document.selection.createRange().text.length); + } + return 0; + } + } + }; +}]) .filter('b2bMultiSepartorHighlight', function($sce) { return function(text, searchText, searchSeperator) { var splitText = function(string) { @@ -21051,10 +21951,20 @@ https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js .factory('b2bUserAgent', [function() { var _isMobile = function() { - return /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + if(/Android/i.test(navigator.userAgent)){ + return /Mobile/i.test(navigator.userAgent); + }else{ + return /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + } + }; var _notMobile = function() { - return !/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + if(/Android/i.test(navigator.userAgent)){ + return !/Mobile/i.test(navigator.userAgent); + }else{ + return !/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + } + }; var _isIE = function() { return /msie|trident/i.test(navigator.userAgent); @@ -21280,9 +22190,9 @@ angular.module("b2bTemplate/calendar/datepicker-popup.html", []).run(["$template " <table class=\"table-condensed\">\n" + " <thead>\n" + " <tr>\n" + - " <th id=\"prev\" class=\"prev\" tabindex=\"0\" b2b-accessibility-click=\"13\" aria-label=\"Previous Month\" role=\"button\" b2b-element-focus=\"!disablePrev && getFocus\" ng-style=\"{visibility: visibilityPrev}\" ng-click=\"!disablePrev && move(-1,$event)\"><i class=\"icon-primary-left\" aria-hidden=\"true\"></i></th>\n" + + " <th id=\"prev\" class=\"prev\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" aria-label=\"Previous Month\" role=\"button\" b2b-element-focus=\"!disablePrev && getFocus\" ng-style=\"{visibility: visibilityPrev}\" ng-click=\"!disablePrev && move(-1,$event)\"><i class=\"icon-primary-left\" aria-hidden=\"true\"></i></th>\n" + " <th id=\"month\" tabindex=\"-1\" aria-label=\"{{title}}\" class=\"datepicker-switch\" colspan=\"{{rows[0].length - 2}}\">{{title}}</th>\n" + - " <th id=\"next\" class=\"next\" tabindex=\"0\" b2b-accessibility-click=\"13\" b2b-element-focus=\"disablePrev && getFocus\" aria-label=\"Next Month\" role=\"button\" ng-style=\"{visibility: visibilityNext}\" ng-click=\"!disableNext && move(1,$event)\"><i class=\"icon-primary-right\" aria-hidden=\"true\"></i></th>\n" + + " <th id=\"next\" class=\"next\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" b2b-element-focus=\"disablePrev && getFocus\" aria-label=\"Next Month\" role=\"button\" ng-style=\"{visibility: visibilityNext}\" ng-click=\"!disableNext && move(1,$event)\"><i class=\"icon-primary-right\" aria-hidden=\"true\"></i></th>\n" + " </tr>\n" + " <tr ng-show=\"labels.length > 0\">\n" + " <th id=\"{{label.post}}\" class=\"dow\" ng-repeat=\"label in labels\" aria-hidden=\"true\"><span aria-hidden=\"true\">{{label.pre}}</span></th>\n" + @@ -21336,7 +22246,7 @@ angular.module("b2bTemplate/coachmark/coachmark.html", []).run(["$templateCache" angular.module("b2bTemplate/dropdowns/b2bDropdownDesktop.html", []).run(["$templateCache", function($templateCache) { $templateCache.put("b2bTemplate/dropdowns/b2bDropdownDesktop.html", "<span b2b-key prev=\"38\" next=\"40\" enable-search ng-class=\"{'large': (dropdownSize === 'large'), 'disabled': (disabled), 'selectWrap': (isInputDropdown), 'selectorModule': (dropdownType === 'menu'), 'linkSelectorModule': (dropdownType === 'link-menu')}\">\n" + - " <input b2b-dropdown-toggle b2b-dropdown-validation ng-disabled=\"disabled\" type=\"text\" id=\"{{dropdownId}}\" name=\"{{dropdownName}}\" class=\"awd-select isWrapped\" ng-required=\"dropdownRequired\" ng-model=\"currentSelected.text\" role=\"combobox\" aria-owns=\"listbox{{$id}}\" aria-expanded=\"{{toggleFlag}}\" ng-click=\"toggleDropdown()\" ng-focus=\"focused=true\" ng-blur=\"setBlur(); focused=false\" ng-class=\"{'active': toggleFlag, 'closed': !toggleFlag, 'large': (dropdownSize === 'large'), 'focused':focused}\" style=\"width:100%;\" value=\"{{currentSelected.text}}\" ng-show=\"isInputDropdown\" aria-describedby=\"{{dropdownDescribedBy}}\" readonly=\"readonly\">\n" + + " <input b2b-dropdown-toggle b2b-dropdown-validation ng-disabled=\"disabled\" type=\"text\" id=\"{{dropdownId}}\" name=\"{{dropdownName}}\" class=\"awd-select isWrapped\" ng-required=\"dropdownRequired\" ng-model=\"currentSelected.text\" role=\"combobox\" aria-owns=\"listbox{{$id}}\" aria-expanded=\"{{toggleFlag}}\" ng-click=\"toggleDropdown()\" ng-blur=\"setBlur();\" ng-class=\"{'active': toggleFlag, 'closed': !toggleFlag, 'large': (dropdownSize === 'large')}\" style=\"width:100%;\" value=\"{{currentSelected.text}}\" ng-show=\"isInputDropdown\" aria-describedby=\"{{dropdownDescribedBy}}\" readonly=\"readonly\">\n" + " <button type=\"button\" b2b-dropdown-toggle ng-disabled=\"disabled\" class=\"selectModule\" aria-label=\"{{labelText}} {{currentSelected.label}}\" aria-expanded=\"{{toggleFlag}}\" aria-haspopup=\"true\" ng-click=\"toggleDropdown()\" ng-blur=\"setBlur()\" ng-class=\"{'active opened': toggleFlag, 'closed': !toggleFlag, 'large': (dropdownSize === 'large')}\" ng-bind-html=\"currentSelected.text\" ng-show=\"!isInputDropdown\"></button>\n" + " <div ng-class=\"{'selectWrapper': (isInputDropdown), 'moduleWrapper': (!isInputDropdown)}\">\n" + " <ul id=\"listbox{{$id}}\" role=\"{{isInputDropdown?'listbox':'menu'}}\" ng-class=\"{'awd-select-list': (isInputDropdown), 'awd-module-list': (!isInputDropdown)}\" tabindex=\"-1\" ng-show=\"toggleFlag\" aria-label=\"Choose options\"></ul>\n" + @@ -21347,7 +22257,7 @@ angular.module("b2bTemplate/dropdowns/b2bDropdownDesktop.html", []).run(["$templ " </ul>\n" + "</div>\n" + "<i class=\"icon-primary-down\" aria-hidden=\"true\"></i>\n" + - "</span> "); + "</span>"); }]); angular.module("b2bTemplate/dropdowns/b2bDropdownGroupDesktop.html", []).run(["$templateCache", function($templateCache) { @@ -21359,7 +22269,7 @@ angular.module("b2bTemplate/dropdowns/b2bDropdownGroupDesktop.html", []).run(["$ angular.module("b2bTemplate/dropdowns/b2bDropdownListDesktop.html", []).run(["$templateCache", function($templateCache) { $templateCache.put("b2bTemplate/dropdowns/b2bDropdownListDesktop.html", - "<li b2b-dropdown-list-desktop b2b-key-item b2b-accessibility-click=\"13\" aria-selected=\"{{currentSelected.value === dropdownListValue}}\" ng-class=\"{'awd-select-list-item': (isInputDropdown), 'module-list-item': (!isInputDropdown)}\" tabindex=\"0\" role=\"{{isInputDropdown?'option':'menuitem'}}\" ng-click=\"selectDropdownItem()\"></li>"); + "<li b2b-dropdown-list-desktop b2b-key-item b2b-accessibility-click=\"13\" aria-selected=\"{{currentSelected.value === dropdownListValue}}\" data-hover=\"{{dropdown.highlightedValue === dropdownListValue}}\" ng-class=\"{'awd-select-list-item': (isInputDropdown), 'module-list-item': (!isInputDropdown)}\" tabindex=\"0\" role=\"{{isInputDropdown?'option':'menuitem'}}\" ng-click=\"selectDropdownItem()\" ng-focus=\"highlightDropdown()\"></li>"); }]); angular.module("b2bTemplate/fileUpload/fileUpload.html", []).run(["$templateCache", function($templateCache) { @@ -21415,16 +22325,30 @@ angular.module("b2bTemplate/horizontalTable/horizontalTable.html", []).run(["$te $templateCache.put("b2bTemplate/horizontalTable/horizontalTable.html", "<div class=\"b2b-horizontal-table\">\n" + " <div class=\"b2b-horizontal-table-arrows row span12\">\n" + - " <div class=\"span4\">\n" + - " <button class=\"btn-arrow left\" type=\"button\" ng-click=\"moveViewportLeft()\" ddh-accessibility-click=\"13,32\" ng-disabled=\"disableLeft\"><div class=\"btn btn-alt\"><i class=\"icon-primary-left\"></i></div>Previous Set</button>\n" + + " <div class=\"span4 b2b-prev-link\">\n" + + " <a href=\"javascript:void(0)\" ng-click=\"moveViewportLeft()\" ddh-accessibility-click=\"13,32\" ng-if=\"!disableLeft\">Previous Set</a>\n" + + " <span ng-if=\"disableLeft\" class=\"b2b-disabled-text\">Previous Set</span>\n" + " </div>\n" + " \n" + " <span class=\"span5 b2b-horizontal-table-column-info\" aria-live=\"polite\" tabindex=\"-1\">\n" + " Displaying {{getColumnSet()[0]}} - {{getColumnSet()[1]}} of {{numOfCols}} (total) columns\n" + " </span>\n" + + "\n" + + " <div ng-if=\"legendContent\" class=\"span2 b2b-horizontal-table-legend\">\n" + + " <b2b-flyout>\n" + + " <div tabindex=\"0\" role=\"button\" aria-haspopup=\"true\" b2b-flyout-toggler b2b-accessibility-click=\"13,32\" aria-expanded=\"{{flyoutOpened ? 'true' : 'false'}}\">\n" + + " Legend\n" + + " <i class=\"icoControls-down\" role=\"img\"></i>\n" + + " </div>\n" + + " <b2b-flyout-content horizontal-placement=\"center\" vertical-placement=\"below\">\n" + + " <div ng-bind-html=\"legendContent\"></div>\n" + + " </b2b-flyout-content>\n" + + " </b2b-flyout>\n" + + " </div>\n" + " \n" + - " <div class=\"span3\">\n" + - " <button class=\"btn-arrow right\" ng-click=\"moveViewportRight()\" ddh-accessibility-click=\"13,32\" ng-disabled=\"disableRight\" type=\"button\">Next Set<div class=\"btn btn-alt\"><i class=\"icon-primary-right\"></i></div></button>\n" + + " <div class=\"span3 text-right b2b-next-link\">\n" + + " <a href=\"javascript:void(0)\" ng-click=\"moveViewportRight()\" ddh-accessibility-click=\"13,32\" ng-if=\"!disableRight\">Next Set</a>\n" + + " <span ng-if=\"disableRight\" class=\"b2b-disabled-text\">Next Set</span>\n" + " </div>\n" + " </div>\n" + " <div class=\"b2b-horizontal-table-inner-container\">\n" + @@ -21449,7 +22373,7 @@ angular.module("b2bTemplate/hourPicker/b2bHourpickerPanel.html", []).run(["$temp $templateCache.put("b2bTemplate/hourPicker/b2bHourpickerPanel.html", "<form name=\"{{'hourpickerForm' + $id}}\">\n" + " <div class=\"hp-checkbox\" role=\"group\">\n" + - " <label class=\"checkbox\" for=\"checkbox_{{dayOption.title}}_{{$id}}\" aria-label=\"{{dayOption.title}}\" ng-repeat=\"dayOption in hourpicker.dayOptions\">\n" + + " <label class=\"checkbox\" for=\"checkbox_{{dayOption.title}}_{{$id}}\" ng-repeat=\"dayOption in hourpicker.dayOptions\">\n" + " <input type=\"checkbox\" id=\"checkbox_{{dayOption.title}}_{{$id}}\" name=\"{{'hourpickerDays' + $id}}\" ng-model=\"hourpickerPanelValue.days[$index].value\" ng-disabled=\"dayOption.disabled\" /><i class=\"skin\"></i><span>{{dayOption.label}}</span>\n" + " </label>\n" + " </div>\n" + @@ -21503,8 +22427,8 @@ angular.module("b2bTemplate/hourPicker/b2bHourpickerValue.html", []).run(["$temp "<div class=\"selected-days\">\n" + " <span class=\"day\">{{hourpickerValue.days}} {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}</span>\n" + " <span style=\"float:right\">\n" + - " <i class=\"icon-misc-pen\" role=\"button\" title=\"Edit {{hourpickerValue.days}} {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" ng-click=\"editHourpickerValue(hourpickerValue.index)\"></i>\n" + - " <i class=\"icon-misc-trash\" role=\"button\" title=\"Delete {{hourpickerValue.days}} {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" ng-click=\"deleteHourpickerValue(hourpickerValue.index)\"></i>\n" + + " <i class=\"icon-misc-pen\" role=\"button\" aria-label=\"Edit {{hourpickerValue.days}} {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}\" title=\"Edit\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" ng-click=\"editHourpickerValue(hourpickerValue.index)\"></i>\n" + + " <i class=\"icon-misc-trash\" role=\"button\" aria-label=\"Delete {{hourpickerValue.days}} {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}\" title=\"Delete\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" ng-click=\"deleteHourpickerValue(hourpickerValue.index)\"></i>\n" + " </span>\n" + " <div style=\"clear:both\"></div>\n" + "</div>"); @@ -21512,26 +22436,13 @@ angular.module("b2bTemplate/hourPicker/b2bHourpickerValue.html", []).run(["$temp angular.module("b2bTemplate/leftNavigation/leftNavigation.html", []).run(["$templateCache", function($templateCache) { $templateCache.put("b2bTemplate/leftNavigation/leftNavigation.html", - "<div class=\"b2b-nav-menu\" ng-init=\"(showmenu = true)\" ng-class=\"{false: 'left-menu-collapsed'}[showmenu]\">\n" + + "<div class=\"b2b-nav-menu\">\n" + " <div class=\"b2b-subnav-container\">\n" + " <ul class=\"b2b-subnav-content\">\n" + - " <li>" + - " <div ng-class=\"{true: 'leftmenu-arrow-expand', false: 'leftmenu-arrow-collapse'}[showmenu]\">"+ - " <a ng-click=\"toggleDrawer(showmenu);(showmenu = !showmenu) \" class=\"text-right\">" + - " <i ng-class=\"{true: 'icon-controls-left', false: 'icon-controls-right'}[showmenu]\"> </i></a>" + - " </div>"+ - " </li>" + - " <li ng-repeat=\"menu in menuData\" ng-click=\"!showmenu||toggleNav($index,menu.href)\">" + - " <span ng-class=\"{true: 'menu-icon', false: 'menu-icon-collapse'}[showmenu]\"><span class=\"{{menu.imageSrc}}\"></span> </span>" + - " <a ng-class=\"{expand: isOpen($index)}\" ng-if=\"showmenu\" aria-label=\"{{menu.name}}\" title=\" \" aria-expanded=\"{{(idx==$index)?true:false;}}\" href=\"javascript:void(0);\">" + - " {{menu.name}}" + - " <i aria-hidden=\"true\" ng-if=\"(menu.menuItems.length > 0)\" class=\"b2b-icon-primary-plus-minus\"ng-class=\"idx==$index ? 'icon-primary-expanded' : 'icon-primary-collapsed'\"></i>" + - " </a>\n" + - " <div role=\"region\" aria-hidden=\"{{(isOpen($index))?false:true;}}\">\n" + - " <ul ng-class=\"{expand: idx==$index}\">\n" + - " <li ng-repeat=\"menuItem in menu.menuItems\" ng-click=\"liveLink($event, $index, $parent.$index)\"><a aria-hidden=\"{{!(idx==$parent.$index)}}\" aria-label=\"{{menuItem.name}}\" title=\" \" href=\"{{menuItem.href}}\" tabindex=\"{{(idx==$parent.$index)?0:-1;}}\" ng-class=\"{active: itemIdx==$index && navIdx==$parent.$index}\">{{menuItem.name}}</a></li>\n" + - " </ul>\n" + - " </div>\n" + + " <li ng-repeat=\"menu in menuData\" ng-click=\"toggleNav($index)\"><a ng-class=\"{'expand': idx==$index}\" aria-label=\"{{menu.name}}\" title=\" \" aria-expanded=\"{{(idx==$index)?true:false;}}\" href=\"javascript:void(0);\">{{menu.name}}<i class=\"b2b-icon-primary-plus-minus\" ng-class=\"idx==$index ? 'icon-primary-expanded' : 'icon-primary-collapsed'\"></i></a>\n" + + " <ul ng-class=\"{expand: idx==$index}\">\n" + + " <li ng-repeat=\"menuItem in menu.menuItems\" ng-click=\"liveLink($event, $index, $parent.$index)\"><a aria-hidden=\"{{!(idx==$parent.$index)}}\" aria-label=\"{{menuItem.name}}\" title=\" \" href=\"{{menuItem.href}}\" tabindex=\"{{(idx==$parent.$index)?0:-1;}}\" ng-class=\"{active: itemIdx==$index && navIdx==$parent.$index}\">{{menuItem.name}}</a></li>\n" + + " </ul>\n" + " </li>\n" + " </ul>\n" + " </div>\n" + @@ -21616,20 +22527,22 @@ angular.module("b2bTemplate/pagination/b2b-pagination.html", []).run(["$template " <a tabindex=\"{{currentPage <= 1 ? -1 : 0 }}\" class=\"b2b-pager__item--prev\" b2b-accessibility-click=\"13,32\" title=\"Previous Page\" ng-click=\"prev($event)\" ng-if=\"totalPages > 10\" ng-class=\"currentPage <= 1 ? 'b2b-pager__item--prev-disabled': '' \">\n" + " <i class=\"icon-primary-left\"></i>\n" + " </a>\n" + - " <a tabindex=\"{{currentPage === 1 ? -1 : 0}}\" ng-class=\"{'b2b-pager__item--noclick': currentPage === 1}\" aria-selected=\"{{checkSelectedPage(page)}}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page 1{{checkSelectedPage(page) ? ' selected' : '' }}\" ng-if=\"totalPages > 10 && currentPage > 6\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(1, $event)\">\n" + + " <a tabindex=\"{{currentPage === 1 ? -1 : 0}}\" ng-class=\"{'b2b-pager__item--noclick': currentPage === 1}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page 1{{checkSelectedPage(page) ? ' selected' : '' }}\" ng-if=\"totalPages > 10 && currentPage > 6\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(1, $event)\">\n" + " 1<span class=\"offscreen-text\" ng-if=\"currentPage === 1\"> is selected</span>\n" + " </a>\n" + - " <a tabindex=\"{{currentPage === 2 ? -1 : 0}}\" aria-selected=\"{{checkSelectedPage(page)}}\" ng-class=\"{'b2b-pager__item--noclick': currentPage === 2}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page 2{{checkSelectedPage(page) ? ' selected' : '' }}\" ng-if=\"totalPages > 10 && currentPage > 6\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(2, $event)\">2<span class=\"offscreen-text\" ng-if=\"currentPage === 2\"> is selected</span></a>\n" + + " <a tabindex=\"{{currentPage === 2 ? -1 : 0}}\" ng-class=\"{'b2b-pager__item--noclick': currentPage === 2}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page 2{{checkSelectedPage(page) ? ' selected' : '' }}\" ng-if=\"totalPages > 10 && currentPage > 6\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(2, $event)\">\n" + + " 2<span class=\"offscreen-text\" ng-if=\"currentPage === 2\"> is selected</span></a>\n" + "\n" + " <span class=\"b2b-pager__item\" ng-if=\"totalPages > 10 && currentPage > 6\">...</span>\n" + "\n" + - " <a tabindex=\"{{checkSelectedPage(page) ? -1 : 0}}\" href=\"javascript:void(0)\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{page}}\" b2b-element-focus=\"isFocused(page)\" ng-repeat=\"page in pages\" ng-class=\"{'b2b-pager__item--active': checkSelectedPage(page), 'b2b-pager__item--noclick': checkSelectedPage(page)}\" b2b-accessibility-click=\"13,32\" ng-click=\"!checkSelectedPage(page) && selectPage(page, $event)\">{{page}}<span class=\"offscreen-text\" ng-if=\"currentPage === page\"> is selected</span></a>\n" + + " <a tabindex=\"{{checkSelectedPage(page) ? -1 : 0}}\" href=\"javascript:void(0)\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{page}}\" b2b-element-focus=\"isFocused(page)\" ng-repeat=\"page in pages\" ng-class=\"{'b2b-pager__item--active': checkSelectedPage(page), 'b2b-pager__item--noclick': checkSelectedPage(page)}\" b2b-accessibility-click=\"13,32\" ng-click=\"!checkSelectedPage(page) && selectPage(page, $event)\">\n" + + " {{page}}<span class=\"offscreen-text\" ng-if=\"checkSelectedPage(page)\"> is selected</span></a>\n" + "\n" + " <span class=\"b2b-pager__item\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\">...</span>\n" + "\n" + - " <a tabindex=\"{{checkSelectedPage(page) ? -1 : 0}}\" href=\"javascript:void(0)\" ng-class=\"{'b2b-pager__item--noclick': checkSelectedPage(page)}\" aria-selected=\"{{checkSelectedPage(page)}}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{totalPages-1}}\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(totalPages-1, $event)\">{{totalPages-1}}<span class=\"offscreen-text\" ng-if=\"currentPage === totalPages-1\"> is selected</span></a>\n" + + " <a tabindex=\"{{checkSelectedPage(page) ? -1 : 0}}\" href=\"javascript:void(0)\" ng-class=\"{'b2b-pager__item--noclick': checkSelectedPage(page)}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{totalPages-1}}\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(totalPages-1, $event)\">{{totalPages-1}}<span class=\"offscreen-text\" ng-if=\"checkSelectedPage(page)\"> is selected</span></a>\n" + "\n" + - " <a tabindex=\"{{currentPage === totalPages ? -1 : 0}}\" href=\"javascript:void(0)\" ng-class=\"{'b2b-pager__item--noclick': currentPage === totalPages}\" aria-selected=\"{{checkSelectedPage(page)}}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{totalPages}}\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(totalPages, $event)\">{{totalPages}}<span class=\"offscreen-text\" ng-if=\"currentPage === totalPages\"> is selected</span></a>\n" + + " <a tabindex=\"{{currentPage === totalPages ? -1 : 0}}\" href=\"javascript:void(0)\" ng-class=\"{'b2b-pager__item--noclick': currentPage === totalPages}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{totalPages}}\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(totalPages, $event)\">{{totalPages}}<span class=\"offscreen-text\" ng-if=\"checkSelectedPage(page)\"> is selected</span></a>\n" + "\n" + " <a tabindex=\"{{currentPage >= totalPages ? -1 : 0 }}\" href=\"javascript:void(0)\" class=\"b2b-pager__item--next\" b2b-accessibility-click=\"13,32\" title=\"Next Page\" ng-click=\"next($event)\" ng-if=\"totalPages > 10\" ng-class=\"currentPage >= totalPages ? 'b2b-pager__item--next-disabled' :'' \">\n" + " <i class=\"icon-primary-right\"></i>\n" + @@ -21823,22 +22736,22 @@ angular.module("b2bTemplate/statusTracker/statusTracker.html", []).run(["$templa " <i class=\"icon-primary-left\"></i>\n" + " </div>\n" + " </button>\n" + - " <div ng-repeat=\"status in statuses\" class=\"b2b-status-tracker-step\" ng-class=\"{ 'complete' : status.complete, 'current' : currentStatus($index)}\" ng-show=\"isInViewport($index)\">\n" + + " <div ng-repeat=\"status in statuses\" class=\"b2b-status-tracker-step {{ status.state }}\" ng-show=\"isInViewport($index)\">\n" + " <p class=\"b2b-status-tracker-heading\">{{status.heading}}</p>\n" + " <div class=\"progress\">\n" + " <div class=\"progress-bar\">\n" + " <span class=\"hidden-spoken\">\n" + - " {{status.complete ? 'Complete' : 'Incomplete'}}\n" + + " {{ removeCamelCase(status.state) }}\n" + " </span>\n" + " </div>\n" + " </div>\n" + - " <div class=\"b2b-status-tracker-estimate\">\n" + - " <i ng-show=\"status.estimate !== '' && status.estimate !== undefined\" ng-class=\"status.complete ? 'icoControls-approval' : 'icon-misc-time'\"></i> {{status.complete ? 'Complete' : status.estimate}}\n" + + " <div class=\"b2b-status-tracker-estimate {{status.state}}\">\n" + + " <i ng-show=\"status.estimate !== '' && status.estimate !== undefined\" ng-class=\"b2bStatusTrackerConfig.icons[status.state]\"></i>\n" + " \n" + + " <span ng-bind-html=\"status.estimate\"></span>\n" + " </div>\n" + " \n" + - " <div class=\"b2b-status-tracker-description\">\n" + - " {{status.description}}\n" + + " <div class=\"b2b-status-tracker-description\" ng-bind-html=\"status.description\"> \n" + " </div>\n" + " </div>\n" + " <button tabindex=\"0\" ng-disabled=\"currentViewIndex + b2bStatusTrackerConfig.maxViewItems === statuses.length\" ng-if=\"statuses.length > b2bStatusTrackerConfig.maxViewItems\" class=\"btn-arrow\" type=\"button\" aria-label=\"Next status\" ng-click=\"nextStatus()\">\n" + @@ -21948,7 +22861,7 @@ angular.module("b2bTemplate/tables/b2bTableHeaderSortable.html", []).run(["$temp $templateCache.put("b2bTemplate/tables/b2bTableHeaderSortable.html", "<th scope=\"col\" role=\"columnheader\" aria-sort=\"{{sortPattern !== 'null' && 'none' || sortPattern}}\" aria-label=\"{{headerName}} {{sortable !== 'false' && ': activate to sort' || ' '}} {{sortPattern !== 'null' && '' || sortPattern}}\" tabindex=\"{{sortable !== 'false' && '0' || '-1'}}\" b2b-accessibility-click=\"13,32\" ng-click=\"(sortable !== 'false') && sort();\" ng-hide=\"isHidden()\">\n" + " <span ng-transclude></span>\n" + - " <i ng-class=\"{'icon-primary-arrows-sort-arrow active': sortPattern === 'ascending', 'icon-primary-arrows-sort-arrow active down': sortPattern === 'descending'}\"></i>\n" + + " <i ng-class=\"{'icoArrows-sort-arrow active': sortPattern === 'ascending', 'icoArrows-sort-arrow active down': sortPattern === 'descending'}\"></i>\n" + "</th>"); }]); diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-chart-controller.js b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-chart-controller.js index 806b1bc2..80e1a269 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-chart-controller.js +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-chart-controller.js @@ -345,7 +345,7 @@ appDS2.controller('reportChartController', function ($scope, $rootScope, $timeou }); -app.directive('onlyDigits', function () { +appDS2.directive('onlyDigits', function () { return { restrict: 'A', @@ -362,7 +362,7 @@ app.directive('onlyDigits', function () { }; }); -app.directive('onlyCharacters', function () { +appDS2.directive('onlyCharacters', function () { return { restrict: 'A', require: '?ngModel', diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-run-controller.js b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-run-controller.js index 760ff6d3..6eb0afe6 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-run-controller.js +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-run-controller.js @@ -52,12 +52,15 @@ appDS2.controller("reportRunController", ['$scope','$rootScope','$routeParams',' + $scope.backToParentReport = function (){ + $window.location.href = "report#/report_run/"+$scope.parentReportUrlParams + } $scope.urlParams = parseQueryString($scope.currentReportUrlParams); - $scope.reportChartURL = 'report#/report_chart_wizard/'+$scope.urlParams.c_master; + $scope.reportChartURL = 'report#/report_chart/'+$scope.urlParams.c_master; - $scope.reportEditURL = 'report_wizard.htm?action=report.edit&c_master='+$scope.urlParams.c_master; + $scope.reportEditURL = 'report#/report_wizard/'+$scope.urlParams.c_master; $http.get('raptor.htm?action=report.run.container&'+$scope.currentReportUrlParams).then( diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-step-controller.js b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-step-controller.js index f1e82fa5..faa2c420 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-step-controller.js +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-step-controller.js @@ -408,8 +408,8 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout "displayHeaderAlignment" : ($scope.selectedDisplayHeaderAlignment.value=="null")?null:$scope.selectedDisplayHeaderAlignment.value, "sortable" : ($scope.sortable.value=="true"), "visible" : ($scope.visible.value=="true"), - "drilldownURL" : drilldownURL, - "drilldownParams" : "", + "drilldownURL" : raptorReportFactory.drillDownURL, + "drilldownParams" : raptorReportFactory.drillDownParams, "drilldownType" : "" } raptorReportFactory.saveColumnEditInfo(colInfo).then(function(data){ @@ -600,26 +600,46 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout }); }; - $scope.openDrillDownReportPopup = function (reportId) { + $scope.openDrillDownReportPopup = function (reportId,parentReportId) { var modalInstance = $modal.open({ scope: $scope, animation: $scope.animationsEnabled, templateUrl: 'app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-drilldown-edit.html', sizeClass: 'modal-large', controller: ['$scope', '$modalInstance', '$http', '$log','raptorReportFactory','reportId', function ($scope, $modalInstance, $http, $log, raptorReportFactory, reportId) { + + $scope.drillDownOptionList =[]; $scope.selectedvalueradioGroup = {"name":""}; $scope.selectedChildReportFormField = {"value":""}; $scope.selectedChildReportColumn = {"value":""}; $scope.fixedValue = {"value":""}; $scope.suppressValues = {"value":""}; - raptorReportFactory.getChildReportFormField(reportId).then(function(data){ - $scope.childReportFF =data; + raptorReportFactory.getChildReportFormField(reportId).then(function(data){ + for (var i=0;i<data.length;i++) { + $scope.drillDownOptionList.push( + { + "name": data[i].name, + "id": data[i].id, + "selectedvalueradioGroup":{"name":""}, + "selectedChildReportFormField":{"value":""}, + "selectedChildReportColumn":{"value":""}, + "fixedValue":{"value":""}, + "suppressValues":{"value":""} + } + ) + } },function(error){ $log.error("raptorReportFactory: getChildReportFormField failed."); }); - raptorReportFactory.getChildReportColumn(reportId).then(function(data){ + raptorReportFactory.getChildReportFormField(parentReportId).then(function(data){ + $scope.childReportFF =data; + },function(error){ + $log.error("raptorReportFactory: getChildReportFormField failed."); + }); + + raptorReportFactory.getChildReportColumn(parentReportId).then(function(data){ $scope.childReportCol =data; },function(error){ $log.error("raptorReportFactory: getChildReportFormField failed."); @@ -628,19 +648,10 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout raptorReportFactory.setDrillDownPopupOptions(null); $scope.complete = function() { -// if ($scope.selectedvalueradioGroup.name=="radiovalue1") { -// console.log("radio 1 selected"); -// } else if ($scope.selectedvalueradioGroup.name=="radiovalue2") { -// console.log("radio 2 selected"); -// } else if ($scope.selectedvalueradioGroup.name=="radiovalue3") { -// console.log("radio 3 selected"); -// } else if ($scope.selectedvalueradioGroup.name=="radiovalue4") { -// console.log("radio 4 selected"); -// } else if ($scope.selectedvalueradioGroup.name=="radiovalue5") { -// console.log("radio 5 selected"); -// } else { -// console.log("None selected"); -// } + + console.log("$scope.drillDownOptionList: "); + console.log($scope.drillDownOptionList); + var drillDownPopupOptions= { radioGroup : $scope.selectedvalueradioGroup.name, @@ -649,8 +660,23 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout fixedValue: $scope.fixedValue.value, suppressValues: $scope.suppressValues.value } - raptorReportFactory.setDrillDownPopupOptions(drillDownPopupOptions); - console.log(raptorReportFactory.drillDownPopupOptions); + var drillDownParams = ""; + var ampStr =""; + for (var i=0;i<$scope.drillDownOptionList.length; i++) { + if (drillDownParams!="") { + ampStr = "&"; + } + if ($scope.drillDownOptionList[i].selectedvalueradioGroup.name=="fixedValue"){ + drillDownParams = drillDownParams + ampStr + $scope.drillDownOptionList[i].id + "="+$scope.drillDownOptionList[i].fixedValue.value; + } else if ($scope.drillDownOptionList[i].selectedvalueradioGroup.name=="reportFF"){ + drillDownParams = drillDownParams + ampStr + $scope.drillDownOptionList[i].id + "=[!"+$scope.drillDownOptionList[i].selectedChildReportFormField.value + "]"; + } else if ($scope.drillDownOptionList[i].selectedvalueradioGroup.name=="reportCol"){ + drillDownParams = drillDownParams + ampStr + $scope.drillDownOptionList[i].id + "=["+$scope.drillDownOptionList[i].selectedChildReportColumn.value + "]"; + } + } + raptorReportFactory.setDrillDownPopupOptions(reportId,drillDownParams); + console.log(raptorReportFactory.drillDownURL); + console.log(raptorReportFactory.drillDownParams); $modalInstance.close(); }; @@ -970,8 +996,10 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout }); $scope.$on('openDrillDownpage', function(event, reportId) { + console.log("$scope.reportId"); + console.log($scope.reportId); if (reportId!="") { - $scope.openDrillDownReportPopup(reportId); + $scope.openDrillDownReportPopup(reportId,$scope.reportId); } }); diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-directives/ds2Header.js b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-directives/ds2Header.js index 7dcbdbe8..088fa487 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-directives/ds2Header.js +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-directives/ds2Header.js @@ -88,7 +88,7 @@ appDS2.directive('ds2Header', function () { $scope.adjustHeader=function() { $scope.showHeader = ($cookies.get("show_app_header") == undefined ? true : $cookies.get("show_app_header")); - console.log($scope.showHeader); + // console.log($scope.showHeader); if ($scope.showHeader==true) { document.getElementById('page-content').style.marginTop = "45px"; }else{ diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-services/ds2-raptor-report/raptorReportFactory.js b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-services/ds2-raptor-report/raptorReportFactory.js index 65e05fbd..b0aafdbf 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-services/ds2-raptor-report/raptorReportFactory.js +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-services/ds2-raptor-report/raptorReportFactory.js @@ -376,8 +376,9 @@ appDS2.factory('raptorReportFactory', function($http, $q) { return $q.reject("raptorReportFactory: getSearchDataAtPage callback failed"); }); }, - setDrillDownPopupOptions: function(drillDownPopupOptions) { - this.drillDownPopupOptions = drillDownPopupOptions; + setDrillDownPopupOptions: function(drillDownURL,drillDownParams) { + this.drillDownURL = drillDownURL; + this.drillDownParams = drillDownParams; }, getReportDeleteStatus : function(deleteUrl) { return $http.get(deleteUrl).then(function(response) { diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/b2b-leftnav-ext.html b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/b2b-leftnav-ext.html index fad0e041..5337fd24 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/b2b-leftnav-ext.html +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/b2b-leftnav-ext.html @@ -1,43 +1,50 @@ -<div class="b2b-nav-menu" id="left-menu-main-div" ng-class="leftMenuClass"> +<div class="b2b-nav-menu" id="left-menu-main-div" + ng-class="leftMenuClass"> <div class="b2b-subnav-container" id="left-menu-subnav-container"> <ul class="b2b-subnav-content" id="left-menu-subnav-content"> <li id="b2b-subnav-content-li"> <div ng-class="leftMenuArrowClass" id="left-menu-arrow-toggle-div"> - <a ng-click="toggleDrawer(showmenu);" class="text-right" id="left-menu-arrow-toggle-anchor"> - <i ng-class="{true: 'icon-controls-left', false: 'icon-controls-right'}[showmenu]" id="left-menuf-arrow-toggle-icon"> </i> + <a ng-click="toggleDrawer(showmenu);" class="text-right" + id="left-menu-arrow-toggle-anchor"> <i + ng-class="{true: 'icon-controls-left', false: 'icon-controls-right'}[showmenu]" + id="left-menuf-arrow-toggle-icon"> </i> </a> </div> </li> - <li ng-repeat="menu in menuData" ng-click="toggleNav($index,menu.href,showmenu)" id="left-menu-li-{{menu.name.split(' ').join('-')}}"> - <span ng-class="{true: 'menu-icon', false: 'menu-icon-collapse'}[showmenu]" id="left-menu-span-{{menu.name.split(' ').join('-')}}"> - <span class="{{menu.imageSrc}}" id="icon-image-{{menu.name.split(' ').join('-')}}"></span> - </span> - <a ng-class="{expand: isOpen($index)}" - id="parent-item-{{menu.name.split(' ').join('-')}}" - ng-if="showmenu" - aria-label="{{menu.name}}" title="{{menu.name}}" - aria-expanded="{{(idx==$index)?true:false;}}" - href="javascript:void(0);"> - {{menu.name}} - <i aria-hidden="true" - ng-if="(menu.menuItems.length > 0)" - class="b2b-icon-primary-plus-minus" - ng-class="idx==$index ? 'icon-primary-expanded' : 'icon-primary-collapsed'"></i> - </a> - <div role="region" aria-hidden="{{(isOpen($index))?false:true;}}" id="left-menu-child-div-{{menu.name.split(' ').join('-')}}"> - <ul ng-class="{expand: idx==$index}" id="left-menu-child-ul-{{menu.name.split(' ').join('-')}}"> - <li ng-repeat="menuItem in menu.menuItems" - ng-click="liveLink($event, $index, $parent.$index)" - id="left-menu-child-li-{{menuItem.name.split(' ').join('-')}}-{{menu.name.split(' ').join('-')}}"> - <a aria-hidden="{{!(idx==$parent.$index)}}" - aria-label="{{menuItem.name}}" title="{{menuItem.name}}" - id="child-item-{{menuItem.name.split(' ').join('-')}}" - href="{{menuItem.href}}" tabindex="{{(idx==$parent.$index)?0:-1;}}" - ng-class="{active: itemIdx==$index && navIdx==$parent.$index}">{{menuItem.name}}</a> - </li> - </ul> - </div> - </li> + <li ng-repeat="menu in menuData" + ng-click="toggleNav($index,menu.href,showmenu)" + id="left-menu-li-{{menu.name.split(' ').join('-')}}"><span + ng-class="{true: 'menu-icon', false: 'menu-icon-collapse'}[showmenu]" + id="left-menu-span-{{menu.name.split(' ').join('-')}}"> <span + class="{{menu.imageSrc}}" + id="icon-image-{{menu.name.split(' ').join('-')}}"></span> + </span> <a ng-class="{expand: isOpen($index)}" + id="parent-item-{{menu.name.split(' ').join('-')}}" ng-if="showmenu" + aria-label="{{menu.name}}" title="{{menu.name}}" + aria-expanded="{{(idx==$index)?true:false;}}" + href="javascript:void(0);"> {{menu.name}} <i aria-hidden="true" + ng-if="(menu.menuItems.length > 0)" + class="b2b-icon-primary-plus-minus" + ng-class="idx==$index ? 'icon-primary-expanded' : 'icon-primary-collapsed'"></i> + </a> + <div role="region" aria-hidden="{{(isOpen($index))?false:true;}}" + id="left-menu-child-div-{{menu.name.split(' ').join('-')}}"> + <div class="left-menu-child"> + <ul ng-class="{expand: idx==$index}" + id="left-menu-child-ul-{{menu.name.split(' ').join('-')}}"> + <li ng-repeat="menuItem in menu.menuItems" + ng-click="liveLink($event, $index, $parent.$index)" + id="left-menu-child-li-{{menuItem.name.split(' ').join('-')}}-{{menu.name.split(' ').join('-')}}"> + <a aria-hidden="{{!(idx==$parent.$index)}}" + aria-label="{{menuItem.name}}" title="{{menuItem.name}}" + id="child-item-{{menuItem.name.split(' ').join('-')}}" + href="{{menuItem.href}}" + tabindex="{{(idx==$parent.$index)?0:-1;}}" + ng-class="{active: itemIdx==$index && navIdx==$parent.$index}">{{menuItem.name}}</a> + </li> + </ul> + </div> + </div></li> </ul> </div> </div>
\ No newline at end of file diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-admin/admin-menu-edit.html b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-admin/admin-menu-edit.html index 69fd324b..913b10ed 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-admin/admin-menu-edit.html +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-admin/admin-menu-edit.html @@ -3,7 +3,7 @@ <h1 class="heading-page" id="AdminMenuItems">Admin Menu Items</h1> </div> <div> - <button type="submit" ng-click="addNewFnMenuItemModalPopup();" class="btn btn-alt btn-small">Add Menu Item</button> + <button type="submit" ng-click="addNewFnMenuItemModalPopup();" class="btn btn-alt btn-small" style="position: initial;">Add Menu Item</button> </div> <h3 class="heading-small"> diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-col-edit.html b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-col-edit.html index 097d1795..e74f89a8 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-col-edit.html +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-col-edit.html @@ -20,6 +20,11 @@ #columnEditTable .selectWrap{ width:220px; } + + +#drilldownOption .selectWrap{ + width:450px; +} </style> <div style="height: 700px;"> @@ -101,7 +106,7 @@ <tr> <td class="colTableLeftColumn" style="width:350px;">Drill-down Link:</td> - <td> + <td id="drilldownOption"> <select name="drillDown" b2b-dropdown ng-model="selectedDrillDownReport.value" placeholder-text="Select"> <option b2b-dropdown-list option-repeat="d in drilldownReports" value="{{d.id}}">{{d.name}}</option> </select> diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-drilldown-edit.html b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-drilldown-edit.html index ec2134bf..6b98ac78 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-drilldown-edit.html +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-drilldown-edit.html @@ -33,57 +33,42 @@ <div class="b2b-modal-body ng-scope ng-isolate-scope in" style="margin-bottom: -50px;"> <form name="workflowForm" class="css-form" novalidate> - <div id="columnEditTable"> + <div id="columnEditTable" ng-repeat="drillDownOption in drillDownOptionList"> <table class="striped"> <tbody> - <fieldset role="radiogroup" radio-group-accessibility> - <tr ng-show="childReportFF.length>0"> + <tr ng-show="childReportFF.length>0||childReportCol.length>0"> <td colspan="2"> - <h2>User</h2> + <h2>{{drillDownOption.name}}</h2> </td> </tr> - <tr ng-show="childReportFF.length>0"> - <td> - <div class="form-row" role="radio" style="margin-top:0px;"> - <label for="optionsRadios1111" class="radio"> - <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios1111" name="optionsRadio11" value="noValue" required> - <i class="skin"></i> - <span>No Value</span> - </label> - </div> - </td> - <td style="margin-top:10px;"> - <p>Accept Default</p> - </td> - </tr> - <tr ng-show="childReportFF.length>0"> + <tr ng-show="childReportFF.length>0||childReportCol.length>0"> <td> <div class="form-row" role="radio" style="margin-top:0px;"> - <label for="optionsRadios2222" class="radio"> - <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios2222" name="optionsRadio11" value="fixedValue"> + <label for="optionsRadios2{{$index}}" class="radio"> + <input type="radio" ng-model="drillDownOption.selectedvalueradioGroup.name" id="optionsRadios2{{$index}}" name="optionsRadio2{{$index}}" value="fixedValue"> <i class="skin"></i> <span>Fixed Value</span> </label> </div> </td> - <td><input type="text" name="defaultValue" ng-model="fixedValue.value" class="colTableInput"></td> + <td><input type="text" name="defaultValue" ng-model="drillDownOption.fixedValue.value" class="colTableInput"></td> </tr> - <tr ng-show="childReportFF.length>0"> + <tr ng-show="childReportCol.length>0"> <td> <div class="form-row" role="radio" style="margin-top:0px;"> - <label for="optionsRadios333333" class="radio"> - <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios333333" name="optionsRadio11" value="reportCol"> + <label for="optionsRadios3{{$index}}" class="radio"> + <input type="radio" ng-model="drillDownOption.selectedvalueradioGroup.name" id="optionsRadios3{{$index}}" name="optionsRadio3{{$index}}" value="reportCol"> <i class="skin"></i> <span>Value of Column</span> </div> </td> <td> - <select name="childReportColumn" b2b-dropdown ng-model="selectedChildReportColumn.value" placeholder-text="Select"> + <select name="childReportColumn" b2b-dropdown ng-model="drillDownOption.selectedChildReportColumn.value" placeholder-text="Select"> <option b2b-dropdown-list option-repeat="d in childReportCol" value="{{d.id}}">{{d.name}}</option> </select> </td> @@ -93,46 +78,23 @@ <tr ng-show="childReportFF.length>0"> <td> <div class="form-row" role="radio" style="margin-top:0px;"> - <label for="optionsRadios444444" class="radio"> - <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios444444" name="optionsRadio11" value="reportFF"> + <label for="optionsRadios4{{$index}}" class="radio"> + <input type="radio" ng-model="drillDownOption.selectedvalueradioGroup.name" id="optionsRadios4{{$index}}" name="optionsRadio4{{$index}}" value="reportFF"> <i class="skin"></i> <span>Value of Form Field</span> </div> </td> <td> - <select name="childReportFormField" b2b-dropdown ng-model="selectedChildReportFormField.value" placeholder-text="Select"> + <select name="childReportFormField" b2b-dropdown ng-model="drillDownOption.selectedChildReportFormField.value" placeholder-text="Select"> <option b2b-dropdown-list option-repeat="d in childReportFF" value="{{d.id}}">{{d.name}}</option> </select> </td> </tr> - <tr ng-show="childReportFF.length>0"> - <td> - <div class="form-row" role="radio" style="margin-top:0px;"> - <label for="optionsRadios5555" class="radio"> - <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios5555" name="optionsRadio11" value="valueSet" required> - <i class="skin"></i> - <span>Value Set</span> - </label> - </div> - </td> - <td style="margin-top:10px;"> - <p>Pass the value of the selected column if not empty, otherwise pass the value of the selected form field</p> - </td> - </tr> + </fieldset> - <tr> - <td colspan="2"> - <h2>Parameter values not to be passed to the drill-down report</h2> - </td> - </tr> - - <tr> - <td class="colTableLeftColumn">Suppress Values</td> - <td><input type="text" name="suppressValue" ng-model="suppressValues.value" class="colTableInput"></td> - </tr> </tbody> </table> diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/report-run.html b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/report-run.html index 70b24925..e5a04a1c 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/report-run.html +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/report-run.html @@ -80,7 +80,7 @@ body { <br><br> <button type="submit" style="width: 90px; height:35px;margin-top:20px; margin-left:5px;" class="btn btn-alt btn-small" ng-click="runReport()">Run</button> </form> - <a type="submit" ng-show="showBackButton" style="margin: 10px" ng-href="report.htm#/report_run/{{parentReportUrlParams}}" att-button btn-type="primary" size="small" title='Back'>Back</a> + <button type="submit" ng-show="showBackButton" style="width: 90px; height:35px;margin-top:20px; margin-left:5px;" class="btn btn-alt btn-small" ng-click="backToParentReport()">Back</button> <iframe id="chartiframe" ng-show="showChart" width="100%" height="450px" style="border: none" scrolling="no"></iframe> <div id="errorDiv"></div> <div ng-if="showGrid"> diff --git a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/styles/ecomp.css b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/styles/ecomp.css index bf5e4002..9a0716a5 100644 --- a/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/styles/ecomp.css +++ b/ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/styles/ecomp.css @@ -163,4 +163,8 @@ p,a{ left: 0; background-color: #222; z-index: 9999; +} +.left-menu-child +{ + margin-left: 37px; }
\ No newline at end of file diff --git a/ecomp-sdk/epsdk-core/src/main/java/org/openecomp/portalsdk/core/conf/AppConfig.java b/ecomp-sdk/epsdk-core/src/main/java/org/openecomp/portalsdk/core/conf/AppConfig.java index 118b0e56..eb4e66cb 100644 --- a/ecomp-sdk/epsdk-core/src/main/java/org/openecomp/portalsdk/core/conf/AppConfig.java +++ b/ecomp-sdk/epsdk-core/src/main/java/org/openecomp/portalsdk/core/conf/AppConfig.java @@ -26,7 +26,6 @@ import javax.sql.DataSource; import org.openecomp.portalsdk.core.interceptor.ResourceInterceptor; import org.openecomp.portalsdk.core.interceptor.SessionTimeoutInterceptor; -import org.openecomp.portalsdk.core.lm.FusionLicenseManager; import org.openecomp.portalsdk.core.logging.format.AlarmSeverityEnum; import org.openecomp.portalsdk.core.logging.format.AppMessagesEnum; import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; @@ -66,11 +65,11 @@ public class AppConfig extends WebMvcConfigurerAdapter implements Configurable, protected ApplicationContext appApplicationContext = null; public AppConfig() { - //loads all default fields and marks logging - //has been started for each log file type. + // loads all default fields and marks logging + // has been started for each log file type. initGlobalLocalContext(); } - + /** * Creates and returns a new instance of a secondary (order=2) * {@link ViewResolver} that finds files by adding prefix "/WEB-INF/jsp/" @@ -89,9 +88,8 @@ public class AppConfig extends WebMvcConfigurerAdapter implements Configurable, } /** - * Loads all the default logging fields into the - * global MDC context and marks each log file type - * that logging has been started. + * Loads all the default logging fields into the global MDC context and + * marks each log file type that logging has been started. */ private void initGlobalLocalContext() { logger.init(); @@ -202,10 +200,14 @@ public class AppConfig extends WebMvcConfigurerAdapter implements Configurable, dataSource.setIdleConnectionTestPeriod( Integer.parseInt(SystemProperties.getProperty(SystemProperties.IDLE_CONNECTION_TEST_PERIOD))); } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, "Error initializing database, verify database settings in properties file: " - + UserUtils.getStackTrace(e),AlarmSeverityEnum.CRITICAL); - logger.error(EELFLoggerDelegate.debugLogger, "Error initializing database, verify database settings in properties file: " - + UserUtils.getStackTrace(e),AlarmSeverityEnum.CRITICAL); + logger.error(EELFLoggerDelegate.errorLogger, + "Error initializing database, verify database settings in properties file: " + + UserUtils.getStackTrace(e), + AlarmSeverityEnum.CRITICAL); + logger.error(EELFLoggerDelegate.debugLogger, + "Error initializing database, verify database settings in properties file: " + + UserUtils.getStackTrace(e), + AlarmSeverityEnum.CRITICAL); // Raise an alarm that opening a connection to the database is // failed. logger.logEcompError(AppMessagesEnum.BeDaoSystemError); @@ -285,24 +287,20 @@ public class AppConfig extends WebMvcConfigurerAdapter implements Configurable, /** * Sets the array of Strings that are paths excluded for session timeout. + * + * @param excludeUrlPathsForSessionTimeout + * Paths to exclude */ public void setExcludeUrlPathsForSessionTimeout(final String... excludeUrlPathsForSessionTimeout) { this.excludeUrlPathsForSessionTimeout = excludeUrlPathsForSessionTimeout; } - /** - * Creates and returns a new instance of a {@link FusionLicenseManager}. - * - * @return New instance of {@link FusionLicenseManager}. -// @Bean - public FusionLicenseManager fusionLicenseManager() { - return new FusionLicenseManager(new LicenseableClassImpl()); - } - */ - /* * (non-Javadoc) - * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) + * + * @see + * org.springframework.context.ApplicationContextAware#setApplicationContext + * (org.springframework.context.ApplicationContext) */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java index 67ac567d..87134d3c 100644 --- a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java +++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java @@ -17,9 +17,12 @@ public class SSOUtil { * Constructs a path for this server, this app's context, etc. * * @param request + * HttpServletRequest * @param response + * HttpServletResponse * @param forwardPath - * @return + * Path to forward user + * @return Redirect URL */ public static String getECOMPSSORedirectURL(HttpServletRequest request, HttpServletResponse response, String forwardPath) { @@ -29,13 +32,11 @@ public class SSOUtil { try { encodedAppURL = URLEncoder.encode(appURL, "UTF-8"); } catch (UnsupportedEncodingException ex) { - logger.error("getECOMPSSORedirectURL: Failed to encode app URL " - + appURL); + logger.error("getECOMPSSORedirectURL: Failed to encode app URL " + appURL); } String portalURL = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL); if (portalURL == null || portalURL.length() == 0) { - logger.error("getECOMPSSORedirectURL: Failed to get property " + - PortalApiConstants.ECOMP_REDIRECT_URL); + logger.error("getECOMPSSORedirectURL: Failed to get property " + PortalApiConstants.ECOMP_REDIRECT_URL); return null; } String redirectURL = portalURL + "?redirectUrl=" + encodedAppURL; diff --git a/ecomp-sdk/pom.xml b/ecomp-sdk/pom.xml index e802cff2..82d9d8b3 100644 --- a/ecomp-sdk/pom.xml +++ b/ecomp-sdk/pom.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - + <!-- ECOMP Portal SDK Maven parent project --> <groupId>org.openecomp.ecompsdkos</groupId> <artifactId>epsdk-project</artifactId> @@ -9,28 +10,20 @@ <packaging>pom</packaging> <name>ECOMP Portal SDK Project (parent)</name> <url>https://wiki.onap.org/display/DW/Portal</url> - <scm> - <connection>scm:git:https://gitlab/scm/st_quantum/quantum.git</connection> - <developerConnection>scm:git:ssh://git@gitlab/st_quantum/quantum.git</developerConnection> - <tag>HEAD</tag> - </scm> <modules> <module>epsdk-fw</module> <module>epsdk-core</module> - <module>epsdk-analytics</module> + <module>epsdk-analytics</module> <module>epsdk-workflow</module> <module>epsdk-app-common</module> <module>epsdk-app-overlay</module> - </modules> <properties> <encoding>UTF-8</encoding> <springframework.version>4.2.0.RELEASE</springframework.version> <hibernate.version>4.3.11.Final</hibernate.version> - <!-- Tests usually require some setup that maven cannot do, so skip. --> - <skiptests>true</skiptests> <nexusproxy>https://nexus.onap.org</nexusproxy> <snapshotNexusPath>content/repositories/snapshots/</snapshotNexusPath> <releaseNexusPath>content/repositories/releases/</releaseNexusPath> @@ -39,21 +32,21 @@ <repositories> <repository> - <!-- Releases repository has ECOMP release artifacts --> - <id>ecomp-releases</id> - <name>OpenECOMP - Release Repository</name> - <url>${nexusproxy}/${releaseNexusPath}</url> - </repository> - <repository> - <!-- Snapshots repository has ECOMP snapshot artifacts --> - <id>ecomp-snapshots</id> - <name>OpenECOMP - Snapshot Repository</name> - <url>${nexusproxy}/${snapshotNexusPath}</url> - </repository> - <repository> - <id>ecomp-public</id> - <name>ecomp onap public Repository</name> - <url>https://nexus.onap.org/content/groups/public</url> + <!-- Releases repository has ECOMP release artifacts --> + <id>ecomp-releases</id> + <name>OpenECOMP - Release Repository</name> + <url>${nexusproxy}/${releaseNexusPath}</url> + </repository> + <repository> + <!-- Snapshots repository has ECOMP snapshot artifacts --> + <id>ecomp-snapshots</id> + <name>OpenECOMP - Snapshot Repository</name> + <url>${nexusproxy}/${snapshotNexusPath}</url> + </repository> + <repository> + <id>ecomp-public</id> + <name>ecomp onap public Repository</name> + <url>https://nexus.onap.org/content/groups/public</url> </repository> </repositories> @@ -76,24 +69,12 @@ </plugins> </build> </profile> - + </profiles> <build> <plugins> - <!-- Name the "master" branch --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-scm-plugin</artifactId> - <version>1.8.1</version> - <configuration> - <connectionType>developerConnection</connectionType> - <scmVersionType>branch</scmVersionType> - <scmVersion>feature/BRANCH_1707</scmVersion> - </configuration> - </plugin> - <!-- Compile to Java 1.8 class output format --> <plugin> <groupId>org.apache.maven.plugins</groupId> @@ -105,7 +86,7 @@ </configuration> </plugin> - <!-- Link iteration name with jar version --> + <!-- Include project version in jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> @@ -160,22 +141,21 @@ </build> <distributionManagement> - <!-- Publish jars to the Nexus Repository - public group --> - <!-- The id below must match your .m2/settings.xml/servers/server/id --> + <!-- The id below must match .m2/settings.xml/servers/server/id --> <repository> - <id>ecomp-releases</id> - <name>OpenECOMP - Release Repository</name> - <url>${nexusproxy}/${releaseNexusPath}</url> + <id>ecomp-releases</id> + <name>OpenECOMP - Release Repository</name> + <url>${nexusproxy}/${releaseNexusPath}</url> </repository> <snapshotRepository> - <id>ecomp-snapshots</id> - <name>OpenECOMP - Snapshot Repository</name> - <url>${nexusproxy}/${snapshotNexusPath}</url> + <id>ecomp-snapshots</id> + <name>OpenECOMP - Snapshot Repository</name> + <url>${nexusproxy}/${snapshotNexusPath}</url> </snapshotRepository> - + <!-- Javadocs --> <site> - <id>ecomp-site</id> - <url>dav:${nexusproxy}${sitePath}</url> + <id>ecomp-site</id> + <url>dav:${nexusproxy}${sitePath}</url> </site> </distributionManagement> |