CINXE.COM

Loop | Yawen Hu

<!DOCTYPE html> <!--[if IE 9 ]> <html class="ie9"> <![endif]--> <html lang="en"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /><script type="text/javascript">window.NREUM||(NREUM={});NREUM.info = {"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"598a124f17","applicationID":"4565198","transactionName":"MQcDMkECCkNSW0YMWghNLDBwTDRVXEheAHYJDBUUXA8IVUEXewtRAxo=","queueTime":0,"applicationTime":172,"agent":"","atts":"HUAARAkYRl5BFkYXXBYrBUQJQQADBA5UAAQCBlJTAldcBAoaTxg="}</script><script type="text/javascript">(window.NREUM||(NREUM={})).init={ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={xpid:"VgUHUl5WGwcFUlRTDgk=",licenseKey:"598a124f17",applicationID:"4565198"};;/*! For license information please see nr-loader-full-1.274.0.min.js.LICENSE.txt */ (()=>{var e,t,r={8122:(e,t,r)=>{"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555:(e,t,r)=>{"use strict";r.d(t,{Vp:()=>c,fn:()=>s,x1:()=>d});var n=r(384),i=r(8122);const o={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){try{const t=c(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}function c(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function d(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.info=a[e])}},9417:(e,t,r)=>{"use strict";r.d(t,{D0:()=>h,gD:()=>p,xN:()=>g});var n=r(993);const i=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var o=r(2614),a=r(944),s=r(384),c=r(8122);const d="[data-nr-mask]",u=()=>{const e={mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,harvestTimeSeconds:10,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},feature_flags:[],generic_events:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},harvest:{tooManyRequestsDelay:60},jserrors:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},logging:{enabled:!0,harvestTimeSeconds:10,autoStart:!0,level:n.p_.INFO},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},performance:{capture_marks:!1,capture_measures:!1},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:o.wk,inactiveMs:o.BB},session_replay:{autoStart:!0,enabled:!1,harvestTimeSeconds:60,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){i(t)?e.mask_selector="".concat(t,",").concat(d):""===t||null===t?e.mask_selector=d:(0,a.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){i(t)?e.block_selector+=",".concat(t):""!==t&&(0,a.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,a.R)(7,t)}},session_trace:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},soft_navigations:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},spa:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},ssl:void 0,user_actions:{enabled:!0}}},l={},f="All configuration objects require an agent identifier!";function h(e){if(!e)throw new Error(f);if(!l[e])throw new Error("Configuration for ".concat(e," was never set"));return l[e]}function g(e,t){if(!e)throw new Error(f);l[e]=(0,c.a)(t,u());const r=(0,s.nY)(e);r&&(r.init=l[e])}function p(e,t){if(!e)throw new Error(f);var r=h(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}},5603:(e,t,r)=>{"use strict";r.d(t,{a:()=>c,o:()=>s});var n=r(384),i=r(8122);const o={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},a={};function s(e){if(!e)throw new Error("All loader-config objects require an agent identifier!");if(!a[e])throw new Error("LoaderConfig for ".concat(e," was never set"));return a[e]}function c(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.loader_config=a[e])}},3371:(e,t,r)=>{"use strict";r.d(t,{V:()=>f,f:()=>l});var n=r(8122),i=r(384),o=r(6154),a=r(9324);let s=0;const c={buildEnv:a.F3,distMethod:a.Xs,version:a.xv,originTime:o.WN},d={customTransaction:void 0,disabled:!1,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,onerror:void 0,ptid:void 0,releaseIds:{},appMetadata:{},session:void 0,denyList:void 0,timeKeeper:void 0,obfuscator:void 0},u={};function l(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!u[e])throw new Error("Runtime for ".concat(e," was never set"));return u[e]}function f(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");u[e]={...(0,n.a)(t,d),...c},Object.hasOwnProperty.call(u[e],"harvestCount")||Object.defineProperty(u[e],"harvestCount",{get:()=>++s});const r=(0,i.nY)(e);r&&(r.runtime=u[e])}},9324:(e,t,r)=>{"use strict";r.d(t,{F3:()=>i,Xs:()=>o,Yq:()=>a,xv:()=>n});const n="1.274.0",i="PROD",o="CDN",a="^2.0.0-alpha.17"},6154:(e,t,r)=>{"use strict";r.d(t,{OF:()=>d,RI:()=>i,WN:()=>f,bv:()=>o,gm:()=>a,lR:()=>l,m:()=>c,mw:()=>s,sb:()=>u});var n=r(1863);const i="undefined"!=typeof window&&!!window.document,o="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),s=Boolean("hidden"===a?.document?.visibilityState),c=""+a?.location,d=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=d&&"undefined"==typeof SharedWorker,l=(()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);return Array.isArray(e)&&e.length>=2?+e[1]:0})(),f=Date.now()-(0,n.t)()},7295:(e,t,r)=>{"use strict";r.d(t,{Xv:()=>a,gX:()=>i,iW:()=>o});var n=[];function i(e){if(!e||o(e))return!1;if(0===n.length)return!0;for(var t=0;t<n.length;t++){var r=n[t];if("*"===r.hostname)return!1;if(s(r.hostname,e.hostname)&&c(r.pathname,e.pathname))return!1}return!0}function o(e){return void 0===e.hostname}function a(e){if(n=[],e&&e.length)for(var t=0;t<e.length;t++){let r=e[t];if(!r)continue;0===r.indexOf("http://")?r=r.substring(7):0===r.indexOf("https://")&&(r=r.substring(8));const i=r.indexOf("/");let o,a;i>0?(o=r.substring(0,i),a=r.substring(i)):(o=r,a="");let[s]=o.split(":");n.push({hostname:s,pathname:a})}}function s(e,t){return!(e.length>t.length)&&t.indexOf(e)===t.length-e.length}function c(e,t){return 0===e.indexOf("/")&&(e=e.substring(1)),0===t.indexOf("/")&&(t=t.substring(1)),""===e||e===t}},1687:(e,t,r)=>{"use strict";r.d(t,{Ak:()=>c,Ze:()=>l,x3:()=>d});var n=r(7836),i=r(3606),o=r(860),a=r(2646);const s={};function c(e,t){const r={staged:!1,priority:o.P3[t]||0};u(e),s[e].get(t)||s[e].set(t,r)}function d(e,t){e&&s[e]&&(s[e].get(t)&&s[e].delete(t),h(e,t,!1),s[e].size&&f(e))}function u(e){if(!e)throw new Error("agentIdentifier required");s[e]||(s[e]=new Map)}function l(e="",t="feature",r=!1){if(u(e),!e||!s[e].get(t)||r)return h(e,t);s[e].get(t).staged=!0,f(e)}function f(e){const t=Array.from(s[e]);t.every((([e,t])=>t.staged))&&(t.sort(((e,t)=>e[1].priority-t[1].priority)),t.forEach((([t])=>{s[e].delete(t),h(e,t)})))}function h(e,t,r=!0){const o=e?n.ee.get(e):n.ee,s=i.i.handlers;if(!o.aborted&&o.backlog&&s){if(r){const e=o.backlog[t],r=s[t];if(r){for(let t=0;e&&t<e.length;++t)g(e[t],r);Object.entries(r).forEach((([e,t])=>{Object.values(t||{}).forEach((t=>{t[0]?.on&&t[0]?.context()instanceof a.y&&t[0].on(e,t[1])}))}))}}o.isolatedBacklog||delete s[t],o.backlog[t]=null,o.emit("drain-"+t,[])}}function g(e,t){var r=e[1];Object.values(t[r]||{}).forEach((t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],o=e[2];n.apply(i,o)}}))}},7836:(e,t,r)=>{"use strict";r.d(t,{P:()=>c,ee:()=>d});var n=r(384),i=r(8990),o=r(3371),a=r(2646),s=r(5607);const c="nr@context:".concat(s.W),d=function e(t,r){var n={},s={},u={},l=!1;try{l=16===r.length&&(0,o.f)(r).isolatedBacklog}catch(e){}var f={on:g,addEventListener:g,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(d.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=h(n),c=p(e),u=c.length,l=0;l<u;l++)c[l].apply(a,r);var g=v()[s[e]];g&&g.push([f,e,r,a]);return a},get:m,listeners:p,context:h,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach((([e,n])=>{s[n]=t,t in r||(r[t]=[])}))},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach((e=>{delete f.backlog[e]}))},isBuffering:function(e){return!!v()[s[e]]},debugId:r,backlog:l?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:l};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function h(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,c,(()=>new a.y(c))):new a.y(c)}function g(e,t){n[e]=p(e).concat(t)}function p(e){return n[e]||[]}function m(t){return u[t]=u[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),u=(0,n.Zm)();u.ee||(u.ee=d)},2646:(e,t,r)=>{"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},9908:(e,t,r)=>{"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(7836).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(9908);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.d,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.d);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},3878:(e,t,r)=>{"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function o(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>o,jT:()=>n,sp:()=>i})},5607:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});const n=(0,r(9566).bz)()},9566:(e,t,r)=>{"use strict";r.d(t,{LA:()=>s,ZF:()=>c,bz:()=>a,el:()=>d});var n=r(6154);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),i.split("").map((e=>"x"===e?o(t,r++).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var s=0;s<e;s++)a.push(o(r,i++).toString(16));return a.join("")}function c(){return s(16)}function d(){return s(32)}},2614:(e,t,r)=>{"use strict";r.d(t,{BB:()=>a,H3:()=>n,g:()=>d,iL:()=>c,tS:()=>s,uh:()=>i,wk:()=>o});const n="NRBA",i="SESSION",o=144e5,a=18e5,s={STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},c={SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},d={OFF:0,FULL:1,ERROR:2}},1863:(e,t,r)=>{"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},7485:(e,t,r)=>{"use strict";r.d(t,{D:()=>i});var n=r(6154);function i(e){if(0===(e||"").indexOf("data:"))return{protocol:"data"};try{const t=new URL(e,location.href),r={port:t.port,hostname:t.hostname,pathname:t.pathname,search:t.search,protocol:t.protocol.slice(0,t.protocol.indexOf(":")),sameOrigin:t.protocol===n.gm?.location?.protocol&&t.host===n.gm?.location?.host};return r.port&&""!==r.port||("http:"===t.protocol&&(r.port="80"),"https:"===t.protocol&&(r.port="443")),r.pathname&&""!==r.pathname?r.pathname.startsWith("/")||(r.pathname="/".concat(r.pathname)):r.pathname="/",r}catch(e){return{}}}},944:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.debug&&console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t)}r.d(t,{R:()=>n})},5284:(e,t,r)=>{"use strict";r.d(t,{t:()=>c,B:()=>s});var n=r(7836),i=r(6154);const o="newrelic";const a=new Set,s={};function c(e,t){const r=n.ee.get(t);s[t]??={},e&&"object"==typeof e&&(a.has(t)||(r.emit("rumresp",[e]),s[t]=e,a.add(t),function(e={}){try{i.gm.dispatchEvent(new CustomEvent(o,{detail:e}))}catch(e){}}({loaded:!0})))}},8990:(e,t,r)=>{"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},6389:(e,t,r)=>{"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout((()=>{i=clearTimeout(i)}),t)),n||(clearTimeout(i),i=setTimeout((()=>{e.apply(this,r)}),t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},3304:(e,t,r)=>{"use strict";r.d(t,{A:()=>o});var n=r(7836);const i=()=>{const e=new WeakSet;return(t,r)=>{if("object"==typeof r&&null!==r){if(e.has(r))return;e.add(r)}return r}};function o(e){try{return JSON.stringify(e,i())??""}catch(e){try{n.ee.emit("internal-error",[e])}catch(e){}return""}}},5289:(e,t,r)=>{"use strict";r.d(t,{GG:()=>o,sB:()=>a});var n=r(3878);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.sp)("load",e,t)}function a(e){if(i())return e();(0,n.DD)("DOMContentLoaded",e)}},384:(e,t,r)=>{"use strict";r.d(t,{NT:()=>o,US:()=>u,Zm:()=>a,bQ:()=>c,dV:()=>s,nY:()=>d,pV:()=>l});var n=r(6154),i=r(1863);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function s(){let e=a();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket}),e}function c(e,t){let r=a();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t}function d(e){let t=a();return t.initializedAgents?.[e]}function u(e,t){a()[e]=t}function l(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},2843:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(3878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},8139:(e,t,r)=>{"use strict";r.d(t,{u:()=>f});var n=r(7836),i=r(3434),o=r(8990),a=r(6154);const s={},c=a.gm.XMLHttpRequest,d="addEventListener",u="removeEventListener",l="nr@wrapped:".concat(n.P);function f(e){var t=function(e){return(e||n.ee).get("events")}(e);if(s[t.debugId]++)return t;s[t.debugId]=1;var r=(0,i.YM)(t,!0);function f(e){r.inPlace(e,[d,u],"-",g)}function g(e,t){return e[1]}return"getPrototypeOf"in Object&&(a.RI&&h(document,f),h(a.gm,f),h(c.prototype,f)),t.on(d+"-start",(function(e,t){var n=e[1];if(null!==n&&("function"==typeof n||"object"==typeof n)){var i=(0,o.I)(n,l,(function(){var e={object:function(){if("function"!=typeof n.handleEvent)return;return n.handleEvent.apply(n,arguments)},function:n}[typeof n];return e?r(e,"fn-",null,e.name||"anonymous"):n}));this.wrapped=e[1]=i}})),t.on(u+"-start",(function(e){e[1]=this.wrapped||e[1]})),t}function h(e,t,...r){let n=e;for(;"object"==typeof n&&!Object.prototype.hasOwnProperty.call(n,d);)n=Object.getPrototypeOf(n);n&&t(n,...r)}},3434:(e,t,r)=>{"use strict";r.d(t,{YM:()=>c});var n=r(7836),i=r(5607);const o="nr@original:".concat(i.W);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],d=e[c];u(d)||(e[c]=r(d,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return u(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){d([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,u,l;try{a=this,o=[...arguments],u="function"==typeof n?n(o,a):n||{}}catch(t){d([t,"",[o,a,s],u],e)}i(r+"start",[o,a,s],u,c);try{return l=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],u,c),e}finally{i(r+"end",[o,a,l],u,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){d([t,r,n,i],e)}s=a}}}function d(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function u(e){return!(e&&"function"==typeof e&&e.apply&&!e[o])}},9300:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.ajax},3333:(e,t,r)=>{"use strict";r.d(t,{TZ:()=>n,Zp:()=>i,mq:()=>s,nf:()=>a,qN:()=>o});const n=r(860).K7.genericEvents,i=["auxclick","click","copy","keydown","paste","scrollend"],o=["focus","blur"],a=4,s=1e3},6774:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.jserrors},993:(e,t,r)=>{"use strict";r.d(t,{ET:()=>o,TZ:()=>a,p_:()=>i});var n=r(860);const i={ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"},o="log",a=n.K7.logging},3785:(e,t,r)=>{"use strict";r.d(t,{R:()=>c,b:()=>d});var n=r(9908),i=r(1863),o=r(860),a=r(3969),s=r(993);function c(e,t,r={},c=s.p_.INFO){(0,n.p)(a.xV,["API/logging/".concat(c.toLowerCase(),"/called")],void 0,o.K7.metrics,e),(0,n.p)(s.ET,[(0,i.t)(),t,r,c],void 0,o.K7.logging,e)}function d(e){return"string"==typeof e&&Object.values(s.p_).some((t=>t===e.toUpperCase().trim()))}},3969:(e,t,r)=>{"use strict";r.d(t,{TZ:()=>n,XG:()=>s,rs:()=>i,xV:()=>a,z_:()=>o});const n=r(860).K7.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},6630:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewEvent},782:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewTiming},6344:(e,t,r)=>{"use strict";r.d(t,{BB:()=>u,G4:()=>o,Qb:()=>l,TZ:()=>i,Ug:()=>a,_s:()=>s,bc:()=>d,yP:()=>c});var n=r(2614);const i=r(860).K7.sessionReplay,o={RECORD:"recordReplay",PAUSE:"pauseReplay",REPLAY_RUNNING:"replayRunning",ERROR_DURING_REPLAY:"errorDuringReplay"},a=.12,s={DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5},c={[n.g.ERROR]:15e3,[n.g.FULL]:3e5,[n.g.OFF]:0},d={RESET:{message:"Session was reset",sm:"Reset"},IMPORT:{message:"Recorder failed to import",sm:"Import"},TOO_MANY:{message:"429: Too Many Requests",sm:"Too-Many"},TOO_BIG:{message:"Payload was too large",sm:"Too-Big"},CROSS_TAB:{message:"Session Entity was set to OFF on another tab",sm:"Cross-Tab"},ENTITLEMENTS:{message:"Session Replay is not allowed and will not be started",sm:"Entitlement"}},u=5e3,l={API:"api"}},5270:(e,t,r)=>{"use strict";r.d(t,{Aw:()=>c,CT:()=>d,SR:()=>s});var n=r(384),i=r(9417),o=r(7767),a=r(6154);function s(e){return!!(0,n.dV)().o.MO&&(0,o.V)(e)&&!0===(0,i.gD)(e,"session_trace.enabled")}function c(e){return!0===(0,i.gD)(e,"session_replay.preload")&&s(e)}function d(e,t){const r=t.correctAbsoluteTimestamp(e);return{originalTimestamp:e,correctedTimestamp:r,timestampDiff:e-r,originTime:a.WN,correctedOriginTime:t.correctedOriginTime,originTimeDiff:Math.floor(a.WN-t.correctedOriginTime)}}},3738:(e,t,r)=>{"use strict";r.d(t,{He:()=>i,Kp:()=>s,Lc:()=>d,Rz:()=>u,TZ:()=>n,bD:()=>o,d3:()=>a,jx:()=>l,uP:()=>c});const n=r(860).K7.sessionTrace,i="bstResource",o="resource",a="-start",s="-end",c="fn"+a,d="fn"+s,u="pushState",l=1e3},4234:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(7836),i=r(1687);class o{constructor(e,t){this.agentIdentifier=e,this.ee=n.ee.get(e),this.featureName=t,this.blocked=!1}deregisterDrain(){(0,i.x3)(this.agentIdentifier,this.featureName)}}},7767:(e,t,r)=>{"use strict";r.d(t,{V:()=>o});var n=r(9417),i=r(6154);const o=e=>i.RI&&!0===(0,n.gD)(e,"privacy.cookies_enabled")},425:(e,t,r)=>{"use strict";r.d(t,{j:()=>P});var n=r(860),i=r(2555),o=r(3371),a=r(9908),s=r(7836),c=r(1687),d=r(5289),u=r(6154),l=r(944),f=r(3969),h=r(384),g=r(6344);const p=["setErrorHandler","finished","addToTrace","addRelease","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start",g.G4.RECORD,g.G4.PAUSE,"log","wrapLogger"],m=["setErrorHandler","finished","addToTrace","addRelease"];var v=r(1863),b=r(2614),y=r(993),R=r(3785),x=r(2646),w=r(3434);function T(e,t,r,n){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,l.R)(29);const i=function(e){return(e||s.ee).get("logger")}(e),o=(0,w.YM)(i),a=new x.y(s.P);return a.level=n.level,a.customAttributes=n.customAttributes,o.inPlace(t,[r],"wrap-logger-",a),i}function A(){const e=(0,h.pV)();p.forEach((t=>{e[t]=(...r)=>function(t,...r){let n=[];return Object.values(e.initializedAgents).forEach((e=>{e&&e.api?e.exposed&&e.api[t]&&n.push(e.api[t](...r)):(0,l.R)(38,t)})),n.length>1?n:n[0]}(t,...r)}))}const E={};var S=r(9417),_=r(5603),O=r(5284);const N=e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e};let I=!1;function P(e,t={},p,x){let{init:w,info:P,loader_config:j,runtime:C={},exposed:k=!0}=t;C.loaderType=p;const H=(0,h.pV)();P||(w=H.init,P=H.info,j=H.loader_config),(0,S.xN)(e.agentIdentifier,w||{}),(0,_.a)(e.agentIdentifier,j||{}),P.jsAttributes??={},u.bv&&(P.jsAttributes.isWorker=!0),(0,i.x1)(e.agentIdentifier,P);const D=(0,S.D0)(e.agentIdentifier),L=[P.beacon,P.errorBeacon];I||(D.proxy.assets&&(N(D.proxy.assets),L.push(D.proxy.assets)),D.proxy.beacon&&L.push(D.proxy.beacon),A(),(0,h.US)("activatedFeatures",O.B),e.runSoftNavOverSpa&&=!0===D.soft_navigations.enabled&&D.feature_flags.includes("soft_nav")),C.denyList=[...D.ajax.deny_list||[],...D.ajax.block_internal?L:[]],C.ptid=e.agentIdentifier,(0,o.V)(e.agentIdentifier,C),e.ee=s.ee.get(e.agentIdentifier),void 0===e.api&&(e.api=function(e,t,h=!1){t||(0,c.Ak)(e,"api");const p={};var x=s.ee.get(e),w=x.get("tracer");E[e]=b.g.OFF,x.on(g.G4.REPLAY_RUNNING,(t=>{E[e]=t}));var A="api-",S=A+"ixn-";function _(t,r,n,o){const a=(0,i.Vp)(e);return null===r?delete a.jsAttributes[t]:(0,i.x1)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),I(A,n,!0,o||null===r?"session":void 0)(t,r)}function O(){}p.log=function(e,{customAttributes:t={},level:r=y.p_.INFO}={}){(0,a.p)(f.xV,["API/log/called"],void 0,n.K7.metrics,x),(0,R.R)(x,e,t,r)},p.wrapLogger=(e,t,{customAttributes:r={},level:i=y.p_.INFO}={})=>{(0,a.p)(f.xV,["API/wrapLogger/called"],void 0,n.K7.metrics,x),T(x,e,t,{customAttributes:r,level:i})},m.forEach((e=>{p[e]=I(A,e,!0,"api")})),p.addPageAction=I(A,"addPageAction",!0,n.K7.genericEvents),p.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,o.f)(e).customTransaction=(r||"http://custom.transaction")+t,I(A,"setPageViewName",!0)()},p.setCustomAttribute=function(e,t,r=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof t)||null===t)return _(e,t,"setCustomAttribute",r);(0,l.R)(40,typeof t)}else(0,l.R)(39,typeof e)},p.setUserId=function(e){if("string"==typeof e||null===e)return _("enduser.id",e,"setUserId",!0);(0,l.R)(41,typeof e)},p.setApplicationVersion=function(e){if("string"==typeof e||null===e)return _("application.version",e,"setApplicationVersion",!1);(0,l.R)(42,typeof e)},p.start=()=>{try{(0,a.p)(f.xV,["API/start/called"],void 0,n.K7.metrics,x),x.emit("manual-start-all")}catch(e){(0,l.R)(23,e)}},p[g.G4.RECORD]=function(){(0,a.p)(f.xV,["API/recordReplay/called"],void 0,n.K7.metrics,x),(0,a.p)(g.G4.RECORD,[],void 0,n.K7.sessionReplay,x)},p[g.G4.PAUSE]=function(){(0,a.p)(f.xV,["API/pauseReplay/called"],void 0,n.K7.metrics,x),(0,a.p)(g.G4.PAUSE,[],void 0,n.K7.sessionReplay,x)},p.interaction=function(e){return(new O).get("object"==typeof e?e:{})};const N=O.prototype={createTracer:function(e,t){var r={},i=this,o="function"==typeof t;return(0,a.p)(f.xV,["API/createTracer/called"],void 0,n.K7.metrics,x),h||(0,a.p)(S+"tracer",[(0,v.t)(),e,r],i,n.K7.spa,x),function(){if(w.emit((o?"":"no-")+"fn-start",[(0,v.t)(),i,o],r),o)try{return t.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw w.emit("fn-err",[arguments,this,t],r),t}finally{w.emit("fn-end",[(0,v.t)()],r)}}}};function I(e,t,r,i){return function(){return(0,a.p)(f.xV,["API/"+t+"/called"],void 0,n.K7.metrics,x),i&&(0,a.p)(e+t,[(0,v.t)(),...arguments],r?null:this,i,x),r?void 0:this}}function P(){r.e(891).then(r.bind(r,8778)).then((({setAPI:t})=>{t(e),(0,c.Ze)(e,"api")})).catch((e=>{(0,l.R)(27,e),x.abort()}))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{N[e]=I(S,e,void 0,h?n.K7.softNav:n.K7.spa)})),p.setCurrentRouteName=h?I(S,"routeName",void 0,n.K7.softNav):I(A,"routeName",!0,n.K7.spa),p.noticeError=function(t,r){"string"==typeof t&&(t=new Error(t)),(0,a.p)(f.xV,["API/noticeError/called"],void 0,n.K7.metrics,x),(0,a.p)("err",[t,(0,v.t)(),!1,r,!!E[e]],void 0,n.K7.jserrors,x)},u.RI?(0,d.GG)((()=>P()),!0):P(),p}(e.agentIdentifier,x,e.runSoftNavOverSpa)),void 0===e.exposed&&(e.exposed=k),I=!0}},8374:(e,t,r)=>{r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860:(e,t,r)=>{"use strict";r.d(t,{$J:()=>o,K7:()=>n,P3:()=>i});const n={ajax:"ajax",genericEvents:"generic_events",jserrors:"jserrors",logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations",spa:"spa"},i={[n.pageViewEvent]:1,[n.pageViewTiming]:2,[n.metrics]:3,[n.jserrors]:4,[n.spa]:5,[n.ajax]:6,[n.sessionTrace]:7,[n.softNav]:8,[n.sessionReplay]:9,[n.logging]:10,[n.genericEvents]:11},o={[n.pageViewTiming]:"events",[n.ajax]:"events",[n.spa]:"events",[n.softNav]:"events",[n.metrics]:"jserrors",[n.jserrors]:"jserrors",[n.sessionTrace]:"browser/blobs",[n.sessionReplay]:"browser/blobs",[n.logging]:"browser/logs",[n.genericEvents]:"ins"}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>({95:"nr-full-compressor",222:"nr-full-recorder",891:"nr-full"}[e]+"-1.274.0.min.js"),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.274.0.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var d=document.getElementsByTagName("script"),u=0;u<d.length;u++){var l=d[u];if(l.getAttribute("src")==r||l.getAttribute("data-webpack")==t+o){s=l;break}}if(!s){c=!0;var f={891:"sha512-Sx2xJQrHp2m/Ngn/ZcfBCUwNr2Xy/C5urYtWpfm3bWpil4spXOQGTtNwIfF5HvPGioGASn9QTyE4Z+zC7r7wcg==",222:"sha512-hMte3OWgwwYeisSiD7WCIx/6tT16zLaPjag9uF4tIZp7ybOvrJKbeyzhe4fz1tDbkdcdOMm8dvgPPLBatSAGeA==",95:"sha512-MPaT9dkHv16XzwEUVZPyqpN1do/Er1XFAZoIAPYWylmv+iGIThqN+GwQq27pUyAX7sNXVJQVZezH96p53Ks3Pg=="};(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r,0!==s.src.indexOf(window.location.origin+"/")&&(s.crossOrigin="anonymous"),f[a]&&(s.integrity=f[a])}e[r]=[n];var h=(t,n)=>{s.onerror=s.onload=null,clearTimeout(g);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=h.bind(null,s.onerror),s.onload=h.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={959:0,85:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,d=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);d<a.length;d++)o=a[d],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.274.0.PROD"]=self["webpackChunk:NRBA-1.274.0.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";i(8374);var e=i(944),t=i(6344),r=i(9566);class n{agentIdentifier;constructor(e=(0,r.LA)(16)){this.agentIdentifier=e}#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}addPageAction(e,t){return this.#e("addPageAction",e,t)}setPageViewName(e,t){return this.#e("setPageViewName",e,t)}setCustomAttribute(e,t,r){return this.#e("setCustomAttribute",e,t,r)}noticeError(e,t){return this.#e("noticeError",e,t)}setUserId(e){return this.#e("setUserId",e)}setApplicationVersion(e){return this.#e("setApplicationVersion",e)}setErrorHandler(e){return this.#e("setErrorHandler",e)}addRelease(e,t){return this.#e("addRelease",e,t)}log(e,t){return this.#e("log",e,t)}}class o extends n{#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}start(){return this.#e("start")}finished(e){return this.#e("finished",e)}recordReplay(){return this.#e(t.G4.RECORD)}pauseReplay(){return this.#e(t.G4.PAUSE)}addToTrace(e){return this.#e("addToTrace",e)}setCurrentRouteName(e){return this.#e("setCurrentRouteName",e)}interaction(){return this.#e("interaction")}wrapLogger(e,t,r){return this.#e("wrapLogger",e,t,r)}}var a=i(860),s=i(9417);const c=Object.values(a.K7);function d(e){const t={};return c.forEach((r=>{t[r]=function(e,t){return!0===(0,s.gD)(t,"".concat(e,".enabled"))}(r,e)})),t}var u=i(425);var l=i(1687),f=i(4234),h=i(5289),g=i(6154),p=i(5270),m=i(7767),v=i(6389);class b extends f.W{constructor(e,t,r=!0){super(e.agentIdentifier,t),this.auto=r,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===e.init[this.featureName].autoStart&&(this.auto=!1),this.auto?(0,l.Ak)(e.agentIdentifier,t):this.ee.on("manual-start-all",(0,v.J)((()=>{(0,l.Ak)(e.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator(e)})))}importAggregator(t,r={}){if(this.featAggregate||!this.auto)return;let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let o;try{if((0,m.V)(this.agentIdentifier)){const{setupAgentSession:e}=await i.e(891).then(i.bind(i,6526));o=e(t)}}catch(t){(0,e.R)(20,t),this.ee.emit("internal-error",[t]),this.featureName===a.K7.sessionReplay&&this.abortHandler?.()}try{if(t.sharedAggregator)await t.sharedAggregator;else{t.sharedAggregator=i.e(891).then(i.bind(i,9337));const{EventAggregator:e}=await t.sharedAggregator;t.sharedAggregator=new e}if(!this.#t(this.featureName,o))return(0,l.Ze)(this.agentIdentifier,this.featureName),void n(!1);const{lazyFeatureLoader:e}=await i.e(891).then(i.bind(i,6103)),{Aggregate:a}=await e(this.featureName,"aggregate");this.featAggregate=new a(t,r),n(!0)}catch(t){(0,e.R)(34,t),this.abortHandler?.(),(0,l.Ze)(this.agentIdentifier,this.featureName,!0),n(!1),this.ee&&this.ee.abort()}};g.RI?(0,h.GG)((()=>o()),!0):o()}#t(e,t){switch(e){case a.K7.sessionReplay:return(0,p.SR)(this.agentIdentifier)&&!!t;case a.K7.sessionTrace:return!!t;default:return!0}}}var y=i(6630);class R extends b{static featureName=y.T;constructor(e,t=!0){super(e,y.T,t),this.importAggregator(e)}}var x=i(384);var w=i(9908),T=i(2843),A=i(3878),E=i(782),S=i(1863);class _ extends b{static featureName=E.T;constructor(e,t=!0){super(e,E.T,t),g.RI&&((0,T.u)((()=>(0,w.p)("docHidden",[(0,S.t)()],void 0,E.T,this.ee)),!0),(0,A.sp)("pagehide",(()=>(0,w.p)("winPagehide",[(0,S.t)()],void 0,E.T,this.ee))),this.importAggregator(e))}}var O=i(3969);class N extends b{static featureName=O.TZ;constructor(e,t=!0){super(e,O.TZ,t),this.importAggregator(e)}}var I=i(6774),P=i(3304);class j{constructor(e,t,r,n,i){this.name="UncaughtError",this.message="string"==typeof e?e:(0,P.A)(e),this.sourceURL=t,this.line=r,this.column=n,this.__newrelic=i}}function C(e){return D(e)?e:new j(void 0!==e?.message?e.message:e,e?.filename||e?.sourceURL,e?.lineno||e?.line,e?.colno||e?.col,e?.__newrelic)}function k(e){const t="Unhandled Promise Rejection";if(!e?.reason)return;if(D(e.reason))try{return e.reason.message=t+": "+e.reason.message,C(e.reason)}catch(t){return C(e.reason)}const r=C(e.reason);return r.message=t+": "+r?.message,r}function H(e){if(e.error instanceof SyntaxError&&!/:\d+$/.test(e.error.stack?.trim())){const t=new j(e.message,e.filename,e.lineno,e.colno,e.error.__newrelic);return t.name=SyntaxError.name,t}return D(e.error)?e.error:C(e)}function D(e){return e instanceof Error&&!!e.stack}class L extends b{static featureName=I.T;#r=!1;constructor(e,r=!0){super(e,I.T,r);try{this.removeOnAbort=new AbortController}catch(e){}this.ee.on("internal-error",(e=>{this.abortHandler&&(0,w.p)("ierr",[C(e),(0,S.t)(),!0,{},this.#r],void 0,this.featureName,this.ee)})),this.ee.on(t.G4.REPLAY_RUNNING,(e=>{this.#r=e})),g.gm.addEventListener("unhandledrejection",(e=>{this.abortHandler&&(0,w.p)("err",[k(e),(0,S.t)(),!1,{unhandledPromiseRejection:1},this.#r],void 0,this.featureName,this.ee)}),(0,A.jT)(!1,this.removeOnAbort?.signal)),g.gm.addEventListener("error",(e=>{this.abortHandler&&(0,w.p)("err",[H(e),(0,S.t)(),!1,{},this.#r],void 0,this.featureName,this.ee)}),(0,A.jT)(!1,this.removeOnAbort?.signal)),this.abortHandler=this.#n,this.importAggregator(e)}#n(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}var K=i(8990);let M=1;const U="nr@id";function V(e){const t=typeof e;return!e||"object"!==t&&"function"!==t?-1:e===g.gm?0:(0,K.I)(e,U,(function(){return M++}))}function G(e){if("string"==typeof e&&e.length)return e.length;if("object"==typeof e){if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer&&e.byteLength)return e.byteLength;if("undefined"!=typeof Blob&&e instanceof Blob&&e.size)return e.size;if(!("undefined"!=typeof FormData&&e instanceof FormData))try{return(0,P.A)(e).length}catch(e){return}}}var F=i(8139),B=i(7836),W=i(3434);const z={},q=["open","send"];function Z(t){var r=t||B.ee;const n=function(e){return(e||B.ee).get("xhr")}(r);if(z[n.debugId]++)return n;z[n.debugId]=1,(0,F.u)(r);var i=(0,W.YM)(n),o=g.gm.XMLHttpRequest,a=g.gm.MutationObserver,s=g.gm.Promise,c=g.gm.setInterval,d="readystatechange",u=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],l=[],f=g.gm.XMLHttpRequest=function(t){const r=new o(t),a=n.context(r);try{n.emit("new-xhr",[r],a),r.addEventListener(d,(s=a,function(){var e=this;e.readyState>3&&!s.resolved&&(s.resolved=!0,n.emit("xhr-resolved",[],e)),i.inPlace(e,u,"fn-",y)}),(0,A.jT)(!1))}catch(t){(0,e.R)(15,t);try{n.emit("internal-error",[t])}catch(e){}}var s;return r};function h(e,t){i.inPlace(t,["onreadystatechange"],"fn-",y)}if(function(e,t){for(var r in e)t[r]=e[r]}(o,f),f.prototype=o.prototype,i.inPlace(f.prototype,q,"-xhr-",y),n.on("send-xhr-start",(function(e,t){h(e,t),function(e){l.push(e),a&&(p?p.then(b):c?c(b):(m=-m,v.data=m))}(t)})),n.on("open-xhr-start",h),a){var p=s&&s.resolve();if(!c&&!s){var m=1,v=document.createTextNode(m);new a(b).observe(v,{characterData:!0})}}else r.on("fn-end",(function(e){e[0]&&e[0].type===d||b()}));function b(){for(var e=0;e<l.length;e++)h(0,l[e]);l.length&&(l=[])}function y(e,t){return t}return n}var Y="fetch-",X=Y+"body-",Q=["arrayBuffer","blob","json","text","formData"],J=g.gm.Request,ee=g.gm.Response,te="prototype";const re={};function ne(e){const t=function(e){return(e||B.ee).get("fetch")}(e);if(!(J&&ee&&g.gm.fetch))return t;if(re[t.debugId]++)return t;function r(e,r,n){var i=e[r];"function"==typeof i&&(e[r]=function(){var e,r=[...arguments],o={};t.emit(n+"before-start",[r],o),o[B.P]&&o[B.P].dt&&(e=o[B.P].dt);var a=i.apply(this,r);return t.emit(n+"start",[r,e],a),a.then((function(e){return t.emit(n+"end",[null,e],a),e}),(function(e){throw t.emit(n+"end",[e],a),e}))})}return re[t.debugId]=1,Q.forEach((e=>{r(J[te],e,X),r(ee[te],e,X)})),r(g.gm,"fetch",Y),t.on(Y+"end",(function(e,r){var n=this;if(r){var i=r.headers.get("content-length");null!==i&&(n.rxSize=i),t.emit(Y+"done",[null,r],n)}else t.emit(Y+"done",[e],n)})),t}var ie=i(7485),oe=i(5603);class ae{constructor(e){this.agentIdentifier=e}generateTracePayload(e){if(!this.shouldGenerateTrace(e))return null;var t=(0,oe.o)(this.agentIdentifier);if(!t)return null;var n=(t.accountID||"").toString()||null,i=(t.agentID||"").toString()||null,o=(t.trustKey||"").toString()||null;if(!n||!i)return null;var a=(0,r.ZF)(),s=(0,r.el)(),c=Date.now(),d={spanId:a,traceId:s,timestamp:c};return(e.sameOrigin||this.isAllowedOrigin(e)&&this.useTraceContextHeadersForCors())&&(d.traceContextParentHeader=this.generateTraceContextParentHeader(a,s),d.traceContextStateHeader=this.generateTraceContextStateHeader(a,c,n,i,o)),(e.sameOrigin&&!this.excludeNewrelicHeader()||!e.sameOrigin&&this.isAllowedOrigin(e)&&this.useNewrelicHeaderForCors())&&(d.newrelicHeader=this.generateTraceHeader(a,s,c,n,i,o)),d}generateTraceContextParentHeader(e,t){return"00-"+t+"-"+e+"-01"}generateTraceContextStateHeader(e,t,r,n,i){return i+"@nr=0-1-"+r+"-"+n+"-"+e+"----"+t}generateTraceHeader(e,t,r,n,i,o){if(!("function"==typeof g.gm?.btoa))return null;var a={v:[0,1],d:{ty:"Browser",ac:n,ap:i,id:e,tr:t,ti:r}};return o&&n!==o&&(a.d.tk=o),btoa((0,P.A)(a))}shouldGenerateTrace(e){return this.isDtEnabled()&&this.isAllowedOrigin(e)}isAllowedOrigin(e){var t=!1,r={};if((0,s.gD)(this.agentIdentifier,"distributed_tracing")&&(r=(0,s.D0)(this.agentIdentifier).distributed_tracing),e.sameOrigin)t=!0;else if(r.allowed_origins instanceof Array)for(var n=0;n<r.allowed_origins.length;n++){var i=(0,ie.D)(r.allowed_origins[n]);if(e.hostname===i.hostname&&e.protocol===i.protocol&&e.port===i.port){t=!0;break}}return t}isDtEnabled(){var e=(0,s.gD)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.enabled}excludeNewrelicHeader(){var e=(0,s.gD)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.exclude_newrelic_header}useNewrelicHeaderForCors(){var e=(0,s.gD)(this.agentIdentifier,"distributed_tracing");return!!e&&!1!==e.cors_use_newrelic_header}useTraceContextHeadersForCors(){var e=(0,s.gD)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.cors_use_tracecontext_headers}}var se=i(9300),ce=i(7295),de=["load","error","abort","timeout"],ue=de.length,le=(0,x.dV)().o.REQ,fe=(0,x.dV)().o.XHR;class he extends b{static featureName=se.T;constructor(e,t=!0){super(e,se.T,t),this.dt=new ae(e.agentIdentifier),this.handler=(e,t,r,n)=>(0,w.p)(e,t,r,n,this.ee);try{const e={xmlhttprequest:"xhr",fetch:"fetch",beacon:"beacon"};g.gm?.performance?.getEntriesByType("resource").forEach((t=>{if(t.initiatorType in e&&0!==t.responseStatus){const r={status:t.responseStatus},n={rxSize:t.transferSize,duration:Math.floor(t.duration),cbTime:0};ge(r,t.name),this.handler("xhr",[r,n,t.startTime,t.responseEnd,e[t.initiatorType]],void 0,a.K7.ajax)}}))}catch(e){}ne(this.ee),Z(this.ee),function(e,t,r,n){function i(e){var t=this;t.totalCbs=0,t.called=0,t.cbTime=0,t.end=x,t.ended=!1,t.xhrGuids={},t.lastSize=null,t.loadCaptureCalled=!1,t.params=this.params||{},t.metrics=this.metrics||{},e.addEventListener("load",(function(r){T(t,e)}),(0,A.jT)(!1)),g.lR||e.addEventListener("progress",(function(e){t.lastSize=e.loaded}),(0,A.jT)(!1))}function o(e){this.params={method:e[0]},ge(this,e[1]),this.metrics={}}function s(t,r){e.loader_config.xpid&&this.sameOrigin&&r.setRequestHeader("X-NewRelic-ID",e.loader_config.xpid);var i=n.generateTracePayload(this.parsedOrigin);if(i){var o=!1;i.newrelicHeader&&(r.setRequestHeader("newrelic",i.newrelicHeader),o=!0),i.traceContextParentHeader&&(r.setRequestHeader("traceparent",i.traceContextParentHeader),i.traceContextStateHeader&&r.setRequestHeader("tracestate",i.traceContextStateHeader),o=!0),o&&(this.dt=i)}}function c(e,r){var n=this.metrics,i=e[0],o=this;if(n&&i){var a=G(i);a&&(n.txSize=a)}this.startTime=(0,S.t)(),this.body=i,this.listener=function(e){try{"abort"!==e.type||o.loadCaptureCalled||(o.params.aborted=!0),("load"!==e.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof r.onload)&&"function"==typeof o.end)&&o.end(r)}catch(e){try{t.emit("internal-error",[e])}catch(e){}}};for(var s=0;s<ue;s++)r.addEventListener(de[s],this.listener,(0,A.jT)(!1))}function d(e,t,r){this.cbTime+=e,t?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof r.onload||"function"!=typeof this.end||this.end(r)}function u(e,t){var r=""+V(e)+!!t;this.xhrGuids&&!this.xhrGuids[r]&&(this.xhrGuids[r]=!0,this.totalCbs+=1)}function l(e,t){var r=""+V(e)+!!t;this.xhrGuids&&this.xhrGuids[r]&&(delete this.xhrGuids[r],this.totalCbs-=1)}function f(){this.endTime=(0,S.t)()}function h(e,r){r instanceof fe&&"load"===e[0]&&t.emit("xhr-load-added",[e[1],e[2]],r)}function p(e,r){r instanceof fe&&"load"===e[0]&&t.emit("xhr-load-removed",[e[1],e[2]],r)}function m(e,t,r){t instanceof fe&&("onload"===r&&(this.onload=!0),("load"===(e[0]&&e[0].type)||this.onload)&&(this.xhrCbStart=(0,S.t)()))}function v(e,r){this.xhrCbStart&&t.emit("xhr-cb-time",[(0,S.t)()-this.xhrCbStart,this.onload,r],r)}function b(e){var t,r=e[1]||{};if("string"==typeof e[0]?0===(t=e[0]).length&&g.RI&&(t=""+g.gm.location.href):e[0]&&e[0].url?t=e[0].url:g.gm?.URL&&e[0]&&e[0]instanceof URL?t=e[0].href:"function"==typeof e[0].toString&&(t=e[0].toString()),"string"==typeof t&&0!==t.length){t&&(this.parsedOrigin=(0,ie.D)(t),this.sameOrigin=this.parsedOrigin.sameOrigin);var i=n.generateTracePayload(this.parsedOrigin);if(i&&(i.newrelicHeader||i.traceContextParentHeader))if(e[0]&&e[0].headers)s(e[0].headers,i)&&(this.dt=i);else{var o={};for(var a in r)o[a]=r[a];o.headers=new Headers(r.headers||{}),s(o.headers,i)&&(this.dt=i),e.length>1?e[1]=o:e.push(o)}}function s(e,t){var r=!1;return t.newrelicHeader&&(e.set("newrelic",t.newrelicHeader),r=!0),t.traceContextParentHeader&&(e.set("traceparent",t.traceContextParentHeader),t.traceContextStateHeader&&e.set("tracestate",t.traceContextStateHeader),r=!0),r}}function y(e,t){this.params={},this.metrics={},this.startTime=(0,S.t)(),this.dt=t,e.length>=1&&(this.target=e[0]),e.length>=2&&(this.opts=e[1]);var r,n=this.opts||{},i=this.target;"string"==typeof i?r=i:"object"==typeof i&&i instanceof le?r=i.url:g.gm?.URL&&"object"==typeof i&&i instanceof URL&&(r=i.href),ge(this,r);var o=(""+(i&&i instanceof le&&i.method||n.method||"GET")).toUpperCase();this.params.method=o,this.body=n.body,this.txSize=G(n.body)||0}function R(e,t){if(this.endTime=(0,S.t)(),this.params||(this.params={}),(0,ce.iW)(this.params))return;let n;this.params.status=t?t.status:0,"string"==typeof this.rxSize&&this.rxSize.length>0&&(n=+this.rxSize);const i={txSize:this.txSize,rxSize:n,duration:(0,S.t)()-this.startTime};r("xhr",[this.params,i,this.startTime,this.endTime,"fetch"],this,a.K7.ajax)}function x(e){const t=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(let t=0;t<ue;t++)e.removeEventListener(de[t],this.listener,!1);t.aborted||(0,ce.iW)(t)||(n.duration=(0,S.t)()-this.startTime,this.loadCazptureCalled||4!==e.readyState?null==t.status&&(t.status=0):T(this,e),n.cbTime=this.cbTime,r("xhr",[t,n,this.startTime,this.endTime,"xhr"],this,a.K7.ajax))}}function T(e,r){e.params.status=r.status;var n=function(e,t){var r=e.responseType;return"json"===r&&null!==t?t:"arraybuffer"===r||"blob"===r||"json"===r?G(e.response):"text"===r||""===r||void 0===r?G(e.responseText):void 0}(r,e.lastSize);if(n&&(e.metrics.rxSize=n),e.sameOrigin){var i=r.getResponseHeader("X-NewRelic-App-Data");i&&((0,w.p)(O.rs,["Ajax/CrossApplicationTracing/Header/Seen"],void 0,a.K7.metrics,t),e.params.cat=i.split(", ").pop())}e.loadCaptureCalled=!0}t.on("new-xhr",i),t.on("open-xhr-start",o),t.on("open-xhr-end",s),t.on("send-xhr-start",c),t.on("xhr-cb-time",d),t.on("xhr-load-added",u),t.on("xhr-load-removed",l),t.on("xhr-resolved",f),t.on("addEventListener-end",h),t.on("removeEventListener-end",p),t.on("fn-end",v),t.on("fetch-before-start",b),t.on("fetch-start",y),t.on("fn-start",m),t.on("fetch-done",R)}(e,this.ee,this.handler,this.dt),this.importAggregator(e)}}function ge(e,t){var r=(0,ie.D)(t),n=e.params||e;n.hostname=r.hostname,n.port=r.port,n.protocol=r.protocol,n.host=r.hostname+":"+r.port,n.pathname=r.pathname,e.parsedOrigin=r,e.sameOrigin=r.sameOrigin}const pe={},me=["pushState","replaceState"];function ve(e){const t=function(e){return(e||B.ee).get("history")}(e);return!g.RI||pe[t.debugId]++||(pe[t.debugId]=1,(0,W.YM)(t).inPlace(window.history,me,"-")),t}var be=i(3738);const{He:ye,bD:Re,d3:xe,Kp:we,TZ:Te,Lc:Ae,uP:Ee,Rz:Se}=be;class _e extends b{static featureName=Te;constructor(e,t=!0){super(e,Te,t);if(!(0,m.V)(this.agentIdentifier))return void this.deregisterDrain();const r=this.ee;let n;ve(r),this.eventsEE=(0,F.u)(r),this.eventsEE.on(Ee,(function(e,t){this.bstStart=(0,S.t)()})),this.eventsEE.on(Ae,(function(e,t){(0,w.p)("bst",[e[0],t,this.bstStart,(0,S.t)()],void 0,a.K7.sessionTrace,r)})),r.on(Se+xe,(function(e){this.time=(0,S.t)(),this.startPath=location.pathname+location.hash})),r.on(Se+we,(function(e){(0,w.p)("bstHist",[location.pathname+location.hash,this.startPath,this.time],void 0,a.K7.sessionTrace,r)}));try{n=new PerformanceObserver((e=>{const t=e.getEntries();(0,w.p)(ye,[t],void 0,a.K7.sessionTrace,r)})),n.observe({type:Re,buffered:!0})}catch(e){}this.importAggregator(e,{resourceObserver:n})}}var Oe=i(2614);class Ne extends b{static featureName=t.TZ;#i;#o;constructor(e,r=!0){let n;super(e,t.TZ,r),this.replayRunning=!1,this.#o=e;try{n=JSON.parse(localStorage.getItem("".concat(Oe.H3,"_").concat(Oe.uh)))}catch(e){}(0,p.SR)(e.agentIdentifier)&&this.ee.on(t.G4.RECORD,(()=>this.#a())),this.#s(n)?(this.#i=n?.sessionReplayMode,this.#c()):this.importAggregator(e),this.ee.on("err",(e=>{this.replayRunning&&(this.errorNoticed=!0,(0,w.p)(t.G4.ERROR_DURING_REPLAY,[e],void 0,this.featureName,this.ee))})),this.ee.on(t.G4.REPLAY_RUNNING,(e=>{this.replayRunning=e}))}#s(e){return e&&(e.sessionReplayMode===Oe.g.FULL||e.sessionReplayMode===Oe.g.ERROR)||(0,p.Aw)(this.agentIdentifier)}#d=!1;async#c(e){if(!this.#d){this.#d=!0;try{const{Recorder:t}=await Promise.all([i.e(891),i.e(222)]).then(i.bind(i,8589));this.recorder??=new t({mode:this.#i,agentIdentifier:this.agentIdentifier,trigger:e,ee:this.ee}),this.recorder.startRecording(),this.abortHandler=this.recorder.stopRecording}catch(e){}this.importAggregator(this.#o,{recorder:this.recorder,errorNoticed:this.errorNoticed})}}#a(){this.featAggregate?this.featAggregate.mode!==Oe.g.FULL&&this.featAggregate.initializeRecording(Oe.g.FULL,!0):(this.#i=Oe.g.FULL,this.#c(t.Qb.API),this.recorder&&this.recorder.parent.mode!==Oe.g.FULL&&(this.recorder.parent.mode=Oe.g.FULL,this.recorder.stopRecording(),this.recorder.startRecording(),this.abortHandler=this.recorder.stopRecording))}}var Ie=i(3333);class Pe extends b{static featureName=Ie.TZ;constructor(e,t=!0){super(e,Ie.TZ,t);const r=[e.init.page_action.enabled,e.init.performance.capture_marks,e.init.performance.capture_measures,e.init.user_actions.enabled];g.RI&&e.init.user_actions.enabled&&(Ie.Zp.forEach((e=>(0,A.sp)(e,(e=>(0,w.p)("ua",[e],void 0,this.featureName,this.ee)),!0))),Ie.qN.forEach((e=>(0,A.sp)(e,(e=>(0,w.p)("ua",[e],void 0,this.featureName,this.ee)))))),r.some((e=>e))?this.importAggregator(e):this.deregisterDrain()}}var je=i(993),Ce=i(3785);class ke extends b{static featureName=je.TZ;constructor(e,t=!0){super(e,je.TZ,t);const r=this.ee;this.ee.on("wrap-logger-end",(function([e]){const{level:t,customAttributes:n}=this;(0,Ce.R)(r,e,n,t)})),this.importAggregator(e)}}new class extends o{constructor(t,r){super(r),g.gm?(this.features={},(0,x.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(R),this.runSoftNavOverSpa=[...this.desiredFeatures].some((e=>e.featureName===a.K7.softNav)),(0,u.j)(this,t,t.loaderType||"agent"),this.run()):(0,e.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}run(){try{const t=d(this.agentIdentifier),r=[...this.desiredFeatures];r.sort(((e,t)=>a.P3[e.featureName]-a.P3[t.featureName])),r.forEach((r=>{if(!t[r.featureName]&&r.featureName!==a.K7.pageViewEvent)return;if(this.runSoftNavOverSpa&&r.featureName===a.K7.spa)return;if(!this.runSoftNavOverSpa&&r.featureName===a.K7.softNav)return;const n=function(e){switch(e){case a.K7.ajax:return[a.K7.jserrors];case a.K7.sessionTrace:return[a.K7.ajax,a.K7.pageViewEvent];case a.K7.sessionReplay:return[a.K7.sessionTrace];case a.K7.pageViewTiming:return[a.K7.pageViewEvent];default:return[]}}(r.featureName).filter((e=>!(e in this.features)));n.length>0&&(0,e.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)}))}catch(t){(0,e.R)(22,t);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,x.Zm)();delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return r.ee.get(this.agentIdentifier).abort(),!1}}}({features:[R,_,_e,Ne,he,N,L,Pe,ke],loaderType:"pro"})})()})();</script> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Loop | Yawen Hu</title> <link rel="shortcut icon" href="/Content/v4/img/favicon.ico" /> <!--[if lte IE 9]> <link rel="stylesheet" href="~/styles/stylesIE9"> <![endif]--> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.2/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <link rel="stylesheet" href="/bundle/sitev6CustomCore?v=mhVgKfAz0WVE6qww1OeAWy-Fitmwrh9ovZt8IRedZEQ1" /> <link rel="preload" as="style" href="/bundle/sitev6Core?v=DeelOfQDga26Slgu9GEODzErbYW6t5_UpWoNX7Jj05w1" onload="this.onload=null;this.rel='stylesheet'" /> <link rel="preload" as="style" href="/bundle/sitev6Satellites?v=Nze6sJhOkBowprvdvrxq9AK0PTkJKgy1imDZkI5oy0M1" onload="this.onload=null;this.rel='stylesheet'" /> <script src="/scripts/jquery?v=VJlbdr5S0uu9PVur2sebe3U6StsmH0vkk-d3El7FfQ81"></script> <script src="/scripts/bootstrap?v=nm6cY3qz9XGAH_qVQCmOjqJ6LDNRlHt8ftxERwCIB7k1"></script> <script src="/scripts/knockout?v=jylNv6qRDVoLHkNArFRYjDOsVBQ8FXQym7YR6wiwXRU1"></script> <input name="__RequestVerificationToken" type="hidden" value="dJqDc9BWHO2WVmiPOa3XEBu3XZxhnikGg4h92JU8bUrt3nHnH3ILUu7bKz_VbMrcFAkOJ0RjYIlxi-sAHqlXdT9de7Y1" /><meta content="website" property="og:type" /><meta content="Yawen Hu" property="og:title" /><meta content="Loop is the open research network that increases the discoverability and impact of researchers and their work. Loop enables you to stay up-to-date with the latest discoveries and news, connect with researchers and form new collaborations." property="og:description" /><meta content="https://loop.frontiersin.org/images/profile/2059358/203" property="og:image" /><meta content="https://loop.frontiersin.org/CDN/Images/Profile//2059358" property="og:url" /><meta content="Loop" property="og:site_name" /><meta content="summary" property="twitter:card" /><meta content="@Loop_Network" property="twitter:site" /> </head> <body class="loop with-ibar"> <!--Layout--> <script type="text/javascript" src="/scripts/loopcorebundle?v=kvUuG3HabCBSs9UWSCjgF7u9M47FLc3rnVnHKtJNTh41" data-loopDomain=""></script> <div id="javascriptConfiguration"> <script type="text/javascript"> var data = {"LoggedUserId":-1,"SecureApiBaseUrl":"https://loop.frontiersin.org/api/v1","ApiBaseUrl":"https://loop.frontiersin.org/api/v1","LoginPage":"https://registration-ui.frontiersin.org/people/login?returnUrl=https://loop.frontiersin.org","RegisterPage":"https://registration-ui.frontiersin.org/register?returnUrl=https://loop.frontiersin.org","PublicationsUrl":"https://api-loop-publication.frontiersin.org/api","DefaultProfilePictureUrl":"https://loop.frontiersin.org/CDN/Images/Profile//default_240.jpg","LoopBaseUrl":"https://loop.frontiersin.org/","OrganizationsApiBaseUrl":"https://organizations-api.frontiersin.org","KaleidoscopeProfilePicturesEnabled":true,"PrivateMessagesEnabled":false,"CreateOrganizationsEnabled":true,"PublicationsInEditorialTabEnabled":true,"TunguskaImpactLinks":true,"HideTotalViewsOnPublications":false,"UsePreviousImpactVersion":false,"EnableSearchPeople":true,"Device":"","ResearchTopicsInOverview":true,"ScheduledTooltipMessage":false}; Loop.Configuration = new Loop.Configuration(data); $("#javascriptConfiguration").remove(); </script> </div> <script src="/Scripts/Ibar?v=-cNH6Tu1NIkL86Eqh3ybQN1N82cWdye-SwLM-RlEtMY1"></script> <div id="ibarContainer"> <nav role="navigation" aria-label="primary"> <div class="nav-wrapper"> <a href="https://loop.frontiersin.org" class="nav-logo" data-test-id="ibar-loop-logo-anchor"></a> <!-- ko stopBinding: true --> <div id="searchPeople" data-bind="template : { name: 'searchPeopleTemplate', data: searchPeopleViewModel }" class="anonymous"> </div> <!-- /ko --> <div class="burger-wrapper hidden"> <div class="burger-icon"> <span></span> <span></span> <span></span> </div> </div> <div class="nav-not-logged"> <button class="btn-login" id="ibar-btn-login">Login</button> <button class="btn-register" id="ibar-btn-register">Register</button> </div> </div> </nav> </div> <script type="text/html" id="searchPeopleTemplate"> <div class="nav-search" data-bind="visible: isVisible, css: { 'is-active': isActive }, click: activate"> <div class="plugin-people" data-bind="value: searchTerm"> <div id="plugin-container"> <input type="text" data-test-id="edit-people-plugin-textbox" id="people-suggestions-plugin" placeholder="Search people" data-label="people-people" data-bind="value: searchTerm, valueUpdate: 'input', event: { keyup: keyupEvent } " autocomplete="off" class="search-people-input"> <div class="search-icon" data-bind="click: activate, visible: !isActive()"> <span class="circ" id="search-magnifier-button"></span> <span class="rect"></span> </div> <div data-bind="visible: isActive && searchTerm"> <div class="people-dropdown" data-test-id="people-dropdown"> <div class="info" data-test-id="people-dropdown-tip" data-bind="text: info, visible: info().length"></div> <div class="error-container" data-test-id="people-dropdown-error" data-bind="visible: isError"> <div class="form-validator-warning">Something went wrong. Please type again.</div> </div> <div class="spinner-container" data-test-id="people-dropdown-spinner" data-bind="visible: isLoading"> <div class="spin"></div> </div> <div> <ul class="suggestion-container" data-bind="visible: searchPeopleResults().length, foreach: { data: searchPeopleResults }"> <li> <a data-bind="click: $parent.navigateToSearchResult" data-test-id="link-image" class="data"> <img width="64px" data-bind="customImg: { src: $data.ProfileImageUrl }" alt="user image" class="people-picture"> <div> <div class="people-name" data-bind="html: $data.FullName"></div> <div class="cb"></div> <div class="people-affiliation" data-bind="html: $data.Affiliation"></div> </div> </a> </li> </ul> <div class="cb"></div> </div> <div class="cb"></div> </div> </div> </div> </div> </div> </script> <script type="text/javascript"> var searchPeopleViewModel = new Loop.viewModels.searchPeople(); $(document).ready(function () { function ibarGoTo(url) { if (url) window.location = url + (url.indexOf("?") > -1 ? "&" : "?") + "actionReferral=ibar"; } var clickOnLogin = function () { ibarGoTo('https://registration-ui.frontiersin.org/people/login?returnUrl=https://loop.frontiersin.org'); }, clickOnRegister = function () { ibarGoTo('https://registration-ui.frontiersin.org/register?returnUrl=https://loop.frontiersin.org'); }; $('#ibar-btn-login').click(clickOnLogin); $('#ibar-btn-register').click(clickOnRegister); searchPeopleViewModel.init(); }); </script> <div id="spaContainer" class="page-container"> <div id="alert-container"> <noscript> <div class="alert alert-warning" role="alert" data-test-id="msg-bar-javascript-disabled"> <p class="icon"> <strong>Javascript disabled:</strong> Javascript is disabled in your web browser and this website relies on Javascript to function properly. Please enable Javascript. </p> </div> <div class="cb"></div> </noscript> <div class="cb"></div> </div> <div class="cb"></div> <div id="javascriptSPAUrlsConfiguration"> <script type="text/javascript"> var data = {"ResearchTopicsAddress":"https://www.frontiersin.org/researchtopic/{0}","ResearchTopicsGuidelines":"https://www.frontiersin.org/about/rtguidelines","ResearchTopicsSuggest":"https://www.frontiersin.org/journal/ManageSpecialTopic.aspx?mode=Suggest","AddPublicationsExternalSite":"https://www.frontiersin.org/profile/publications/add","Submission":"https://www.frontiersin.org/Submission/SubmissionInfo.aspx?utm_source=LOP&utm_medium=Profile&utm_campaign=editorialRolesBrick_FrontiersArticleSubmissions","JournalBaseUrl":"https://www.frontiersin.org/","JournalPageBaseUrl":"https://www.frontiersin.org","ImpactApiBaseUrl":"https://api-social-impact.frontiersin.org/api/v1","ImpactPublicApiBaseUrl":"https://impact-public.frontiersin.org/","ImpactApiV2BaseUrl":"https://impact-api.frontiersin.org/v2","ImpactApiV3BaseUrl":"https://impact-api-v3.frontiersin.org/","OrchisApiBaseUrl":"https://orchis.frontiersin.org/orcid/v2"}; Loop.Configuration.loadSPAUrls(data); $("#javascriptSPAUrlsConfiguration").remove(); </script> </div> <div id="javascriptProfileConfiguration"> <script type="text/javascript"> var data = {"FirstName":"Yawen","MiddleName":null,"LastName":"Hu","HasProfilePicture":false,"EnabledFeatures":[1,2,3],"Location":"New Orleans, United States","ProfileInfo":{"EnabledFeatures":[1,2,3],"UserId":2059358,"FirstName":"Yawen","MiddleName":null,"LastName":"Hu","LocationCity":"New Orleans","Affiliations":[{"Id":2070816,"OrganizationId":226786328,"Name":"LSU Health Sciences Center New Orleans, Louisiana State University","City":"New Orleans","State":"Louisiana","Country":"United States","CountryISOCode":"USA","CountryId":0,"Position":"Post Doctoral Researcher","PositionId":5,"JobTitle":null,"IsPrimary":true,"IsCurrent":true,"StartingDate":null,"StartingDateFormat":null,"EndingDate":null,"EndingDateFormat":null,"LogoUrl":null,"IsCommon":false}],"CurrentAffiliations":[{"Id":2070816,"OrganizationId":226786328,"Name":"LSU Health Sciences Center New Orleans, Louisiana State University","City":"New Orleans","State":"Louisiana","Country":"United States","CountryISOCode":"USA","CountryId":0,"Position":"Post Doctoral Researcher","PositionId":5,"JobTitle":null,"IsPrimary":true,"IsCurrent":true,"StartingDate":null,"StartingDateFormat":null,"EndingDate":null,"EndingDateFormat":null,"LogoUrl":null,"IsCommon":false}],"PrimaryAffiliationId":2070816,"Affiliation":"LSU Health Sciences Center New Orleans, Louisiana State University","AffiliationPublicId":226786328,"JobTitle":"","ProfilePicture":"https://loop.frontiersin.org/images/profile/2059358/203","ProfilePictureSmall":"https://loop.frontiersin.org/images/profile/2059358/24","IsProfilePublic":true,"LocationCountry":{"CountryId":426727504,"Name":"United States","Abbreviation":"USA"},"Degree":null},"EditAffiliation":false,"PublicationsCount":0,"TopicsCount":0,"EditedPublicationsCount":0,"ReviewedPublicationsCount":5,"FollowersCount":0,"FollowingCount":0,"CoAuthorsCount":0,"NetworkCount":0,"UserId":2059358,"NetworkId":0,"ProfileUserName":null,"LoggedUserId":-1,"LoggedNetworkId":0,"LoggedProfileUserName":null,"ProfileHeader":{"UserId":2059358,"LoggedUserId":-1,"FullName":"Yawen Hu","Biography":"Loop is the open research network that increases the discoverability and impact of researchers and their work. Loop enables you to stay up-to-date with the latest discoveries and news, connect with researchers and form new collaborations.","BriefReferenceCity":"New Orleans","BriefReferenceCountry":"United States","PictureUrl":"https://loop.frontiersin.org/images/profile/2059358/203","SkypeAccount":""}}; Loop.Configuration.addProfileConfig(data, true); $("#javascriptProfileConfiguration").remove(); </script> </div> <!-- Profile header--> <div class="container-profile-header"> <div class="container"> <div class="row disable-on-edit" id="profile-header" data-bind="with: Loop.viewModels.Main.headerViewModel"> <!-- END PRIVATE PROFILE NOTIFICATION --> <div class="col-lg-2 col-md-2 col-sm-2 col-xs-3"> <img src="https://loop.frontiersin.org/images/profile/2059358/203" alt="Profile picture" data-test-id="Index-Profile-Picture" class="img-responsive profile-picture" id="profile-picture" onerror="this.src=Loop.Core.Configuration.UrlList.getDefaultProfilePicture();" /> </div> <div class="col-lg-7 col-md-6 col-sm-10 col-xs-9"> <div id="profile-info" data-bind="with: headerEditor"> <div class="name"> <div class="profile-text"> <span class="h1" id="nameLine" data-test-id="nameline" data-bind="text: fullName">Yawen Hu</span> <div class="module-share"> <i class="icon-share" id="share-profile" data-test-id="share-profile"></i> <div class="share-popover hide-on-clickout" id="share-profile-content"> <div class="arrow-sharebox"></div> <i class="icon-share-grey" id="share-profile-disabled" data-test-id="share-profile-disabled"></i> <ul> <li> <a class="btn-fb" data-test-id="link-share-facebook" onclick="openWindow($(this).attr('href'), 600, 600); return false;" href="https://www.facebook.com/sharer.php?app_id=252481538283708&amp;u=https://loop.frontiersin.org/people/2059358/overview?snsrc=0&amp;sdk=joey&amp;display=popup"></a> </li> <li> <a class="btn-in" data-test-id="link-share-linkedin" onclick="openWindow($(this).attr('href'), 600, 600); return false;" href="https://www.linkedin.com/cws/share?isFramed=false&amp;url=https://loop.frontiersin.org/people/2059358/overview?snsrc=1"></a> </li> <li> <a class="btn-tw" data-test-id="link-share-twitter" onclick="openWindow($(this).attr('href'), 600, 600); return false;" href="https://twitter.com/intent/tweet?url=https://loop.frontiersin.org/people/2059358/overview?snsrc=2&amp;text=Loop - Yawen Hu&amp;tw_p=tweetbutton"></a> </li> <li> <a class="btn-gp" data-test-id="link-share-googleplus" onclick="openWindow($(this).attr('href'), 600, 600); return false;" href="https://plus.google.com/share?url=https://loop.frontiersin.org/people/2059358/overview?snsrc=3"></a> </li> <li> <a class="btn-more addthis_button_expanded" data-test-id="button-share-addthis" addthis:url="https://loop.frontiersin.org/people/2059358/overview" addthis:title="Loop | Yawen Hu"><span></span></a> </li> </ul> <div class="cb"></div> </div> </div> </div> </div> <div class="cb"></div> <div class="degree" data-bind="visible: degree.hasValue" style='display:none'> <span data-test-id="Index-Degree-Span" data-bind="text: degree.descriptionWithoutBraces"> </span> </div> <div class="cb"></div> <div data-test-id="Initial-Affiliations-Div" data-bind="visible: displayInitialAffiliations"> <ul data-test-id="Initial-Affiliations-List" class="affiliation"> <li> <div data-test-id="Initial-Affiliation-Position-0" class="position">Post Doctoral Researcher</div> <div class="cb"></div> <div data-test-id="Initial-Affiliation-Name-0" class="affiliation-name">LSU Health Sciences Center New Orleans, Louisiana State University</div> <div data-test-id="Initial-Affiliation-Location-0" class="affiliation-location">New Orleans, United States</div> </li> </ul> <div class="cb"></div> </div> <div data-test-id="Updated-Affiliations-Div" data-bind="visible: displayInitialAffiliations() == false"> <ul class="affiliation" data-test-id="Updated-Affiliations-List" data-bind="foreach: { data: affiliations }"> <li> <div class="position" data-bind="text: Position, attr{'data-test-id' : 'Updated-Affiliation-Position-' + $index()}, visible: IsCommon() === false"></div> <div class="primary-label" style="display:none" data-bind="visible: IsPrimary() && $parent.affiliations().length > 1, attr{'data-test-id' : 'Updated-Affiliation-Primary-' + $index()}">Primary</div> <div class="cb"></div> <div class="affiliation-name" data-bind="text: Name, attr{'data-test-id' : 'Updated-Affiliation-Name-' + $index()}"></div> <div class="affiliation-location" data-bind="text: Location, attr{'data-test-id' : 'Updated-Affiliation-Location-' + $index()}"></div> </li> </ul> <div class="cb"></div> <a class="text-link" href="#" style="display:none" data-bind="visible: displayViewAllLink(), click: redirectToAffiliations">View All</a> <div class="cb" data-bind="visible: displayViewAllLink"></div> </div> </div> </div> <div class="col-lg-3 col-md-4 col-sm-10 col-xs-12 col-lg-offset-0 col-md-offset-0 col-sm-offset-2 col-xs-offset-0"> <div id="main-actions"> <div class="module-user-actions" data-bind="attr: { id: networkButtonMenu.getID() }, visible: networkButtonMenu.visible" style="display: none"> <i class="cog" data-bind="attr: { 'data-test-id': networkButtonMenu.getButtonID() }, click: networkButtonMenu.toggleMenu, css: { 'active': networkButtonMenu.menuVisible }"></i> <ul class="user-actions" data-bind="simpleFadeVisible: networkButtonMenu.menuVisible(), foreach: { data: networkButtonMenu.options }" style="display: none"> <li data-bind="attr: { 'data-test-id': getID(), 'data-track': dataTrack }, click: optionClick, text: optionText"></li> </ul> </div> <div class="container-btn-follow-big" data-test-id="header-follow-button-container" id="header-follow-button-container"></div> <div class="container-contact-btn-circ-big" data-test-id="header-message-button-container" id="header-message-button-container"></div> </div> </div> </div> </div> </div> <script type="text/javascript"> $(document).ready(function () { Loop.viewModels.Main.headerViewModel.initMenu(); var networkButton = new Loop.controls.NetworkButton('-1', '2059358', 'header-follow-button-container', { buttonSize: Loop.controls.NetworkButtonSize.HeaderBig, isPublic: true }); // GTM - Loop Profile Loop.tracking.googleTagManager.trackLoopProfile( 'GTM-NNJFB3', -1, 2059358, true); }); </script> <script type="text/javascript"> //Sites excluded from sharing options var addthis_config = { services_exclude: 'facebook, twitter, linkedin, googleplus,amazonwishlist, amenme,arto,balltribe,beat100,biggerpockets,bryderi, buzzzy, camyoo, foodlve, chiq, classicalplace, cleanprint, stylishhome, fashiolista, gamekicker, google_plusone_share, w3validator, kaboodle, n4g, virb, voxopolis, dotnetshoutout' }, previousWindow; $(document).ready(function () { Loop.viewModels.Main.headerViewModel.headerEditor = new Loop.viewModels.partials.HeaderSection({ hasProfilePicture: false, firstName: "Yawen", middleName: "", lastName: "Hu", jobTitle: "", degree: { id: 0, description: "" }, formerLocation: { city: "New Orleans", countryId: 426727504, countryName: "United States" } }); $("#share-profile").click(function () { if (!window.addthis){ var addthisScript = document.createElement('script'); addthisScript.setAttribute('src', 'https://s7.addthis.com/js/300/addthis_widget.js#domready=1') document.body.appendChild(addthisScript) } $("#share-profile-content").fadeIn(500, "easeOutQuint"); }); $("#share-profile-disabled").click(function () { $("#share-profile-content").fadeOut(500, "easeOutExpo"); }); Loop.viewModels.partials.CompleteYourProfile.init({ hasProfilePicture: false }); }); $(window).on("focus", function () { activateOnClickOut() }); function activateOnClickOut() { if ($("#share-profile-content").css("display") !== "none") $("#share-profile-content").fadeOut(500, "easeOutExpo"); } function openWindow(url, width, height) { if (previousWindow != null) previousWindow.close(); previousWindow = window.open(url, 'share_profile', 'width=' + width + ',height=' + height + ',menubar=no,toolbar=no,resizable=yes,scrollbars=yes'); } </script> <script id="customMessageTemplate" type="text/html"> <div data-bind="fadeIf: field.isModified() && !field.isValid(), attr: { title: field.error }" class="form-validator-error" data-test-id="form-validation-error"> <span data-bind="text: field.error"></span> </div> </script> <div class="container-profile-navigation"> <div class="container" data-bind="with: Loop.viewModels.Main.profileNavigationViewModel"> <div class="row disable-href-on-edit"> <div class="mini-profile-nav"> <img data-bind="customImg: {src: profilePicture}" src="https://loop.frontiersin.org/images/profile/2059358/24" alt="mini profile avatar" data-test-id="profile-nav-profile-picture" /> <span data-test-id="mini-profile-nav-name" data-bind="text: fullName">Yawen Hu</span> </div> <ul id="profile-navigation" class="hidden-xs"> <li id="overviewTab" data-test-id="overviewTab"><a href="/people/2059358/overview" data-track="click-overview-page">Overview</a></li> <li id="bioTab" data-test-id="bioTab"><a href="/people/2059358/bio" data-track="click-bio-page">Bio</a></li> <li id="networkTab" data-test-id="networkTab"><a href="/people/2059358/network" data-track="click-network-page">Network<span data-test-id="networkTabLabel" data-bind="text: numberOfConnections" class="formatted-number"></span></a></li> <li id="publicationsTab" data-test-id="publicationsTab"><a href="/people/2059358/publications" data-track="click-pub-page">Publications<span id="lblPubCount" data-test-id="publicationCountTabLabel" data-bind="text: numberOfPublications" class="formatted-number"></span></a></li> <li id="editorialTab" data-test-id="editorialTab" data-bind="css: { 'disabled': Loop.Configuration.disabledEditorialContributions() }"><a href="/people/2059358/editorial" data-track="click-editorial-page">Editorial Contributions<span data-test-id="editorialTabLabel" data-bind="text: numberOfEditorialContributions" class="formatted-number"></span></a></li> <li id="impactTab" data-test-id="impactTab" data-bind="css: { 'disabled': false }"><a href="/people/2059358/impact" data-track="click-impact-page">Impact<span data-test-id="impactTabLabel"></span></a></li> </ul> <div class="visible-xs"> <div id="profile-navigation-select" style="display: none"> <label> <select data-bind="value: currentTab" id="profile-navigation-mobile"> <option id="mobile-navigation-overview" data-test-id="mobile-navigation-overview" value="/people/2059358/overview">Overview</option> <option id="mobile-navigation-bio" data-test-id="mobile-navigation-bio" value="/people/2059358/bio">Bio</option> <option id="mobile-navigation-network" data-test-id="mobile-navigation-network" value="/people/2059358/network">Network</option> <option id="mobile-navigation-publications" data-test-id="mobile-navigation-publications" value="/people/2059358/publications">Publications</option> <option id="mobile-navigation-editorial" data-test-id="mobile-navigation-editorial" value="/people/2059358/editorial" data-bind="visible: Loop.Configuration.disabledEditorialContributions() === false">Editorial Contributions</option> <option id="mobile-navigation-impact" data-test-id="mobile-navigation-impact" value="/people/2059358/impact" data-bind="visible: false === false">Impact</option> <option selected="selected" style="display: none"></option> </select> </label> </div> </div> </div> </div> </div><div id="main-container" class="container main-container"> <div class="row"> <div id="tab-pane" class="tab-pane active"> <!-- ### CONTENT ### --> <div id="mainColumn"></div> <!-- ### SIDEBAR ### --> <div id="sideBar"></div> </div> </div> </div> <div id="back-burner" style="display: none;"></div> <div id="knockoutTemplates" style="display:none"> <script type="text/html" id="affiliations"> <div class="brick disable-on-edit" id="brick-experience" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-affiliations-content"> <div class="brick-content-title" id="brick-affiliations-content-title" data-test-id="brick-affiliations-content-title"> <h2>Affiliations</h2> </div> <div class="brick-content-text" id="brick-affiliations-content-text" data-test-id="brick-affiliations-content-text"> <a id="affiliations-btn-add1" href="#" data-bind="click: addAffiliation, visible: (brick.isDataLoaded() && editMode() && !brick.noContent())" data-track="add-profile-info" class="brick-header-action">Add</a> <div class="cb"></div> <div data-bind="fadeVisible: brick.noContentOwnProfile" data-test-id="affiliations-empty" id="affiliations-empty" class="empty-case"> <p><a id="affiliations-btn-add2" href="#" data-bind="click: addAffiliation" data-track="add-profile-info">Add</a> your affiliation.</p> </div> <div class="cb"></div> <p data-bind="visible: brick.noContentOtherProfile" class="no-content" id="affiliations-nocontent">No content to display.</p> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <ul class="brick-list" data-bind="foreach: { data: affiliations, beforeRemove: removeElement, afterAdd: addElement}"> <li data-bind="attr: {'id' : $parent.getItemDivId(Id), 'data-index': $index()}"> <div class="row show-grid" data-bind="fadeVisible: !$data.isEditing() "> <div class="col-xs-9 col-sm-10"> <div class="list-info"> <div class="period" data-bind="visible: PeriodFrom.length>0 || PeriodTo.length>0"><span class="begin" data-bind="text: PeriodFrom, attr{'data-test-id' : 'period-from-' + $index()}"></span><span data-bind="visible: PeriodFrom.length>0 && PeriodTo.length>0"> - </span><span class="end" data-bind="text: PeriodTo, attr{'data-test-id' : 'position-to-' + $index()}"></span></div> <div class="primary-label" data-bind="visible: IsPrimary, attr{'data-test-id' : 'primary-affiliation-' + $index()}">Primary</div> <i class="icon-pencil" data-bind="visible: $parent.editMode(), click: $parent.editAffiliation" data-track="edit-profile-info"></i> <i class="icon-cross" data-bind="click: $parent.deleteAffiliation, visible: $parent.editMode() && !IsPrimary() " data-track="remove-profile-info" data-test-id="icon-remove-affiliation"></i> <div class="cb"></div> <div class="position" data-bind="text: Position, attr{'data-test-id' : 'position-name-' + $index()}, visible: !IsCommon"></div> <div class="cb"></div> <div class="organisation" data-bind="text: Name, attr{'data-test-id' : 'organization-name-' + $index()}"></div> <div class="city" data-bind="text: Location, attr{'data-test-id' : 'location-' + $index()}"></div> <div class="cb"></div> </div> </div> </div> </li> </ul> <div class="bottom-spacer" data-bind="visible: !brick.noContent() && !brick.errorMessage()"></div> </div> </div> </div> </script><script type="text/html" id="affiliationEdit"> <div class="editing-module item-hidden" data-bind="validationOptions: { insertMessages: true, messageTemplate: 'customMessageTemplate' }, fadeVisible: dataItem.isEditing"> <div class="row show-grid"> <div class="col-xs-2"></div> <div class="col-xs-8"> <form> <label for="affiliation-period-from">From</label> <div class="cb"></div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Select" class="chosen-select" id="affiliation-period-from" data-bind="options: dataItem.GetMonths(dataItem.AuxPeriodFrom.Year), optionsText: 'Month', optionsCaption: 'Select', value: dataItem.AuxPeriodFrom.Month, optionsValue: 'Id'" data-test-id="edit-affiliation-period-from-month"></select> </div> </div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Select" class="chosen-select" data-bind="options: dataItem.GetYears(), optionsCaption: 'Select', value: dataItem.AuxPeriodFrom.Year" data-test-id="edit-affiliation-period-from-year"></select> </div> </div> <span data-bind="fadeIf: !dataItem.IsValidStartingDate()" data-test-id="edit-affiliation-period-from-validator" class="form-validator-error"><span data-bind="text: dataItem.StartingDateErrorMessage"></span></span> <!--<div class="form-validator-error" >Please select an option.</div>--> <div class="cb"></div> <div class="period-to" data-bind="fadeVisible: !dataItem.IsCurrent()"> <label for="experience-period-to">To</label> <div class="cb"></div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Select" class="chosen-select" id="affiliation-period-to" data-bind="options: dataItem.GetMonths(dataItem.AuxPeriodTo.Year), optionsText: 'Month', optionsCaption: 'Select', value: dataItem.AuxPeriodTo.Month, optionsValue: 'Id'" data-test-id="edit-affiliation-period-to-month"></select> </div> </div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Select" class="chosen-select" data-bind="options: dataItem.GetYears(), optionsCaption: 'Select', value: dataItem.AuxPeriodTo.Year" data-test-id="edit-affiliation-period-to-year"></select> </div> </div> <span data-bind="fadeIf: !dataItem.IsValidEndingDate()" data-test-id="edit-affiliation-period-to-validator" class="form-validator-error"><span data-bind="text: dataItem.EndingDateErrorMessage"></span></span> <div class="cb"></div> </div> <div class="checkbox" data-bind="css:{ 'disabled': dataItem.IsEditingFirstAffiliation() }"> <label> <input type="checkbox" data-bind="checked:dataItem.IsCurrent" data-test-id="edit-affiliation-is-current"> Current affiliation. </label> </div> <div class="cb"></div> <div class="checkbox" data-bind="css:{ 'disabled': !dataItem.EnableIsPrimary() }"> <label> <input type="checkbox" data-bind="checked:dataItem.IsPrimary, enable:dataItem.EnableIsPrimary" data-test-id="edit-affiliation-is-primary"> Primary affiliation. <span data-bind="fadeIf: !dataItem.IsValidPrimaryCombination()" data-test-id="edit-affiliation-is-primary-validator" class="form-validator-error"><span data-bind="text: dataItem.PrimaryErrorMessage"></span></span> </label> </div> <div class="module-icon-info"> <i class="icon-info dark" data-bind="attr: { id: dataItem.primaryInfo.iconId }, click: dataItem.primaryInfo.show" data-test-id="header-affiliation-info-icon"></i> <div class="info-popover" style="display:none;" data-test-id="header-affiliation-info-message" data-bind="attr: { id: dataItem.primaryInfo.id }, fadeIf: dataItem.primaryInfo.visible, falsyWhenClickedOutside: dataItem.primaryInfo.clickOutsideProperties"> <p>You may add multiple current affiliations, but can only select one primary affiliation.</p> </div> </div> <div class="cb"></div> <div class="edit-affiliation" data-bind="fadeIf: dataItem.isNewOrganization() == false && dataItem.isCommonOrganization() == false"> <label>Affiliation / Employer *</label> <input type="text" data-test-id="edit-affiliation-plugin-textbox" id="organization-suggestions-plugin" placeholder="Type here" data-label="affiliation-organization" data-bind="value: dataItem.Name, valueUpdate: 'input'" autocomplete="off"> <div class="cb"></div> <span data-bind="fadeIf: !dataItem.IsValidOrganization()" class="form-validator-error" data-test-id="edit-affiliation-plugin-textbox-validator"><span data-bind="text: Loop.constants.UIMessages.required"></span></span> </div> <div class="add-affiliation" data-bind="fadeIf: dataItem.isNewOrganization() == true"> <div class="add-affiliation"> <label>Affiliation / Employer *</label> <div class="add-affiliation-dropdown"> <input type="text" data-bind="value: dataItem.newOrganization.organization.name, valueUpdate: 'input'" data-test-id="create-organization-input-name" tabindex="1" placeholder="Name*"> <input type="text" data-bind="value: dataItem.newOrganization.organization.city, valueUpdate: 'input'" data-test-id="create-organization-input-city" tabindex="2" placeholder="City*"> <input type="text" id="header-country" tabindex="3" placeholder="Country / Region *" data-bind="jqAuto: { autoFocus: true }, jqAutoSource: Loop.Cache.UgaritCountries(false), jqAutoSourceInputValue: 'name', jqAutoSourceValue: 'id', jqAutoValue: dataItem.newOrganization.organization.countryId" /> <div data-bind="fadeIf: !dataItem.newOrganization.organization.countryId.isValid()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.autocompleteRequired('country')"></span></div> <div class="cb"></div> </div> </div> </div> <div class="add-affiliation" data-bind="fadeIf: dataItem.isCommonOrganization() == true"> <div class="add-affiliation"> <label>Affiliation / Employer *</label> <div class="add-affiliation-dropdown"> <div class="select-wrapper"> <div class="select"> <select data-placeholder="Select" class="chosen-select" id="header-common-organization" data-bind="options: Frontiers.Ugarit.Common.Configuration.GetCommonOrganizations(), optionsText: 'name', optionsCaption: 'Select', value: dataItem.commonOrganization.organization.id, optionsValue: 'id'" data-test-id="edit-affiliation-common-organization-id" tabindex="2"></select> </div> </div> <input type="text" data-bind="value: dataItem.commonOrganization.organization.city, valueUpdate: 'input'" data-test-id="create-organization-input-city" tabindex="2" placeholder="City*"> <input type="text" id="header-country" tabindex="3" placeholder="Country / Region *" data-bind="jqAuto: { autoFocus: true }, jqAutoSource: Loop.Cache.UgaritCountries(false), jqAutoSourceInputValue: 'name', jqAutoSourceValue: 'id', jqAutoValue: dataItem.commonOrganization.organization.countryId" /> <div data-bind="fadeIf: !dataItem.commonOrganization.organization.countryId.isValid()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.autocompleteRequired('country')"></span></div> <div class="cb"></div> </div> </div> </div> <div class="cb"></div> <div data-bind="fadeIf: dataItem.showPosition() === true"> <div class="cb"></div> <label for="experience-position">Position</label> <div class="select-wrapper"> <div class="select"> <select data-placeholder="Select" class="input-block-level chosen-select" data-test-id="edit-affiliation-position" id="experience-position" data-bind="options: Loop.Cache.Positions(), optionsText: 'PositionName', optionsValue: 'PositionId', value: dataItem.PositionId, optionsCaption: 'Select' "></select> <!--<span data-bind="fadeIf: !dataItem.IsValidPosition()" class="form-validator-error" data-test-id="edit-affiliation-position-validator"><span data-bind="text: Loop.constants.UIMessages.required"></span></span>--> </div> </div> <div class="cb"></div> </div> </form> <div class="cb"></div> </div> <div class="col-xs-2"> </div> </div> <div class="row show-grid"> <div class="col-xs-12"> <div class="button-container"> <button id="affiliation-btn-cancel" data-test-id="affiliation-btn-cancel" type="button" class="btn-cancel" data-bind="click: cancelEdition, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }" data-track="cancel-profile-update"> Cancel </button> <button id="affiliation-btn-save" data-test-id="affiliation-btn-save" type="button" class="btn-save" data-bind="click: saveItem, enable: dataItem.IsValidAffiliation() && !dataItem.saving(), css: { 'btn-saving': dataItem.saving(), 'disabled': !dataItem.IsValidAffiliation() }" data-track="save-profile-update"> Save </button> <button id="affiliation-btn-remove" data-test-id="affiliation-btn-remove" type="button" class="btn-remove" data-bind="click: deleteItem, visible: dataItem.AllowDelete, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }"> Remove </button> </div> </div> </div> <div class="cb"></div> <div data-bind="fadeIf: dataItem.UIMessage" class="form-validator-warning"> <span id="affiliation-ui-msg" data-test-id="edit-affiliation-global-validator" data-bind="text: dataItem.UIMessage"></span> </div> </div> <div class="cb"></div> </script> <script type="text/html" id="authoringNamesTemplate"> <p data-test-id="authoring-modal"> Please enter all names (disregarding punctuation) under which you have published work, for example, your maiden name or alternative spellings. We will search for publications using all these names, which you can then add to your profile. Once you have added your publications you can choose to check the name(s) that you are currently publishing under and with which we will conduct all future publication searches. </p> <div class="error-module" data-bind="visible: readError"><p data-bind="text: Loop.constants.UIMessages.genericLoadingErrorInModal"></p></div> <div class="table-names" data-bind="visible: readError() === false" style="display:none"> <ul class="row-titles row"> <li class="col-checkbox">&nbsp;</li> <li class="col-input"> <div class="block-input-text">First Name *</div> <div class="block-input-text">Middle Name</div> <div class="block-input-text">Last Name *</div> </li> <li class="col-remove">&nbsp;</li> </ul> <div class="cb"></div> <!--ko foreach: { data: authoringNames, beforeRemove: removeElement, afterAdd: addElement}--> <ul class="row-names row" data-test-id="authoringNameRow" data-bind="css: { 'main-authoring-name': $index()===0 }"> <li class="col-checkbox" data-test-id="authorNameCheckbox"> <!--ko if: $index() === 0--> &nbsp; <!--/ko--> <!--ko if: $index() > 0--> <input type="checkbox" data-bind="checked: isActivePublishingName" /> <!--/ko--> </li> <li class="col-input"> <div class="block-input-text"> <label>First Name *</label> <input type="text" data-test-id="firstNameTextBox" data-bind="disable: isPrimary, value: firstName, valueUpdate: 'input'" /> </div> <div class="block-input-text"> <label>Middle Name</label> <input type="text" data-test-id="middleNameTextBox" data-bind="disable: isPrimary, value: middleName, valueUpdate: 'input'" /> </div> <div class="block-input-text"> <label>Last Name *</label> <input type="text" data-test-id="lastNameTextBox" data-bind="disable: isPrimary, value: lastName, valueUpdate: 'input'" /> </div> </li> <li class="col-remove"><i class="icon-cross" data-test-id="removeAuthorIcon" data-bind="click: remove, fadeRotateIf: !isPrimary() && !last()"></i></li> </ul> <div class="cb"></div> <!-- /ko --> </div> <div data-bind="fadeIf: duplicatedNameError" class="form-validator-error" id="authoring-duplicatedname-error">The list contains duplicated authoring names.</div> <div class="cb"></div> </script><script type="text/html" id="automaticSuggestions"> <div class="brick disable-on-edit" id="brick-find-publications" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-automatic-suggestions-content" data-test-id="test-brick-automatic-suggestions"> <div class="brick-content-title"> <h2>Manage My Suggestions</h2> </div> <div class="brick-content-text"> <div class="cb"></div> <h3>Authoring Names</h3> <p>By providing us additional authoring names, we will be able to make more appropriate publication suggestions for you.</p> <button class="btn-flex disable-on-edit" type="button" data-bind="click: showAutomaticSuggestions" data-test-id="test-edit-authoring-names-button">Edit Authoring Names</button> <div class="cb"></div> </div> </div> </div> </script> <script type="text/html" id="briefBio"> <div class="brick disable-on-edit" id="brick-bio" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-bio-content"> <h2 data-test-id="overview-bio-title">Brief Bio</h2> <i id="editBioButton" class="icon-pencil" data-bind="click: editBio, visible: (brick.isDataLoaded() && editMode() && !brick.noContent())" data-track="edit-profile-info" data-test-id="brief-bio-edit-icon"></i> <div class="cb"></div> <div data-bind="fadeVisible: (!editBioMode() && brick.noContentOwnProfile())" data-test-id="bio-empty" class="empty-case"> <p> Users who add a description significantly increase their chances for discovers and collaboration. Showcase your career and increase your impact by <a id="bio-btn-add2" href="#" data-bind="click: editBio" class="add-to-panel" data-track="add-profile-info">adding your brief bio now.</a> </p> </div> <p data-bind="visible: brick.noContentOtherProfile" class="no-content" data-test-id="bio-empty-other-profile">No content to display.</p> <div class="error-module" data-bind="visible: !editBioMode() && brick.errorMessage"><p data-bind="text: brick.errorMessage"></p></div> <div id="bio-content" data-bind="visible: !brick.noContent()"> <div data-bind="html: briefBioHtml, fadeVisible: !editBioMode()"></div> </div> <div id="bio-content-edit" data-bind="fadeVisible: editBioMode()" class="editing-module editing-module-markdown"> <div class="row-fluid"> <div id="toolbar" style="display: none;"> <ul class="rich-text-buttons"> <li data-wysihtml5-command="bold" title="CTRL+B" class="rich-text-bold list-link"></li> <li data-wysihtml5-command="italic" title="CTRL+I" class="rich-text-italic list-link"></li> </ul> <div id="rich-editor-link-panel" data-wysihtml5-dialog="createLink" class="insert-link" style="display: none;"> <input data-wysihtml5-dialog-field="href" class="insert-input" type="text" placeholder="Type your link" value="http://" /> <a data-wysihtml5-dialog-action="save" class="insert-button">Insert</a> </div> </div> <textarea id="bio-textarea" class="span16"></textarea> </div> <div class="row show-grid"> <div class="col-xs-12"> <div class="button-container"> <button type="button" class="btn-cancel" data-test-id="brief-bio-cancel-btn" data-track="cancel-profile-update" data-bind="click: currentEditItem.cancelEdition, enable: !saving(), css: { 'disabled': saving() }">Cancel</button> <button type="button" class="btn-save" data-test-id="brief-bio-save-btn" data-track="save-profile-update" data-bind="click: currentEditItem.saveItem, enable: !saving(), css: { 'btn-saving': saving() }">Save</button> </div> </div> </div> <div class="cb"></div> <div data-bind="fadeIf: brick.errorMessage" class="form-validator-warning"> <span id="bio-ui-msg" data-bind="text: brick.errorMessage"></span> </div> </div> <div class="cb"></div> </div> </div> </script><script type="text/html" id="briefBioOverview"> <div class="brick disable-on-edit disable-href-on-edit" id="brick-bio-overview" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-bio-overview-content"> <div class="brick-content-title" id="brick-bio-overview-content-title" data-test-id="brick-bio-overview-content-title"> <h2 data-test-id="overview-bio-title">Brief Bio</h2> </div> <div class="brick-content-text" id="brick-bio-overview-content-text" data-test-id="brick-bio-overview-content-text"> <a href="./bio?editBio=true"> <i id="editBioButton" data-bind="visible: (brick.isDataLoaded() && editMode() && !brick.noContent())" data-track="edit-profile-info" class="icon-pencil" data-test-id="overview-bio-editpencil"></i> </a> <div class="cb"></div> <div id="bio-content" data-bind="html: overview, visible: !brick.noContent()" class="wrappedBio" data-test-id="overview-bio-content"></div> <!-- Empty case --> <div data-test-id="bio-empty" data-bind="visible: brick.noContentOwnProfile" class="empty-case"> <p> Users who add a description significantly increase their chances for discovers and collaboration. Showcase your career and increase your impact by <a id="bio-btn-add2" href="./bio?editBio=true" class="add-to-panel" data-track="add-profile-info">adding your brief bio now.</a> </p> </div> <div class="cb"></div> <!-- /Empty case --> <!-- No content - other profile --> <p data-bind="visible: brick.noContentOtherProfile" class="no-content" data-test-id="bio-empty-other-profile">No content to display.</p> <!-- /No content - other profile --> <!-- Error --> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- /Error --> <!-- Content: actual bio --> <div id="bio-content" data-bind="visible: !brick.noContent()" class="wrappedBio" data-test-id="overview-bio-content"> <!--<p data-bind="html: overview"></p>--> </div> <!-- /Content: actual bio --> <!-- View all link --> <a class="link-view-all" href="bio" data-test-id="link-view-full-bio" data-bind="visible: brick.isDataLoaded() && !brick.noContent() && !brick.errorMessage()">View Full Bio and Expertise</a> <!-- /View all link --> </div> </div> </div> </script> <script type="text/html" id="followButton"> <div data-bind="attr:{id:Loop.Core.Utils.generateUUID()}, insertNetworkButton: { }"></div> </script> <script type="text/html" id="dismissButton"> <div data-bind="attr:{id:Loop.Core.Utils.generateUUID()}, insertDismissButton: { }"></div> </script><script type="text/html" id="claimYourPublicationTemplate"> <ul class="brick-list"> <li> <div class="row show-grid"> <div class="col-xs-12"> <div class="list-info"> <h4 data-bind="text: Title"></h4> <div data-bind="template: {name: 'authorsListTemplate', data: AuthorList}"></div> <div class="journal-container"> <div class="journal-data" data-bind="css: { 'no-open-access': !Loop.Common.isFrontiersPublication($data) }"> <div data-bind="css: { 'no-logo': Loop.Common.getPublicationType($data) === 'external' }" data-test-id="publications-journal-source-no-logo"> <!-- ko if: Loop.Common.getPublicationType($data) !== 'external'--> <div data-bind="css: Loop.Common.getPublicationJournalSourceLogo($data)" data-test-id="publications-journal-source-logo"></div> <!-- /ko --> <div class="journal-texts"> <div class="journal-name" data-test-id="publicationSource" data-bind="text: DisplayPublicationSource"></div> <div class="journal-metadata-container"> <!-- ko if: formattedPublicationDate --> <span class="journal-date" data-test-id="publications-date">Published on <!--ko text: formattedPublicationDate --><!--/ko--></span> <!-- /ko --> </div> </div> </div> </div> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <div class="open-access" data-test-id="publications-journal-open-access-logo"></div> <!-- /ko --> </div> <div class="cb"></div> </div> </div> </div> </li> </ul> </script><script type="text/html" id="coAuthors"> <div class="brick brick-sidebar disable-on-edit" id="brick-coauthors" data-test-id="panel-coauthors" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-coauthors-content"> <div class="brick-content-title" data-test-id="brick-coauthors-title"> <h2> <span data-bind="visible: !brick.errorMessage()"> <span data-bind="text: paginator.total" class="number-bold formatted-number"> </span> </span> Co-Authors </h2> </div> <div class="brick-content-text" data-test-id="brick-coauthors-text"> <div class="cb"></div> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-test-id="error-coAuthors" data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko template: { name: getViewName(), afterRender: setExternalLinks } --> <!-- /ko --> </div> </div> </div> </script> <script type="text/html" id="coAuthorsResults"> <ul id="coauthors-panel" class="brick-list row" data-bind="template: { name: 'miniProfile', foreach: miniProfiles }"></ul> <!-- ko if: brick.hasContent() --> <a class="link-view-all" href="network?networkTab=coauthors-panel">View All Co-Authors</a> <!-- /ko --> </script> <script type="text/html" id="coAuthorsNoResults"> <div class="empty-case"> <p><a class="add-to-panel" href="publications">Confirm your publications</a> so that the colleagues you have collaborated with can be displayed here.</p> </div> <div class="cb"></div> </script> <script id="create-organization-template" type="text/html"> <div class="add-affiliation" data-test-id="create-organization-component" data-bind="validationOptions: { insertMessages: true, messageTemplate: 'create-organization-error-template'}, onCustomKeyUp: onCustomKeyUpEvents"> <!--style="opacity:0; display:none"--> <label data-test-id="create-organization-title" data-bind="text: title"></label> <div class="add-affiliation-dropdown"> <form> <input type="text" data-bind="value: organization.name, valueUpdate: 'input', attr: { placeholder: placeHolders.organization }" data-test-id="create-organization-input-name" tabindex="1"> <input type="text" data-bind="value: organization.cityName, valueUpdate: 'input' , attr: { placeholder: placeHolders.city }" data-test-id="create-organization-input-city" tabindex="2"> <input type="text" id="header-country" data-test-id="create-organization-select-country" tabindex="3" data-bind="attr: { placeholder: placeHolders.country }, jqAuto: { autoFocus: true }, jqAutoSource: Loop.Cache.UgaritCountries(false), jqAutoSourceInputValue: 'name', jqAutoSourceValue: 'id', jqAutoValue: organization.countryId" /> <div data-bind="fadeIf: !organization.countryId.isValid()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.autocompleteRequired('country')"></span></div> <div class="cb"></div> <button type="button" class="btn-cancel" data-test-id="create-organization-cancel-btn" tabindex="5" data-bind="click: finishProcess, enable: !saving(), css: { 'disabled': saving() }"> Cancel </button> <button type="button" class="btn-save" data-test-id="create-organization-save-btn" tabindex="4" data-bind="click: saveOrganization, enable: validationErrors().length <= 0 && !saving(), css: { 'btn-saving': saving(), 'disabled': validationErrors().length > 0 }"> Save </button> <div data-test-id="create-organization-api-error" class="form-validator-warning" data-bind="fadeIf: organizationAPIError() != ''"> <span data-bind="text: organizationAPIError()"></span> </div> </form> </div> </div> </script> <script id="create-organization-error-template" type="text/html"> <div data-bind="fadeIf: !field.isValid()" class="form-validator-error" data-test-id="create-organization-form-validation-error"> <span data-bind="text: field.error"></span> </div> </script> <script type="text/html" id="editorial"> <div class="brick" id="brick-editorial-contributions" data-test-id="brick-editorial-contributions" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content"> <!-- ko if: isEmptyCase() === false --> <ul class="nav-editorial-contributions" data-test-id="nav-editorial-contributions"> <li data-bind="css: { 'current': currentTabName() === tabs.researchTopicsTabName, 'disabled': disabledResearchTopics }, click: setActiveTab.bind($data, tabs.researchTopicsTabName)"> <div class="number" data-bind="text: totalResearchTopics" data-test-id="total"></div> <div class="name"><span>Edited</span> <span>Research Topics</span></div> <div class="arrow"></div> </li> <!-- ko if: Loop.Configuration.features.PublicationsInEditorialTabEnabled === true --> <li data-bind="css: { 'current': currentTabName() === tabs.editedPublicationsTabName, 'disabled': disabledEditedPublications }, click: setActiveTab.bind($data, tabs.editedPublicationsTabName)"> <div class="number" data-bind="text: totalEditedPublications" data-test-id="total"></div> <div class="name"><span>Edited</span> <span>Publications</span></div> <div class="arrow"></div> </li> <li data-bind="css: { 'current': currentTabName() === tabs.reviewedPublicationsTabName, 'disabled': disabledReviewedPublications }, click: setActiveTab.bind($data, tabs.reviewedPublicationsTabName)"> <div class="number" data-bind="text: totalReviewedPublications" data-test-id="total"></div> <div class="name"><span>Reviewed</span> <span>Publications</span></div> <div class="arrow"></div> </li> <!-- /ko --> </ul> <div class="cb"></div> <!-- /ko --> <!-- ko if: isEmptyCase() === false --> <div class="content-editorial-contributions"> <div class="research-topics" data-test-id="tab-research-topics" data-bind="visible: currentTabName()===tabs.researchTopicsTabName"> <!-- ko if: isEmptyResearchTopics() === false --> <!-- ko with: researchTopics--> <form class="search-form" data-bind="visible: brick.errorMessage() != null"> <input type="text" placeholder="Search Research Topics by title." data-test-id="search-input" data-bind="value: searchTerm, valueUpdate: 'input', onEnterKeyPress: search"> <button class="btn-src" data-bind="click: search" data-test-id="search-button"></button> </form> <div class="cb"></div> <ul class="brick-list" data-bind="foreach: topics" data-test-id="result-list"> <li> <div class="list-info" data-bind="attr: {'data-index': $index()}"> <h3><a data-bind="attr:{ href: researchTopic.topicUrl }, html: researchTopic.title" href="#" target="_blank" data-test-id="topic-title"></a></h3> <!-- ko if: "topicEditors" in $data.researchTopic && $data.researchTopic.topicEditors.length > 0--> <h5>Editors:</h5> <ul class="people-list" data-bind="foreach: researchTopic.topicEditors" data-test-id="author-list"> <li> <div class="image-container"> <!-- ko if: "profilePicture" in $data --> <img data-bind="customImg: { src: profilePicture }" alt="" class="img-responsive" data-test-id="topic-editor-picture" /> <!-- /ko --> </div> <div class="data-container"> <!-- ko if: "fullName" in $data--> <div class="name" data-test-id="topic-editor-name"> <a data-bind="attr:{ href: profileUrl }, text: fullName" data-test-id="anchor-editor-profile" /> </div> <!-- /ko--> <div class="cb"></div> <ul class="list-hrz"> <!-- ko if: "affiliation" in $data--> <li data-bind="text: affiliation" data-test-id="topic-editor-affiliation"></li> <!-- /ko --> <!-- ko if: "location" in $data--> <li data-bind="text: location" data-test-id="topic-editor-location"></li> <!-- /ko --> </ul> </div> <div class="cb"></div> </li> </ul> <!-- /ko --> <!-- ko if: "summary" in $data.researchTopic && $data.researchTopic.summary.trim() --> <div class="description" data-bind="html: researchTopic.summary" data-test-id="topic-description"></div> <!-- /ko --> <!-- ko if: "topicStatus" in $data.researchTopic && $data.researchTopic.topicStatus.trim() && "statusClass" in $data --> <div data-bind="css: researchTopic.statusClass, text: researchTopic.topicStatus" data-test-id="topic-status"></div> <!-- /ko --> <!-- ko if: "isOpenForSubmission" in $data.researchTopic && $data.researchTopic.isOpenForSubmission === true --> <div class="submission-open" data-test-id="topic-status-open">Submission Open.</div> <!-- /ko --> </div> <div class="cb"></div> <!--<ul class="list-hrz"> <li class="tt" data-toggle="tooltip" data-placement="top" title="7,403 Views"><span>7,403</span>Views</li> <li class="tt" data-toggle="tooltip" data-placement="top" title="72 Articles"><span>72</span>Articles</li> <li class="tt" data-toggle="tooltip" data-placement="top" title="34 Contributors"><span>34</span>Contributors</li> <li class="tt" data-toggle="tooltip" data-placement="top" title="34 Contributors"><a><span>81</span>Comments</a></li> <li><a class="impact"><span></span>View Impact</a></li> </ul> <div class="cb"></div>--> </li> </ul> <!-- ko if: displayNoResults() === true --> <p class="no-content" data-bind="text: Loop.constants.UIMessages.noResultsMatchingCriteria" data-test-id="no-results"></p> <!-- /ko --> <div class="error-module" data-bind="visible: brick.errorMessage" data-test-id="error"><p data-bind="text: brick.errorMessage"></p></div> <!-- /ko --> <!-- /ko --> <!-- ko if: isEmptyResearchTopics() === true --> <!-- ko template : { name: 'emptyCaseResearchTopics', data: $data } --> <!-- /ko --> <!-- /ko --> <div class="cb"></div> &nbsp; </div> <div class="edited-pubs" data-test-id="tab-edited-pubs" style="display:none;" data-bind="visible: currentTabName()===tabs.editedPublicationsTabName"> <!-- ko if: isEmptyEditedPublications() === false --> <!-- ko template : { name: 'editorialPublicationTab', data: $data.editedPublications } --> <!-- /ko --> <!-- /ko --> <!-- ko if: isEmptyEditedPublications() === true --> <!-- ko template : { name: 'emptyCaseEditedPubs', data: $data } --> <!-- /ko --> <!-- /ko --> </div> <div class="reviewed-pubs" data-test-id="tab-reviewed-pubs" style="display:none;" data-bind="visible: currentTabName()===tabs.reviewedPublicationsTabName"> <!-- ko if: isEmptyReviewedPublications() === false --> <!-- ko template : { name: 'editorialPublicationTab', data: $data.reviewedPublications } --> <!-- /ko --> <!-- /ko --> <!-- ko if: isEmptyReviewedPublications() === true --> <!-- ko template : { name: 'emptyCaseReviewedPubs', data: $data } --> <!-- /ko --> <!-- /ko --> </div> </div> <!-- /ko --> </div> </div> </script> <script type="text/html" id="editorialPaging"> <div class="spinner" data-bind="fadeIf: isPaging"></div> <div class="show-more"> <button class="btn-flex" type="button" data-test-id="paging-next" data-bind="visible: allowPagination() && !$parent.brick.errorMessage(), click: next"> Show More </button> </div> </script> <script type="text/html" id="editorialPublicationTab"> <div class="info"> <i class="icon-info"></i> <span>Info: </span> Editorial contributions currently displayed are for Frontiers articles published after 01/01/2014 only. <p></p> </div> <div class="cb"></div> <form class="search-form" data-bind="visible: brick.errorMessage() != null"> <input type="text" placeholder="Search publications by title, author or doi." data-test-id="search-input" data-bind="value: searchTerm, valueUpdate: 'input', onEnterKeyPress: search"> <button class="btn-src" data-bind="click: search" data-test-id="search-button"></button> </form> <div class="cb"></div> <ul class="brick-list" data-bind="foreach: publications"> <!-- ko template : { name: 'editorialPublicationItem', data: $data } --> <!-- /ko --> </ul> <!-- ko if: displayNoResults() === true --> <p class="no-content" data-bind="text: Loop.constants.UIMessages.noResultsMatchingCriteria" data-test-id="no-results"></p> <!-- /ko --> <div class="error-module" data-bind="visible: brick.errorMessage" data-test-id="error"><p data-bind="text: brick.errorMessage"></p></div> <!--ko if: brick.errorMessage() == ''--> <div class="cb"></div> <!-- ko template : { name: 'editorialPaging', data: paginator } --> <!-- /ko --> <!-- /ko --> <div class="cb"></div> </script> <script type="text/html" id="editorialPublicationItem"> <li> <div class="row show-grid"> <div class="col-xs-12"> <div class="list-info"> <!--<h3 data-bind="text: Title" data-test-id="pub-title"></h3>--> <h3><a data-test-id="publications-title" data-bind="attr: {'data-pub-type': Loop.Common.getPublicationType($data), href: $data.ArticleLink}, text: Title" href="" target="_blank"></a></h3> <div data-bind="template: {name: 'authorsListTemplate', data: AuthorList}" data-test-id="pub-authors"></div> <div class="cb"></div> <div class="journal-container"> <div class="journal-data"> <a href="#" target="_blank" data-bind="attr: {href: Loop.Common.getJournalLink($data.JournalId)}"> <!--<div class="logo-fr"></div>--> <div data-bind="css: Loop.Common.getPublicationJournalSourceLogo($data)" data-test-id="pub-journal-logo"></div> <div class="journal-texts"> <div class="journal-name" data-bind="text:Source" data-test-id="pub-source"> </div> <div class="journal-metadata-container"> <!-- ko if: formattedPublicationDate --> <span class="journal-date" data-test-id="pub-date">Published on <!--ko text: formattedPublicationDate --><!--/ko--></span> <!-- /ko --> </div> </div> </a> </div> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <div class="open-access" data-test-id="pub-open-access-logo"></div> <!-- /ko --> </div> </div> <div class="row"> <div class="col-xs-12"> <ul class="list-hrz" data-bind="visible: $data.TotalViews > 0"> <li class="inline-text dark-text"> <span class="formatted-number" data-bind="text: $data.TotalViews" data-test-id="pub-views"></span>views </li> <li style="display:none" class="inline-text dark-text"><span data-test-id="pub-downloads">XX</span>downloads</li> <li style="display:none" class="inline-text dark-text"><span data-test-id="pub-citations">XX</span>citations</li> <!--Loop.Common.isFrontiersPublication($data)--> <li> <a class="impact" data-bind="attr: {href: Loop.Common.viewImpactLink($data.ArticleId, $data.DoiLink, true)}" data-test-id="pub-impact-link" target="_blank" href=""><span></span>View impact</a> </li> <!-- /ko --> </ul> </div> </div> </div> </div> </li> </script> <script type="text/html" id="emptyCaseResearchTopics"> <div class="emptycase" data-test-id="empty-case-research-topics"> <div class="logo-fr-rt"></div> <h2>Showcase Your Editorial Contributions</h2> <div class="cb"></div> <p><strong>Frontiers Research Topics</strong> bring together leading researchers to contribute articles around a noteworthy and specialized theme. These collections are highly visible enhancing both the readership and the citation of the articles.</p> <div class="cb"></div> <p>Find out more about how you can organize your own topic, suggest a topic theme, or participate in an existing topic on the About page.</p> <div class="cb"></div> <a class="btn-flex-big" data-bind="attr: { 'href': Loop.Configuration.urls.JournalAboutResearchTopics() }" href="" target="_blank" data-test-id="btn-about-topics">About Research Topics</a> <div class="cb"></div> </div> <div class="cb"></div> </script> <script type="text/html" id="emptyCaseEditedPubs"> <div class="emptycase" data-test-id="empty-case-edited-pubs"> <h2>Showcase Your Editorial Contributions</h2> <div class="cb"></div> <p><strong>Frontiers</strong> recognizes the importance of peer review and the valuable contribution made by editors.</p> <div class="cb"></div> <p>As the first publisher to be fully integrated into Loop, <strong>Frontiers articles</strong> are highlighted as edited publications on the handling editor's Loop profile.</p> <div class="cb"></div> <p>Find out more about editorial recognition on the Frontiers blog.</p> <div class="cb"></div> <a class="btn-flex-big" data-bind="attr: { 'href': Loop.Configuration.urls.BlogUrl('/2016/09/14/why-peer-review-needs-to-be-recognized' + Loop.constants.googleAnalytics.BLOG_READ_MORE) }" href="" target="_blank" data-test-id="btn-read-more">About Editorial Recognition</a> <div class="cb"></div> </div> <div class="cb"></div> </script> <script type="text/html" id="emptyCaseReviewedPubs"> <div class="emptycase" data-test-id="empty-case-reviewed-pubs"> <h2>Showcase Your Editorial Contributions</h2> <div class="cb"></div> <p><strong>Frontiers</strong> acknowledges reviewers for their contribution to the peer review process by listing their names on published articles they endorsed.</p> <div class="cb"></div> <p>As the first publisher to be fully integrated into Loop, <strong>Frontiers articles</strong> are displayed as reviewed publications on the reviewer's Loop profiles.</p> <div class="cb"></div> <p>Find out more about editorial recognition on the Frontiers blog.</p> <div class="cb"></div> <a class="btn-flex-big" data-bind="attr: { 'href': Loop.Configuration.urls.BlogUrl('/2016/09/14/why-peer-review-needs-to-be-recognized' + Loop.constants.googleAnalytics.BLOG_READ_MORE) }" href="" target="_blank" data-test-id="btn-read-more">About Editorial Recognition</a> <div class="cb"></div> </div> <div class="cb"></div> </script> <script type="text/html" id="emptyCaseResearchTopicsFull"> <div class="brick" id="brick-editorial-contributions" data-bind="changeBrickStatus: brick.status()" data-test-id="empty-case-editorial-contributions"> <div class="brick-content"> <!-- ko template : { name: 'emptyCaseResearchTopics', data: $data } --> <!-- /ko --> </div> </div> </script> <script type="text/html" id="editorialContributionsSideBar"> <div class="brick brick-sidebar" id="brick-editorial-contributions" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content"> <h2><span class="number-bold" data-bind="text: getTotalEditorialContributions()" data-test-id="editorial-contribution-total"></span> Editorial Contributions</h2> <div class="cb"></div> <ul class="editorial-contributions-list"> <li class="rt" data-bind="visible: showResearchTopicsTotal()"> <div class="text"><span class="number" data-bind="text: researchTopicsTotal" data-test-id="research-topic-total"></span> Edited Research Topics</div> </li> <li class="ep" data-bind="visible: showEditedPublicationsTotal()"> <div class="text"><span class="number" data-bind="text: editedPublicationsTotal" data-test-id="edited-pub-total"></span> Edited Publications</div> </li> <li class="rp" data-bind="visible: ReviewedPublicationsTotal()"> <div class="text"><span class="number" data-bind="text: reviewedPublicationsTotal" data-test-id="reviewed-pub-total"></span> Reviewed Publications</div> </li> </ul> <a class="link-view-all" href="editorial" data-test-id="link-view-editorial">View Editorial Contributions</a> </div> </div> </script> <script type="text/html" id="editorialRoles"> <div class="brick" id="brick-editorial-roles" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-editorialRoles-content"> <div class="brick-content-title" id="brick-editorialRoles-content-title" data-test-id="brick-editorialRoles-content-title"> <h2>Editorial Roles</h2> <div class="module-icon-info"> <i class="icon-info" data-bind="attr: { id: infoIconId }, click: showInfo"></i> <div class="info-popover" style="display:none" data-bind="attr: { id: infoId}, fadeIf: displayInfoHint, falsyWhenClickedOutside: clickOutsideProperties"> <p> You can find the descriptions of the editorial roles <a data-bind="attr: { 'href': Loop.Configuration.urls.JournalPublishingModel() }" href="" target="_blank">here</a>. </p> </div> </div> </div> <div class="brick-content-text" id="brick-editorialRoles-content-text" data-test-id="brick-editorialRoles-content-text"> <div class="cb"></div> <!-- Editorial roles --> <ul data-bind="foreach: { data: editorialRolesList}, css: { 'has-rt': hasRT }" data-test-id="brick-editorialRoles-content-list" class="editorial-roles-list"> <li> <div class="role" data-bind="text: RoleName + ' for'" data-test-id="brick-editorialRoles-role-name"></div> <div class="cb"></div> <!-- ko if: SectionId > 0 --> <a data-bind="text: SectionTitle, attr:{ href: SectionLink }" href="#" target="_blank" class="journal-section" data-test-id="brick-editorialRoles-section-link"></a> <div class="cb"></div> <!-- /ko --> <ul data-bind="foreach: Journals, attr:{ class: 'journals-b' }"> <!-- ko if: $data.JournalTitle --> <li> <a data-bind="attr:{ href: JournalLink, 'data-track-referral': 'template-B', class: 'logo-section logo-image-' + $parent.PrivateTenantId }" href="#" target="_blank" data-test-id="brick-editorialRoles-journal-image" data-track="editorial-role-journal-image"></a> <div class="text"> <a data-bind="multipleLines: { text: JournalTitle, separator: 'break', targetSeparator: 'empty' }, attr: { href: JournalLink,'data-track-referral': 'template-B' }" href="#" target="_blank" class="journal-name" data-test-id="brick-editorialRoles-journal-title" data-track="editorial-role-journal-title"></a> <div class="cb"></div> <a data-bind="attr:{ href: Loop.Common.getSubmissionUrl() + '_B', 'data-track-referral': 'template-B' }" href="#" target="_blank" class="text-link" data-test-id="brick-editorialRoles-journal-submit" data-track="editorial-role-journal-link">Open for submissions</a> </div> </li> <!-- /ko --> </ul> <div class="cb"></div> </li> </ul> <div class="empty-case" data-bind="visible: editorialRolesList().length === 0"> <p> <!-- ko if: Loop.Configuration.isOwnProfile() === true --> You do not have an active role on a Frontiers editorial board. You can apply to join or refer a colleague to one of our editorial boards <a href="" data-bind="attr: { 'href': Loop.Core.Configuration.UrlList.getAbsoluteUrl('editorApplication', Loop.constants.googleAnalytics.JOIN_EDITORIAL_BOARD) }" target="_Blank">here</a>. <!-- /ko --> <!-- ko if: Loop.Configuration.isOwnProfile() === false --> This researcher does not have an active role on a Frontiers editorial board. You may recommend their participation <a href="" data-bind="attr: { 'href': Loop.Core.Configuration.UrlList.getAbsoluteUrl('editorApplication', Loop.constants.googleAnalytics.JOIN_EDITORIAL_BOARD) }" target="_Blank">here</a>. <!-- /ko --> </p> </div> <div class="cb"></div> <!-- Research topics --> <!-- ko if: hasRT --> <ul class="researchtopics-list" data-test-id="brick-editorialRoles-researchTopics-list"> <li> <div class="role">Frontiers Topic Editor</div> <div class="cb"></div> <ul class="rt-list" data-bind="foreach: researchTopics"> <li> <div class="left"> <a data-bind="attr:{ href: simpleUrl }" href="#" target="_blank" data-test-id="researchTopic-icon-link"> <!-- ko if: imageUrl --> <img class="img-responsive" data-bind="attr: { src: imageUrl}" data-track="research-topic-image" data-test-id="researchTopic-img"> <!-- /ko --> <!-- ko ifnot: imageUrl --> <i class="rt-icon" data-track="research-topic-image">RT</i> <!-- /ko --> </a> </div> <div class="right"> <a data-bind="attr:{ href: simpleUrl}, text: title" href="#" target="_blank" class="rt-name" data-test-id="researchTopic-title-link" data-track="research-topic-title"></a> <div class="cb"></div> <a data-bind="attr:{ href: urlOpen }" href="#" target="_blank" class="rt-open" data-test-id="researchTopic-submit-link" data-track="research-topic-link">Open for Submissions</a> </div> </li> </ul> </li> </ul> <div class="cb"></div> <a class="link-view-all" href="editorial" data-test-id="researchTopic-view-all-link">View All Topics</a> <!-- /ko --> </div> <div class="cb"></div> </div> </div> </script><script type="text/html" id="education"> <div class="brick disable-on-edit" id="brick-education" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-education-content"> <div class="brick-content-title" id="brick-bio-education-content-title" data-test-id="brick-bio-education-content-title"> <h2>Education</h2> </div> <div class="brick-content-text" id="brick-bio-education-content-text" data-test-id="brick-bio-education-content-text"> <a id="edu-btn-add1" href="#" data-bind="click: addEducation, visible: (brick.isDataLoaded() && editMode() && !brick.noContent())" data-track="add-profile-info" class="brick-header-action">Add</a> <div class="cb"></div> <div data-bind="fadeVisible: brick.noContentOwnProfile" data-test-id="education-empty" id="education-empty" class="empty-case"> <p><a id="edu-btn-add2" href="#" data-bind="click: addEducation" data-track="add-profile-info" class="add-to-panel">Add</a> your education history.</p> </div> <div class="cb"></div> <p data-bind="visible: brick.noContentOtherProfile" class="no-content" id="education-nocontent">No content to display.</p> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <ul class="brick-list" data-bind="foreach: { data: educations, beforeRemove: removeElement, afterAdd: addElement}"> <li data-bind="attr: {'id' : $parent.getItemDivId(UserEducationId), 'data-index': $index()}"> <div class="row show-grid" data-bind="fadeVisible: !$data.isEditing()"> <div class="col-xs-12"> <div class="list-info"> <!-- ko if: "PeriodFrom" in $data && $data.PeriodFrom.Format != 3 || "PeriodTo" in $data && $data.PeriodTo.Format != 3 || IsCurrentEducation --> <div class="period"> <!-- ko if: "PeriodFrom" in $data --> <span class="begin" data-bind="text: Loop.Helpers.PeriodDateHelper.FormatDate(PeriodFrom.Date, PeriodFrom.Format)"></span> <!-- /ko --> <span data-bind="visible: $data.PeriodFrom && $data.PeriodFrom.Format != 3 && ($data.PeriodTo && $data.PeriodTo.Format != 3 || $data.IsCurrentEducation)"> - </span> <!-- ko if: IsCurrentEducation --> <span class="end">Present</span> <!-- /ko --> <!-- ko ifnot: IsCurrentEducation --> <!-- ko if "PeriodTo" in $data--> <span class="end" data-bind="text: Loop.Helpers.PeriodDateHelper.FormatDate(PeriodTo.Date, PeriodTo.Format)"></span> <!-- /ko --> <!-- /ko --> </div> <!-- /ko --> <!-- ko if:$parent.editMode--> <i class="icon-pencil" data-bind="click: $parent.editEducation" data-track="edit-profile-info" data-test-id="icon-edit-education"></i> <i class="icon-cross" data-bind="click: $parent.deleteEducation" data-track="remove-profile-info" data-test-id="icon-remove-education"></i> <!-- /ko --> <div class="cb"></div> <!-- ko if: "Degree" in $data --> <!-- ko if: "Name" in $data.Degree && $data.Degree.Name.trim() --> <div class="job-title" data-bind="text: Degree.Name"></div> <!-- /ko --> <!-- /ko --> <div class="cb"></div> <!-- ko if: "OrganizationName" in $data --> <div class="organisation" data-bind="text: OrganizationName"></div> <!-- /ko --> </div> <!-- .list-info --> </div> <!-- .col-xs-9 col-sm-10 --> </div> <!-- row show-grid--> </li> </ul> <!--<div class="bottom-spacer" data-bind="fadeVisible: !brick.noContent() && !brick.errorMessage()"></div>--> <div class="bottom-spacer" data-bind="visible: !brick.noContent() && !brick.errorMessage()"></div> </div> </div> </div> </script><script type="text/html" id="educationEdit"> <div class="editing-module item-hidden" data-bind="validationOptions: { insertMessages: true, messageTemplate: 'customMessageTemplate' }, fadeVisible: dataItem.isEditing"> <div class="row show-grid"> <div class="col-xs-2"></div> <div class="col-xs-8"> <form id="edu-edit-form"> <label for="edu-from-month">From</label> <div class="cb"></div> <div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Month" class="chosen-select" id="edu-from-month" data-bind="options: Loop.Cache.Months(), optionsCaption: 'Month', optionsText: 'Month', optionsValue: 'Id', value: dataItem.auxPeriodFrom.month"></select> </div> </div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Year" class="chosen-select" id="edu-from-year" data-bind="options: Loop.Cache.Years(undefined,undefined,false,undefined), optionsCaption: 'Year', value: dataItem.auxPeriodFrom.year"></select> </div> </div> <div class="cb"></div> <div data-bind="fadeIf: !dataItem.IsValidPeriodFrom()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.yearRequired"></span></div> <div data-bind="fadeIf: !dataItem.IsValidPeriodRange()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.invalidYearRange"></span></div> </div> <div class="cb"></div> <div data-bind="fadeVisible: !dataItem.IsCurrentEducation()" class="period-to"> <label for="edu-to-month">To</label> <div id="edu-to"> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Month" class="chosen-select" id="edu-to-month" data-bind="options: Loop.Cache.Months(), optionsText: 'Month', optionsCaption: 'Month', optionsValue: 'Id', value: dataItem.auxPeriodTo.month"></select> </div> </div> <!-- .select-wrapper --> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Year" class="chosen-select" id="edu-to-year" data-bind="options: Loop.Cache.Years(undefined,undefined,false,undefined), optionsCaption: 'Year', value: dataItem.auxPeriodTo.year"></select> </div> </div> <!-- .select-wrapper --> <div class="cb"></div> <span data-bind="fadeIf: !dataItem.IsValidPeriodTo()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.yearRequired"></span></span> </div> </div> <div class="checkbox"> <label> <input type="checkbox" id="edu-iscurrent" data-bind="checked: dataItem.IsCurrentEducation" /><span class="bold">I currently study here.</span> </label> </div> <div class="cb"></div> <label for="edu-degree">Degree *</label> <div class="select-wrapper"> <div class="select"> <select class="input-block-level chosen-select" style="width: 100%" id="edu-degree" data-bind="options: Loop.Cache.Degrees(), optionsCaption: 'Select', optionsText: 'Name', optionsValue: 'DegreeId', value: dataItem.Degree.DegreeId"></select> </div> </div> <div data-bind="fadeIf: !dataItem.IsValidDegree()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.selectRequired"></span></div> <div class="cb"></div> <label for="edu-org">School / Organization *</label> <input id="edu-org" class="input-block-level" data-bind="value: dataItem.OrganizationName, valueUpdate: 'input'" type="text" /> </form> </div> </div> <div class="row show-grid"> <div class="col-xs-12"> <div class="button-container"> <button id="edu-btn-cancel" data-test-id="edu-btn-cancel" type="button" class="btn-cancel" data-bind="click: cancelEdition, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }" data-track="cancel-profile-update"> Cancel </button> <button id="edu-btn-save" data-test-id="edu-btn-save" type="button" class="btn-save" data-bind="click: saveItem, enable: dataItem.IsValidEducation() && !dataItem.saving(), css: { 'btn-saving': dataItem.saving(), 'disabled': !dataItem.IsValidEducation() }" data-track="save-profile-update"> Save </button> <button id="edu-btn-remove" data-test-id="edu-btn-remove" type="button" class="btn-remove" data-bind="click: deleteItem, visible: !dataItem.IsNew, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }"> Remove </button> </div> </div> </div> <div class="cb"></div> <div data-bind="fadeIf: dataItem.UIMessage" class="form-validator-warning"> <span id="edu-ui-msg" data-bind="text: dataItem.UIMessage"></span> </div> </div> <div class="cb"></div> </script> <script type="text/html" id="experience"> <div class="brick disable-on-edit" id="brick-experience" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-experience-content"> <div class="brick-content-title" id="brick-experience-content-title" data-test-id="brick-experience-content-title"> <h2>Experience</h2> </div> <div class="brick-content-text" id="brick-experience-content-text" data-test-id="brick-experience-content-text"> <a id="exp-btn-add1" href="#" data-bind="click: addExperience, visible: (brick.isDataLoaded() && editMode() && !brick.noContent())" data-track="add-profile-info" class="brick-header-action">Add</a> <div class="cb"></div> <div data-bind="fadeVisible: brick.noContentOwnProfile" data-test-id="experience-empty" id="experience-empty" class="empty-case"> <p><a id="exp-btn-add2" href="#" data-bind="click: addExperience" data-track="add-profile-info">Add</a> your professional experience.</p> </div> <div class="cb"></div> <p data-bind="visible: brick.noContentOtherProfile" class="no-content" id="experience-nocontent">No content to display.</p> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <ul class="brick-list" data-bind="foreach: { data: experiences, beforeRemove: removeElement, afterAdd: addElement}"> <li data-bind="attr: {'id' : $parent.getItemDivId(UserPositionId), 'data-index': $index()}"> <div class="row show-grid" data-bind="fadeVisible: !$data.isEditing() "> <div class="col-xs-12"> <div class="list-info"> <!-- ko if: "PeriodFrom" in $data && $data.PeriodFrom.Format != 3 || "PeriodTo" in $data && $data.PeriodTo.Format != 3 || IsCurrentPosition --> <div class="period"> <!-- ko if: "PeriodFrom" in $data --> <span class="begin" data-bind="text: Loop.Helpers.PeriodDateHelper.FormatDate(PeriodFrom.Date, PeriodFrom.Format)"></span> <!-- /ko --> <span data-bind="visible: $data.PeriodFrom && $data.PeriodFrom.Format != 3 && ($data.PeriodTo && $data.PeriodTo.Format != 3 || $data.IsCurrentPosition)"> - </span> <!-- ko if: IsCurrentPosition --> <span class="end">Present</span> <!-- /ko --> <!-- ko ifnot: IsCurrentPosition --> <!-- ko if "PeriodTo" in $data--> <span class="end" data-bind="text: Loop.Helpers.PeriodDateHelper.FormatDate(PeriodTo.Date, PeriodTo.Format)"></span> <!-- /ko --> <!-- /ko --> </div> <!-- /ko --> <!-- ko if: $parent.editMode--> <i class="icon-pencil" data-bind="click: $parent.editExperience" data-track="edit-profile-info" data-test-id="icon-edit-experience"></i> <i class="icon-cross" data-bind="click: $parent.deleteExperience" data-track="remove-profile-info" data-test-id="icon-remove-experience"></i> <!-- /ko --> <div class="cb"></div> <!-- ko if: "PositionTitle" in $data && $data.PositionTitle.trim() --> <div class="job-title" data-bind="text: PositionTitle"></div> <!-- /ko --> <!-- ko if: "Position" in $data --> <div class="position" data-bind="text: '(' + Position.PositionName + ')', visible: Position.PositionName"></div> <!-- /ko --> <div class="cb"></div> <!-- ko if: "Organization" in $data && $data.Organization.Name.trim() --> <!-- ko if: "Name" in $data.Organization --> <div class="organisation" data-bind="text:Organization.Name"></div> <!-- /ko --> <!-- ko if: "Category" in $data.Organization && $data.Organization.Category.trim() --> <!-- ko if: "Industry" in $data.Organization && $data.Organization.Industry.trim() --> <div class="organisation-details" data-bind="text: '(' + Organization.Category + ' in ' + Organization.Industry + ')'"></div> <!-- /ko --> <!-- /ko --> <!-- /ko --> <!-- ko if: "DepartmentDivision" in $data && $data.DepartmentDivision.trim()--> <div class="division" data-bind="text: DepartmentDivision"></div> <!-- /ko --> <!-- ko if: "LabOfficeName" in $data && $data.LabOfficeName.trim()--> <div class="lab" data-bind="text: LabOfficeName"></div> <!-- /ko --> <div class="cb"></div> <!-- ko if: "City" in $data && $data.City.trim() --> <div class="city" data-bind="text: City + ',', visible: City"></div> <!-- /ko --> <!-- ko if: "Country" in $data --> <!-- ko if: "Name" in $data.Country && $data.Country.Name.trim() --> <div class="country" data-bind="text: Country.Name"></div> <!-- /ko --> <!-- /ko --> <div class="cb"></div> <!-- ko if: "Description" in $data && $data.Description.trim() --> <div class="description" data-bind="text: Description"></div> <!-- /ko --> </div> <!-- .list-info --> </div> <!-- .col-xs-9 col-sm-10 --> </div><!-- .row show-grid --> </li> </ul> <!--<div class="bottom-spacer" data-bind="fadeVisible: !brick.noContent() && !brick.errorMessage()"></div>--> <div class="bottom-spacer" data-bind="visible: !brick.noContent() && !brick.errorMessage()"></div> </div> </div> </div> </script><script type="text/html" id="experienceEdit"> <div class="editing-module item-hidden" data-bind="validationOptions: { insertMessages: true, messageTemplate: 'customMessageTemplate'}, fadeVisible: dataItem.isEditing"> <div class="row show-grid"> <div class="col-xs-2"></div> <div class="col-xs-8"> <form id="exp-edit-form"> <label for="exp-from-month">From *</label> <div class="cb"></div> <div> <div class="select-wrapper small-select"> <div class="select"> <select class="chosen-select" id="exp-from-month" data-bind="options: Loop.Cache.Months(), optionsCaption: 'Month', optionsText: 'Month', optionsValue: 'Id', value: dataItem.auxPeriodFrom.month"></select> </div> </div> <!-- .select-wrapper --> <div class="select-wrapper small-select"> <div class="select"> <select class="chosen-select" id="exp-from-year" data-bind="options: Loop.Cache.Years(undefined,undefined,false,undefined), optionsCaption: 'Year', value: dataItem.auxPeriodFrom.year"></select> </div> </div> <!-- .select-wrapper --> <div class="cb"></div> <div data-bind="fadeIf: !dataItem.IsValidPeriodFrom()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.yearRequired"></span></div> <div data-bind="fadeIf: !dataItem.IsValidPeriodRange()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.invalidYearRange"></span></div> </div> <div data-bind="fadeVisible: !dataItem.IsCurrentPosition()" class="period-to"> <label for="exp-to-month">To *</label> <div> <div class="cb"></div> <div class="select-wrapper small-select"> <div class="select"> <select class="chosen-select" id="exp-to-month" data-bind="options: Loop.Cache.Months(), optionsText: 'Month', optionsCaption: 'Month', optionsValue: 'Id', value: dataItem.auxPeriodTo.month"></select> </div> </div> <!-- .select-wrapper --> <div class="select-wrapper small-select"> <div class="select"> <select class="chosen-select" id="exp-to-year" data-bind="options: Loop.Cache.Years(undefined,undefined,false,undefined), optionsCaption: 'Year', value: dataItem.auxPeriodTo.year"></select> </div> </div> <!-- .select-wrapper --> <div class="cb"></div> <span data-bind="fadeIf: !dataItem.IsValidPeriodTo()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.yearRequired"></span></span> </div> </div> <div class="checkbox"> <label> <input type="checkbox" id="exp-iscurrent" data-bind="checked: dataItem.IsCurrentPosition" /><span class="bold">I currently work here.</span> </label> </div> <div class="cb"></div> <label for="exp-jobtitle">Job Title *</label> <input type="text" id="exp-jobtitle" class="input-block-level" data-bind="value: dataItem.PositionTitle, valueUpdate: 'input'" /> <label for="exp-position">Position *</label> <div class="select-wrapper"> <div class="select"> <select class="input-block-level chosen-select" style="width: 100%" id="exp-position" data-bind="options: Loop.Cache.Positions(), optionsCaption: 'Select', optionsText: 'PositionName', optionsValue: 'PositionId', value: dataItem.Position.PositionId"></select> </div> </div> <span data-bind="fadeIf: !dataItem.IsValidPosition()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.selectRequired"></span></span> <div class="cb"></div> <label for="exp-affiliation">Affiliation / Employer *</label> <input id="exp-affiliation" class="input-block-level" type="text" data-bind="value: dataItem.Organization.Name, valueUpdate: 'input'" /> <label for="exp-department">Department / Division</label> <input id="exp-department" class="input-block-level" type="text" data-bind="value: dataItem.DepartmentDivision, valueUpdate: 'input'" /> <label for="exp-lab">Lab / Office Name</label> <input id="exp-lab" class="input-block-level" type="text" data-bind="value: dataItem.LabOfficeName, valueUpdate: 'input'" /> <label for="exp-city">City</label> <input id="exp-city" class="input-block-level" type="text" data-bind="value: dataItem.City, valueUpdate: 'input'" /> <label for="exp-country">Country</label> <div class="select-wrapper"> <div class="select"> <select class="input-block-level chosen-select" id="exp-country" style="width: 100%" data-bind="options: Loop.Cache.Countries(), optionsCaption: 'Select', optionsText: 'Name', optionsValue: 'CountryId',value: dataItem.Country.CountryId"></select> </div> </div> <label for="exp-desc">Description</label> <textarea id="exp-desc" class="input-block-level" data-bind="value: dataItem.Description, valueUpdate: 'input'"></textarea> </form> </div> </div> <div class="row show-grid"> <div class="col-xs-12"> <div class="button-container"> <button type="button" id="exp-btn-cancel" data-test-id="exp-btn-cancel" class="btn-cancel" data-bind="click: cancelEdition, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }" data-track="cancel-profile-update">Cancel</button> <button type="button" id="exp-btn-save" data-test-id="exp-btn-save" class="btn-save" data-bind="click: saveItem, enable: dataItem.IsValidExperience() && !dataItem.saving(), css: { 'btn-saving': dataItem.saving(), 'disabled': !dataItem.IsValidExperience() }" data-track="save-profile-update"> Save </button> <button type="button" id="exp-btn-remove" data-test-id="exp-btn-remove" class="btn-remove" data-bind="click: deleteItem, visible: !dataItem.IsNew, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }">Remove</button> </div> </div> </div> <div class="cb"></div> <div data-bind="fadeIf: dataItem.UIMessage" class="form-validator-warning"> <span id="exp-ui-msg" data-bind="text: dataItem.UIMessage"></span> </div> </div> <div class="cb"></div> </script><script type="text/html" id="expertise"> <div class="brick brick-sidebar disable-href-on-edit disable-on-edit" id="brick-expertise" data-bind="changeBrickStatus: brick.status()" data-test-id="expertiseWidget"> <div class="brick-content" id="brick-expertise-content" data-test-id="brick-expertise-content"> <h2>Expertise</h2> <i class="icon-pencil" data-bind="visible: brick.ownProfile() && !brick.errorMessage() && brick.hasContent(), click: beginEdit" data-track="edit-profile-info" data-test-id="expertise-pencil"></i> <div class="cb"></div> <!-- Empty case - Other profile --> <section data-test-id="empty-case-public-view" data-bind="visible: brick.noContentOtherProfile()"> <div> <p class="no-content" id="expertise-nocontent" data-test-id="empty-case-public-view-text">No content to display.</p> </div> <div class="cb"></div> </section> <!-- Error --> <div class="error-module" data-bind="visible: brick.errorMessage" data-test-id="expertise-error"> <p data-bind="text: brick.errorMessage" data-test-id="expertise-error-description"></p> </div> <div class="cb"></div> <div data-bind="css: { 'empty-case': brick.noContentOwnProfile() }" data-test-id="expertise-main-div"> <p data-test-id="expertiseAdd" data-bind="visible: brick.noContentOwnProfile, click: addExpertise"> <a id="addExpertiseLink" data-test-id="addExpertiseLink" data-track="add-profile-info">Add</a> your expertise so we can connect you to the right people and content. </p> <div class="module" data-bind="css: { 'editing-expertise': isEditing() }" data-test-id="expertise-module"> <div class="input-container" data-bind="visible: brick.ownProfile() && !brick.errorMessage()" data-test-id="expertise-input-container"> <input type="text" name="tags" placeholder="Type an expertise tag" id="autocomplete-tags" data-bind="hasFocus: inputHasFocus, css: { 'editing-input': isEditing, 'dropdown-arrow': autoCompleteResults()>0 }, value: newTag, valueUpdate: 'afterkeydown', event: { keypress: keyPress }, disable: !canEdit()" data-test-id="expertise-input"> </div> <div class="cb"></div> <div data-bind="fadeIf: newTagError" class="form-validator-error" data-test-id="expertise-input-error"> <span data-bind="text: newTagError" data-test-id="expertise-input-error-text"></span> </div> <div class="cb"></div> <!-- ko template: { name: 'tagsCloudTemplate', data: tagsCloud } --> <!-- /ko --> <div class="erase" data-bind="fadeIf: displayClearAll, click: clearAllTags" data-test-id="clear-all-tags" style="opacity: 1;"><i></i>Clear all tags</div> <div data-bind="fadeIf: tagsError() && isEditing()" class="form-validator-error" data-test-id="expertise-tags-error"> <p> <span data-test-id="expertise-tags-error-text" data-bind="text: tagsError"></span> </p> </div> <div class="cb"></div> <div class="button-container" data-test-id="expertiseButtons"> <button type="button" class="btn-cancel" data-test-id="expertiseCancel" data-bind="click: cancel, enable: !saving()" data-track="cancel-profile-update"> Cancel </button> <button type="button" class="btn-save" data-test-id="expertiseSave" data-bind="click: save, enable: !saving() && !tagsError(), css: { 'btn-saving': saving, 'disabled': tagsError() }" data-track="save-profile-update"> Save </button> <div class="form-validator-warning" data-test-id="expertise-api-error" data-bind="fadeIf: UIMessage"> <span id="expertise-api-error-text" data-bind="text:UIMessage"></span> </div> </div> </div> </div> <div class="cb"></div> </div> </div> </script><script type="text/html" id="followingFollowers"> <ul class="nav nav-tabs row" data-bind="attr: { id: id }" role="tablist"> <li class="col-xs-6"> <!-- ko with: follower--> <a role="tab" data-toggle="tab" data-bind="attr: { href: '#' + $parent.followerTabName }, click: $parent.setActiveTab"> <!--ko if: brick.isDataLoaded() && !(brick.errorMessage() && paginator.currentPage() === 0) --> <span data-bind="text: paginator.total" class="formatted-number">0</span> <!-- /ko --> Followers </a> <!-- /ko --> </li> <li class="col-xs-6"> <!-- ko with: following--> <a role="tab" data-toggle="tab" data-bind="attr: { href: '#' + $parent.followingTabName }, click: $parent.setActiveTab"> <!--ko if: brick.isDataLoaded() && !(brick.errorMessage() && paginator.currentPage() === 0) --> <span data-bind="text: paginator.total" class="formatted-number">0</span> <!-- /ko --> Following </a> <!-- /ko --> </li> </ul> <div class="tab-content"> <!-- ko with: follower--> <div class="tab-pane active fade in" data-bind="attr: { id: $parent.followerTabName }"> <p data-bind="visible: brick.noContent" class="no-content" data-test-id="followers-panel-nocontent">No content to display.</p> <div data-bind="visible: !brick.noContent() || brick.status() === Loop.Enum.BrickDataStatus.Loading" class="disable-on-edit"> <ul class="brick-list row"> <!-- ko template : { name: 'miniProfile', foreach: $parent.displayedFollowers } --> <!-- /ko --> </ul> <div class="spinner" data-bind="fadeIf: paginator.isPaging"></div> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko if: !brick.errorMessage() && !paginator.isPaging() --> <a class="link-view-all" href="network?networkTab=followers-panel" data-test-id="link-viewAll-followingFollowers">View All Followers</a> <!-- /ko --> </div> </div> <!-- /ko --> <!-- ko with: following--> <div class="tab-pane fade" data-bind="attr: { id: $parent.followingTabName }"> <p data-bind="visible: brick.noContent" class="no-content" data-test-id="followers-panel-nocontent">No content to display.</p> <div data-bind="visible: !brick.noContent() || brick.status() === Loop.Enum.BrickDataStatus.Loading" class="disable-on-edit"> <ul class="brick-list row"> <!-- ko template : { name: 'miniProfile', foreach: $parent.displayedFollowing } --> <!-- /ko --> </ul> <div class="spinner" data-bind="fadeIf: paginator.isPaging"></div> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko if: !brick.errorMessage() && !paginator.isPaging() --> <a class="link-view-all" href="network?networkTab=following-panel" data-test-id="link-viewAll-followingFollowers">View All Following</a> <!-- /ko --> </div> </div> <!--/ko--> </div> </script> <script type="text/html" id="header-editor-affiliation-modal-template"> <div class="editing-module"> <div class="row show-grid"> <div class="col-sm-2 col-xs-0"></div> <div class="col-sm-8 col-xs-12"> <form> <label for="affiliation-period-from">From</label> <div class="cb"></div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Select" class="chosen-select" id="affiliation-period-from" data-bind="options: affiliation.GetMonths(affiliation.AuxPeriodFrom.Year), optionsText: 'Month', optionsCaption: 'Select', value: affiliation.AuxPeriodFrom.Month, optionsValue: 'Id'" data-test-id="edit-affiliation-period-from-month"></select> </div> </div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Select" class="chosen-select" data-bind="options: affiliation.GetYears(), optionsCaption: 'Select', value: affiliation.AuxPeriodFrom.Year" data-test-id="edit-affiliation-period-from-year"></select> </div> </div> <span data-bind="fadeIf: !affiliation.IsValidStartingDate()" data-test-id="edit-affiliation-period-from-validator" class="form-validator-error"><span data-bind="text: affiliation.StartingDateErrorMessage"></span></span> <!--<div class="form-validator-error" >Please select an option.</div>--> <div class="cb"></div> <div class="checkbox disabled"> <label> <input type="checkbox" data-bind="checked:affiliation.IsCurrent" data-test-id="edit-affiliation-is-current">Current affiliation </label> </div> <div class="module-icon-info"> <i class="icon-info dark" data-bind="attr: { id: currentInfo.iconId }, click: currentInfo.show" data-test-id="header-affiliation-info-icon"></i> <div class="info-popover" style="display:none;" data-test-id="header-affiliation-info-message" data-bind="attr: { id: currentInfo.id }, fadeIf: currentInfo.visible, falsyWhenClickedOutside: currentInfo.clickOutsideProperties"> <p>You can only add current affiliations here. To add past affiliations, please visit your Bio section.</p> </div> </div> <div class="cb"></div> <div class="checkbox" data-bind="css:{ 'disabled': !isThereAnyAffiliations}"> <label> <input type="checkbox" data-bind="checked:affiliation.IsPrimary, enable:affiliation.IsCurrent" data-test-id="edit-affiliation-is-primary"> Primary affiliation </label> </div> <div class="module-icon-info"> <i class="icon-info dark" data-bind="attr: { id: primaryInfo.iconId }, click: primaryInfo.show" data-test-id="header-affiliation-info-icon"></i> <div class="info-popover" style="display:none;" data-test-id="header-affiliation-info-message" data-bind="attr: { id: primaryInfo.id }, fadeIf: primaryInfo.visible, falsyWhenClickedOutside: primaryInfo.clickOutsideProperties"> <p>You may add multiple current affiliations, but can only select one primary affiliation.</p> </div> </div> <div class="cb"></div> <div class="edit-affiliation" data-bind="fadeIf: affiliation.isNewOrganization() == false && affiliation.isCommonOrganization() == false"> <label>Affiliation / Employer *</label> <input type="text" data-test-id="edit-affiliation-plugin-textbox" id="organization-suggestions-plugin" placeholder="Type here" data-label="affiliation-organization" data-bind="value: affiliation.Name, valueUpdate: 'input'" autocomplete="off"> <div class="cb"></div> <span data-bind="fadeIf: !affiliation.IsValidOrganization()" class="form-validator-error" data-test-id="edit-affiliation-plugin-textbox-validator"><span data-bind="text: Loop.constants.UIMessages.required"></span></span> </div> <div class="add-affiliation" data-bind="fadeIf: affiliation.isNewOrganization() == true"> <div class="add-affiliation"> <label>Affiliation / Employer *</label> <div class="add-affiliation-dropdown"> <input type="text" data-bind="value: affiliation.newOrganization.organization.name, valueUpdate: 'input'" data-test-id="create-organization-input-name" tabindex="3" placeholder="Name*"> <input type="text" data-bind="value: affiliation.newOrganization.organization.city, valueUpdate: 'input'" data-test-id="create-organization-input-city" tabindex="4" placeholder="City*"> <input type="text" id="header-country" tabindex="5" placeholder="Country / Region *" data-bind="jqAuto: { autoFocus: true }, jqAutoSource: Loop.Cache.UgaritCountries(false), jqAutoSourceInputValue: 'name', jqAutoSourceValue: 'id', jqAutoValue: affiliation.newOrganization.organization.countryId" /> <div data-bind="fadeIf: !affiliation.newOrganization.organization.countryId.isValid()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.autocompleteRequired('country')"></span></div> <div class="cb"></div> </div> </div> </div> <div class="add-affiliation" data-bind="fadeIf: affiliation.isCommonOrganization() == true"> <div class="add-affiliation"> <label>Affiliation / Employer *</label> <div class="add-affiliation-dropdown"> <div class="select-wrapper"> <div class="select"> <select data-placeholder="Select" class="chosen-select" id="header-common-organization" data-bind="options: Frontiers.Ugarit.Common.Configuration.GetCommonOrganizations(), optionsText: 'name', optionsCaption: 'Select', value: affiliation.commonOrganization.organization.id, optionsValue: 'id'" data-test-id="edit-affiliation-common-organization-id" tabindex="2"></select> </div> </div> <input type="text" data-bind="value: affiliation.commonOrganization.organization.city, valueUpdate: 'input'" data-test-id="create-organization-input-city" tabindex="2" placeholder="City*"> <input type="text" id="header-country" tabindex="3" placeholder="Country / Region *" data-bind="jqAuto: { autoFocus: true }, jqAutoSource: Loop.Cache.UgaritCountries(false), jqAutoSourceInputValue: 'name', jqAutoSourceValue: 'id', jqAutoValue: affiliation.commonOrganization.organization.countryId" /> <div data-bind="fadeIf: !affiliation.commonOrganization.organization.countryId.isValid()" class="form-validator-error"><span data-bind="text: Loop.constants.UIMessages.autocompleteRequired('country')"></span></div> <div class="cb"></div> </div> </div> </div> <div class="cb"></div> <div data-bind="fadeIf: affiliation.showPosition() === true"> <div class="cb"></div> <label for="experience-position">Position</label> <div class="select-wrapper"> <div class="select"> <select data-placeholder="Select" class="input-block-level chosen-select" data-test-id="edit-affiliation-position" id="experience-position" data-bind="options: Loop.Cache.Positions(), optionsText: 'PositionName', optionsValue: 'PositionId', value: affiliation.PositionId, optionsCaption: 'Select' "></select> </div> </div> <div class="cb"></div> </div> </form> <div class="cb"></div> </div> <div class="col-sm-2 col-xs-0"> </div> </div> </div> <div class="cb"></div> </script><script type="text/html" id="header-editor-main-template"> <!-- UPLOAD PICTURE --> <input id="upload" name="profileimage" style="display: none" type="file" accept="image/jpg,image/jpeg,image/png,image/gif,image/tiff,image/bmp,image/pjpeg" /> <div class="img-responsive profile-picture" id="profile-picture-preview-fix" data-test-id="profile-picture-preview-fix" data-bind="visible:!profilePicture.isProfilePictureEdited() || profilePicture.isProfilePictureDeleted()"> <img data-bind="attr: { src: profilePicture.currentPicture }" /> </div> <div class="img-responsive profile-picture" id="profile-picture-preview" data-test-id="profile-picture-preview" data-bind="visible: profilePicture.isProfilePictureEdited() && !profilePicture.isProfilePictureDeleted()"> <img data-bind="attr: { src: profilePicture.profilePictureUrl }, cropbox:{ width:203, height:203, croppedImageData: profilePicture.pictureModel.profilePicture }" alt=""> </div> <ul class="modal-action-list"> <li> <a href="" id="upload_link" data-bind="click: profilePicture.uploadPicture"> <i data-test-id="profile-picture-upload" class="icon-upload"></i>Upload Picture </a> </li> <li> <a href="" id="remove-image-link" data-bind="click: profilePicture.deletePicture, visible: profilePicture.IsRemoveVisible"> <i class="icon-cross" data-test-id="profile-picture-remove"></i> Remove Picture </a> </li> </ul> <!-- UPLOAD PICTURE --> <div class="main-profile-form" data-bind="validationOptions: { insertMessages: true, messageTemplate: 'customMessageTemplate' }"> <div class="row show-grid name-block"> <div class="col-xs-12 col-sm-4"> <label for="popup-firstname">First Name *</label> <div class="cb"></div> <input id="popup-firstname" type="text" data-bind="value: firstName, valueUpdate: 'input'" data-test-id="firstname" tabindex="1" /> </div> <div class="col-xs-12 col-sm-4"> <label for="popup-middlename">Middle Name</label> <div class="cb"></div> <input id="popup-middlename" type="text" data-bind="value: middleName, valueUpdate: 'input'" data-test-id="middlename" tabindex="2" /> </div> <div class="col-xs-12 col-sm-4"> <label for="popup-lastname">Last Name *</label> <div class="cb"></div> <input id="popup-lastname" type="text" data-bind="value: lastName, valueUpdate: 'input'" data-test-id="lastName" tabindex="3" /> </div> <div class="text-link" data-bind="click: addAuthoringNames" style="display: none">Edit Authoring Names</div> </div> <div class="cb"></div> <div class="affiliation-block"> <div class="title">Select Primary Affiliation Displayed <span data-bind="visible: hasAffiliations() == true">*</span></div> <div class="module-icon-info"> <i class="icon-info" data-bind="attr: { id: info.iconId }, click: info.show, visible: hasAffiliations() == true" data-test-id="header-affiliation-info-icon"></i> <div class="info-popover" data-test-id="header-affiliation-info-message" data-bind="attr: { id: info.id }, fadeIf: info.visible, falsyWhenClickedOutside: info.clickOutsideProperties"> <p>Should you have multiple current affiliations, your primary affiliation is the main University, Institute, Company, Corporation or Organization that you are affiliated with for your research. This primary affiliation is featured on top of your Loop profile.</p> </div> </div> <div class="empty-case" data-bind="visible: hasAffiliations() == false" style="margin: 30px 0" data-test-id="header-affiliation-emtpy-case"> <p><a data-bind="click: addAffiliation" data-test-id="header-affiliation-empty-add">Add</a> your affiliation.</p> </div> <ul data-bind="visible: hasAffiliations, foreach: { data: currentAffiliations }"> <li data-test-id="header-affiliation-item"> <div class="radio-button" data-test-id="header-affiliation-item-radio" data-bind="attr: { 'value': Id }, css: { 'checked': Id === $parent.primaryAffiliationId() }, click: $parent.primaryAffiliationChange"></div> <div class="data"> <div class="position" data-bind="text: Position, visible: !IsCommon" data-test-id="header-affiliation-item-position"></div> <div class="affiliation-name" data-bind="text: Name" data-test-id="header-affiliation-item-name"></div> <div class="affiliation-location" data-bind="text: Location()" data-test-id="header-affiliation-item-location"></div> </div> <div class="cb"></div> </li> </ul> <div class="text-link" data-bind="visible: hasAffiliations, click: addAffiliation" data-test-id="header-affiliation-add" tabindex="4">Add New Affiliation</div> </div> <div class="cb"></div> <div class="row show-grid degree-block"> <div class="col-xs-12 col-sm-6"> <label for="popup-degree">Select Education Displayed</label> <div class="cb"></div> <div class="select-wrapper"> <div class="select"> <select data-placeholder="Select" class="input-block-level chosen-select" data-test-id="header-degree-select" tabindex="5" data-bind="options: Loop.Cache.Degrees(true), optionsText: 'Name', optionsValue: 'DegreeId', value: degreeId, valueAllowUnset: true, valueUpdate: 'input', enable: !saving()"> </select> </div> </div> </div> <div class="cb"></div> <div class="text-link" data-bind="click: addEducation" data-test-id="header-education-add" tabindex="6" style="display: none">Add New Education</div> </div> <div class="cb"></div> </div> </script> <script type="text/html" id="honorsAndAwards"> <div class="brick disable-on-edit" id="brick-awards" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-honorsAndAwards-content"> <div class="brick-content-title" id="brick-honorsAndAwards-content-title" data-test-id="brick-honorsAndAwards-content-title"> <h2>Honors & Awards</h2> </div> <div class="brick-content-text" id="brick-honorsAndAwards-content-text" data-test-id="brick-honorsAndAwards-content-text"> <a id="ha-btn-add1" href="#" data-track="add-profile-info" data-bind="click: addHonorsAndAwards, visible: (brick.isDataLoaded() && editMode() && !brick.noContent())" class="brick-header-action" data-test-id="honorsAndAwards-addLink">Add</a> <div class="cb"></div> <div data-bind="fadeVisible: brick.noContentOwnProfile" data-test-id="honorsAndAwards-empty" id="honorsAndAwards-empty" class="empty-case"> <p><a id="ha-btn-add2" data-bind="click: addHonorsAndAwards" data-track="add-profile-info" href="#">Add</a> your awards history.</p> </div> <div class="cb"></div> <p data-bind="visible: brick.noContentOtherProfile" class="no-content" id="honorsAndAwards-nocontent" data-test-id="honorsAndAwards-noContent">No content to display.</p> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <ul class="brick-list" data-bind="foreach: { data: honorsAndAwards, beforeRemove: removeElement, afterAdd: addElement }"> <li data-bind="attr: {'id' : $parent.getItemDivId(HonorAwardId), 'data-index': $index()}"> <div class="row show-grid" data-bind="fadeVisible: !$data.isEditing()"> <div class="col-xs-12"> <div class="list-info"> <!-- ko if: "AwardDate" in $data && $data.AwardDate.Format() != 3 --> <div class="period"> <span class="begin" data-bind="text: Loop.Helpers.PeriodDateHelper.FormatDate(AwardDate.Date(), AwardDate.Format())" data-test-id="honorsAndAwards-date"></span> </div> <!-- /ko --> <!-- ko if: $parent.editMode--> <i class="icon-pencil" data-test-id="honorsAndAwards-icon-pencil" data-track="edit-profile-info" data-bind="click: $parent.editHonorsAndAwards"></i> <i class="icon-cross" data-test-id="honorsAndAwards-icon-cross" data-track="remove-profile-info" data-bind="click: $parent.deleteHonorsAndAwards"></i> <!-- /ko --> <div class="cb"></div> <!-- ko if: "AwardName" in $data && $data.AwardName.trim() --> <div class="award-title" data-bind="text: AwardName" data-test-id="honorsAndAwards-awardName">></div> <div class="cb"></div> <!-- /ko --> <!-- ko if: "AwardAuthority" in $data && $data.AwardAuthority.trim() --> <div class="organisation" data-bind="text:AwardAuthority" data-test-id="honorsAndAwards-awardAuthority">></div> <div class="cb"></div> <!-- /ko --> <!-- ko if: "HonorDescription" in $data && $data.HonorDescription.trim() --> <div class="description" data-bind="text: HonorDescription " data-test-id="honorsAndAwards-honorDescription">></div> <div class="cb"></div> <!-- /ko --> </div> <!-- .list-info --> </div> <!-- .col-xs-12--> </div><!-- .row show-grid --> </li> </ul> <div class="bottom-spacer" data-bind="visible: !brick.noContent() && !brick.errorMessage()"></div> </div> </div> </div> </script><script type="text/html" id="honorsAndAwardsEdit"> <div class="editing-module item-hidden" data-bind="validationOptions: { insertMessages: true, messageTemplate: 'customMessageTemplate' }, fadeVisible: dataItem.isEditing"> <div class="row show-grid"> <div class="col-xs-2"></div> <div class="col-xs-8"> <form data-test-id="HonorAward-EditForm"> <label for="awards-period-from">Date Honor / Award was received</label> <div class="cb"></div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Select" class="chosen-select" data-test-id="HonorAward-EditForm-Month" data-bind="options: dataItem.AwardDate.getMonths(), optionsCaption: 'Month', optionsText: dataItem.AwardDate.getMonthName, value: dataItem.AwardDate.Month, event:{ change: dataItem.AwardDate.updateDate}"></select> </div> </div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Select" class="chosen-select" data-test-id="HonorAward-EditForm-Year" data-bind="options: dataItem.AwardDate.getYears(), optionsCaption: 'Year', value: dataItem.AwardDate.Year, event:{ change: dataItem.AwardDate.updateDate}"></select> </div> </div> <div class="form-validator-error" data-bind="fadeIf: !dataItem.IsValidDate()" data-test-id="HonorAward-EditForm-IsValidDate"> <span data-bind="text: dataItem.dateErrorMessage()" data-test-id="HonorAward-EditForm-IsValidDateMessage"></span> </div> <div class="cb"></div> <label for="awards-title">Honor / Award title *</label> <input type="text" name="awardTitle" id="awards-title" data-test-id="HonorAward-EditForm-AwardTitle" data-bind="value: dataItem.AwardName, valueUpdate: 'input'"> <div class="cb"></div> <label for="awards-by">Awarded by</label> <input type="text" name="awardedBy" id="awards-by" data-test-id="HonorAward-EditForm-AwardedBy" data-bind="value: dataItem.AwardAuthority, valueUpdate: 'input'"> <div class="cb"></div> <label for="awards-description">Description</label> <textarea id="awards-description" data-bind="value: dataItem.HonorDescription, valueUpdate: 'input'" data-test-id="HonorAward-EditForm-Description"></textarea> <div class="cb"></div> </form> </div> </div> <div class="row show-grid"> <div class="col-xs-12"> <div class="button-container"> <button type="button" class="btn-cancel" data-test-id="HonorAward-EditForm-CancelButton" data-bind="click: cancelEdition, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }" data-track="cancel-profile-update"> Cancel </button> <button type="button" class="btn-remove" data-test-id="HonorAward-EditForm-RemoveButton" data-bind="click: deleteItem, visible: !dataItem.IsNew, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }"> Remove </button> <button type="button" class="btn-save" data-test-id="HonorAward-EditForm-SaveButton" data-bind="click: saveItem, enable: dataItem.IsValidHonorAndAward() && !dataItem.saving(), css: { 'btn-saving': dataItem.saving(), 'disabled': !dataItem.IsValidHonorAndAward() }" data-track="save-profile-update"> Save </button> </div> </div> </div> <div class="cb"></div> <div data-bind="fadeIf: dataItem.UIMessage" class="form-validator-warning"> <span id="honors-ui-msg" data-test-id="HonorAward-EditForm-UIMessage" data-bind="text: dataItem.UIMessage"></span> </div> </div> <div class="cb"></div> </script> <script type="text/html" id="impactChart"> <div class="brick brick-impact disable-on-edit" id="brick-impact-counter-nav" data-test-id="impact-chart-brick" data-bind="changeBrickStatus: brick.status(), attr: { 'data-anchor': anchorId }"> <div class="brick-content" id="brick-impact-counter-content"> <div class="brick-content-title"> <h2><span data-bind="text: title" data-test-id="impact-chart-title">-</span></h2> <div class="brick-impact-title"> <i data-bind="css: iconClass" data-test-id="brick-icon"></i> <div class="module-icon-info"> <i class="icon-info" data-bind="attr: { id: infoIconId, 'data-test-id': infoIconId }, click: showInfo"></i> <div class="info-popover" style="display:none;" data-bind="attr: { id: infoId, 'data-test-id': infoId }, fadeIf: displayInfoHint, falsyWhenClickedOutside: clickOutsideProperties"> <h4>Please note:</h4> <p>Loop does not have any control over when data from external sources becomes available.</p> </div> </div> </div> </div> <div class="brick-content-text" id="brick-impact-counter-text" data-test-id="brick-impact-counter-text"> <div class="row"> <div class="brick-impact"> <!-- Brick content --> <div data-test-id="impact-chart-content" data-bind="visible: brick.isDataLoaded() && !brick.errorMessage()"> <ul class="source-list" data-test-id="impact-chart-key-value-pairs"> <!-- ko foreach : chartSections --> <li data-bind="css: { active: active }"> <a data-bind="click: $parent.onSectionClicked"> <span class="formatted-number number" data-bind="text: Total"></span> <span class="source" data-bind="text: Label"></span> <span class="line"></span> </a> </li> <!--/ko--> </ul> <div class="cb"></div> <div class="chart-controls" data-bind="changeChartStatus: chartStatuses" data-test-id="chart-section"> <div id="" class="input-block-level" data-bind="attr: { 'id': idPrefix + '-chart-controls'}" style="opacity: 0; display: none;"> <div> <form> <label>Last 12 months <select data-bind="value: selectedRange" data-test-id="chart-range-select" style="display: none;"> <option>Since beginning</option> <option>Last Week</option> <option>Last Month</option> <option selected="selected">Last Year</option> </select> </label> </form> </div> <div class="btn-group pull-right" data-toggle="tooltip" title="Toggle between timeline and bar chart views"> <button type="button" class="btn btn-default btn-xs active" data-test-id="chart-timeline-button" data-bind="css: { active: chartType() === Loop.constants.impactChartTypes.SPLINE }, click: function(data, event) { changeChartType('spline', data, event) }"><span class="glyphicon glyphicon-time"></span></button> <button type="button" class="btn btn-default btn-xs" data-test-id="chart-columns-button" data-bind="css: { active: chartType() === Loop.constants.impactChartTypes.COLUMN }, click: function(data, event) { changeChartType('column', data, event) }"><span class="glyphicon glyphicon-stats"></span></button> </div> </div> <div id="" data-bind="attr: { 'id': idPrefix + '-timeline-chart'}" style="width: 100%; height: 400px; margin: 0 auto; padding:20px 11px; opacity: 0; display: none;"></div> <div class="error-module" data-bind="visible: chartErrorMessage()" data-test-id="impact-chart-error-message"> <p data-bind="text: chartErrorMessage()"></p> </div> <div class="no-content" data-bind="visible: chartNoDataMessage"> <p data-bind="text: chartNoDataMessage"></p> </div> <div class="cb"></div> </div> </div> <!-- /Content --> <!-- Error --> <div data-test-id="error-section" data-bind="visible: brick.errorMessage()"> <div class="error-module" data-test-id="impact-error-message"> <p data-bind="text: brick.errorMessage()"></p> </div> <div class="cb"></div> </div> <!-- /Error --> </div> </div> </div> </div> </div> </script><script type="text/javascript"> var demographicsAge = function () { $('#demographics-age').highcharts({ credits: { enabled: false }, chart: { type: 'bubble', zoomType: 'xy' }, title: { text: null }, xAxis: { title: { text: 'Age' } }, yAxis: { min: 0, title: { text: 'Number of Users' } }, series: [{ data: [[20, 2, 2], [30, 10, 10], [50, 15, 15]], color: '#000000', name: 'Men' }, { data: [[25, 5, 5], [30, 7, 7], [40, 1, 1]], color: '#f29400', name: 'Women' }] }); }; var demographicsPosition = function () { $('#demographics-position').highcharts({ credits: { enabled: false }, chart: { type: 'pie', width: 250, height: 180 }, title: { text: null }, plotOptions: { series: { allowPointSelect: false, slicedOffset: 0, } }, series: [{ data: [ { name: 'Student', y: 29.9, color: '#dccd00' }, { name: 'Professor', y: 71.5, color: '#7d7900' }, { name: 'Researcher', y: 106.4, color: '#f29400' } ] }] }); }; var demographicsTopCountries = function () { $('#demographics-top-countries').highcharts({ chart: { type: 'bar', width: 241, height: 200, marginLeft: 0 }, title: { text: null }, xAxis: { categories: ['United States', 'Russia', 'Switzerland'], tickWidth: 0, title: { text: null }, labels: { align: 'left', x: 0, y: -18, style: { whiteSpace: 'nowrap', color: 'black' } } }, yAxis: { min: 0, title: { enabled: false }, labels: { overflow: 'justify' } }, tooltip: { valueSuffix: ' citations' }, plotOptions: { bar: { dataLabels: { enabled: true, inside: true, align: 'left', color: '#ffffff', style: { fontWeight: 'bold' } } } }, legend: { enabled: false }, credits: { enabled: false }, series: [{ data: [{ color: '#7d7900', y: 897 }, { color: '#7d7900', y: 203 }, { color: '#7d7900', y: 133 }] }] }); }; var percentileChart = function () { $('#percentile-chart').highcharts({ credits: { enabled: false }, chart: { type: 'pie' }, title: { text: null }, tooltip: { enabled: false }, plotOptions: { pie: { size: '100%', innerSize: '70%', dataLabels: { enabled: false } } }, series: [{ name: '2', size: '100%', innerSize: '80%', startAngle: -90, // endAngle: 90, convert to half-donut chart data: [ { y: 51, color: '#37ADE7' }, { y: 12, color: '#000000' }, { y: 37, color: '#dcdcdc' } ] }] }, function (percentileChart) { // on complete var xpos = '50%'; var ypos = '50%'; var circleradius = 40; // Render the text percentileChart.renderer.text(percentileChart.series[0].data[0].percentage + '%', 75, 120).css({ width: circleradius * 2, color: '#000000', fontSize: '36px', textAlign: 'center', fontWeight: 'bold' }).attr({ zIndex: 999 }).add(); }); }; var viewBarChart = function () { $('#views-bar-chart').highcharts({ credits: { enabled: false }, chart: { type: Loop.constants.impactChartTypes.COLUMN }, title: { text: null }, legend: { x: 140 }, xAxis: { categories: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] }, yAxis: { min: 0, title: { text: 'Views' } }, tooltip: { headerFormat: '<span style="font-size:10px">{point.key}</span><table>', pointFormat: '<tr><td style="color:{series.color};padding:0">{series.name}: </td>' + '<td style="padding:0"><b>{point.y:.1f} mm</b></td></tr>', footerFormat: '</table>', shared: true, useHTML: true }, plotOptions: { series: { stacking: 'normal' } }, series: [{ name: 'Views', color: '#dccd00', data: [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4] }, { name: 'Downloads', color: '#7d7900', data: [42.4, 33.2, 34.5, 39.7, 52.6, 75.5, 57.4, 60.4, 47.6, 39.1, 46.8, 51.1] }] }); }; var viewTimelineChart = function() { $('#views-timeline-chart').highcharts({ credits: { enabled: false }, chart: { type: Loop.constants.impactChartTypes.SPLINE }, title: { text: null }, legend: { x: 40 }, xAxis: { gridLineWidth: 1, categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], title: { text: 'Year 2014' }, labels: { step: 3 }, plotLines: [{ value: 3, //If the categories are alphanumeric, you have to use ordinals instead of labels width: 2, color: '#FF0000' }] }, yAxis: { gridLineWidth: 1, title: { text: 'Views' }, min: 0, plotLines: [{ value: 50, width: 2, color: '#000000' }], plotBands: [{ from: 200, to: 317, label: { text: '▲ rise', align: 'center', style: { color: '#007A3D' } }, zindex: 1, color: { linearGradient: { //The gradient runs along a horizontal line x1: 0, y1: 0, x2: 1, y2: 0 }, stops: [[0, '#EBFAEB'], [0.5, '#C2F0C2'], [0.6, '#AABBCC'], [0.8, '#ADEBAD'], [0.9, '#99E699'] ] } }] }, plotOptions: { series: { allowPointSelect: true } }, series: [{ name: 'Views and Downloads', lineWidth: 6, color: '#f29400', marker: { symbol: 'circle', fillColor: '#FFFFFF', radius: 7, lineWidth: 5, lineColor: null // inherit from series }, data: [6, 15, 21, 49, 101, 180, 256, 316, 337, 208, 143, 128] }, { name: 'Views', visible: false, lineWidth: 6, color: '#7d7900', marker: { symbol: 'circle', fillColor: '#FFFFFF', radius: 7, lineWidth: 5, lineColor: null // inherit from series }, // Define the data points. All series have a dummy year // of 1970/71 in order to be compared on the same x axis. Note // that in JavaScript, months start at 0 for January, 1 for February etc. data: [4, 12, 14, 34, 67, 135, 211, 300, 315, 134, 122, 118] }, { name: 'Downloads', visible: false, lineWidth: 6, color: '#eccc00', marker: { symbol: 'circle', fillColor: '#FFFFFF', radius: 7, lineWidth: 5, lineColor: null // inherit from series }, data: [2, 3, 7, 15, 34, 45, 21, 16, 22, 78, 21, 10] }] }); } </script> <script type="text/html" id="impactCharts"> <div class="brick disable-on-edit" id="brick-impact-overview" style="display: block; opacity: 1; height: auto;"> <div class="brick-content" id="brick-impact-overview-content" style="display: block; opacity: 1;"> <div class="brick-content-text" id="brick-impact-content-text" data-test-id="brick-impact-content-text"> <h3>Sample 1</h3> <div id="demographics-age" style="min-width: 815px; margin: 0 auto"></div> </div> </div> </div> <div class="brick disable-on-edit" id="brick-impact-overview" style="display: block; opacity: 1; height: auto;"> <div class="brick-content" id="brick-impact-overview-content" style="display: block; opacity: 1;"> <div class="brick-content-text" id="brick-impact-content-text" data-test-id="brick-impact-content-text"> <h3>Sample 2</h3> <div id="demographics-position" style="min-width: 815px; margin: 0 auto"></div> </div> </div> </div> <div class="brick disable-on-edit" id="brick-impact-overview" style="display: block; opacity: 1; height: auto;"> <div class="brick-content" id="brick-impact-overview-content" style="display: block; opacity: 1;"> <div class="brick-content-text" id="brick-impact-content-text" data-test-id="brick-impact-content-text"> <h3>Sample 3</h3> <div id="demographics-top-countries" style="min-width: 815px; margin: 0 auto"></div> </div> </div> </div> <div class="brick disable-on-edit" id="brick-impact-overview" style="display: block; opacity: 1; height: auto;"> <div class="brick-content" id="brick-impact-overview-content" style="display: block; opacity: 1;"> <div class="brick-content-text" id="brick-impact-content-text" data-test-id="brick-impact-content-text"> <h3>Sample 4</h3> <div id="percentile-chart" style="height: 220px; width: 220px; display: block;"></div> </div> </div> </div> <div class="brick disable-on-edit" id="brick-impact-overview" style="display: block; opacity: 1; height: auto;"> <div class="brick-content" id="brick-impact-overview-content" style="display: block; opacity: 1;"> <div class="brick-content-text" id="brick-impact-content-text" data-test-id="brick-impact-content-text"> <h3>Sample 5</h3> <div id="views-bar-chart" style="min-width: 810px; height: 400px; margin: 0 auto"></div> </div> </div> </div> <div class="brick disable-on-edit" id="brick-impact-overview" style="display: block; opacity: 1; height: auto;"> <div class="brick-content" id="brick-impact-overview-content" style="display: block; opacity: 1;"> <div class="brick-content-text" id="brick-impact-content-text" data-test-id="brick-impact-content-text"> <h3>Sample 6</h3> <div id="views-timeline-chart" style="min-width: 810px; height: 400px; margin: 0 auto"></div> </div> </div> </div> </script><script type="text/html" id="impactCounter"> <div class="brick brick-impact disable-on-edit" id="brick-impact-counter-nav" data-test-id="impact-counter-brick" data-bind="changeBrickStatus: brick.status(), attr: { 'data-anchor': anchorId }"> <div class="brick-content" id="brick-impact-counter-content"> <div class="brick-content-title"> <h2><span data-bind="text: title" data-test-id="impact-counter-title">-</span></h2> <div class="brick-impact-title"> <i data-bind="css: cssClass"></i> <div class="module-icon-info"> <i class="icon-info" data-bind="attr: { id: infoIconId }, click: showInfo"></i> <div class="info-popover" style="display:none" data-bind="attr: { id: infoId }, fadeIf:displayInfoHint, falsyWhenClickedOutside: clickOutsideProperties"> <h4>Please note:</h4> <p>Loop does not have any control over when data from external sources becomes available.</p> </div> </div> </div> </div> <div class="brick-content-text" id="brick-impact-counter-text" data-test-id="impact-counter-text"> <div class="row"> <div id="impact-counter-list"> <div class="brick-impact"> <div class="cb"></div> <ul class="source-list" data-bind="visible: brick.isDataLoaded() && !brick.errorMessage()" data-test-id="impact-counter-key-value-pairs"> <!-- ko foreach : counterElements --> <li> <span class="formatted-number number" style="color:#dcdcdc" data-bind="text: total"></span> <span class="source" data-bind="text: label"></span> <span class="line"></span> </li> <!--/ko--> </ul> <div class="error-module" data-bind="visible: brick.errorMessage()" data-test-id="impact-error-message"><p data-bind="text: brick.errorMessage()"></p></div> <div class="cb"></div> </div> </div> </div> </div> </div> </div> </script><script type="text/html" id="impactData"> <div class="brick disable-on-edit" id="brick-impact-overview" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-impact-overview-content"> <div class="brick-content-text" id="brick-impact-content-text" data-test-id="brick-impact-content-text"> <ul data-bind="visible: brick.isDataLoaded()"> <li> <span data-bind="text:totalViews" class="formatted-number" data-test-id="impact-totalViews-number"></span> <div class="module-icon-info" style="left:75%"> <i class="icon-info" style="margin-top:0px" data-bind="attr: { id: infoIconId, 'data-test-id': infoIconId }, click: showInfo"></i> <div class="info-popover" style="display:none;" data-bind="attr: { id: infoId, 'data-test-id': infoId }, fadeIf: displayInfoHint, falsyWhenClickedOutside: clickOutsideProperties"> <p> Views and Downloads from the Frontiers platform </p> </div> </div> Total <br>Views </li> <li><span data-bind="text:profileViews" class="formatted-number" data-test-id="impact-profileViews-number"></span>Profile<br>Views</li> <li><span data-bind="text:totalPublications" class="formatted-number" data-test-id="impact-totalPublications-number"></span>Total<br>Publications</li> <li><span data-bind="text:publicationViews" class="formatted-number" data-test-id="impact-publicationViews-number"></span>Publication<br>Views</li> <li><span data-bind="text:publicationDownloads" class="formatted-number" data-test-id="impact-publicationDownloads-number"></span>Publications<br>Downloads</li> </ul> <div class="error-module" data-bind="visible: brick.errorMessage" data-test-id="brick-impact-error-message"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- View all link --> <a class="link-view-all" href="impact" data-test-id="link-view-full-impact" data-bind="click: sendTo, visible: brick.isDataLoaded() && !brick.noContent() && !brick.errorMessage()">View Full Impact</a> <!-- /View all link --> </div> </div> </div> </script><script type="text/html" id="impactSummary"> <div class="brick disable-on-edit" id="brick-impact-overview-nav" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-impact-overview-content"> <div class="brick-content-text" id="brick-impact-overview-text" data-test-id="brick-impact-overview-text"> <div class="alert alert-warning" data-bind="fadeVisible: statisticsUpdated() && !impactAnnotationDiscarted()"> <p><strong>Please note</strong>: your impact metrics will be updated within 24 hours of linking your publications. Please check back later.</p> <i class="close" data-bind="click: discardImpactAnnotation"></i> </div> <div class="row show-grid" data-bind="visible: brick.isDataLoaded()"> <div id="brick-impact-overview-publications" class="col-lg-3 col-md-3 col-sm-12 col-xs-12"> <div class="publications"> <div class="number formatted-number" data-bind="text: totalPublications" data-test-id="impact-publications-number"></div> <div class="data">Publications</div> <p> Displayed is the <span class="role">Author impact </span> based on the articles authored by <!--ko text: fullName--><!--/ko-->. </p> </div> </div> <div class="col-lg-9 col-md-9 col-sm-12 col-xs-12"> <!-- ko template: { name: getViewName() } --> <!-- /ko --> </div> </div> <!-- Error --> <div class="error-module" data-bind="visible: brick.errorMessage()" data-test-id="brick-impact-error-message"><p data-bind="text: brick.errorMessage()"></p></div> <div class="cb"></div> <!-- /Error --> </div> </div> </div> </script><script type="text/html" id="impactSummaryMineNoResults"> <div id="brick-impact-overview-noPublications-mine" data-test-id="brick-impact-summary-noPublications-mine"> <div class="empty-case"> <p> <a href="publications" data-track="click-pub-page">Confirm your publications</a> so that your author impact metrics can be displayed here. </p> </div> </div> </script><script type="text/html" id="impactSummaryOthersNoResults"> <div id="brick-impact-overview-noPublications-others" data-test-id="brick-impact-summary-noPublications-others"> <div class="no-content"> This researcher has not added any publications to their profile and there are no author impact metrics to display. </div> </div> </script><script type="text/html" id="impactSummaryResults"> <div id="brick-impact-overview-results" data-test-id="brick-impact-summary-results"> <ul class="row show-grid"> <li class="col-lg-4 col-md-4 col-sm-4 col-xs-6" data-bind="click: function(data, event) { scrollToMetricBrick('Citations') }"> <div class="number formatted-number" style="color:#dcdcdc" data-bind="text: citations.total()" data-test-id="impact-citations-total"></div> <div class="data">Citations</div> <div class="divider"></div> <!-- ko if: false--> <div class="increase"><span data-bind="text: citations.period()" data-test-id="impact-citations-period"></span><span class="grow formatted-number" data-bind="text: citations.delta()" data-test-id="impact-citations-delta"></span></div> <!-- /ko --> </li> <li class="col-lg-4 col-md-4 col-sm-4 col-xs-6"> <div> <div class="number formatted-number" data-bind="text: views.total(), click: function(data, event) { scrollToMetricBrick('Views') }" data-test-id="impact-views-total"></div> <div class="module-icon-info" style="left:60%"> <i class="icon-info" style="position: absolute" data-bind="attr: { id: infoIconId, 'data-test-id': infoIconId }, click: showInfo"></i> <div class="info-popover" style="display:none;" data-bind="attr: { id: infoId, 'data-test-id': infoId }, fadeIf: displayInfoHint, falsyWhenClickedOutside: clickOutsideProperties"> <p> Views and Downloads from the Frontiers platform </p> </div> </div> </div> <div data-bind="click: function(data, event) { scrollToMetricBrick('Views') }"> <div class="data">Views</div> <div class="divider"></div> <!-- ko if: false--> <div class="increase"><span data-bind="text: views.period()" data-test-id="impact-views-period"></span><span class="grow formatted-number" data-bind="text: views.delta()" data-test-id="impact-views-delta"></span></div> <!-- /ko --> </div> </li> <li class="col-lg-4 col-md-4 col-sm-4 col-xs-6" data-bind="click: function(data, event) { scrollToMetricBrick('Downloads') }"> <div class="number formatted-number" data-bind="text: downloads.total()" data-test-id="impact-downloads-total"></div> <div class="data">Downloads</div> <div class="divider"></div> <!-- ko if: false--> <div class="increase"><span data-bind="text: downloads.period()" data-test-id="impact-downloads-period"></span><span class="grow formatted-number" data-bind="text: downloads.delta()" data-test-id="impact-downloads-delta"></span></div> <!-- /ko --> </li> </ul> </div> </script><script type="text/html" id="importYourPublicationsTemplate"> <div class="brick brick-sidebar" id="brick-iyp" data-bind="changeBrickStatus: brick.status()" data-test-id="brick-iyp"> <div class="brick-content" id="brick-iyp-content"> <h2>ORCID synchronization</h2> <div class="cb"></div> <p>If you curate a list of your publications in ORCID, avoid curating them again by keeping them synchronized to Loop.</p> <div class="cb"></div> <div class="orcid-container"> <div data-bind="visible: showOrcid"> <div id="orcid-profile" class="item-orcidLink" data-test-id="orcid-profile-plugin"></div> <div class="cb"></div> </div> </div> <div class="cb"></div> </div> </div> </script> <script type="text/html" id="importYourPublicationsModal"> <div data-test-id="import-your-pubs-modal-result" data-bind="visible: !brick.errorMessage()"> <p data-bind="visible: modalMessage !== '', html: modalMessage" data-test-id="import-your-pubs-modal-message"></p> </div> </script> <script type="text/html" id="inviatePeopleViaEmailTemplate"> <div class="brick brick-sidebar" id="brick-invite" data-bind="changeBrickStatus: brick.status(), validationOptions: { insertMessages: false }"> <div class="brick-content" id="brick-invite-content"> <h2>Invite People Via Email</h2> <div class="cb"></div> <p>Inviting your colleagues to Loop will allow you to stay up-to-date with their research activity once they have joined.</p> <form> <input data-bind="value: email, enable: status() !== 'sending', valueUpdate: 'input', onEnterKeyPress: sendEmail, event: { keypress: avoidWhiteSpaces }" type="text" data-test-id="input-invite-by-email" /> <div class="form-validator-error" data-bind="fadeIf: !email.isValid()"> <!--ko text: errors()--> Please fill in this field. <!--/ko--> </div> <div class="cb"></div> <button data-bind="click: sendEmail, enable: status() !== 'sending' && email.isValid(), css: { 'btn-saving' : status() === 'sending', 'disabled': !email.isValid() }" class="btn-save" type="button" data-test-id="btn-invite-by-email"> Invite </button> <!--ko if: status() == 'success'--> <div data-bind="foreach: { data: endpointMessages, beforeRemove: removeMessage, afterAdd: addMessage }" data-test-id="div-endpoint-messages"> <div data-test-id="email-msg-success" data-bind="text: message, css: { 'form-validator-warning': !success, 'form-validator-success': success}"></div> </div> <!-- /ko--> <div data-bind="fadeIf: status() == 'error'" data-test-id="div-endpoint-error"> <div class="form-validator-warning" data-test-id="email-msg-success" data-bind="text: UIMessage"></div> </div> </form> <div class="cb"></div> </div> </div> </script><script type="text/html" id="miniProfile"> <li> <div class="row show-grid disable-on-edit" data-bind="attr:{'data-test-id': 'dv_' + userId}"> <div class="col-xs-3 col-sm-3 col-lg-3"> <div class="image-container"> <a data-bind="attr: { href: url }" data-test-id="link-image"> <img data-bind="customImg: { src: profilePicture }" alt="publication image" class="img-responsive" /> </a> </div> </div> <div class="col-xs-9" data-test-id="mini-profile-body"> <div class="row"> <div class="col-xs-12 col-md-7 col-lg-8"> <div class="list-info"> <h4> <a data-bind="attr: { href: url }"> <span data-bind="text: fullName" data-test-id="mini-profile-fullname"></span> </a> </h4> <p data-bind="text: affiliation, visible: affiliation"></p> <!-- ko if:$data.location--> <p> <span data-bind="text: location"></span> </p> <!-- /ko --> </div> </div> <div class="col-xs-12 col-md-5 col-lg-4" data-test-id="action-button"> <div class="button-container"> <!-- ko template: { name: nestedView, data: $data } --> <!-- /ko --> </div> </div> </div> <!-- ko if: numberOfCommonPublications !== undefined && numberOfCommonPublications > 0 --> <div class="row"> <div class="col-xs-12"> <ul class="list-hrz"> <li class="tt" data-toggle="tooltip" data-placement="top" title="" data-test-id="publications-in-common"><span data-bind="text: numberOfCommonPublications" class="formatted-number"></span>publications in common</li> </ul> </div> </div> <!-- /ko --> <!-- ko if: numberOfViews !== undefined && numberOfViews > 0 --> <div class="row"> <div class="col-xs-12"> <ul class="list-hrz"> <li class="tt" data-toggle="tooltip" data-placement="top" title=""><span data-bind="text: numberOfViews" class="formatted-number"></span>views</li> <li class="tt" data-toggle="tooltip" data-placement="top" title="" data-bind="visible: numberOfPublications"><span data-bind="text: numberOfPublications" class="formatted-number"></span>publications</li> </ul> </div> </div> <!-- /ko --> </div> </div> </li> </script> <script type="text/html" id="miniProfileLarge"> <li data-bind="attr:{'id': 'miniprofile_' + userId}"> <div class="row show-grid disable-on-edit" data-bind="attr:{'data-test-id': 'dv_' + userId}"> <div class="col-xs-2 col-sm-2 col-lg-2"> <div class="image-container"> <a data-bind="attr: { href: url }" data-test-id="link-image"> <img data-bind="customImg: { src: profilePicture }" alt="publication image" class="img-responsive" /> </a> </div> </div> <div class="col-xs-10" data-test-id="mini-profile-body"> <div class="row"> <div class="col-sm-12 col-md-10"> <div class="list-info"> <h4> <a data-bind="attr: { href: url }"> <span data-bind="text: fullName"></span> </a> </h4> <p data-bind="text: affiliation, visible: affiliation"></p> <p> <span data-bind="text: location"></span> </p> </div> </div> <div class="col-sm-12 col-md-2"> <div class="button-container"> <div data-test-id="action-button"> <!-- ko template: { name: nestedView, data: $data } --> <!-- /ko --> </div> <!-- ko if: secondaryNestedView --> <div data-test-id="secondary-action-button"> <!-- ko template: { name: secondaryNestedView, data: $data } --> <!-- /ko --> </div> <!-- /ko --> </div> </div> </div> <div class="row"> <!-- ko if: numberOfCommonPublications !== undefined && numberOfCommonPublications > 0 --> <div class="col-xs-12"> <ul class="list-hrz"> <li class="tt" data-toggle="tooltip" data-placement="top" title="" data-test-id="publications-in-common"><span data-bind="text: numberOfCommonPublications" class="formatted-number"></span>publications in common</li> </ul> </div> <!-- /ko --> <!-- ko if: numberOfViews !== undefined && numberOfViews > 0 --> <div class="col-xs-12" style="display: none"> <ul class="expertise-tags" id="henry-tags"></ul> </div> <div class="col-xs-12"> <ul class="list-hrz"> <!-- ko if: numberOfViews !== undefined && numberOfViews > 0 --> <li class="tt" data-toggle="tooltip" data-placement="top" title=""><span data-bind="text: numberOfViews" class="formatted-number"></span>views</li> <li class="tt" data-toggle="tooltip" data-placement="top" title="" data-bind="visible: numberOfPublications"><span data-bind="text: numberOfPublications" class="formatted-number"></span>publications</li> <!-- /ko --> </ul> </div> <!-- /ko --> </div> </div> </div> </li> </script> <script type="text/html" id="miniPublications"> <div class="brick disable-on-edit" id="brick-suggested-publications" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-suggested-publications-content"> <div class="brick-content-title"> <h2> <span data-bind="visible: !newPublications() && numberOfPublications(), text: numberOfPublications" class="number-bold formatted-number" data-test-id="publications-number"></span> <span data-bind="text: title" data-test-id="publications-brickTitle"></span> </h2> </div> <div class="brick-content-text"> <div class="cb"></div> <div> <p class="no-content" data-bind="visible: brick.noContentOtherProfile" data-test-id="publications-noContent-OtherProfile">No content to display.</p> </div> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko template: { name: getViewName(), afterRender: setExternalLinks } --> <!-- /ko --> </div> </div> </div> </script> <script type="text/html" id="miniPublicationsNoResults"> <div class="empty-case"> <p>We cannot find any publications that match your profile.</p> <div class="row"> <div class="col-xs-6"> <a href="publications?tryAnotherSearch=true" class="icon-magnifier" data-test-id="try-find-publications-anchor">Try to find your publications with our advanced search.</a> </div> </div> </div> <div class="cb"></div> </script> <script type="text/html" id="miniPublicationsResults"> <ul data-test-id="miniPublicationList" data-bind="template: { foreach: publications, name: publicationsListTemplateId, beforeRemove: hidePublication, afterAdd: showPublication }" class="brick-list"></ul> <!-- ko if: brick.ownProfile() || (!brick.ownProfile() && numberOfPublications() > 0) --> <a data-test-id="publications-viewAll-link" class="link-view-all" data-bind="attr:{href:newPublications() ? 'publications/new' : 'publications'}">View All Publications</a> <!-- /ko --> </script> <script type="text/html" id="networkMain"> <div id="brick-network" class="brick" data-test-id="panel-networkMain" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-network-content"> <span data-bind="attr: { 'data-status': brick.isDataLoaded() ? 'data-loaded' : 'data-pending' }"></span> <ul class="nav nav-tabs row" role="tablist" id="tab-network-nav"> <!-- ko with: follower--> <li> <a role="tab" data-toggle="tab" data-bind="attr: { href: '#' + $parent.followerTabName }, click: $parent.setActiveTab"> <!--ko if: brick.isDataLoaded() && !(brick.errorMessage() && paginator.currentPage() === 0) --> <span data-test-id="number-followers" class="number formatted-number" data-bind="text: paginator.total">0</span> <!-- /ko --> Followers </a> </li> <!-- /ko --> <!-- ko with: following--> <li> <a role="tab" data-toggle="tab" data-bind="attr: { href: '#' + $parent.followingTabName }, click: $parent.setActiveTab"> <!--ko if: brick.isDataLoaded() && !(brick.errorMessage() && paginator.currentPage() === 0)--> <span data-test-id="number-following" class="number formatted-number" data-bind="text: paginator.total">0</span> <!-- /ko --> Following </a> </li> <!-- /ko --> <!-- ko with: coAuthors--> <li> <a role="tab" data-toggle="tab" data-bind="attr: { href: '#' + $parent.coAuthorTabName }, click: $parent.setActiveTab"> <!--ko if: brick.isDataLoaded() && !(brick.errorMessage() && paginator.currentPage() === 0)--> <span data-test-id="number-coauthors" class="number formatted-number" data-bind="text: paginator.total()">0</span> <!-- /ko --> Co-authors </a> </li> <!-- /ko --> </ul> <div class="tab-content"> <!-- ko with: follower--> <div class="tab-pane" data-bind="attr: { id: $parent.followerTabName }" data-test-id="followers-panel"> <p data-bind="visible: brick.noContent" class="no-content" data-test-id="followers-panel-nocontent">No content to display.</p> <div data-bind="visible: !brick.noContent() || brick.status() === Loop.Enum.BrickDataStatus.Loading"> <ul class="brick-list row" data-bind="attr: { id: $parent.followerTabName }"> <!-- ko template : { name: 'miniProfileLarge', foreach: followers, afterAdd: $parent.addElement } --> <!-- /ko --> </ul> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko template : { name: 'networkPaging', data: paginator } --> <!-- /ko --> </div> </div> <!-- /ko --> <!-- ko with: following--> <div class="tab-pane" data-bind="attr: { id: $parent.followingTabName }" data-test-id="following2-panel"> <p data-bind="visible: brick.noContent" class="no-content" data-test-id="following2-panel-nocontent">No content to display.</p> <div data-bind="visible: !brick.noContent() || brick.status() === Loop.Enum.BrickDataStatus.Loading"> <ul class="brick-list row" data-bind="attr: { id: $parent.followingTabName }"> <!-- ko template : { name: 'miniProfileLarge', foreach: followings, afterAdd: $parent.addElement } --> <!-- /ko --> </ul> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <div class="spinner" data-bind="fadeIf: paginator.isPaging"></div> <div data-bind="visible: paginator.total() > paginator.getOffset() - removedItems() + insertedItems()"> <a href="#" class="link-view-all" data-test-id="paging-next" data-bind="fadeIf: !paginator.isPaging() && !brick.errorMessage(), click: paginator.next"> <span>Show more</span> </a> </div> </div> </div> <!-- /ko --> <!-- ko with: coAuthors--> <div class="tab-pane" data-bind="attr: { id: $parent.coAuthorTabName }" data-test-id="coauthors-panel"> <p data-bind="visible: brick.noContent" class="no-content" data-test-id="coauthors-panel-nocontent">No content to display.</p> <div data-bind="visible: !brick.noContent() || brick.status() === Loop.Enum.BrickDataStatus.Loading"> <ul class="brick-list row" data-bind="attr: { id: $parent.coAuthorTabName }"> <!-- ko template : { name: 'miniProfileLarge', foreach: miniProfiles, afterAdd: $parent.addElement } --> <!-- /ko --> </ul> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko template : { name: 'networkPaging', data: paginator } --> <!-- /ko --> </div> </div> <!-- /ko --> </div> </div> </div> </script> <script type="text/html" id="networkPaging"> <div class="spinner" data-bind="fadeIf: isPaging"></div> <a href="#" class="link-view-all" data-test-id="paging-next" data-bind="fadeIf: allowPagination() && !$parent.brick.errorMessage(), click: next"> <span>Show more</span> </a> </script> <script type="text/html" id="networkMain"> <div id="brick-network" class="brick" data-test-id="panel-networkMain" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-network-content"> <span data-bind="attr: { 'data-status': brick.isDataLoaded() ? 'data-loaded' : 'data-pending' }"></span> <ul class="nav nav-tabs row" role="tablist" id="tab-network-nav"> <!-- ko with: follower--> <li> <a role="tab" data-toggle="tab" data-bind="attr: { href: '#' + $parent.followerTabName }, click: $parent.setActiveTab"> <!--ko if: brick.isDataLoaded() && !(brick.errorMessage() && paginator.currentPage() === 0) --> <span data-test-id="number-followers" class="number formatted-number" data-bind="text: paginator.total">0</span> <!-- /ko --> Followers </a> </li> <!-- /ko --> <!-- ko with: following--> <li> <a role="tab" data-toggle="tab" data-bind="attr: { href: '#' + $parent.followingTabName }, click: $parent.setActiveTab"> <!--ko if: brick.isDataLoaded() && !(brick.errorMessage() && paginator.currentPage() === 0)--> <span data-test-id="number-following" class="number formatted-number" data-bind="text: paginator.total">0</span> <!-- /ko --> Following </a> </li> <!-- /ko --> <!-- ko with: coAuthors--> <li> <a role="tab" data-toggle="tab" data-bind="attr: { href: '#' + $parent.coAuthorTabName }, click: $parent.setActiveTab"> <!--ko if: brick.isDataLoaded() && !(brick.errorMessage() && paginator.currentPage() === 0)--> <span data-test-id="number-coauthors" class="number formatted-number" data-bind="text: paginator.total()">0</span> <!-- /ko --> Co-authors </a> </li> <!-- /ko --> </ul> <div class="tab-content"> <!-- ko with: follower--> <div class="tab-pane" data-bind="attr: { id: $parent.followerTabName }" data-test-id="followers-panel"> <p data-bind="visible: brick.noContent" class="no-content" data-test-id="followers-panel-nocontent">No content to display.</p> <div data-bind="visible: !brick.noContent() || brick.status() === Loop.Enum.BrickDataStatus.Loading"> <ul class="brick-list row" data-bind="attr: { id: $parent.followerTabName }"> <!-- ko template : { name: 'miniProfileLarge', foreach: followers, afterAdd: $parent.addElement } --> <!-- /ko --> </ul> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko template : { name: 'networkPaging', data: paginator } --> <!-- /ko --> </div> </div> <!-- /ko --> <!-- ko with: following--> <div class="tab-pane" data-bind="attr: { id: $parent.followingTabName }" data-test-id="following2-panel"> <p data-bind="visible: brick.noContent" class="no-content" data-test-id="following2-panel-nocontent">No content to display.</p> <div data-bind="visible: !brick.noContent() || brick.status() === Loop.Enum.BrickDataStatus.Loading"> <ul class="brick-list row" data-bind="attr: { id: $parent.followingTabName }"> <!-- ko template : { name: 'miniProfileLarge', foreach: followings, afterAdd: $parent.addElement } --> <!-- /ko --> </ul> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <div class="spinner" data-bind="fadeIf: paginator.isPaging"></div> <div data-bind="visible: paginator.total() > paginator.getOffset() - removedItems() + insertedItems()"> <a href="#" class="link-view-all" data-test-id="paging-next" data-bind="fadeIf: !paginator.isPaging() && !brick.errorMessage(), click: paginator.next"> <span>Show more</span> </a> </div> </div> </div> <!-- /ko --> <!-- ko with: coAuthors--> <div class="tab-pane" data-bind="attr: { id: $parent.coAuthorTabName }" data-test-id="coauthors-panel"> <p data-bind="visible: brick.noContent" class="no-content" data-test-id="coauthors-panel-nocontent">No content to display.</p> <div data-bind="visible: !brick.noContent() || brick.status() === Loop.Enum.BrickDataStatus.Loading"> <ul class="brick-list row" data-bind="attr: { id: $parent.coAuthorTabName }"> <!-- ko template : { name: 'miniProfileLarge', foreach: miniProfiles, afterAdd: $parent.addElement } --> <!-- /ko --> </ul> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko template : { name: 'networkPaging', data: paginator } --> <!-- /ko --> </div> </div> <!-- /ko --> </div> </div> </div> </script> <script type="text/html" id="networkPaging"> <div class="spinner" data-bind="fadeIf: isPaging"></div> <a href="#" class="link-view-all" data-test-id="paging-next" data-bind="fadeIf: allowPagination() && !$parent.brick.errorMessage(), click: next"> <span>Show more</span> </a> </script><script type="text/html" id="oneButtonFooter"> <!--ko with: footer--> <button class="btn btn-blue btn-flat" type="button" data-dismiss="modal" data-bind="click: action, html: text"></button> <!--/ko--> </script> <script type="text/html" id="pagination"> <!-- ### NAVIGATION ### --> <div id="paginationHolder" data-test-id="paginationHolder" data-bind="visible: paginationEnabled()"> <div class="display-result"> <div class="row show-grid"> <div class="col-lg-8 col-md-7 col-sm-6 col-xs-12"> <p data-test-id="paginationText" data-bind="text: paginationText"></p> </div> <div class="col-lg-4 col-md-5 col-sm-6 col-xs-12" data-bind="visible: paginationEnabled() && totalPages() > 1"> <ul class="page-nav"> <!-- ko if: currentPage() > 1 --> <li class="page-first"><a id="select-first" data-test-id="select-first" href="#" data-bind="click: firstPage, disable: isBusy"></a></li> <li class="page-prev"><a id="select-previous" data-test-id="select-previous" href="#" data-bind="click: previousPage, disable: isBusy"></a></li> <!-- /ko --> <!-- ko foreach: pages --> <li data-bind="if: $data <= $parent.totalPages(), css:{active: $data === $parent.currentPage(), 'no-border': $parent.isLastElementInRow($data)}"> <a data-test-id="select-page-number" href="#" data-bind="click: $parent.setPage, text: $data, attr:{id: 'pageLink_' + $data, 'data-test-id': 'select-' + $data}, disable: $parent.isBusy"></a> </li> <!-- /ko --> <!-- ko if: currentPage() < totalPages() --> <li class="page-next"><a id="select-next" data-test-id="select-next" href="#" data-bind="click: nextPage, disable: isBusy"></a></li> <li class="page-last"><a id="select-last" data-test-id="select-last" href="#" data-bind="click: lastPage, disable: isBusy"></a></li> <!-- /ko --> </ul> </div> </div> </div> </div> </script> <script type="text/html" id="peopleAlsoLookedAt"> <div class="brick brick-sidebar" id="brick-people-also-looked-at" data-test-id="panel-people-also-looked-at" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-people-also-looked-at-content"> <div class="brick-content-title" id="brick-people-also-looked-at-content-title" data-test-id="brick-people-also-looked-at-content-title"> <h2>People Also Looked At</h2> </div> <div class="brick-content-text" id="brick-people-also-looked-at-content-text" data-test-id="brick-people-also-looked-at-content-text"> <div class="cb"></div> <ul class="brick-list row" data-test-id="list-relatedPeople" data-bind="template: { name: 'miniProfile', foreach: miniProfiles }"></ul> <div class="error-module" data-bind="visible: brick.errorMessage" data-test-id="error-people-also-looked-at"><p data-test-id="error-message-people-also-looked-at" data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> </div> </div> </div> </script> <script type="text/html" id="profile-picture-editor"> <input id="upload" name="profileimage" style="display:none" type="file" accept="image/jpg,image/jpeg,image/png,image/gif,image/tiff,image/bmp,image/pjpeg" /> <ul class="modal-action-list"> <li> <a href="" id="upload_link" data-bind="click:uploadPicture"> <i data-test-id="profile-picture-upload" class="icon-upload"></i>Upload a picture </a> </li> <!--<li><a href="" data-toggle="modal" data-target="#profile-picture-camera-modal" id="toggle57864" data-test-id="profile-picture-camera"><i class="icon-camera"></i>Take a photo</a></li>--> <li> <a href="" id="remove-image-link" data-bind="click:deletePicture, visible: IsRemoveVisible"> <i class="icon-cross" data-test-id="profile-picture-remove"></i> Remove </a> </li> </ul> <div class="img-responsive profile-picture" id="profile-picture-preview-fix" data-test-id="profile-picture-preview-fix" data-bind="visible:!isProfilePictureEdited() || isProfilePictureDeleted()"> <img data-bind="attr:{src:currentPicture}" /> </div> <div class="img-responsive profile-picture" id="profile-picture-preview" data-test-id="profile-picture-preview" data-bind="visible:isProfilePictureEdited() && !isProfilePictureDeleted()"> <img data-bind="attr:{src:profilePictureUrl}, cropbox:{width:203, height:203, croppedImageData: pictureModel.profilePicture}" alt=""> </div> </script> <script type="text/html" id="publicationJournalItem"> <div data-bind="css: { 'no-logo': Loop.Common.getPublicationType($data) === 'external' }" data-test-id="publications-journal-source-no-logo"> <!-- ko if: Loop.Common.getPublicationType($data) !== 'external'--> <div data-bind="css: Loop.Common.getPublicationJournalSourceLogo($data)" data-test-id="publications-journal-source-logo"></div> <!-- /ko --> <div class="journal-texts"> <div class="journal-name" data-test-id="publicationSource" data-bind="text: DisplayPublicationSource"></div> <div class="journal-metadata-container"> <!-- ko if: formattedPublicationDate --> <span class="journal-date" data-test-id="publications-date">Published on <!--ko text: formattedPublicationDate --><!--/ko--></span> <!-- /ko --> </div> </div> </div> </script><script type="text/html" id="publication-confirmer-tmpl"> <ul class="brick-list"> <li> <div class="row show-grid"> <div class="col-xs-12"> <div class="list-info" data-bind="jqueryEffect: transition"> <h4 data-bind="text: Title"></h4> <div data-bind="template: {name: 'authorsListTemplate', data: AuthorList}"></div> <div class="journal-container"> <div class="journal-data" data-bind="css: { 'no-open-access': !Loop.Common.isFrontiersPublication($data) }"> <div data-bind="css: { 'no-logo': Loop.Common.getPublicationType($data) === 'external' }" data-test-id="publications-journal-source-no-logo"> <!-- ko if: Loop.Common.getPublicationType($data) !== 'external'--> <div data-bind="css: Loop.Common.getPublicationJournalSourceLogo($data)" data-test-id="publications-journal-source-logo"></div> <!-- /ko --> <div class="journal-texts"> <div class="journal-name" data-test-id="publicationSource" data-bind="text: DisplayPublicationSource"></div> <div class="journal-metadata-container"> <!-- ko if: formattedPublicationDate --> <span class="journal-date" data-test-id="publications-date">Published on <!--ko text: formattedPublicationDate --><!--/ko--></span> <!-- /ko --> </div> </div> </div> </div> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <div class="open-access" data-test-id="publications-journal-open-access-logo"></div> <!-- /ko --> </div> <div class="cb"></div> </div> </div> </div> </li> </ul> </script><script type="text/html" id="publicationsConfirmRejectAll"> <div class="col-xs-12 col-sm-8"> <ul class="list-hrz"> <li data-bind="visible: publicationsType !== Loop.constants.publicationType.CONFIRMED && publications().length > 0"> <a class="confirm" title="confirms all publications" data-test-id="publicationsConfirmAll" data-track="confirm-all-pub" data-bind="click: confirmRemoveAllPublicationsPopup.bind($data, true)">Confirm all on page</a> </li> <li data-bind="visible: publicationsType === Loop.constants.publicationType.SUGGESTED && publications().length > 0"> <a class="remove" title="removes all publications" data-test-id="publicationsRemoveAll" data-track="reject-all-pub" data-bind="click: confirmRemoveAllPublicationsPopup.bind($data, false)">Reject all on page</a> </li> </ul> </div> </script><script type="text/html" id="publicationsItemConfirmReject"> <li data-test-id="publication-row"> <div class="row show-grid"> <div class="col-xs-12"> <div class="row"> <div class="col-sm-12 col-md-10"> <div class="list-info disable-on-edit"> <!-- ko if: $data.Doi !== undefined && $data.Doi !== null && $data.Doi !== '' --> <h3><a data-test-id="publications-title" href="" target="_blank" data-bind="attr: {'data-pub-type': Loop.Common.getPublicationType($data), href: Loop.Common.getReadFullArticleLink($data)}, text: Title"></a></h3> <!-- /ko --> <!-- ko if: $data.Doi === undefined || $data.Doi === null || $data.Doi === '' --> <h3><span data-bind="text:Title" /></h3> <!-- /ko --> <div data-bind="template: {name: 'authorsListTemplate', data: AuthorList}"></div> <div class="journal-container"> <div class="journal-data" data-bind="template: {name: 'publicationJournalItem', data: $data}, css: { 'no-open-access': !Loop.Common.isFrontiersPublicationByDoi($data.Doi) }"></div> <!-- ko if: Loop.Common.isOpenAccess($data) --> <div class="open-access" data-test-id="publications-journal-open-access-logo"></div> <!-- /ko --> </div> <div class="cb"></div> </div> </div> <div class="col-sm-12 col-md-2"> <div class="button-container"> <button data-test-id="publicationConfirmButton" class="btn-confirm" type="button" data-track="confirm-pub" data-bind="click: $parent.confirmRemoveThisPublication.bind($data, true), disable: $parent.publicationsBeingConfirmed.indexOf($data) >= 0 || $parent.publicationsBeingRejected.indexOf($data) >= 0, css: {'btn-saving': $parent.publicationsBeingConfirmed.indexOf($data) >= 0, 'disabled': $parent.publicationsBeingRejected.indexOf($data) >= 0 }"> Confirm </button> <button data-test-id="publicationRemoveButton" class="btn-not-mine" type="button" data-track="reject-pub" data-bind="attr : { pubId: $data.PublicationId }, visible: $parent.publicationsType === Loop.constants.publicationType.SUGGESTED, click: $parent.confirmRemoveThisPublication.bind($data, false), disable: $parent.publicationsBeingRejected.indexOf($data) >= 0 || $parent.publicationsBeingConfirmed.indexOf($data) >= 0, css: {'btn-saving-flat-red': $parent.publicationsBeingRejected.indexOf($data) >= 0, 'disabled': $parent.publicationsBeingConfirmed.indexOf($data) >= 0 }"> Reject </button> </div> </div> </div> <div class="row"> <div class="col-xs-12"> <ul class="list-hrz" data-bind="visible: $data.TotalViews > 0"> <!-- ko if: $parent.showTotalViews --> <li data-test-id="publications-views" class="inline-text dark-text"> <span class="formatted-number" data-bind="text: $data.TotalViews"></span>views </li> <li data-test-id="publications-downloads" style="display:none" class="inline-text dark-text"><span>XX</span>downloads</li> <li data-test-id="publications-citations" style="display:none" class="inline-text dark-text"><span>XX</span>citations</li> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <li><a class="impact" data-test-id="publications-impact-link" data-bind="attr: {href: Loop.Common.getImpactLink($data), target: Loop.Common.getImpactTarget($data)}"><span></span>View impact</a></li> <!-- /ko --> <!-- /ko --> </ul> </div> </div> </div> </div> </li> </script><script type="text/html" id="publicationsItemReadOnly"> <li data-test-id="publication-row"> <div class="row show-grid"> <div class="col-xs-12"> <div class="row"> <div class="col-sm-12 col-md-12"> <div class="list-info disable-on-edit"> <!-- ko if: $data.Doi !== undefined && $data.Doi !== null && $data.Doi !== '' --> <h3><a data-test-id="publications-title" href="" target="_blank" data-bind="attr: {'data-pub-type': Loop.Common.getPublicationType($data), href: Loop.Common.getReadFullArticleLink($data)}, text: Title"></a></h3> <!-- /ko --> <!-- ko if: $data.Doi === undefined || $data.Doi === null || $data.Doi === '' --> <h3><span data-bind="text:Title" /></h3> <!-- /ko --> <div data-bind="template: {name: 'authorsListTemplate', data: AuthorList}"></div> <div class="journal-container"> <!-- ko if: $data.JournalId !== undefined && $data.JournalId > 0 --> <div class="journal-data" data-bind="css: { 'no-open-access': !Loop.Common.isFrontiersPublication($data) }"> <a href="#" target="_blank" data-bind="attr: {href: Loop.Common.getJournalLink($data.JournalId)}"> <!-- ko template: { name: 'publicationJournalItem', data: $data } --> <!-- /ko --> </a> </div> <!-- /ko --> <!-- ko if: $data.JournalId == undefined || $data.JournalId === 0 --> <div class="journal-data" data-bind="css: { 'no-open-access': !Loop.Common.isFrontiersPublication($data) }"> <!-- ko template: { name: 'publicationJournalItem', data: $data } --> <!-- /ko --> </div> <!-- /ko --> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <div class="open-access" data-test-id="publications-journal-open-access-logo"></div> <!-- /ko --> </div> <div class="cb"></div> </div> </div> </div> <div class="row"> <div class="col-xs-12"> <ul class="list-hrz" data-bind="visible: $data.TotalViews > 0"> <!-- ko if: $parent.showTotalViews --> <li data-test-id="publications-views" class="inline-text dark-text"> <span class="formatted-number" data-bind="text: $data.TotalViews"></span>views </li> <li data-test-id="publications-downloads" style="display:none" class="inline-text dark-text"><span>XX</span>downloads</li> <li data-test-id="publications-citations" style="display:none" class="inline-text dark-text"><span>XX</span>citations</li> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <li><a class="impact" data-test-id="publications-impact-link" data-bind="attr: {href: Loop.Common.getImpactLink($data), target: Loop.Common.getImpactTarget($data)}"><span></span>View impact</a></li> <!-- /ko --> <!-- /ko --> </ul> </div> </div> </div> </div> </li> </script><script type="text/html" id="publicationsItemReject"> <li data-test-id="publication-row"> <div class="row show-grid"> <div class="col-xs-12"> <div class="row"> <div class="col-sm-12 col-md-10"> <div class="list-info disable-on-edit"> <!-- ko if: $data.Doi !== undefined && $data.Doi !== null && $data.Doi !== '' --> <h3><a data-test-id="publications-title" href="" target="_blank" data-bind="attr: {'data-pub-type': Loop.Common.getPublicationType($data), href: Loop.Common.getReadFullArticleLink($data)}, text: Title"></a></h3> <!-- /ko --> <!-- ko if: $data.Doi === undefined || $data.Doi === null || $data.Doi === '' --> <h3><span data-bind="text:Title" /></h3> <!-- /ko --> <div data-bind="template: {name: 'authorsListTemplate', data: AuthorList}"></div> <div class="journal-container"> <!-- ko if: $data.JournalId !== undefined && $data.JournalId > 0 --> <div class="journal-data" data-bind="css: { 'no-open-access': !Loop.Common.isFrontiersPublication($data) }"> <a href="#" target="_blank" data-bind="attr: {href: Loop.Common.getJournalLink($data.JournalId)}"> <!-- ko template: { name: 'publicationJournalItem', data: $data } --> <!-- /ko --> </a> </div> <!-- /ko --> <!-- ko if: $data.JournalId == undefined || $data.JournalId === 0 --> <div class="journal-data" data-bind="css: { 'no-open-access': !Loop.Common.isFrontiersPublication($data) }"> <!-- ko template: { name: 'publicationJournalItem', data: $data } --> <!-- /ko --> </div> <!-- /ko --> <!-- ko if: Loop.Common.isOpenAccess($data) --> <div class="open-access" data-test-id="publications-journal-open-access-logo"></div> <!-- /ko --> </div> <div class="cb"></div> </div> </div> <div class="col-sm-12 col-md-2"> <div class="button-container" data-test-id="publicationRemoveButtonContainer"> <button data-test-id="publicationRemoveButton" class="btn-not-mine" type="button" data-track="reject-pub" data-bind="attr : { pubId: $data.PublicationId }, visible: $parent.publicationsType === Loop.constants.publicationType.CONFIRMED, click: $parent.confirmRemoveThisPublication.bind($data, false), disable: $parent.publicationsBeingRejected.indexOf($data) >= 0 || $parent.publicationsBeingConfirmed.indexOf($data) >= 0, css: {'btn-saving-flat-red': $parent.publicationsBeingRejected.indexOf($data) >= 0, 'disabled': $parent.publicationsBeingConfirmed.indexOf($data) >= 0 }"> Reject </button> </div> </div> </div> <div class="row"> <div class="col-xs-12"> <ul class="list-hrz" data-bind="visible: $data.TotalViews > 0"> <!-- ko if: $parent.showTotalViews --> <li data-test-id="publications-views" class="inline-text dark-text"> <span class="formatted-number" data-bind="text: $data.TotalViews"></span>views </li> <li data-test-id="publications-downloads" style="display:none" class="inline-text dark-text"><span>XX</span>downloads</li> <li data-test-id="publications-citations" style="display:none" class="inline-text dark-text"><span>XX</span>citations</li> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <li><a class="impact" data-test-id="publications-impact-link" data-bind="attr: {href: Loop.Common.getImpactLink($data), target: Loop.Common.getImpactTarget($data)}"><span></span>View impact</a></li> <!-- /ko --> <!-- /ko --> </ul> </div> </div> </div> </div> </li> </script><script type="text/html" id="publicationsMainPrivateView"> <div id="brick-publications-private" class="brick" data-bind="changeBrickStatus: brick.status()"> <div id="brick-publications-private-content" class="brick-content"> <div class="brick-content-title"> <!-- ko if: brick.ownProfile() --> <ul role="tablist" id="tab-publications-nav" class="nav nav-tabs"> <li data-test-id="liPublListingNew"> <a data-toggle="tab" data-bind="attr: { href: '#' + Loop.constants.publicationType.SUGGESTED }, click: function () { setActiveTab(Loop.constants.publicationType.SUGGESTED) }, disable: isBusy"> <span></span> <div class="clearfix"></div> Suggested </a> </li> <li data-test-id="liPublListingConfirmed"> <a data-toggle="tab" data-bind="attr: { href: '#' + Loop.constants.publicationType.CONFIRMED }, click: function () { setActiveTab(Loop.constants.publicationType.CONFIRMED) }, disable: isBusy"> <span class="number formatted-number" data-bind="text: numberOfPublications()[Loop.constants.publicationType.CONFIRMED]">0</span> <div class="clearfix"></div> Confirmed </a> </li> <li data-test-id="liPublListingDeleted"> <a data-toggle="tab" data-bind="attr: { href: '#' + Loop.constants.publicationType.REJECTED }, click: function () { setActiveTab(Loop.constants.publicationType.REJECTED) }, disable: isBusy"> <span class="number formatted-number" data-bind="text: numberOfPublications()[Loop.constants.publicationType.REJECTED]">0</span> <div class="clearfix"></div> Rejected </a> </li> </ul> <!-- /ko --> </div> <div class="brick-content-text"> <div class="cb"></div> <div class="tab-content"> <div role="tabpanel" class="tab-pane fade" data-bind="template: { name: 'publicationPrivateView', data: pubSuggested },attr:{ id: Loop.constants.publicationType.SUGGESTED }"></div> <div role="tabpanel" class="tab-pane fade" data-bind="template: { name: 'publicationPrivateView', data: pubConfirmed },attr:{ id: Loop.constants.publicationType.CONFIRMED }"></div> <div role="tabpanel" class="tab-pane fade" data-bind="template: { name: 'publicationPrivateView', data: pubRejected } ,attr:{ id: Loop.constants.publicationType.REJECTED }"></div> <div class="cb"></div> <!-- ### PAGINATION ### --> <div class="cb"></div> </div> </div> </div> </div> </script> <script type="text/html" id="publicationPrivateView"> <!-- ### SEARCH & FILTER ### --> <!-- ko if: mustDisplayPaginationMenu --> <div class="display-result-container"> <!-- ### PAGINATION ### --> <!-- ko template: {name: 'pagination', data: pagination}--> <!-- /ko --> </div> <!-- /ko --> <div data-bind="visible: isBusy() && !isConfirmingDeleting()"> <div class="spinner" style="display:block; opacity: 1;"></div> </div> <!-- ### EMPTY CASES ### --> <!-- ko if: !publications().length && !isBusy() && !brick.errorMessage()--> <!-- ### NO CONTENT ### --> <!-- ko if: !isTabWithPublications() && !isSearch() --> <div data-test-id="noContentToDisplayHolder" class="no-content"> <div data-bind="visible: $parent.isSuggestionsEnabled()"> <!-- ko if: publicationsType == Loop.constants.publicationType.SUGGESTED --> We were unable to find any publications that might belong to you. <!-- /ko --> <!-- ko if: publicationsType == Loop.constants.publicationType.CONFIRMED --> You have not confirmed any publications. <!-- /ko --> <!-- ko if: publicationsType == Loop.constants.publicationType.REJECTED --> You have not rejected any publications. <!-- /ko --> </div> <div data-bind="visible: !$parent.isSuggestionsEnabled()"> No content to display.<br /><br />Please turn ON the automatic publication suggestions feature, so we can find publications that match your profile. </div> </div> <!-- /ko --> <!-- /ko --> <ul data-test-id="publicationList" data-bind="template: { foreach: publications, name: publicationsListTemplateId, beforeRemove: hidePublication, afterAdd: (publicationsType !== Loop.constants.publicationType.CONFIRMED) ? showPublication : ''}" class="brick-list"></ul> <div class="error-module" data-bind="visible: brick.errorMessage()"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <!-- ko if: mustDisplayPaginationMenu --> <div class="display-result-container-bottom"> <!-- ### PAGINATION ### --> <!-- ko template: {name: 'pagination', data: pagination}--> <!-- /ko --> </div> <!-- /ko --> </script> <script type="text/html" id="publicationsMainPublicView"> <div id="brick-publications-public" class="brick" data-bind="changeBrickStatus: brick.status()"> <div id="brick-publications-public-content" class="brick-content"> <!-- ### HEADER ### --> <h2 data-test-id="publications-public-title"><span class="number-bold formatted-number" data-test-id="publicationsNumber" data-bind="text: totalPublications"></span> Publications</h2> <div class="cb"></div> <!-- ko if: mustDisplayPaginationMenu --> <div class="display-result-container"> <!-- ### PAGINATION ### --> <!-- ko template: {name: 'pagination', data: pagination}--> <!-- /ko --> </div> <!-- /ko --> <div data-bind="visible: isBusy()"> <div class="spinner" style="display:block; opacity: 1;"></div> </div> <div class="results" data-bind="visible: isSearch() && !isBusy()"> <p> Showing results for <span data-bind="text: publicationsSearch.searchByText" data-test-id="pub-results-for"></span>: <span data-bind="text: publicationsSearch.searchByTextToShow" data-test-id="pub-results-for-value" class="results-value"></span> </p> <!-- ### SEARCH BY AUTHOR ### --> <!-- ko template: { name: 'publicationsTagsCloudTemplate', data: publicationsSearch.authorsTagsCloud } --> <!-- /ko --> <i class="close" data-bind="click: publicationsSearch.resetSearch" data-test-id="pub-close-search"></i> </div> <div data-bind="if: brick.noContentOtherProfile" class="clearfix"></div> <!-- ko if: !publications().length && !isBusy() && isSearch()--> <div data-test-id="pub-no-matching-search-holder"> <p class=" no-content">Sorry, your search didn't match any results. Please try again.</p> </div> <!-- /ko --> <!-- ko if: !publications().length && !isBusy() && !isSearch() && !brick.errorMessage() --> <div data-test-id="noContentToDisplayHolder" style="width: 100%; display: inline-block; margin: 20px; line-height: 18px; color: #666"> No content to display. </div> <!-- /ko --> <div class="error-module" data-bind="visible: brick.errorMessage()" data-test-id="pub-error-holder"><p data-bind="text: brick.errorMessage()"></p></div> <!-- ### RESULT SET ### --> <div data-bind="visible: !isBusy()"> <ul class="brick-list" data-bind="foreach: { data: publications}"> <li data-test-id="publication-row"> <div class="row show-grid"> <div class="col-xs-12"> <div class="row"> <div class="col-sm-12 col-md-12"> <div class="list-info disable-on-edit"> <!-- ko if: $data.Doi !== undefined && $data.Doi !== null && $data.Doi !== '' --> <h3><a data-test-id="publications-title" href="" target="_blank" data-bind="attr: {'data-pub-type': Loop.Common.getPublicationType($data), href: Loop.Common.getReadFullArticleLink($data)}, text: $data.Title"></a></h3> <!-- /ko --> <!-- ko if: $data.Doi === undefined || $data.Doi === null || $data.Doi === '' --> <h3><span data-bind="text:Title" /></h3> <!-- /ko --> <div data-bind="template: {name: 'authorsListTemplate', data: AuthorList}"></div> <div class="journal-container"> <!-- ko if: $data.JournalId !== undefined && $data.JournalId > 0 --> <div class="journal-data" data-bind="css: { 'no-open-access': !Loop.Common.isFrontiersPublication($data) }"> <a href="#" target="_blank" data-bind="template: {name: 'publicationJournalItem', $data}, attr: {href: Loop.Common.getJournalLink($data.JournalId)}"> </a> </div> <!-- /ko --> <!-- ko if: $data.JournalId == undefined || $data.JournalId === 0 --> <div class="journal-data" data-bind="template: {name: 'publicationJournalItem', $data}, css: { 'no-open-access': !Loop.Common.isFrontiersPublication($data) }"></div> <!-- /ko --> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <div class="open-access" data-test-id="publications-journal-open-access-logo"></div> <!-- /ko --> </div> <div class="cb"></div> </div> </div> </div> <div class="row"> <div class="col-xs-12"> <ul class="list-hrz" data-bind="visible: $data.TotalViews > 0"> <!-- ko if: $parent.showTotalViews --> <li data-test-id="publications-views" class="inline-text dark-text"> <span class="formatted-number" data-bind="text: $data.TotalViews"></span>views </li> <li data-test-id="publications-downloads" style="display:none" class="inline-text dark-text"><span>XX</span>downloads</li> <li data-test-id="publications-citations" style="display:none" class="inline-text dark-text"><span>XX</span>citations</li> <!-- ko if: Loop.Common.isFrontiersPublication($data) --> <li><a class="impact" data-test-id="publications-impact-link" data-bind="attr: {href: Loop.Common.getImpactLink($data), target: Loop.Common.getImpactTarget($data)}"><span></span>View impact</a></li> <!-- /ko --> <!-- /ko --> </ul> </div> </div> </div> </div> </li> </ul> <div class="cb"></div> <!-- ko if: mustDisplayPaginationMenu --> <div class="display-result-container-bottom"> <!-- ### PAGINATION ### --> <!-- ko template: {name: 'pagination', data: pagination}--> <!-- /ko --> </div> <!-- /ko --> </div> </div> <div class="cb"></div> </div> </script><script type="text/html" id="publicationsSearch"> <div class="filter-search"> <div class="row show-grid"> <div class="col-xs-12 col-sm-6 col-md-6 col-lg-5"> <div class="filtering-options"> <p>Filter by:</p> <ul class="radio-buttons"> <li> <label> <input type="radio" id="rdoAuthor" value="1" data-bind="attr: { name: radioFilterName }, checked: searchBy, disable: isBusy"> <span>Author</span> </label> </li> <li> <label> <input type="radio" id="rdoTitle" value="2" data-bind="attr: { name: radioFilterName }, checked: searchBy, disable: isBusy"> <span>Title</span> </label> </li> <li> <label> <input type="radio" id="rdoDOI" value="3" data-bind="attr: { name: radioFilterName }, checked: searchBy, disable: isBusy"> <span>DOI</span> </label> </li> </ul> </div> </div> <div class="col-xs-12 col-sm-6 col-md-6 col-lg-7"> <div class="filtering-bar"> <input data-test-id="searchTextBox" type="text" data-bind="attr: {id: autocompleteId}, value: currentSearchText, valueUpdate: 'input', event:{keypress: searchOnKeyPress}, disable: isBusy" name="Search"> <button data-test-id="searchButton" type="button" data-bind="click: search, disable: isBusy">Go</button> </div> </div> </div> </div> </script> <script type="text/html" id="publicationsSearchResultPerPage"> <div class="col-xs-12 col-sm-4"> <form> <div class="select-wrapper"> <div class="select"> <select data-test-id="searchSelectResultsPerPage" data-bind="value: selectedResultPerPage, disable: isBusy"> <option value="25" selected="selected">25 results per page</option> <option value="50">50 results per page</option> <option value="100">100 results per page</option> </select> </div> </div> </form> </div> </script> <script type="text/html" id="publicationsTagsCloudTemplate"> <div data-bind="attr: { id: identifier }" data-test-id="publications-tags-cloud"> <ul id="tags-list" class="tags" data-bind="foreach: { data: visibleTags }" data-test-id="tags-list"> <li data-bind="attr: { 'data-keyword': text }"> <p data-bind="text: text"></p> <span id="delete-tag" data-test-id="delete-tag"></span> </li> </ul> </div> <div class="cb"></div> </script><script type="text/html" id="ranking"> <div class="brick brick-impact" id="brick-ranking" data-test-id="ranking-brick" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-ranking-content"> <div class="brick-content-title"> <h2>Benchmark</h2> <div class="brick-impact-title"> <i class="icon-percentile"></i> </div> </div> <div class="brick-content-text"> <div class="cb"></div> <div class="brick-rank" data-bind="visible: displayInfo"> <div class="row"> <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6"> <!-- ko if: displayNoData() --> <p><span data-bind="text: noDataText"></span></p> <!-- /ko --> <!-- ko ifnot: displayNoData() --> <p><span class="name" data-bind="text: name" data-test-id="ranking-span-name"></span><span data-bind="text: verbText() + ' more views of Frontiers articles than '"></span><span class="percent" data-bind="text: percentile() + '%'" data-test-id="ranking-span-percentile"></span><span data-bind="text: rangeText"> of all Loop authors.</span></p> <!-- /ko --> </div> <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6"> <div id="pyramid"> <div id="pyramidName" data-bind="visible: displayGraphic" class="name" style="margin-top: 68px"> <span data-bind="text:name" data-test-id="ranking-span-pyramid-name"></span> </div> <div class="bg-left-outline"></div> <div class="shad"></div> <div class="bg-left"> <svg width="75" height="150" baseProfile="full" version="1.2"> <defs> <mask id="svg-bgmask-left" maskUnits="userSpaceOnUse" maskContentUnits="userSpaceOnUse" transform="scale(1)"> <image width="75" height="150" xlink:href="../../content/v6/images/pyramid/bg-left.svg" /> </mask> </defs> <image id="rank-left" mask="url(#svg-bgmask-left)" xlink:href="../../content/v6/images/pyramid/floor-left.svg" width="75" height="66" x="0" y="-51" data-bind="visible: displayGraphic" /> </svg> </div> <div class="bg-right"> <svg width="75" height="150" baseProfile="full" version="1.2"> <defs> <mask id="svg-bgmask-right" maskUnits="userSpaceOnUse" maskContentUnits="userSpaceOnUse" transform="scale(1)"> <image width="75" height="150" xlink:href="../../content/v6/images/pyramid/bg-right.svg" /> </mask> </defs> <image id="rank-right" mask="url(#svg-bgmask-right)" xlink:href="../../content/v6/images/pyramid/floor-right.svg" width="75" height="66" x="0" y="-51" data-bind="visible: displayGraphic" /> </svg> </div> </div> </div> </div> </div> <div class="error-module" data-bind="visible: displayError" data-test-id="brick-impact-error-message"><p data-bind="text: brick.errorMessage()"></p></div> <div class="cb"></div> </div> </div> </div> </script> <script type="text/html" id="relatedPeople"> <div class="brick brick-sidebar" id="brick-related-people" data-test-id="panel-relatedPeople" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-related-people-content"> <div class="brick-content-title"> <h2>Related People</h2> </div> <div class="brick-content-text"> <div class="cb"></div> <ul class="brick-list row" data-test-id="list-relatedPeople" data-bind="template: { name: 'miniProfile', foreach: miniProfiles }"></ul> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-test-id="error-relatedPeople" data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> </div> </div> </div> </script> <script type="text/html" id="socialProfilesTemplate"> <div class="brick brick-sidebar" id="brick-social-profiles" data-bind="changeBrickStatus: brick.status()" data-test-id="brick-social-profiles"> <div class="brick-content" id="brick-social-profiles-content"> <h2>Other Online Pages</h2> <div class="cb"></div> <ul class="profile-list" data-bind="fadeVisible: !isEditMode()"> <li data-bind="visible: showOrcid"> <div id="orcid-profile" class="item-orcidLink" data-test-id="orcid-profile-plugin"></div> <div class="cb"></div> </li> <!-- ko if: twitterUrlIsEmpty() === true && brick.ownProfile() --> <li data-test-id="social-brick-twitter"> <div class="twitter"> <i class="icon"></i> <span>Add your Twitter account</span> </div> <label data-bind="visible: brick.ownProfile(), click: twitterEdit" for="twitter-profile"><i class="icon-pencil"></i></label> <div class="cb"> </div> </li> <!-- /ko --> <!-- ko if: twitterUrlIsEmpty() === false --> <li data-test-id="social-brick-twitter"> <a href="#" target="_blank" class="twitter" data-bind="attr: {'href': getUrlWithProtocol(twitterUrl()), 'title': getUrlWithProtocol(twitterUrl())}"> <i class="icon"></i> <span data-bind="text: getUrlWithoutProtocol(twitterUrl())"></span> </a> <label data-bind="visible: brick.ownProfile(), click: twitterEdit" for="twitter-profile"><i class="icon-pencil"></i></label> <div class="cb"> </div> </li> <!-- /ko --> <!-- ko if: blogUrlIsEmpty() === true && brick.ownProfile() --> <li data-test-id="social-brick-blog"> <div class="blog"> <i class="icon"></i> <span>Add your blog or website</span> </div> <label data-bind="visible: brick.ownProfile(), click: blogEdit" for="blog-profile"><i class="icon-pencil"></i></label> <div class="cb"></div> </li> <!-- /ko --> <!-- ko if: blogUrlIsEmpty() === false --> <li data-test-id="social-brick-blog"> <a href="#" target="_blank" class="blog" data-bind="attr: {'href': getUrlWithProtocol(blogUrl()), 'title': getUrlWithProtocol(blogUrl())}"> <i class="icon"></i> <span data-bind="text: getUrlWithoutProtocol(blogUrl())"></span> </a> <label data-bind="visible: brick.ownProfile(), click: blogEdit" for="blog-profile"><i class="icon-pencil"></i></label> <div class="cb"></div> </li> <!-- /ko --> </ul> <div data-bind="fadeVisible: isEditMode()" class="editing"> <form> <label for="twitter-profile">Twitter</label> <div class="cb"></div> <input type="text" id="twitter-profile" data-bind="value: twitterUrlInput, valueUpdate: 'input'" data-test-id="twitter-profile-text" /> <div class="cb"></div> <label for="blog-profile">Website / Blog</label> <div class="cb"></div> <input type="text" id="blog-profile" data-bind="value: blogUrlInput, valueUpdate: 'input'" data-test-id="blog-profile-text" /> <div class="cb"></div> <div class="cb"></div> <div class="button-container"> <button class="btn-cancel" type="button" data-bind="click: cancel, enable: !saving(), css: { 'disabled': saving() }" data-test-id="social-brick-cancel">Cancel</button> <button class="btn-save" type="button" data-bind="click: save, enable: areUrlValid() && !saving(), css: { 'btn-saving': saving(), 'disabled': !areUrlValid() }" data-test-id="social-brick-save">Save</button> </div> <div class="cb"></div> <div class="form-validator-warning" data-bind="text: apiErrorMessage"></div> <div class="cb"></div> </form> </div> <div class="cb"></div> </div> </div> </script><script type="text/html" id="societyMembership"> <div class="brick disable-on-edit" id="brick-membership" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-membership-content"> <div class="brick-content-title" id="brick-membership-content-title" data-test-id="brick-membership-content-title"> <h2>Society Memberships</h2> </div> <div class="brick-content-text" id="brick-membership-content-text" data-test-id="brick-membership-content-text"> <a id="membership-btn-add" href="#" data-track="add-profile-info" data-bind="click: addSocietyMembership, visible: (brick.isDataLoaded() && editMode() && !brick.noContent())" class="brick-header-action" data-test-id="membership-addLink">Add</a> <div class="cb"></div> <div data-bind="fadeVisible: brick.noContentOwnProfile" data-test-id="membership-empty" id="membership-empty" class="empty-case"> <p><a id="membership-btn-add-empty-case" data-test-id="membership-btn-add-empty-case" data-track="add-profile-info" data-bind="click: addSocietyMembership" href="#">Add</a> your society memberships.</p> </div> <div class="cb"></div> <p data-bind="visible: brick.noContentOtherProfile" class="no-content" id="membership-noContent" data-test-id="membership-noContent">No content to display.</p> <div class="error-module" data-bind="visible: brick.errorMessage"><p data-bind="text: brick.errorMessage"></p></div> <div class="cb"></div> <ul class="brick-list" data-bind="foreach: { data: societyMemberships, beforeRemove: removeElement, afterAdd: addElement }"> <li data-bind="attr: {'id' : $parent.getItemDivId(MembershipId), 'data-index': $index()}"> <div class="row show-grid" data-bind="fadeVisible: !$data.isEditing()"> <div class="col-xs-12"> <div class="list-info"> <!-- ko if: "PeriodFrom" in $data && $data.PeriodFrom.Format != 3 || "PeriodTo" in $data && $data.PeriodTo.Format != 3 || IsCurrent --> <div class="period"> <!-- ko if: "PeriodFrom" in $data --> <span class="begin" data-bind="text: Loop.Helpers.PeriodDateHelper.FormatDate(PeriodFrom.Date, PeriodFrom.Format)" data-test-id="membership-date-begin"></span> <!-- /ko --> <span data-bind="visible: $data.PeriodFrom && $data.PeriodFrom.Format != 3 && ($data.PeriodTo && $data.PeriodTo.Format != 3 || $data.IsCurrent)"> - </span> <!-- ko if: IsCurrent --> <span class="end" data-test-id="membership-date-current">Present</span> <!-- /ko --> <!-- ko ifnot: IsCurrent --> <!-- ko if "PeriodTo" in $data--> <span class="end" data-bind="text: Loop.Helpers.PeriodDateHelper.FormatDate(PeriodTo.Date, PeriodTo.Format)" data-test-id="membership-date-end"></span> <!-- /ko --> <!-- /ko --> </div> <!-- /ko --> <!-- ko if: $parent.editMode--> <i class="icon-pencil" data-test-id="membership-icon-pencil" data-track="edit-profile-info" data-bind="click: $parent.editSocietyMembership"></i> <i class="icon-cross" data-test-id="membership-icon-cross" data-track="remove-profile-info" data-bind="click: $parent.deleteSocietyMembership"></i> <!-- /ko --> <div class="cb"></div> <!-- ko if "Role" in $data && $data.Role.trim()--> <div class="membership-role" data-bind="text: Role" data-test-id="membership-role"></div> <div class="cb"></div> <!-- /ko --> <!-- ko if "Name" in $data && $data.Name.trim()--> <div class="organisation" data-bind="text:Name" data-test-id="membership-organization"></div> <div class="cb"></div> <!-- /ko --> <!-- ko if "Description" in $data && $data.Description.trim()--> <div class="description" data-bind="text: Description " data-test-id="membership-description"></div> <div class="cb"></div> <!-- /ko --> </div> <!-- .list-info --> </div> <!-- .col-xs-12--> </div> <!-- .row show-grid --> </li> </ul> <div class="bottom-spacer" data-bind="visible: !brick.noContent() && !brick.errorMessage()"></div> </div> </div> </div> </script> <script type="text/html" id="societyMembershipEdit"> <div class="editing-module item-hidden" data-bind="validationOptions: { insertMessages: true, messageTemplate: 'customMessageTemplate' }, fadeVisible: dataItem.isEditing"> <div class="row show-grid"> <div class="col-xs-2"></div> <div class="col-xs-8"> <form id="membership-edit-form" data-test-id="membership-edit-form"> <label for="membership-from-month">From</label> <div class="cb"></div> <div> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Month" class="chosen-select" id="membership-from-month" data-test-id="membership-from-month" data-bind="options: Loop.Cache.Months(), optionsCaption: 'Month', optionsText: 'Month', optionsValue: 'Id', value: dataItem.auxPeriodFrom.month"></select> </div> </div> <!-- .select-wrapper --> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Year" class="chosen-select" id="membership-from-year" data-test-id="membership-from-year" data-bind="options: Loop.Cache.Years(undefined,undefined,false,undefined), optionsCaption: 'Year', value: dataItem.auxPeriodFrom.year"></select> </div> </div> <!-- .select-wrapper --> <div class="cb"></div> <div data-bind="fadeIf: !dataItem.IsValidPeriodFrom()" class="form-validator-error" data-test-id="membership-error-year-from-required"><span data-bind="text: Loop.constants.UIMessages.yearRequired"></span></div> <div data-bind="fadeIf: !dataItem.IsValidPeriodRange()" class="form-validator-error" data-test-id="membership-error-invalid-year-range"><span data-bind="text: Loop.constants.UIMessages.invalidYearRange"></span></div> </div> <div class="cb"></div> <div data-bind="fadeVisible: !dataItem.IsCurrent()" class="period-to"> <label for="membership-to-month">To</label> <div id="membership-to"> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Month" class="chosen-select" id="membership-to-month" data-test-id="membership-to-month" data-bind="options: Loop.Cache.Months(), optionsText: 'Month', optionsCaption: 'Month', optionsValue: 'Id', value: dataItem.auxPeriodTo.month"></select> </div> </div> <!-- .select-wrapper --> <div class="select-wrapper small-select"> <div class="select"> <select data-placeholder="Year" class="chosen-select" id="membership-to-year" data-test-id="membership-to-year" data-bind="options: Loop.Cache.Years(undefined,undefined,false,undefined), optionsCaption: 'Year', value: dataItem.auxPeriodTo.year"></select> </div> </div> <!-- .select-wrapper --> <div class="cb"></div> <span data-bind="fadeIf: !dataItem.IsValidPeriodTo()" class="form-validator-error" data-test-id="membership-error-year-to-required"><span data-bind="text: Loop.constants.UIMessages.yearRequired"></span></span> </div> </div> <div class="checkbox"> <label> <input type="checkbox" id="membership-iscurrent" data-test-id="membership-iscurrent" data-bind="checked: dataItem.IsCurrent" /><span class="bold">I am currently a member of this society.</span> </label> </div> <div class="cb"></div> <label for="membership-input-name">Organization / Society *</label> <input id="membership-input-name" data-test-id="membership-input-name" class="input-block-level" data-bind="value: dataItem.Name, valueUpdate: 'input'" type="text" /> <label for="membership-input-role">Role</label> <input id="membership-input-role" data-test-id="membership-input-role" class="input-block-level" data-bind="value: dataItem.Role, valueUpdate: 'input'" type="text" /> <label for="membership-input-desc">Description</label> <textarea id="membership-input-desc" data-test-id="membership-textarea-desc" class="input-block-level" data-bind="value: dataItem.Description, valueUpdate: 'input'"></textarea> </form> <!-- .membership-edit-form--> </div> <!-- .col-xs-8--> </div> <!-- .row show-grid--> <div class="row show-grid"> <div class="col-xs-12"> <div class="button-container"> <button id="membership-btn-cancel" data-test-id="membership-btn-cancel" type="button" class="btn-cancel" data-bind="click: cancelEdition, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }" data-track="cancel-profile-update"> Cancel </button> <button id="membership-btn-save" data-test-id="membership-btn-save" type="button" class="btn-save" data-bind="click: saveItem, enable: dataItem.IsValidSocietyMembership() && !dataItem.saving(), css: { 'btn-saving': dataItem.saving(), 'disabled': !dataItem.IsValidSocietyMembership() }" data-track="save-profile-update"> Save </button> <button id="edumembership-btn-remove" data-test-id="membership-btn-remove" type="button" class="btn-remove" data-bind="click: deleteItem, visible: !dataItem.IsNew, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }"> Remove </button> </div> </div> <!-- .col-xs-12--> </div> <!-- .row show-grid--> <div class="cb"></div> <div data-bind="fadeIf: dataItem.UIMessage" class="form-validator-warning"> <span id="membership-ui-msg" data-test-id="membership-warning-message" data-bind="text: dataItem.UIMessage"></span> </div> </div> <div class="cb"></div> </script> <script type="text/html" id="specialty"> <div class="disable-on-edit"> <div class="brick-content-title" id="brick-specialty-content-title" data-test-id="brick-specialty-content-title"> <h2>Specialty</h2> </div> <div class="brick-content-text" id="brick-specialty-content-text" data-test-id="brick-specialty-content-text"> <a class="brick-header-action" data-test-id="specialty-add" data-track="add-profile-info" data-bind="click: addSpecialty, visible: brick.ownProfile() && !brick.noContentOwnProfile()">Add</a> <div class="cb"></div> <div data-bind="fadeVisible: brick.noContentOwnProfile() && !isEditMode()" data-test-id="specialty-empty" class="empty-case"> <p> <a data-test-id="specialty-add2" data-track="add-profile-info" href="#" data-bind="click: addSpecialty" class="add-to-panel">Add</a> your professional specialty. </p> </div> <div data-bind="visible: brick.noContentOtherProfile"> <p class="no-content" data-test-id="div-specialityemptyother">No content to display.</p> </div> <div class="error-module" data-bind="fadeIf: specialtyErrorMessage()"> <p data-bind="text: specialtyErrorMessage"></p> </div> <div data-bind="visible: !brick.noContent()"> <ul id="list-specialties" data-bind="foreach: { data: specialties, beforeRemove: removeElement, afterAdd: addElement }"> <li data-bind="visible: $parent.mustDisplayItem($index()), attr:{'id' : $parent.getItemLiId(ExpertiseId), 'data-test-id': 'specialty-detail-' + $index(), 'data-index': $index()}"> <div data-bind="fadeVisible: !$data.isEditing()"> <div class="specialty"> <p data-bind="text: Domain.Name, attr:{title: Domain.Name}"></p> <i data-test-id="specialty-icon-cross" class="icon-cross" data-bind="click: $parent.deleteSpecialty, visible: $parent.specialties().length > 1 && $parent.brick.ownProfile" data-track="remove-profile-info"></i> <i data-test-id="specialty-icon-pencil" class="icon-pencil" data-bind="click: $parent.editSpecialty.bind($data), visible: $parent.brick.ownProfile" data-track="edit-profile-info"></i> </div> <div class="specialty"> <p data-bind="text: Field.Name, attr:{title: Field.Name}"></p> </div> <div class="specialty"> <p data-bind="text: Specialty.Name, attr:{title: Specialty.Name}"></p> </div> <div class="cb"></div> </div> </li> </ul> </div> <div class="cb"></div> <a href="#" class="link-view-all" id="link-view-all" data-test-id="link-view-all" data-bind="visible: viewAllIsVisible, click: viewAllClick">View All Specialties</a> </div> </div> </script> <script type="text/html" id="specialty-edit"> <li data-bind="fadeVisible: dataItem.isEditing"> <form> <section data-test-id="edit-form" class="editing-module"> <label for="domain-select">Domain *</label> <div class="select-wrapper"> <div class="select"> <select class="input-block-level" id="domain-select" tabindex="-1" data-bind="options: Loop.Cache.Domains(), optionsText: 'Name', optionsValue: 'DomainId', optionsCaption: 'Select a domain...', value: dataItem.Domain.DomainId"></select> </div> </div> <div class="cb"></div> <label for="field-select">Field *</label> <div class="select-wrapper"> <div class="select"> <select class="input-block-level" id="field-select" tabindex="-1" data-bind="options: dataItem.getValidFields(), optionsText: 'Name', optionsValue: 'FieldId', optionsCaption: 'Select a field...', value: dataItem.Field.FieldId"></select> </div> </div> <div class="cb"></div> <label for="specialty-select">Specialty *</label> <div class="select-wrapper"> <div class="select"> <select class="input-block-level" id="specialty-select" tabindex="-1" data-bind="options: dataItem.getNotRepeatedSpecialties(), optionsText: 'Name', optionsValue: 'SpecialtyId', optionsCaption: 'Select a specialty...', value: dataItem.Specialty.SpecialtyId"></select> </div> </div> <div class="cb"></div> <div class="button-container"> <button class="btn-cancel" type="button" id="btn-cancel-specialty" data-test-id="btn-cancel-specialty" data-bind="click: cancelEdition, enable: !dataItem.saving(), css: { 'disabled': dataItem.saving() }" data-track="cancel-profile-update"> Cancel </button> <button class="btn-save" type="button" id="btn-save-specialty" data-test-id="btn-save-specialty" data-bind="click: saveItem, enable: dataItem.isValidSpecialty() && !dataItem.saving(), css: { 'btn-saving': dataItem.saving(), 'disabled': !dataItem.isValidSpecialty() }" data-track="save-profile-update"> Save </button> </div> <div class="cb"></div> <div data-bind="fadeIf: dataItem.UIMessage" class="form-validator-warning"> <span id="edu-ui-msg" data-bind="text: dataItem.UIMessage"></span> </div> <div class="cb"></div> </section> </form> </li> </script> <script type="text/html" id="tagsCloudTemplate"> <div class="tags-cloud" data-bind="attr: { id: identifier }, visible: tags().length > 0 || isEditing()" data-test-id="tags-cloud-main-div"> <ul id="tags-list" class="expertise-tags" data-bind="foreach: { data: visibleTags }, css: { 'disabled': !isEditing(), 'editing-tags': isEditing() }" data-test-id="tags-list"> <li data-bind="css: { 'ellipsis': ellipsis, 'item-hidden': hidden }, attr: { 'data-keyword': escapedText }"> <p data-bind="text: text"></p> <span id="delete-tag" data-bind="visible: (!ellipsis && $parent.ownProfile())" data-test-id="delete-tag"></span> </li> </ul> </div> <div class="cb"></div> </script><script type="text/html" id="tryAnotherSearch"> <div class="brick disable-on-edit" id="brick-find-publications" data-bind="changeBrickStatus: brick.status()"> <div class="brick-content" id="brick-find-publications-content" data-test-id="test-brick-find-publications"> <div class="brick-content-title"> <h2>Couldn't find your publications?</h2> </div> <div class="brick-content-text"> <div class="cb"></div> <p>By providing us additional authoring names, we will be able to make more appropriate publication suggestions for you.</p> <div class="center-block"> <button class="btn-flex disable-on-edit" type="button" data-bind="click: showTryAnotherSearch" data-test-id="test-add-authoring-names-button">Add Authoring Names</button> </div> <p>Alternatively, you can <a class="externalPublicationSite" data-bind="attr:{ 'href': Loop.Common.getAddPublicationsUrl() }" data-test-id="test-add-publications-link">upload your publications</a> manually.</p> </div> </div> </div> </script> <script type="text/html" id="brickView"> <div class="brick" data-test-id="brick-generic" data-bind="attr: { 'id': brick.elementId, 'data-test-id': brick.dataTestId }, css: { 'brick-sidebar': brick.isInSideBar, 'disable-on-edit': brick.disableOnEdit },changeBrickStatus: brick.status()"> <div class="brick-content" data-bind="attr: { 'id': brick.elementId + '-content', 'data-test-id': brick.dataTestId + '-content'}"> <div id="brick-body" data-test-id="brick-body"> <!-- ko template: { name: brick.bodyTemplate } --> <!-- /ko --> </div> </div> </div> </script> </div> </div> <div id="footerContainer"> <div id="footer"> <p class="copyright" data-test-id="footer-copyright"> Frontiers In and Loop are registered trade marks of Frontiers Media SA.<br> © Copyright 2007-2024 Frontiers Media SA. All rights reserved - <a id="lnk-terms" href="https://www.frontiersin.org/legal/terms-and-conditions">Terms and Conditions</a> </p> </div> </div> <div id="footerScriptsContainer"> <script src="/scripts/GoogleAnalytics/46-20240229-04?v=COA5_NRoIfui9w-m4V4oGcgnIELw5wC5Xf0dCZx2HHs1"></script> <script src="/SPA/js/libs?v=OBUjf_nHOhxIq0DNMdxrq1_M-C6HVrH3JMqSjklpdMc1"></script> <script src="/SPA/BasicJS?v=he4CFhp8VB3FJPK7V8EdKPGHPKeoAPrvsRzZ7lSeRKE1"></script> <script src="/SPA/common/js?v=NlGxBdOih6_9gM_hqnQ2dJeInrQi_QUZMFAKf2w-TbM1"></script> <script src="/SPA/profile/communicationServices/js?v=2pi1FYTE-RK1sd91kHITRP7YoE4VzlhgNIOlFRyYYNM1"></script> <script src="/SPA/profile/models/js?v=C5zuMGgIO2s0Q3ZlsX4OqY0JqVqXr5NnkSQcABeicPQ1"></script> <script src="/SPA/profile/tabs/js?v=0VlJUtpnsHf_VUTlFCZ9MGwCSaG3fQ9-1j39ZC2jL2c1"></script> <script src="/SPA/profile/viewModels/js?v=fHWvp02rvPUom0v2hrrZVwhWg-ylJb0bEWXhmmTGr3Q1"></script> <script src="/SPA/profile/controls/js?v=htEeWe6MOyI0aDo0BUAiK5zBJm8Fr6O_wp5EUoBxQ4c1"></script> <script src="/SPA/profile/root/js?v=xuDz_o0togOX55MoHsxGvXPIQGhBHpvcAbRB-Fy6WvM1"></script> <script type='text/javascript' defer src='/SPA/richTextEditor?v=QXDATimLoqRM05dyi_SNFkwG0HLNBkVo4jVHDc6Rf481' ></script> <script type='text/javascript' defer src='/SPA/ugarit/js?v=nlEDfNJbpzRGK4DKai3HMikGwhIvH-a_oDHlXcxr8Co1' ></script> <script> var Loop = window.Loop || {}; Loop.Configuration = Loop.Configuration || {}; Loop.Configuration.features = Loop.Configuration.features || {}; Loop.Configuration.features.ImpactTabEnabled = true; Loop.Configuration.features.EditorialBoardTabEnabled = true; </script> <script type="text/javascript"> if (Loop.Core) { Loop.Core.Configuration.loggedUserId = Loop.Configuration.LoggedUserId; } Loop.tracking.googleTagManager.init('GTM-NNJFB3', 'sn44Fo138Wv5nzW6H174eA', 'env-2', 'https://tag-manager.frontiersin.org'); $(document).ready(function () { Loop.Common.checkSupportedBrowsers($($("#alert-container")[0])); Loop.tracking.googleTagManager.trackAppId('6'); Loop.tracking.googleTagManager.trackLoopId(Loop.Configuration.LoggedUserId); }); </script> </div> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10