@internetarchive/histogram-date-range 0.1.0-beta → 0.1.3-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"histogram-date-range.js","sourceRoot":"","sources":["../../src/histogram-date-range.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EACH,IAAI,EACJ,UAAU,EAEV,GAAG,GAGJ,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,KAAK,MAAM,oBAAoB,CAAC;AACvC,OAAO,8DAA8D,CAAC;AAEtE,kFAAkF;AAClF,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC,+CAA+C;AAC/C,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,yFAAyF;AACzF,MAAM,UAAU,GAAG,GAAG,CAAA,8CAA8C,CAAC;AACrE,MAAM,iBAAiB,GAAG,GAAG,CAAA,qDAAqD,CAAC;AACnF,MAAM,eAAe,GAAG,GAAG,CAAA,mDAAmD,CAAC;AAC/E,MAAM,sBAAsB,GAAG,GAAG,CAAA,qDAAqD,CAAC;AACxF,MAAM,eAAe,GAAG,GAAG,CAAA,mDAAmD,CAAC;AAC/E,MAAM,WAAW,GAAG,GAAG,CAAA,2DAA2D,CAAC;AACnF,MAAM,UAAU,GAAG,GAAG,CAAA,2CAA2C,CAAC;AAClE,MAAM,aAAa,GAAG,GAAG,CAAA,gDAAgD,CAAC;AAC1E,MAAM,sBAAsB,GAAG,GAAG,CAAA,0DAA0D,CAAC;AAC7F,MAAM,gBAAgB,GAAG,GAAG,CAAA,oDAAoD,CAAC;AACjF,MAAM,eAAe,GAAG,GAAG,CAAA,kDAAkD,CAAC;AAkB9E,IAAa,kBAAkB,GAA/B,MAAa,kBAAmB,SAAQ,UAAU;IAAlD;QACE,gDAAgD;;QAEhD,iEAAiE;QACrC,UAAK,GAAG,KAAK,CAAC;QACd,WAAM,GAAG,MAAM,CAAC;QAChB,gBAAW,GAAG,YAAY,CAAC;QAC3B,iBAAY,GAAG,aAAa,CAAC;QAC7B,kBAAa,GAAG,cAAc,CAAC;QAC/B,gBAAW,GAAG,wBAAwB,CAAC;QACvD,eAAU,GAAG,WAAW,CAAC;QACzB,uBAAkB,GAAG,YAAY,CAAC;QAClC,YAAO,GAAG,EAAE,CAAC;QACb,YAAO,GAAG,EAAE,CAAC;QACI,aAAQ,GAAG,KAAK,CAAC;QAClB,SAAI,GAAa,EAAE,CAAC;QAEhD,yDAAyD;QACxC,mBAAc,GAAG,CAAC,CAAC;QAEnB,oBAAe,GAAG,KAAK,CAAC;QACxB,gBAAW,GAAG,KAAK,CAAC;QACpB,eAAU,GAAG,KAAK,CAAC;QAEpC,oEAAoE;QAC5D,qBAAgB,GAAG,EAAE,CAAC;QACtB,qBAAgB,GAAG,EAAE,CAAC;QACtB,eAAU,GAAG,CAAC,CAAC;QACf,eAAU,GAAG,CAAC,CAAC;QACf,gBAAW,GAAG,CAAC,CAAC;QAChB,eAAU,GAAG,CAAC,CAAC;QACf,cAAS,GAAG,CAAC,CAAC;QAEd,cAAS,GAAoB,EAAE,CAAC;QAEhC,uBAAkB,GAAG,EAAE,CAAC;QAsKhC,0EAA0E;QAC1E,0EAA0E;QAC1E,4BAA4B;QAC5B,qFAAqF;QAC7E,SAAI,GAAG,CAAC,CAAe,EAAQ,EAAE;YACvC,8EAA8E;YAC9E,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,OAAO;aACR;YACD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC,CAAC;QAEM,SAAI,GAAG,GAAS,EAAE;YACxB,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,sBAAsB,EAAE,CAAC;aAC/B;YACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC,CAAC;QAEF;;;;WAIG;QACK,SAAI,GAAG,CAAC,CAAe,EAAQ,EAAE;YACvC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAgC,CAAC;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;YAChD,IAAK,MAAM,CAAC,EAAe,KAAK,YAAY,EAAE;gBAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;aAC7B;iBAAM;gBACL,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;aAC7B;QACH,CAAC,CAAC;IAmeJ,CAAC;IA7qBC,+CAA+C;IAE/C,oBAAoB;QAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,YAA4B;QAClC,4DAA4D;QAC5D,IACE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAC3B,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAC3B,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC;YACnC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,EACnC;YACA,IAAI,CAAC,gBAAgB,EAAE,CAAC;SACzB;IACH,CAAC;IAED;;;;;;OAMG;IACK,gBAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO;SACR;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe;YACzC,CAAC,CAAC,IAAI,CAAC,eAAe;YACtB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QACjB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe;YACzC,CAAC,CAAC,IAAI,CAAC,eAAe;YACtB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,iBAAiB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;YAC5C,OAAO;gBACL,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;gBAC9C,QAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC/D,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE;aACpE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAY,UAAU;QACpB,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,IAAY,QAAQ;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACnC,OAAO,CAAC,CAAC;SACV;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,+CAA+C;IAClB,IAAI,OAAO;QACtC,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,KAAc;QACxB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,oDAAoD;IACxC,IAAI,eAAe;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,eAAe,CAAC,OAAe;QACjC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,sEAAsE;YACtE,qEAAqE;YACrE,uEAAuE;YACvE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;SACjC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE;YACL,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;SAC9D;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,oDAAoD;IACxC,IAAI,eAAe;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,eAAe,CAAC,OAAe;QACjC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,kDAAkD;YAClD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;SACjC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE;YACL,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;SAC9D;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IACD,6CAA6C;IAC7C,IAAI,UAAU;;QACZ,OAAO;QACL,kEAAkE;QAClE,MAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,CAAC,mCAAI,IAAI,CAAC,WAAW,CACvE,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,IAAI,UAAU;;QACZ,OAAO;QACL,mEAAmE;QACnE,MAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,CAAC,mCAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAC9B,CAAC;IACJ,CAAC;IAED,IAAY,WAAW;QACrB,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3C,CAAC;IAEO,WAAW,CAAC,CAAe;QACjC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE;YACrC,OAAO;SACR;QACD,MAAM,MAAM,GAAG,CAAC,CAAC,aAA+B,CAAC;QACjD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAqB,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAE/D,IAAI,CAAC,cAAc;YACjB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAElE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QACvB,OAAO,CAAC,QAAQ,IAAI,SAAS;QAC7B,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,MAAM;KACvC,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IA0CD;;;;;;;OAOG;IACK,eAAe,CAAC,IAAY;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;OAOG;IACK,eAAe,CAAC,IAAY;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;IAEO,YAAY;QAClB,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAEO,eAAe;QACrB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACK,sBAAsB;QAC5B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,sBAAsB,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5C,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI,CAAC,kBAAkB,EAAE;gBAC3D,mEAAmE;gBACnE,OAAO;aACR;YACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC;YACtD,MAAM,OAAO,GAAG;gBACd,MAAM,EAAE;oBACN,OAAO,EAAE,IAAI,CAAC,eAAe;oBAC7B,OAAO,EAAE,IAAI,CAAC,eAAe;iBAC9B;gBACD,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5E,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IAEO,wBAAwB;QAC9B,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE;YAC7C,OAAO;SACR;QACD,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC1C,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAC1C,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,CAAe;QACnC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,aAA+B,CAAC;QACxD,MAAM,OAAO,GACV,IAAI,CAAC,cAAc,CAAC,EAAe,KAAK,YAAY;YACnD,CAAC,CAAC,IAAI,CAAC,UAAU;YACjB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;QACvC,6EAA6E;QAC7E,oCAAoC;QACpC,IACE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;YACnC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,EACpC;YACA,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;SACtB;IACH,CAAC;IAED;;;OAGG;IACK,uBAAuB,CAAC,CAAS;QACvC,4EAA4E;QAC5E,2BAA2B;QAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,UAAU,CAC9D,CAAC;QACF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;OAMG;IACK,uBAAuB,CAAC,IAAY;QAC1C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,SAAS,GACb,IAAI,CAAC,WAAW;YAChB,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAC1E,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC;IAEO,kBAAkB,CAAC,CAAa;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,aAAiC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAEO,kBAAkB,CAAC,CAAa;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,aAAiC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAED,IAAY,sBAAsB;QAChC,OAAO,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3D,CAAC;IAED,4CAA4C;IAC5C,IAAY,iBAAiB;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC;IAED,4CAA4C;IAC5C,IAAY,iBAAiB;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC;IAEO,cAAc,CAAC,CAAa;QAClC,MAAM,OAAO,GAAI,CAAC,CAAC,aAAgC,CAAC,OAAqB,CAAC;QAC1E,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QACzD,IAAI,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE;YAC3C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;SACzC;QACD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QACrD,IAAI,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE;YACzC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;SACvC;QACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAED,IAAY,iBAAiB;QAC3B,6DAA6D;QAC7D,6DAA6D;QAC7D,iFAAiF;QACjF,MAAM,EAAE,GAAG,kBAAkB,CAAC;QAE9B,MAAM,WAAW,GAAG;eACT,IAAI,CAAC,UAAU;gBACd,IAAI,CAAC,WAAW,GAAG,EAAE;gBACrB,EAAE,OAAO,EAAE,IAAI,EAAE;eAClB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC;iBAClB,EAAE,IAAI,EAAE,IAAI,EAAE;eAChB,IAAI,CAAC,WAAW,GAAG,EAAE;WACzB,CAAC;QACR,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAC5E,CAAC;IAED,IAAY,iBAAiB;QAC3B,MAAM,EAAE,GAAG,kBAAkB,CAAC;QAC9B,MAAM,WAAW,GAAG;eACT,IAAI,CAAC,UAAU;eACf,IAAI,CAAC,WAAW,GAAG,EAAE;eACrB,EAAE,MAAM,EAAE,IAAI,EAAE;eAChB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC;iBAClB,EAAE,KAAK,EAAE,IAAI,EAAE;gBAChB,IAAI,CAAC,WAAW,GAAG,EAAE;WAC1B,CAAC;QACR,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAC5E,CAAC;IAEO,iBAAiB,CACvB,eAAuB,EACvB,EAAY,EACZ,WAAmB;QAEnB,2EAA2E;QAC3E,wDAAwD;QACxD,MAAM,CAAC,GAAG,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvC,OAAO,GAAG,CAAA;;YAEF,EAAE;;QAEN,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;QAChC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;sBACpB,IAAI,CAAC,IAAI;;iBAEd,WAAW,aAAa,UAAU;;aAGzC,eAAe,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,CACpE;aACK,IAAI,CAAC,MAAM,GAAG,CAAC;;kBAEV,IAAI,CAAC,MAAM,GAAG,CAAC;;;;aAKvB,eAAe,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,CACpE;aACK,IAAI,CAAC,MAAM,GAAG,CAAC;;kBAEV,IAAI,CAAC,MAAM,GAAG,CAAC;;;;KAI5B,CAAC;IACJ,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,GAAG,CAAA;;aAED,IAAI,CAAC,UAAU;;iBAEX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;kBAChC,IAAI,CAAC,MAAM;gBACb,iBAAiB;SACxB,CAAC;IACR,CAAC;IAED,IAAI,iBAAiB;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,0CAA0C;QAEpE,2EAA2E;QAC3E,qEAAqE;QACrE,wEAAwE;QACxE,yCAAyC;QACzC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/B,MAAM,GAAG,GAAG,GAAG,CAAA;;;uCAGkB,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,MAClE,IAAI,CAAC,MACP;eACS,CAAC;eACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;mBACrB,QAAQ;oBACP,IAAI,CAAC,MAAM;2BACJ,IAAI,CAAC,WAAW;2BAChB,IAAI,CAAC,WAAW;oBACvB,IAAI,CAAC,cAAc;kBAE3B,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU;gBAC1C,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,eACN;4BACkB,IAAI,CAAC,KAAK;4BACV,IAAI,CAAC,QAAQ;0BACf,IAAI,CAAC,MAAM;WAC1B,CAAC;YACN,CAAC,IAAI,MAAM,CAAC;YACZ,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,OAAwB;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACH,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAA;;;uBAGQ,IAAI,CAAC,UAAU;;kBAEpB,IAAI,CAAC,wBAAwB;iBAC9B,IAAI,CAAC,kBAAkB;kBACtB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;qBACvB,IAAI,CAAC,QAAQ;;KAE7B,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAA;;;uBAGQ,IAAI,CAAC,UAAU;;kBAEpB,IAAI,CAAC,wBAAwB;iBAC9B,IAAI,CAAC,kBAAkB;kBACtB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;qBACvB,IAAI,CAAC,QAAQ;;KAE7B,CAAC;IACJ,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAA;;;mBAGI,IAAI,CAAC,YAAY;oBAChB,IAAI,CAAC,aAAa;iBACrB,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa;kBACtB,IAAI,CAAC,cAAc;qBAChB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;;;kBAG1C,IAAI,CAAC,YAAY,GAAG,CAAC;;;0BAGb,IAAI,CAAC,eAAe;KACzC,CAAC;IACJ,CAAC;IAED,IAAY,cAAc;QACxB,OAAO,IAAI,CAAA;0CAC2B,IAAI,CAAC,kBAAkB;KAC5D,CAAC;IACJ,CAAC;IAED,IAAY,yBAAyB;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,OAAO,IAAI,CAAA,EAAE,CAAC;SACf;QACD,OAAO,IAAI,CAAA;;KAEV,CAAC;IACJ,CAAC;IAmGD,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;QACD,OAAO,IAAI,CAAA;;;;;YAKH,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;wBAEtB,IAAI,CAAC,KAAK;;UAExB,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,eAAe;;;YAGpD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;;qBAGtB,IAAI,CAAC,KAAK;sBACT,IAAI,CAAC,MAAM;6BACJ,IAAI,CAAC,IAAI;;cAExB,IAAI,CAAC,qBAAqB;kCACN,IAAI,CAAC,iBAAiB;cAC1C,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB;;;cAGhD,IAAI,CAAC,gBAAgB;;cAErB,IAAI,CAAC,gBAAgB;;;;KAI9B,CAAC;IACJ,CAAC;CACF,CAAA;AArIQ,yBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;6CAmBwB,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAgC/C,sBAAsB;eAC3B,gBAAgB;;;;mBAIZ,eAAe;;;;;;;;;;;0BAWR,gBAAgB;sBACpB,sBAAsB;;;;;;;;;;;;;;;;;;;;eAoB7B,UAAU;;gBAET,WAAW;;;mBAGR,aAAa;;GAE7B,CAAC;AAxqB0B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDAAe;AACd;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDAAiB;AAChB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAA4B;AAC3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAA8B;AAC7B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAAgC;AAC/B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDAAwC;AACvD;IAAX,QAAQ,EAAE;sDAA0B;AACzB;IAAX,QAAQ,EAAE;8DAAmC;AAClC;IAAX,QAAQ,EAAE;mDAAc;AACb;IAAX,QAAQ,EAAE;mDAAc;AACI;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oDAAkB;AAClB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAqB;AAGvC;IAAR,KAAK,EAAE;0DAA4B;AAC3B;IAAR,KAAK,EAAE;2DAA0C;AACzC;IAAR,KAAK,EAAE;2DAAiC;AAChC;IAAR,KAAK,EAAE;uDAA6B;AAC5B;IAAR,KAAK,EAAE;sDAA4B;AAwFP;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iDAE3B;AAQW;IAAX,QAAQ,EAAE;yDAEV;AAkBW;IAAX,QAAQ,EAAE;yDAEV;AA9IU,kBAAkB;IAD9B,aAAa,CAAC,sBAAsB,CAAC;GACzB,kBAAkB,CAktB9B;SAltBY,kBAAkB","sourcesContent":["import {\n css,\n html,\n LitElement,\n PropertyValues,\n svg,\n SVGTemplateResult,\n TemplateResult,\n} from 'lit';\nimport { property, state, customElement } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.js';\nimport dayjs from 'dayjs/esm/index.js';\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\n\n// these values can be overridden via the component's HTML (camelCased) attributes\nconst WIDTH = 180;\nconst HEIGHT = 40;\nconst SLIDER_WIDTH = 10;\nconst TOOLTIP_WIDTH = 125;\nconst TOOLTIP_HEIGHT = 30;\nconst DATE_FORMAT = 'YYYY';\nconst MISSING_DATA = 'no data';\nconst UPDATE_DEBOUNCE_DELAY_MS = 1000;\n\n// this constant is not set up to be overridden\nconst SLIDER_CORNER_SIZE = 4;\n\n// these CSS custom props can be overridden from the HTML that is invoking this component\nconst sliderFill = css`var(--histogramDateRangeSliderFill, #4B65FE)`;\nconst selectedRangeFill = css`var(--histogramDateRangeSelectedRangeFill, #DBE0FF)`;\nconst barIncludedFill = css`var(--histogramDateRangeBarIncludedFill, #2C2C2C)`;\nconst activityIndicatorColor = css`var(--histogramDateRangeActivityIndicator, #2C2C2C)`;\nconst barExcludedFill = css`var(--histogramDateRangeBarExcludedFill, #CCCCCC)`;\nconst inputBorder = css`var(--histogramDateRangeInputBorder, 0.5px solid #2C2C2C)`;\nconst inputWidth = css`var(--histogramDateRangeInputWidth, 35px)`;\nconst inputFontSize = css`var(--histogramDateRangeInputFontSize, 1.2rem)`;\nconst tooltipBackgroundColor = css`var(--histogramDateRangeTooltipBackgroundColor, #2C2C2C)`;\nconst tooltipTextColor = css`var(--histogramDateRangeTooltipTextColor, #FFFFFF)`;\nconst tooltipFontSize = css`var(--histogramDateRangeTooltipFontSize, 1.1rem)`;\n\ntype SliderId = 'slider-min' | 'slider-max';\n\ninterface HistogramItem {\n value: number;\n height: number;\n binStart: string;\n binEnd: string;\n}\n\ninterface BarDataset extends DOMStringMap {\n numItems: string;\n binStart: string;\n binEnd: string;\n}\n\n@customElement('histogram-date-range')\nexport class HistogramDateRange extends LitElement {\n /* eslint-disable lines-between-class-members */\n\n // public reactive properties that can be set via HTML attributes\n @property({ type: Number }) width = WIDTH;\n @property({ type: Number }) height = HEIGHT;\n @property({ type: Number }) sliderWidth = SLIDER_WIDTH;\n @property({ type: Number }) tooltipWidth = TOOLTIP_WIDTH;\n @property({ type: Number }) tooltipHeight = TOOLTIP_HEIGHT;\n @property({ type: Number }) updateDelay = UPDATE_DEBOUNCE_DELAY_MS;\n @property() dateFormat = DATE_FORMAT;\n @property() missingDataMessage = MISSING_DATA;\n @property() minDate = '';\n @property() maxDate = '';\n @property({ type: Boolean }) disabled = false;\n @property({ type: Object }) bins: number[] = [];\n\n // internal reactive properties not exposed as attributes\n @state() private _tooltipOffset = 0;\n @state() private _tooltipContent?: TemplateResult;\n @state() private _tooltipVisible = false;\n @state() private _isDragging = false;\n @state() private _isLoading = false;\n\n // non-reactive properties (changes don't auto-trigger re-rendering)\n private _minSelectedDate = '';\n private _maxSelectedDate = '';\n private _minDateMS = 0;\n private _maxDateMS = 0;\n private _dragOffset = 0;\n private _histWidth = 0;\n private _binWidth = 0;\n private _currentSlider?: SVGRectElement;\n private _histData: HistogramItem[] = [];\n private _emitUpdatedEventTimer?: ReturnType<typeof setTimeout>;\n private _previousDateRange = '';\n\n /* eslint-enable lines-between-class-members */\n\n disconnectedCallback(): void {\n this.removeListeners();\n super.disconnectedCallback();\n }\n\n updated(changedProps: PropertyValues): void {\n // check for changes that would affect bin data calculations\n if (\n changedProps.has('bins') ||\n changedProps.has('minDate') ||\n changedProps.has('maxDate') ||\n changedProps.has('minSelectedDate') ||\n changedProps.has('maxSelectedDate')\n ) {\n this.handleDataUpdate();\n }\n }\n\n /**\n * Set private properties that depend on the attribute bin data\n *\n * We're caching these values and not using getters to avoid recalculating all\n * of the hist data every time the user drags a slider or hovers over a bar\n * creating a tooltip.\n */\n private handleDataUpdate(): void {\n if (!this.hasBinData) {\n return;\n }\n this._histWidth = this.width - this.sliderWidth * 2;\n this._minDateMS = dayjs(this.minDate).valueOf();\n this._maxDateMS = dayjs(this.maxDate).valueOf();\n this._binWidth = this._histWidth / this._numBins;\n this._previousDateRange = this.currentDateRangeString;\n this._histData = this.calculateHistData();\n this.minSelectedDate = this.minSelectedDate\n ? this.minSelectedDate\n : this.minDate;\n this.maxSelectedDate = this.maxSelectedDate\n ? this.maxSelectedDate\n : this.maxDate;\n this.requestUpdate();\n }\n\n private calculateHistData(): HistogramItem[] {\n const minValue = Math.min(...this.bins);\n const maxValue = Math.max(...this.bins);\n const valueScale = this.height / Math.log1p(maxValue - minValue);\n const dateScale = this.dateRangeMS / this._numBins;\n return this.bins.map((v: number, i: number) => {\n return {\n value: v,\n height: Math.floor(Math.log1p(v) * valueScale),\n binStart: `${this.formatDate(i * dateScale + this._minDateMS)}`,\n binEnd: `${this.formatDate((i + 1) * dateScale + this._minDateMS)}`,\n };\n });\n }\n\n private get hasBinData(): boolean {\n return this._numBins > 0;\n }\n\n private get _numBins(): number {\n if (!this.bins || !this.bins.length) {\n return 0;\n }\n return this.bins.length;\n }\n\n /** component's loading (and disabled) state */\n @property({ type: Boolean }) get loading(): boolean {\n return this._isLoading;\n }\n\n set loading(value: boolean) {\n this.disabled = value;\n this._isLoading = value;\n }\n\n /** formatted minimum date of selected date range */\n @property() get minSelectedDate(): string {\n return this.formatDate(this._minSelectedDate);\n }\n\n set minSelectedDate(rawDate: string) {\n if (!this._minSelectedDate) {\n // because the values needed to calculate valid max/min values are not\n // available during the lit init when it's populating properties from\n // attributes, fall back to just the raw date if nothing is already set\n this._minSelectedDate = rawDate;\n }\n const x = this.translateDateToPosition(rawDate);\n if (x) {\n const validX = this.validMinSliderX(x);\n this._minSelectedDate = this.translatePositionToDate(validX);\n }\n this.requestUpdate();\n }\n\n /** formatted maximum date of selected date range */\n @property() get maxSelectedDate(): string {\n return this.formatDate(this._maxSelectedDate);\n }\n\n set maxSelectedDate(rawDate: string) {\n if (!this._maxSelectedDate) {\n // see comment above in the minSelectedDate setter\n this._maxSelectedDate = rawDate;\n }\n const x = this.translateDateToPosition(rawDate);\n if (x) {\n const validX = this.validMaxSliderX(x);\n this._maxSelectedDate = this.translatePositionToDate(validX);\n }\n this.requestUpdate();\n }\n /** horizontal position of min date slider */\n get minSliderX(): number {\n return (\n // default to leftmost position if missing or invalid min position\n this.translateDateToPosition(this.minSelectedDate) ?? this.sliderWidth\n );\n }\n\n /** horizontal position of max date slider */\n get maxSliderX(): number {\n return (\n // default to rightmost position if missing or invalid max position\n this.translateDateToPosition(this.maxSelectedDate) ??\n this.width - this.sliderWidth\n );\n }\n\n private get dateRangeMS(): number {\n return this._maxDateMS - this._minDateMS;\n }\n\n private showTooltip(e: PointerEvent): void {\n if (this._isDragging || this.disabled) {\n return;\n }\n const target = e.currentTarget as SVGRectElement;\n const x = target.x.baseVal.value + this.sliderWidth / 2;\n const dataset = target.dataset as BarDataset;\n const itemsText = `item${dataset.numItems !== '1' ? 's' : ''}`;\n\n this._tooltipOffset =\n x + (this._binWidth - this.sliderWidth - this.tooltipWidth) / 2;\n\n this._tooltipContent = html`\n ${dataset.numItems} ${itemsText}<br />\n ${dataset.binStart} - ${dataset.binEnd}\n `;\n this._tooltipVisible = true;\n }\n\n private hideTooltip(): void {\n this._tooltipContent = undefined;\n this._tooltipVisible = false;\n }\n\n // use arrow functions (rather than standard JS class instance methods) so\n // that `this` is bound to the histogramDateRange object and not the event\n // target. for more info see\n // https://lit-element.polymer-project.org/guide/events#using-this-in-event-listeners\n private drag = (e: PointerEvent): void => {\n // prevent selecting text or other ranges while dragging, especially in Safari\n e.preventDefault();\n if (this.disabled) {\n return;\n }\n this.setDragOffset(e);\n this._isDragging = true;\n this.addListeners();\n this.cancelPendingUpdateEvent();\n };\n\n private drop = (): void => {\n if (this._isDragging) {\n this.removeListeners();\n this.beginEmitUpdateProcess();\n }\n this._isDragging = false;\n };\n\n /**\n * Adjust the date range based on slider movement\n *\n * @param e PointerEvent from the slider being moved\n */\n private move = (e: PointerEvent): void => {\n const newX = e.offsetX - this._dragOffset;\n const slider = this._currentSlider as SVGRectElement;\n const date = this.translatePositionToDate(newX);\n if ((slider.id as SliderId) === 'slider-min') {\n this.minSelectedDate = date;\n } else {\n this.maxSelectedDate = date;\n }\n };\n\n /**\n * Constrain a proposed value for the minimum (left) slider\n *\n * If the value is less than the leftmost valid position, then set it to the\n * left edge of the widget (ie the slider width). If the value is greater than\n * the rightmost valid position (the position of the max slider), then set it\n * to the position of the max slider\n */\n private validMinSliderX(newX: number): number {\n const validX = Math.max(newX, this.sliderWidth);\n return Math.min(validX, this.maxSliderX);\n }\n\n /**\n * Constrain a proposed value for the maximum (right) slider\n *\n * If the value is greater than the rightmost valid position, then set it to\n * the right edge of the widget (ie widget width - slider width). If the value\n * is less than the leftmost valid position (the position of the min slider),\n * then set it to the position of the min slider\n */\n private validMaxSliderX(newX: number): number {\n const validX = Math.max(newX, this.minSliderX);\n return Math.min(validX, this.width - this.sliderWidth);\n }\n\n private addListeners(): void {\n window.addEventListener('pointermove', this.move);\n window.addEventListener('pointerup', this.drop);\n window.addEventListener('pointercancel', this.drop);\n }\n\n private removeListeners(): void {\n window.removeEventListener('pointermove', this.move);\n window.removeEventListener('pointerup', this.drop);\n window.removeEventListener('pointercancel', this.drop);\n }\n\n /**\n * start a timer to emit an update event. this timer can be canceled (and the\n * event not emitted) if user drags a slider or focuses a date input within\n * the update delay\n */\n private beginEmitUpdateProcess(): void {\n this.cancelPendingUpdateEvent();\n this._emitUpdatedEventTimer = setTimeout(() => {\n if (this.currentDateRangeString === this._previousDateRange) {\n // don't emit duplicate event if no change since last emitted event\n return;\n }\n this._previousDateRange = this.currentDateRangeString;\n const options = {\n detail: {\n minDate: this.minSelectedDate,\n maxDate: this.maxSelectedDate,\n },\n bubbles: true,\n composed: true,\n };\n this.dispatchEvent(new CustomEvent('histogramDateRangeUpdated', options));\n }, this.updateDelay);\n }\n\n private cancelPendingUpdateEvent(): void {\n if (this._emitUpdatedEventTimer === undefined) {\n return;\n }\n clearTimeout(this._emitUpdatedEventTimer);\n this._emitUpdatedEventTimer = undefined;\n }\n\n /**\n * find position of pointer in relation to the current slider\n */\n private setDragOffset(e: PointerEvent): void {\n this._currentSlider = e.currentTarget as SVGRectElement;\n const sliderX =\n (this._currentSlider.id as SliderId) === 'slider-min'\n ? this.minSliderX\n : this.maxSliderX;\n this._dragOffset = e.offsetX - sliderX;\n // work around Firefox issue where e.offsetX seems to be not based on current\n // element but on background element\n if (\n this._dragOffset > this.sliderWidth ||\n this._dragOffset < -this.sliderWidth\n ) {\n this._dragOffset = 0;\n }\n }\n\n /**\n * @param x horizontal position of slider\n * @returns string representation of date\n */\n private translatePositionToDate(x: number): string {\n // use Math.ceil to round up to fix case where input like 1/1/2010 would get\n // translated to 12/31/2009\n const milliseconds = Math.ceil(\n ((x - this.sliderWidth) * this.dateRangeMS) / this._histWidth\n );\n return this.formatDate(this._minDateMS + milliseconds);\n }\n\n /**\n * Returns slider x-position corresponding to given date (or null if invalid\n * date)\n *\n * @param date\n * @returns x-position of slider\n */\n private translateDateToPosition(date: string): number | null {\n const milliseconds = dayjs(date).valueOf();\n const xPosition =\n this.sliderWidth +\n ((milliseconds - this._minDateMS) * this._histWidth) / this.dateRangeMS;\n return isNaN(milliseconds) || isNaN(xPosition) ? null : xPosition;\n }\n\n private handleMinDateInput(e: InputEvent): void {\n const target = e.currentTarget as HTMLInputElement;\n this.minSelectedDate = target.value;\n this.beginEmitUpdateProcess();\n }\n\n private handleMaxDateInput(e: InputEvent): void {\n const target = e.currentTarget as HTMLInputElement;\n this.maxSelectedDate = target.value;\n this.beginEmitUpdateProcess();\n }\n\n private get currentDateRangeString(): string {\n return `${this.minSelectedDate}:${this.maxSelectedDate}`;\n }\n\n /** minimum selected date in milliseconds */\n private get minSelectedDateMS(): number {\n return dayjs(this.minSelectedDate).valueOf();\n }\n\n /** maximum selected date in milliseconds */\n private get maxSelectedDateMS(): number {\n return dayjs(this.maxSelectedDate).valueOf();\n }\n\n private handleBarClick(e: InputEvent): void {\n const dataset = (e.currentTarget as SVGRectElement).dataset as BarDataset;\n const binStartDateMS = dayjs(dataset.binStart).valueOf();\n if (binStartDateMS < this.minSelectedDateMS) {\n this.minSelectedDate = dataset.binStart;\n }\n const binEndDateMS = dayjs(dataset.binEnd).valueOf();\n if (binEndDateMS > this.maxSelectedDateMS) {\n this.maxSelectedDate = dataset.binEnd;\n }\n this.beginEmitUpdateProcess();\n }\n\n private get minSliderTemplate(): SVGTemplateResult {\n // width/height in pixels of curved part of the sliders (like\n // border-radius); used as part of a SVG quadratic curve. see\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#curve_commands\n const cs = SLIDER_CORNER_SIZE;\n\n const sliderShape = `\n M${this.minSliderX},0\n h-${this.sliderWidth - cs}\n q-${cs},0 -${cs},${cs}\n v${this.height - cs * 2}\n q0,${cs} ${cs},${cs}\n h${this.sliderWidth - cs}\n `;\n return this.generateSliderSVG(this.minSliderX, 'slider-min', sliderShape);\n }\n\n private get maxSliderTemplate(): SVGTemplateResult {\n const cs = SLIDER_CORNER_SIZE;\n const sliderShape = `\n M${this.maxSliderX},0\n h${this.sliderWidth - cs}\n q${cs},0 ${cs},${cs}\n v${this.height - cs * 2}\n q0,${cs} -${cs},${cs}\n h-${this.sliderWidth - cs}\n `;\n return this.generateSliderSVG(this.maxSliderX, 'slider-max', sliderShape);\n }\n\n private generateSliderSVG(\n sliderPositionX: number,\n id: SliderId,\n sliderShape: string\n ): SVGTemplateResult {\n // whether the curved part of the slider is facing towards the left (1), ie\n // minimum, or facing towards the right (-1), ie maximum\n const k = id === 'slider-min' ? 1 : -1;\n\n return svg`\n <svg\n id=\"${id}\"\n class=\"\n ${this.disabled ? '' : 'draggable'} \n ${this._isDragging ? 'dragging' : ''}\"\n @pointerdown=\"${this.drag}\"\n >\n <path d=\"${sliderShape} z\" fill=\"${sliderFill}\" />\n <rect\n x=\"${\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.4 * k\n }\"\n y=\"${this.height / 3}\"\n width=\"1\"\n height=\"${this.height / 3}\"\n fill=\"white\"\n />\n <rect\n x=\"${\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.6 * k\n }\"\n y=\"${this.height / 3}\"\n width=\"1\"\n height=\"${this.height / 3}\"\n fill=\"white\"\n />\n </svg>\n `;\n }\n\n get selectedRangeTemplate(): SVGTemplateResult {\n return svg`\n <rect\n x=\"${this.minSliderX}\"\n y=\"0\"\n width=\"${this.maxSliderX - this.minSliderX}\"\n height=\"${this.height}\"\n fill=\"${selectedRangeFill}\"\n />`;\n }\n\n get histogramTemplate(): SVGTemplateResult[] {\n const xScale = this._histWidth / this._numBins;\n const barWidth = xScale - 1;\n let x = this.sliderWidth; // start at the left edge of the histogram\n\n // the stroke-dasharray style below creates a transparent border around the\n // right edge of the bar, which prevents user from encountering a gap\n // between adjacent bars (eg when viewing the tooltips or when trying to\n // extend the range by clicking on a bar)\n return this._histData.map(data => {\n const bar = svg`\n <rect\n class=\"bar\"\n style='stroke-dasharray: 0 ${barWidth} ${data.height} ${barWidth} 0 ${\n data.height\n };'\n x=\"${x}\"\n y=\"${this.height - data.height}\"\n width=\"${barWidth}\"\n height=\"${data.height}\"\n @pointerenter=\"${this.showTooltip}\"\n @pointerleave=\"${this.hideTooltip}\"\n @click=\"${this.handleBarClick}\"\n fill=\"${\n x >= this.minSliderX && x <= this.maxSliderX\n ? barIncludedFill\n : barExcludedFill\n }\"\n data-num-items=\"${data.value}\"\n data-bin-start=\"${data.binStart}\"\n data-bin-end=\"${data.binEnd}\"\n />`;\n x += xScale;\n return bar;\n });\n }\n\n private formatDate(rawDate: string | number): string {\n const date = dayjs(rawDate);\n return date.isValid() ? date.format(this.dateFormat) : '';\n }\n\n /**\n * NOTE: we are relying on the lit `live` directive in the template to\n * ensure that the change to minSelectedDate is noticed and the input value\n * gets properly re-rendered. see\n * https://lit.dev/docs/templates/directives/#live\n */\n get minInputTemplate(): TemplateResult {\n return html`\n <input\n id=\"date-min\"\n placeholder=\"${this.dateFormat}\"\n type=\"text\"\n @focus=\"${this.cancelPendingUpdateEvent}\"\n @blur=\"${this.handleMinDateInput}\"\n .value=\"${live(this.minSelectedDate)}\"\n ?disabled=\"${this.disabled}\"\n />\n `;\n }\n\n get maxInputTemplate(): TemplateResult {\n return html`\n <input\n id=\"date-max\"\n placeholder=\"${this.dateFormat}\"\n type=\"text\"\n @focus=\"${this.cancelPendingUpdateEvent}\"\n @blur=\"${this.handleMaxDateInput}\"\n .value=\"${live(this.maxSelectedDate)}\"\n ?disabled=\"${this.disabled}\"\n />\n `;\n }\n\n get tooltipTemplate(): TemplateResult {\n return html`\n <style>\n #tooltip {\n width: ${this.tooltipWidth}px;\n height: ${this.tooltipHeight}px;\n top: ${-9 - this.tooltipHeight}px;\n left: ${this._tooltipOffset}px;\n display: ${this._tooltipVisible ? 'block' : 'none'};\n }\n #tooltip:after {\n left: ${this.tooltipWidth / 2}px;\n }\n </style>\n <div id=\"tooltip\">${this._tooltipContent}</div>\n `;\n }\n\n private get noDataTemplate(): TemplateResult {\n return html`\n <div class=\"missing-data-message\">${this.missingDataMessage}</div>\n `;\n }\n\n private get activityIndicatorTemplate(): TemplateResult {\n if (!this.loading) {\n return html``;\n }\n return html`\n <ia-activity-indicator mode=\"processing\"> </ia-activity-indicator>\n `;\n }\n\n static styles = css`\n .missing-data-message {\n text-align: center;\n }\n #container {\n margin: 0;\n touch-action: none;\n position: relative;\n }\n .disabled {\n opacity: 0.3;\n }\n ia-activity-indicator {\n position: absolute;\n left: calc(50% - 10px);\n top: 10px;\n width: 20px;\n height: 20px;\n --activityIndicatorLoadingDotColor: rgba(0, 0, 0, 0);\n --activityIndicatorLoadingRingColor: ${activityIndicatorColor};\n }\n\n /* prevent selection from interfering with tooltip, especially on mobile */\n /* https://stackoverflow.com/a/4407335/1163042 */\n .noselect {\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Safari */\n -moz-user-select: none; /* Old versions of Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none; /* current Chrome, Edge, Opera and Firefox */\n }\n .bar {\n /* create a transparent border around the hist bars to prevent \"gaps\" and\n flickering when moving around between bars. this also helps with handling\n clicks on the bars, preventing users from being able to click in between\n bars */\n stroke: rgba(0, 0, 0, 0);\n /* ensure transparent stroke wide enough to cover gap between bars */\n stroke-width: 2px;\n }\n .bar:hover {\n /* highlight currently hovered bar */\n fill-opacity: 0.7;\n }\n .disabled .bar:hover {\n /* ensure no visual hover interaction when disabled */\n fill-opacity: 1;\n }\n /****** histogram ********/\n #tooltip {\n position: absolute;\n background: ${tooltipBackgroundColor};\n color: ${tooltipTextColor};\n text-align: center;\n border-radius: 3px;\n padding: 2px;\n font-size: ${tooltipFontSize};\n font-family: sans-serif;\n touch-action: none;\n pointer-events: none;\n }\n #tooltip:after {\n content: '';\n position: absolute;\n margin-left: -5px;\n top: 100%;\n /* arrow */\n border: 5px solid ${tooltipTextColor};\n border-color: ${tooltipBackgroundColor} transparent transparent\n transparent;\n }\n /****** slider ********/\n .draggable:hover {\n cursor: grab;\n }\n .dragging {\n cursor: grabbing !important;\n }\n /****** inputs ********/\n #inputs {\n display: flex;\n justify-content: center;\n }\n #inputs .dash {\n position: relative;\n bottom: -1px;\n }\n input {\n width: ${inputWidth};\n margin: 0 3px;\n border: ${inputBorder};\n border-radius: 2px !important;\n text-align: center;\n font-size: ${inputFontSize};\n }\n `;\n\n render(): TemplateResult {\n if (!this.hasBinData) {\n return this.noDataTemplate;\n }\n return html`\n <div\n id=\"container\"\n class=\"\n noselect \n ${this._isDragging ? 'dragging' : ''}\n \"\n style=\"width: ${this.width}px\"\n >\n ${this.activityIndicatorTemplate} ${this.tooltipTemplate}\n <div\n class=\"inner-container\n ${this.disabled ? 'disabled' : ''}\"\n >\n <svg\n width=\"${this.width}\"\n height=\"${this.height}\"\n @pointerleave=\"${this.drop}\"\n >\n ${this.selectedRangeTemplate}\n <svg id=\"histogram\">${this.histogramTemplate}</svg>\n ${this.minSliderTemplate} ${this.maxSliderTemplate}\n </svg>\n <div id=\"inputs\">\n ${this.minInputTemplate}\n <div class=\"dash\">-</div>\n ${this.maxInputTemplate}\n </div>\n </div>\n </div>\n `;\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'histogram-date-range': HistogramDateRange;\n }\n}\n"]}
1
+ {"version":3,"file":"histogram-date-range.js","sourceRoot":"","sources":["../../src/histogram-date-range.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n nothing,\n LitElement,\n PropertyValues,\n svg,\n SVGTemplateResult,\n TemplateResult,\n} from 'lit';\nimport { property, state, customElement } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.js';\nimport dayjs from 'dayjs/esm/index.js';\nimport customParseFormat from 'dayjs/esm/plugin/customParseFormat';\ndayjs.extend(customParseFormat);\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\n\n// these values can be overridden via the component's HTML (camelCased) attributes\nconst WIDTH = 180;\nconst HEIGHT = 40;\nconst SLIDER_WIDTH = 10;\nconst TOOLTIP_WIDTH = 125;\nconst TOOLTIP_HEIGHT = 30;\nconst DATE_FORMAT = 'YYYY';\nconst MISSING_DATA = 'no data';\nconst UPDATE_DEBOUNCE_DELAY_MS = 0;\n\n// this constant is not set up to be overridden\nconst SLIDER_CORNER_SIZE = 4;\n\n// these CSS custom props can be overridden from the HTML that is invoking this component\nconst sliderColor = css`var(--histogramDateRangeSliderColor, #4B65FE)`;\nconst selectedRangeColor = css`var(--histogramDateRangeSelectedRangeColor, #DBE0FF)`;\nconst barIncludedFill = css`var(--histogramDateRangeBarIncludedFill, #2C2C2C)`;\nconst activityIndicatorColor = css`var(--histogramDateRangeActivityIndicator, #2C2C2C)`;\nconst barExcludedFill = css`var(--histogramDateRangeBarExcludedFill, #CCCCCC)`;\nconst inputBorder = css`var(--histogramDateRangeInputBorder, 0.5px solid #2C2C2C)`;\nconst inputWidth = css`var(--histogramDateRangeInputWidth, 35px)`;\nconst inputFontSize = css`var(--histogramDateRangeInputFontSize, 1.2rem)`;\nconst inputFontFamily = css`var(--histogramDateRangeInputFontFamily, sans-serif)`;\nconst tooltipBackgroundColor = css`var(--histogramDateRangeTooltipBackgroundColor, #2C2C2C)`;\nconst tooltipTextColor = css`var(--histogramDateRangeTooltipTextColor, #FFFFFF)`;\nconst tooltipFontSize = css`var(--histogramDateRangeTooltipFontSize, 1.1rem)`;\nconst tooltipFontFamily = css`var(--histogramDateRangeTooltipFontFamily, sans-serif)`;\n\ntype SliderId = 'slider-min' | 'slider-max';\n\ninterface HistogramItem {\n value: number;\n height: number;\n binStart: string;\n binEnd: string;\n}\n\ninterface BarDataset extends DOMStringMap {\n numItems: string;\n binStart: string;\n binEnd: string;\n}\n\n@customElement('histogram-date-range')\nexport class HistogramDateRange extends LitElement {\n /* eslint-disable lines-between-class-members */\n\n // public reactive properties that can be set via HTML attributes\n @property({ type: Number }) width = WIDTH;\n @property({ type: Number }) height = HEIGHT;\n @property({ type: Number }) sliderWidth = SLIDER_WIDTH;\n @property({ type: Number }) tooltipWidth = TOOLTIP_WIDTH;\n @property({ type: Number }) tooltipHeight = TOOLTIP_HEIGHT;\n @property({ type: Number }) updateDelay = UPDATE_DEBOUNCE_DELAY_MS;\n @property() dateFormat = DATE_FORMAT;\n @property() missingDataMessage = MISSING_DATA;\n @property() minDate = '';\n @property() maxDate = '';\n @property({ type: Boolean }) disabled = false;\n @property({ type: Object }) bins: number[] = [];\n\n // internal reactive properties not exposed as attributes\n @state() private _tooltipOffset = 0;\n @state() private _tooltipContent?: TemplateResult;\n @state() private _tooltipVisible = false;\n @state() private _isDragging = false;\n @state() private _isLoading = false;\n\n // non-reactive properties (changes don't auto-trigger re-rendering)\n private _minSelectedDate = '';\n private _maxSelectedDate = '';\n private _minDateMS = 0;\n private _maxDateMS = 0;\n private _dragOffset = 0;\n private _histWidth = 0;\n private _binWidth = 0;\n private _currentSlider?: SVGRectElement;\n private _histData: HistogramItem[] = [];\n private _emitUpdatedEventTimer?: ReturnType<typeof setTimeout>;\n private _previousDateRange = '';\n\n /* eslint-enable lines-between-class-members */\n\n disconnectedCallback(): void {\n this.removeListeners();\n super.disconnectedCallback();\n }\n\n updated(changedProps: PropertyValues): void {\n // check for changes that would affect bin data calculations\n if (\n changedProps.has('bins') ||\n changedProps.has('minDate') ||\n changedProps.has('maxDate') ||\n changedProps.has('minSelectedDate') ||\n changedProps.has('maxSelectedDate')\n ) {\n this.handleDataUpdate();\n }\n }\n\n /**\n * Set private properties that depend on the attribute bin data\n *\n * We're caching these values and not using getters to avoid recalculating all\n * of the hist data every time the user drags a slider or hovers over a bar\n * creating a tooltip.\n */\n private handleDataUpdate(): void {\n if (!this.hasBinData) {\n return;\n }\n this._histWidth = this.width - this.sliderWidth * 2;\n this._minDateMS = this.getMSFromString(this.minDate);\n this._maxDateMS = this.getMSFromString(this.maxDate);\n this._binWidth = this._histWidth / this._numBins;\n this._previousDateRange = this.currentDateRangeString;\n this._histData = this.calculateHistData();\n this.minSelectedDate = this.minSelectedDate\n ? this.minSelectedDate\n : this.minDate;\n this.maxSelectedDate = this.maxSelectedDate\n ? this.maxSelectedDate\n : this.maxDate;\n this.requestUpdate();\n }\n\n private calculateHistData(): HistogramItem[] {\n const minValue = Math.min(...this.bins);\n const maxValue = Math.max(...this.bins);\n // if there is no difference between the min and max values, use a range of\n // 1 because log scaling will fail if the range is 0\n const valueRange =\n minValue === maxValue ? 1 : Math.log1p(maxValue - minValue);\n const valueScale = this.height / valueRange;\n const dateScale = this.dateRangeMS / this._numBins;\n return this.bins.map((v: number, i: number) => {\n return {\n value: v,\n // use log scaling for the height of the bar to prevent tall bars from\n // making the smaller ones too small to see\n height: Math.floor(Math.log1p(v) * valueScale),\n binStart: `${this.formatDate(i * dateScale + this._minDateMS)}`,\n binEnd: `${this.formatDate((i + 1) * dateScale + this._minDateMS)}`,\n };\n });\n }\n\n private get hasBinData(): boolean {\n return this._numBins > 0;\n }\n\n private get _numBins(): number {\n if (!this.bins || !this.bins.length) {\n return 0;\n }\n return this.bins.length;\n }\n\n private get histogramLeftEdgeX(): number {\n return this.sliderWidth;\n }\n\n private get histogramRightEdgeX(): number {\n return this.width - this.sliderWidth;\n }\n\n /** component's loading (and disabled) state */\n @property({ type: Boolean }) get loading(): boolean {\n return this._isLoading;\n }\n\n set loading(value: boolean) {\n this.disabled = value;\n this._isLoading = value;\n }\n\n /** formatted minimum date of selected date range */\n @property() get minSelectedDate(): string {\n return this.formatDate(this.getMSFromString(this._minSelectedDate));\n }\n\n /** updates minSelectedDate if new date is valid */\n set minSelectedDate(rawDate: string) {\n if (!this._minSelectedDate) {\n // because the values needed to calculate valid max/min values are not\n // available during the lit init when it's populating properties from\n // attributes, fall back to just the raw date if nothing is already set\n this._minSelectedDate = rawDate;\n return;\n }\n const proposedDateMS = this.getMSFromString(rawDate);\n const isValidDate = !Number.isNaN(proposedDateMS);\n const isNotTooRecent =\n proposedDateMS <= this.getMSFromString(this.maxSelectedDate);\n if (isValidDate && isNotTooRecent) {\n this._minSelectedDate = this.formatDate(proposedDateMS);\n }\n this.requestUpdate();\n }\n\n /** formatted maximum date of selected date range */\n @property() get maxSelectedDate(): string {\n return this.formatDate(this.getMSFromString(this._maxSelectedDate));\n }\n\n /** updates maxSelectedDate if new date is valid */\n set maxSelectedDate(rawDate: string) {\n if (!this._maxSelectedDate) {\n // because the values needed to calculate valid max/min values are not\n // available during the lit init when it's populating properties from\n // attributes, fall back to just the raw date if nothing is already set\n this._maxSelectedDate = rawDate;\n return;\n }\n const proposedDateMS = this.getMSFromString(rawDate);\n const isValidDate = !Number.isNaN(proposedDateMS);\n const isNotTooOld =\n proposedDateMS >= this.getMSFromString(this.minSelectedDate);\n if (isValidDate && isNotTooOld) {\n this._maxSelectedDate = this.formatDate(proposedDateMS);\n }\n this.requestUpdate();\n }\n\n /** horizontal position of min date slider */\n get minSliderX(): number {\n const x = this.translateDateToPosition(this.minSelectedDate);\n return this.validMinSliderX(x);\n }\n\n /** horizontal position of max date slider */\n get maxSliderX(): number {\n const x = this.translateDateToPosition(this.maxSelectedDate);\n return this.validMaxSliderX(x);\n }\n\n private get dateRangeMS(): number {\n return this._maxDateMS - this._minDateMS;\n }\n\n private showTooltip(e: PointerEvent): void {\n if (this._isDragging || this.disabled) {\n return;\n }\n const target = e.currentTarget as SVGRectElement;\n const x = target.x.baseVal.value + this.sliderWidth / 2;\n const dataset = target.dataset as BarDataset;\n const itemsText = `item${dataset.numItems !== '1' ? 's' : ''}`;\n const formattedNumItems = Number(dataset.numItems).toLocaleString();\n\n this._tooltipOffset =\n x + (this._binWidth - this.sliderWidth - this.tooltipWidth) / 2;\n\n this._tooltipContent = html`\n ${formattedNumItems} ${itemsText}<br />\n ${dataset.binStart} - ${dataset.binEnd}\n `;\n this._tooltipVisible = true;\n }\n\n private hideTooltip(): void {\n this._tooltipContent = undefined;\n this._tooltipVisible = false;\n }\n\n // use arrow functions (rather than standard JS class instance methods) so\n // that `this` is bound to the histogramDateRange object and not the event\n // target. for more info see\n // https://lit-element.polymer-project.org/guide/events#using-this-in-event-listeners\n private drag = (e: PointerEvent): void => {\n // prevent selecting text or other ranges while dragging, especially in Safari\n e.preventDefault();\n if (this.disabled) {\n return;\n }\n this.setDragOffset(e);\n this._isDragging = true;\n this.addListeners();\n this.cancelPendingUpdateEvent();\n };\n\n private drop = (): void => {\n if (this._isDragging) {\n this.removeListeners();\n this.beginEmitUpdateProcess();\n }\n this._isDragging = false;\n };\n\n /**\n * Adjust the date range based on slider movement\n *\n * @param e PointerEvent from the slider being moved\n */\n private move = (e: PointerEvent): void => {\n const newX = e.offsetX - this._dragOffset;\n const slider = this._currentSlider as SVGRectElement;\n if ((slider.id as SliderId) === 'slider-min') {\n this.minSelectedDate = this.translatePositionToDate(\n this.validMinSliderX(newX)\n );\n } else {\n this.maxSelectedDate = this.translatePositionToDate(\n this.validMaxSliderX(newX)\n );\n }\n };\n\n /**\n * Constrain a proposed value for the minimum (left) slider\n *\n * If the value is less than the leftmost valid position, then set it to the\n * left edge of the histogram (ie the slider width). If the value is greater\n * than the rightmost valid position (the position of the max slider), then\n * set it to the position of the max slider\n */\n private validMinSliderX(newX: number): number {\n // allow the left slider to go right only to the right slider, even if the\n // max selected date is out of range\n const rightLimit = Math.min(\n this.translateDateToPosition(this.maxSelectedDate),\n this.histogramRightEdgeX\n );\n newX = this.clamp(newX, this.histogramLeftEdgeX, rightLimit);\n const isInvalid =\n Number.isNaN(newX) || rightLimit < this.histogramLeftEdgeX;\n return isInvalid ? this.histogramLeftEdgeX : newX;\n }\n\n /**\n * Constrain a proposed value for the maximum (right) slider\n *\n * If the value is greater than the rightmost valid position, then set it to\n * the right edge of the histogram (ie histogram width - slider width). If the\n * value is less than the leftmost valid position (the position of the min\n * slider), then set it to the position of the min slider\n */\n private validMaxSliderX(newX: number): number {\n // allow the right slider to go left only to the left slider, even if the\n // min selected date is out of range\n const leftLimit = Math.max(\n this.histogramLeftEdgeX,\n this.translateDateToPosition(this.minSelectedDate)\n );\n newX = this.clamp(newX, leftLimit, this.histogramRightEdgeX);\n const isInvalid =\n Number.isNaN(newX) || leftLimit > this.histogramRightEdgeX;\n return isInvalid ? this.histogramRightEdgeX : newX;\n }\n\n private addListeners(): void {\n window.addEventListener('pointermove', this.move);\n window.addEventListener('pointerup', this.drop);\n window.addEventListener('pointercancel', this.drop);\n }\n\n private removeListeners(): void {\n window.removeEventListener('pointermove', this.move);\n window.removeEventListener('pointerup', this.drop);\n window.removeEventListener('pointercancel', this.drop);\n }\n\n /**\n * start a timer to emit an update event. this timer can be canceled (and the\n * event not emitted) if user drags a slider or focuses a date input within\n * the update delay\n */\n private beginEmitUpdateProcess(): void {\n this.cancelPendingUpdateEvent();\n this._emitUpdatedEventTimer = setTimeout(() => {\n if (this.currentDateRangeString === this._previousDateRange) {\n // don't emit duplicate event if no change since last emitted event\n return;\n }\n this._previousDateRange = this.currentDateRangeString;\n const options = {\n detail: {\n minDate: this.minSelectedDate,\n maxDate: this.maxSelectedDate,\n },\n bubbles: true,\n composed: true,\n };\n this.dispatchEvent(new CustomEvent('histogramDateRangeUpdated', options));\n }, this.updateDelay);\n }\n\n private cancelPendingUpdateEvent(): void {\n if (this._emitUpdatedEventTimer === undefined) {\n return;\n }\n clearTimeout(this._emitUpdatedEventTimer);\n this._emitUpdatedEventTimer = undefined;\n }\n\n /**\n * find position of pointer in relation to the current slider\n */\n private setDragOffset(e: PointerEvent): void {\n this._currentSlider = e.currentTarget as SVGRectElement;\n const sliderX =\n (this._currentSlider.id as SliderId) === 'slider-min'\n ? this.minSliderX\n : this.maxSliderX;\n this._dragOffset = e.offsetX - sliderX;\n // work around Firefox issue where e.offsetX seems to be not based on current\n // element but on background element\n if (\n this._dragOffset > this.sliderWidth ||\n this._dragOffset < -this.sliderWidth\n ) {\n this._dragOffset = 0;\n }\n }\n\n /**\n * @param x horizontal position of slider\n * @returns string representation of date\n */\n private translatePositionToDate(x: number): string {\n // use Math.ceil to round up to fix case where input like 1/1/2010 would get\n // translated to 12/31/2009\n const milliseconds = Math.ceil(\n ((x - this.sliderWidth) * this.dateRangeMS) / this._histWidth\n );\n return this.formatDate(this._minDateMS + milliseconds);\n }\n\n /**\n * Returns slider x-position corresponding to given date\n *\n * @param date\n * @returns x-position of slider\n */\n private translateDateToPosition(date: string): number {\n const milliseconds = this.getMSFromString(date);\n return (\n this.sliderWidth +\n ((milliseconds - this._minDateMS) * this._histWidth) / this.dateRangeMS\n );\n }\n\n /** ensure that the returned value is between minValue and maxValue */\n private clamp(x: number, minValue: number, maxValue: number): number {\n return Math.min(Math.max(x, minValue), maxValue);\n }\n\n private handleMinDateInput(e: Event): void {\n const target = e.currentTarget as HTMLInputElement;\n this.minSelectedDate = target.value;\n this.beginEmitUpdateProcess();\n }\n\n private handleMaxDateInput(e: Event): void {\n const target = e.currentTarget as HTMLInputElement;\n this.maxSelectedDate = target.value;\n this.beginEmitUpdateProcess();\n }\n\n private handleKeyUp(e: KeyboardEvent): void {\n if (e.key === 'Enter') {\n const target = e.currentTarget as HTMLInputElement;\n target.blur();\n if (target.id === 'date-min') {\n this.handleMinDateInput(e);\n } else if (target.id === 'date-max') {\n this.handleMaxDateInput(e);\n }\n }\n }\n\n private get currentDateRangeString(): string {\n return `${this.minSelectedDate}:${this.maxSelectedDate}`;\n }\n\n private getMSFromString(date: string): number {\n const digitGroupCount = (date.split(/(\\d+)/).length - 1) / 2;\n if (digitGroupCount === 1) {\n // if there's just a single set of digits, assume it's a year\n const dateObj = new Date(0, 0); // start at January 1, 1900\n dateObj.setFullYear(Number(date)); // override year\n return dateObj.getTime(); // get time in milliseconds\n }\n return dayjs(date, [this.dateFormat, DATE_FORMAT]).valueOf();\n }\n\n /**\n * expand or narrow the selected range by moving the slider nearest the\n * clicked bar to the outer edge of the clicked bar\n *\n * @param e Event click event from a histogram bar\n */\n private handleBarClick(e: Event): void {\n const dataset = (e.currentTarget as SVGRectElement).dataset as BarDataset;\n // use the midpoint of the width of the clicked bar to determine which is\n // the nearest slider\n const clickPosition =\n (this.getMSFromString(dataset.binStart) +\n this.getMSFromString(dataset.binEnd)) /\n 2;\n const distanceFromMinSlider = Math.abs(\n clickPosition - this.getMSFromString(this.minSelectedDate)\n );\n const distanceFromMaxSlider = Math.abs(\n clickPosition - this.getMSFromString(this.maxSelectedDate)\n );\n // update the selected range by moving the nearer slider\n if (distanceFromMinSlider < distanceFromMaxSlider) {\n this.minSelectedDate = dataset.binStart;\n } else {\n this.maxSelectedDate = dataset.binEnd;\n }\n this.beginEmitUpdateProcess();\n }\n\n private get minSliderTemplate(): SVGTemplateResult {\n // width/height in pixels of curved part of the sliders (like\n // border-radius); used as part of a SVG quadratic curve. see\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#curve_commands\n const cs = SLIDER_CORNER_SIZE;\n\n const sliderShape = `\n M${this.minSliderX},0\n h-${this.sliderWidth - cs}\n q-${cs},0 -${cs},${cs}\n v${this.height - cs * 2}\n q0,${cs} ${cs},${cs}\n h${this.sliderWidth - cs}\n `;\n return this.generateSliderSVG(this.minSliderX, 'slider-min', sliderShape);\n }\n\n private get maxSliderTemplate(): SVGTemplateResult {\n const cs = SLIDER_CORNER_SIZE;\n const sliderShape = `\n M${this.maxSliderX},0\n h${this.sliderWidth - cs}\n q${cs},0 ${cs},${cs}\n v${this.height - cs * 2}\n q0,${cs} -${cs},${cs}\n h-${this.sliderWidth - cs}\n `;\n return this.generateSliderSVG(this.maxSliderX, 'slider-max', sliderShape);\n }\n\n private generateSliderSVG(\n sliderPositionX: number,\n id: SliderId,\n sliderShape: string\n ): SVGTemplateResult {\n // whether the curved part of the slider is facing towards the left (1), ie\n // minimum, or facing towards the right (-1), ie maximum\n const k = id === 'slider-min' ? 1 : -1;\n\n return svg`\n <svg\n id=\"${id}\"\n class=\"\n ${this.disabled ? '' : 'draggable'} \n ${this._isDragging ? 'dragging' : ''}\"\n @pointerdown=\"${this.drag}\"\n >\n <path d=\"${sliderShape} z\" fill=\"${sliderColor}\" />\n <rect\n x=\"${\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.4 * k\n }\"\n y=\"${this.height / 3}\"\n width=\"1\"\n height=\"${this.height / 3}\"\n fill=\"white\"\n />\n <rect\n x=\"${\n sliderPositionX - this.sliderWidth * k + this.sliderWidth * 0.6 * k\n }\"\n y=\"${this.height / 3}\"\n width=\"1\"\n height=\"${this.height / 3}\"\n fill=\"white\"\n />\n </svg>\n `;\n }\n\n get selectedRangeTemplate(): SVGTemplateResult {\n return svg`\n <rect\n x=\"${this.minSliderX}\"\n y=\"0\"\n width=\"${this.maxSliderX - this.minSliderX}\"\n height=\"${this.height}\"\n fill=\"${selectedRangeColor}\"\n />`;\n }\n\n get histogramTemplate(): SVGTemplateResult[] {\n const xScale = this._histWidth / this._numBins;\n const barWidth = xScale - 1;\n let x = this.sliderWidth; // start at the left edge of the histogram\n\n // the stroke-dasharray style below creates a transparent border around the\n // right edge of the bar, which prevents user from encountering a gap\n // between adjacent bars (eg when viewing the tooltips or when trying to\n // extend the range by clicking on a bar)\n return this._histData.map(data => {\n const bar = svg`\n <rect\n class=\"bar\"\n style='stroke-dasharray: 0 ${barWidth} ${data.height} ${barWidth} 0 ${\n data.height\n };'\n x=\"${x}\"\n y=\"${this.height - data.height}\"\n width=\"${barWidth}\"\n height=\"${data.height}\"\n @pointerenter=\"${this.showTooltip}\"\n @pointerleave=\"${this.hideTooltip}\"\n @click=\"${this.handleBarClick}\"\n fill=\"${\n x + barWidth >= this.minSliderX && x <= this.maxSliderX\n ? barIncludedFill\n : barExcludedFill\n }\"\n data-num-items=\"${data.value}\"\n data-bin-start=\"${data.binStart}\"\n data-bin-end=\"${data.binEnd}\"\n />`;\n x += xScale;\n return bar;\n });\n }\n\n private formatDate(dateMS: number): string {\n if (Number.isNaN(dateMS)) {\n return '';\n }\n const date = dayjs(dateMS);\n if (date.year() < 1000) {\n // years before 1000 don't play well with dayjs custom formatting, so fall\n // back to displaying only the year\n return String(date.year());\n }\n return date.format(this.dateFormat);\n }\n\n /**\n * NOTE: we are relying on the lit `live` directive in the template to\n * ensure that the change to minSelectedDate is noticed and the input value\n * gets properly re-rendered. see\n * https://lit.dev/docs/templates/directives/#live\n */\n get minInputTemplate(): TemplateResult {\n return html`\n <input\n id=\"date-min\"\n placeholder=\"${this.dateFormat}\"\n type=\"text\"\n @focus=\"${this.cancelPendingUpdateEvent}\"\n @blur=\"${this.handleMinDateInput}\"\n @keyup=\"${this.handleKeyUp}\"\n .value=\"${live(this.minSelectedDate)}\"\n ?disabled=\"${this.disabled}\"\n />\n `;\n }\n\n get maxInputTemplate(): TemplateResult {\n return html`\n <input\n id=\"date-max\"\n placeholder=\"${this.dateFormat}\"\n type=\"text\"\n @focus=\"${this.cancelPendingUpdateEvent}\"\n @blur=\"${this.handleMaxDateInput}\"\n @keyup=\"${this.handleKeyUp}\"\n .value=\"${live(this.maxSelectedDate)}\"\n ?disabled=\"${this.disabled}\"\n />\n `;\n }\n\n get tooltipTemplate(): TemplateResult {\n return html`\n <style>\n #tooltip {\n width: ${this.tooltipWidth}px;\n height: ${this.tooltipHeight}px;\n top: ${-9 - this.tooltipHeight}px;\n left: ${this._tooltipOffset}px;\n display: ${this._tooltipVisible ? 'block' : 'none'};\n }\n #tooltip:after {\n left: ${this.tooltipWidth / 2}px;\n }\n </style>\n <div id=\"tooltip\">${this._tooltipContent}</div>\n `;\n }\n\n private get noDataTemplate(): TemplateResult {\n return html`\n <div class=\"missing-data-message\">${this.missingDataMessage}</div>\n `;\n }\n\n private get activityIndicatorTemplate(): TemplateResult | typeof nothing {\n if (!this.loading) {\n return nothing;\n }\n return html`\n <ia-activity-indicator mode=\"processing\"> </ia-activity-indicator>\n `;\n }\n\n static styles = css`\n .missing-data-message {\n text-align: center;\n }\n #container {\n margin: 0;\n touch-action: none;\n position: relative;\n }\n .disabled {\n opacity: 0.3;\n }\n ia-activity-indicator {\n position: absolute;\n left: calc(50% - 10px);\n top: 10px;\n width: 20px;\n height: 20px;\n --activityIndicatorLoadingDotColor: rgba(0, 0, 0, 0);\n --activityIndicatorLoadingRingColor: ${activityIndicatorColor};\n }\n\n /* prevent selection from interfering with tooltip, especially on mobile */\n /* https://stackoverflow.com/a/4407335/1163042 */\n .noselect {\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Safari */\n -moz-user-select: none; /* Old versions of Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none; /* current Chrome, Edge, Opera and Firefox */\n }\n .bar {\n /* create a transparent border around the hist bars to prevent \"gaps\" and\n flickering when moving around between bars. this also helps with handling\n clicks on the bars, preventing users from being able to click in between\n bars */\n stroke: rgba(0, 0, 0, 0);\n /* ensure transparent stroke wide enough to cover gap between bars */\n stroke-width: 2px;\n }\n .bar:hover {\n /* highlight currently hovered bar */\n fill-opacity: 0.7;\n }\n .disabled .bar:hover {\n /* ensure no visual hover interaction when disabled */\n fill-opacity: 1;\n }\n /****** histogram ********/\n #tooltip {\n position: absolute;\n background: ${tooltipBackgroundColor};\n color: ${tooltipTextColor};\n text-align: center;\n border-radius: 3px;\n padding: 2px;\n font-size: ${tooltipFontSize};\n font-family: ${tooltipFontFamily};\n touch-action: none;\n pointer-events: none;\n }\n #tooltip:after {\n content: '';\n position: absolute;\n margin-left: -5px;\n top: 100%;\n /* arrow */\n border: 5px solid ${tooltipTextColor};\n border-color: ${tooltipBackgroundColor} transparent transparent\n transparent;\n }\n /****** slider ********/\n .draggable:hover {\n cursor: grab;\n }\n .dragging {\n cursor: grabbing !important;\n }\n /****** inputs ********/\n #inputs {\n display: flex;\n justify-content: center;\n }\n #inputs .dash {\n position: relative;\n bottom: -1px;\n }\n input {\n width: ${inputWidth};\n margin: 0 3px;\n border: ${inputBorder};\n border-radius: 2px !important;\n text-align: center;\n font-size: ${inputFontSize};\n font-family: ${inputFontFamily};\n }\n `;\n\n render(): TemplateResult {\n if (!this.hasBinData) {\n return this.noDataTemplate;\n }\n return html`\n <div\n id=\"container\"\n class=\"\n noselect \n ${this._isDragging ? 'dragging' : ''}\n \"\n style=\"width: ${this.width}px\"\n >\n ${this.activityIndicatorTemplate} ${this.tooltipTemplate}\n <div\n class=\"inner-container\n ${this.disabled ? 'disabled' : ''}\"\n >\n <svg\n width=\"${this.width}\"\n height=\"${this.height}\"\n @pointerleave=\"${this.drop}\"\n >\n ${this.selectedRangeTemplate}\n <svg id=\"histogram\">${this.histogramTemplate}</svg>\n ${this.minSliderTemplate} ${this.maxSliderTemplate}\n </svg>\n <div id=\"inputs\">\n ${this.minInputTemplate}\n <div class=\"dash\">-</div>\n ${this.maxInputTemplate}\n </div>\n </div>\n </div>\n `;\n }\n}\n\n// help TypeScript provide strong typing when interacting with DOM APIs\n// https://stackoverflow.com/questions/65148695/lit-element-typescript-project-global-interface-declaration-necessary\ndeclare global {\n interface HTMLElementTagNameMap {\n 'histogram-date-range': HistogramDateRange;\n }\n}\n"]}
@@ -1,4 +1,3 @@
1
- /* eslint-disable no-debugger */
2
1
  import { html, fixture, expect, oneEvent, aTimeout } from '@open-wc/testing';
3
2
  import '../src/histogram-date-range';
4
3
  const SLIDER_WIDTH = 10;
@@ -9,9 +8,8 @@ const subject = html `
9
8
  tooltipWidth="140"
10
9
  height="50"
11
10
  dateFormat="M/D/YYYY"
12
- updateDelay="10"
13
11
  minDate="1900"
14
- maxDate="Dec 4, 2020"
12
+ maxDate="12/4/2020"
15
13
  bins="[33, 1, 100]"
16
14
  >
17
15
  </histogram-date-range>
@@ -49,38 +47,42 @@ describe('HistogramDateRange', () => {
49
47
  /* -------------------------- minimum (left) slider ------------------------- */
50
48
  expect(el.minSliderX).to.eq(SLIDER_WIDTH);
51
49
  const minDateInput = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#date-min');
50
+ const pressEnterEvent = new KeyboardEvent('keyup', {
51
+ key: 'Enter',
52
+ });
52
53
  // valid min date
53
54
  minDateInput.value = '1950';
54
- minDateInput.dispatchEvent(new Event('blur'));
55
+ minDateInput.dispatchEvent(pressEnterEvent);
55
56
  expect(Math.floor(el.minSliderX)).to.eq(84);
56
57
  expect(el.minSelectedDate).to.eq('1/1/1950'); // set to correct format
57
58
  // attempt to set date earlier than first item
58
- minDateInput.value = 'October 1, 1850';
59
+ minDateInput.value = '10/1/1850';
59
60
  minDateInput.dispatchEvent(new Event('blur'));
60
61
  expect(Math.floor(el.minSliderX)).to.eq(SLIDER_WIDTH); // leftmost valid position
61
- expect(el.minSelectedDate).to.eq('1/1/1900'); // leftmost valid date
62
+ // allow date value less than slider range
63
+ expect(el.minSelectedDate).to.eq('10/1/1850');
62
64
  /* -------------------------- maximum (right) slider ------------------------- */
63
65
  expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);
64
66
  const maxDateInput = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#date-max');
65
67
  // set valid max date
66
- maxDateInput.value = 'March 12 1975';
67
- maxDateInput.dispatchEvent(new Event('blur'));
68
- await el.updateComplete;
68
+ maxDateInput.value = '3/12/1975';
69
+ maxDateInput.dispatchEvent(pressEnterEvent);
69
70
  expect(Math.floor(el.maxSliderX)).to.eq(121);
70
71
  expect(maxDateInput.value).to.eq('3/12/1975');
71
72
  // attempt to set date later than last item
72
- maxDateInput.value = 'Dec 31 2199';
73
+ maxDateInput.value = '12/31/2199';
73
74
  maxDateInput.dispatchEvent(new Event('blur'));
74
75
  await el.updateComplete;
75
76
  expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH); // rightmost valid position
76
- expect(maxDateInput.value).to.eq('12/4/2020'); // rightmost valid date
77
+ // allow date value greater than slider range
78
+ expect(maxDateInput.value).to.eq('12/31/2199');
77
79
  });
78
80
  it('handles invalid date inputs', async () => {
79
81
  var _a, _b;
80
82
  const el = await createCustomElementInHTMLContainer();
81
83
  /* -------------------------- minimum (left) slider ------------------------- */
82
84
  const minDateInput = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#date-min');
83
- minDateInput.value = 'May 17, 1961';
85
+ minDateInput.value = '5/17/1961';
84
86
  minDateInput.dispatchEvent(new Event('blur'));
85
87
  await el.updateComplete;
86
88
  expect(Math.floor(el.minSliderX)).to.eq(101);
@@ -161,14 +163,15 @@ describe('HistogramDateRange', () => {
161
163
  it("emits a custom event when the element's date range changes", async () => {
162
164
  var _a;
163
165
  const el = await createCustomElementInHTMLContainer();
164
- el.updateDelay = 30; // set slightly longer debounce delay for these tests
166
+ el.updateDelay = 30; // set debounce delay of 30ms
165
167
  const minDateInput = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#date-min');
166
168
  const updateEventPromise = oneEvent(el, 'histogramDateRangeUpdated');
167
169
  // simulate typing a new value into input
168
170
  minDateInput.value = '1955';
169
171
  minDateInput.dispatchEvent(new Event('blur'));
170
- // verify that event is emitted
172
+ // will wait longer than debounce delay
171
173
  const { detail } = await updateEventPromise;
174
+ // verify that event is emitted
172
175
  expect(detail.minDate).to.equal('1/1/1955');
173
176
  expect(detail.maxDate).to.equal('12/4/2020');
174
177
  let eventCount = 0;
@@ -176,7 +179,7 @@ describe('HistogramDateRange', () => {
176
179
  // events are not sent if no change since the last event that was sent
177
180
  minDateInput.value = '1955';
178
181
  minDateInput.dispatchEvent(new Event('blur'));
179
- await aTimeout(60);
182
+ await aTimeout(60); // wait longer than debounce delay
180
183
  expect(eventCount).to.equal(0);
181
184
  const updateEventPromise2 = oneEvent(el, 'histogramDateRangeUpdated');
182
185
  // with the debounce, multiple quick changes only result in one event sent
@@ -198,13 +201,16 @@ describe('HistogramDateRange', () => {
198
201
  it('shows/hides tooltip when hovering over (or pointing at) a bar', async () => {
199
202
  var _a, _b;
200
203
  const el = await createCustomElementInHTMLContainer();
204
+ // include a number which will require commas (1,000,000)
205
+ el.bins = [1000000, 1, 100];
206
+ await aTimeout(10);
201
207
  const bars = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.bar');
202
208
  const tooltip = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#tooltip');
203
209
  expect(tooltip.innerText).to.eq('');
204
210
  // hover
205
211
  bars[0].dispatchEvent(new PointerEvent('pointerenter'));
206
212
  await el.updateComplete;
207
- expect(tooltip.innerText).to.match(/^33 items\n1\/1\/1900 - 4\/23\/1940/);
213
+ expect(tooltip.innerText).to.match(/^1,000,000 items\n1\/1\/1900 - 4\/23\/1940/);
208
214
  expect(getComputedStyle(tooltip).display).to.eq('block');
209
215
  // leave
210
216
  bars[0].dispatchEvent(new PointerEvent('pointerleave'));
@@ -267,11 +273,34 @@ describe('HistogramDateRange', () => {
267
273
  `);
268
274
  const leftBarToClick = Array.from((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.bar'))[1]; // click on second bar to the left
269
275
  leftBarToClick.dispatchEvent(new Event('click'));
276
+ await el.updateComplete;
270
277
  expect(el.minSelectedDate).to.eq('1910'); // range was extended to left
271
278
  const rightBarToClick = Array.from((_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('.bar'))[8]; // click on second bar from the right
272
279
  rightBarToClick.dispatchEvent(new Event('click'));
273
280
  expect(el.maxSelectedDate).to.eq('1998'); // range was extended to right
274
281
  });
282
+ it('narrows the selected range when the histogram is clicked inside of the current range', async () => {
283
+ var _a, _b;
284
+ const el = await fixture(html `
285
+ <histogram-date-range
286
+ minDate="1900"
287
+ maxDate="2020"
288
+ minSelectedDate="1900"
289
+ maxSelectedDate="2020"
290
+ bins="[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]"
291
+ >
292
+ </histogram-date-range>
293
+ `);
294
+ ///////////////////////////////////////////////
295
+ // NB: the slider nearest the clicked bar moves
296
+ ///////////////////////////////////////////////
297
+ const leftBarToClick = Array.from((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.bar'))[3]; // click on fourth bar to the left
298
+ leftBarToClick.dispatchEvent(new Event('click'));
299
+ expect(el.minSelectedDate).to.eq('1932'); // range was extended to the right
300
+ const rightBarToClick = Array.from((_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('.bar'))[8]; // click on second bar from the right
301
+ rightBarToClick.dispatchEvent(new Event('click'));
302
+ expect(el.maxSelectedDate).to.eq('1998'); // range was extended to the left
303
+ });
275
304
  it('handles invalid pre-selected range by defaulting to overall max and min', async () => {
276
305
  var _a, _b;
277
306
  const el = await fixture(html `
@@ -285,9 +314,29 @@ describe('HistogramDateRange', () => {
285
314
  </histogram-date-range>
286
315
  `);
287
316
  const minDateInput = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#date-min');
317
+ // malformed min date defaults to overall min
288
318
  expect(minDateInput.value).to.eq('1900');
289
319
  const maxDateInput = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#date-max');
290
- expect(maxDateInput.value).to.eq('2020');
320
+ // well-formed max date is allowed
321
+ expect(maxDateInput.value).to.eq('5000');
322
+ });
323
+ it('handles year values less than 1000 by overriding date format to just display year', async () => {
324
+ var _a, _b;
325
+ const el = await fixture(html `
326
+ <histogram-date-range
327
+ dateFormat="M/D/YYYY"
328
+ minDate="-2000"
329
+ maxDate="2000"
330
+ minSelectedDate="-500"
331
+ maxSelectedDate="500"
332
+ bins="[33, 1, 100]"
333
+ >
334
+ </histogram-date-range>
335
+ `);
336
+ const minDateInput = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#date-min');
337
+ expect(minDateInput.value).to.eq('-500');
338
+ const maxDateInput = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#date-max');
339
+ expect(maxDateInput.value).to.eq('500');
291
340
  });
292
341
  it('handles missing data', async () => {
293
342
  var _a, _b;
@@ -303,6 +352,16 @@ describe('HistogramDateRange', () => {
303
352
  ></histogram-date-range>`);
304
353
  expect((_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.innerHTML).to.contain('no data available');
305
354
  });
355
+ it('correctly displays data consisting of a single bin', async () => {
356
+ var _a;
357
+ const el = await fixture(html `
358
+ <histogram-date-range minDate="2020" maxDate="2020" bins="[50]">
359
+ </histogram-date-range>
360
+ `);
361
+ const bars = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.bar');
362
+ const heights = Array.from(bars).map(b => b.height.baseVal.value);
363
+ expect(heights).to.eql([157]);
364
+ });
306
365
  it('has a disabled state', async () => {
307
366
  var _a, _b, _c;
308
367
  const el = await fixture(html `
@@ -1 +1 @@
1
- {"version":3,"file":"histogram-date-range.test.js","sourceRoot":"","sources":["../../test/histogram-date-range.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-debugger */\nimport { html, fixture, expect, oneEvent, aTimeout } from '@open-wc/testing';\n\nimport { HistogramDateRange } from '../src/histogram-date-range';\nimport '../src/histogram-date-range';\n\nconst SLIDER_WIDTH = 10;\nconst WIDTH = 200;\n\nconst subject = html`\n <histogram-date-range\n width=\"${WIDTH}\"\n tooltipWidth=\"140\"\n height=\"50\"\n dateFormat=\"M/D/YYYY\"\n updateDelay=\"10\"\n minDate=\"1900\"\n maxDate=\"Dec 4, 2020\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n`;\n\nasync function createCustomElementInHTMLContainer(): Promise<HistogramDateRange> {\n document.head.insertAdjacentHTML(\n 'beforeend',\n `<style>\n html {\n font-size:10px;\n }\n .container {\n width: 400px;\n height: 400px;\n display: flex;\n background: #FFF6E1;\n justify-content: center;\n align-items: center;\n }\n </style>`\n );\n // https://open-wc.org/docs/testing/helpers/#customize-the-fixture-container\n const parentNode = document.createElement('div');\n parentNode.setAttribute('class', 'container');\n return fixture<HistogramDateRange>(subject, { parentNode });\n}\n\ndescribe('HistogramDateRange', () => {\n it('shows scaled histogram bars when provided with data', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = (el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown) as SVGRectElement[];\n const heights = Array.from(bars).map(b => b.height.baseVal.value);\n\n expect(heights).to.eql([38, 7, 50]);\n });\n\n it('changes the position of the sliders and standardizes date format when dates are entered', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n expect(el.minSliderX).to.eq(SLIDER_WIDTH);\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n // valid min date\n minDateInput.value = '1950';\n minDateInput.dispatchEvent(new Event('blur'));\n\n expect(Math.floor(el.minSliderX)).to.eq(84);\n expect(el.minSelectedDate).to.eq('1/1/1950'); // set to correct format\n\n // attempt to set date earlier than first item\n minDateInput.value = 'October 1, 1850';\n minDateInput.dispatchEvent(new Event('blur'));\n\n expect(Math.floor(el.minSliderX)).to.eq(SLIDER_WIDTH); // leftmost valid position\n expect(el.minSelectedDate).to.eq('1/1/1900'); // leftmost valid date\n\n /* -------------------------- maximum (right) slider ------------------------- */\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // set valid max date\n maxDateInput.value = 'March 12 1975';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.maxSliderX)).to.eq(121);\n expect(maxDateInput.value).to.eq('3/12/1975');\n\n // attempt to set date later than last item\n maxDateInput.value = 'Dec 31 2199';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH); // rightmost valid position\n expect(maxDateInput.value).to.eq('12/4/2020'); // rightmost valid date\n });\n\n it('handles invalid date inputs', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n minDateInput.value = 'May 17, 1961';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101);\n expect(minDateInput.value).to.eq('5/17/1961');\n\n // enter invalid value\n minDateInput.value = 'invalid';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101); // does not move\n expect(minDateInput.value).to.eq('5/17/1961'); // resets back to previous date\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial values\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n expect(maxDateInput.value).to.eq('12/4/2020');\n\n // enter invalid value\n maxDateInput.value = 'Abc 12, 1YYY';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.maxSliderX)).to.eq(WIDTH - SLIDER_WIDTH); // does not move\n expect(maxDateInput.value).to.eq('12/4/2020'); // resets back to previous date\n });\n\n it('updates the date inputs when the sliders are moved', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n const container = el.shadowRoot?.querySelector(\n '#container'\n ) as HTMLDivElement;\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n // initial state\n expect(minSlider.getBoundingClientRect().x).to.eq(108);\n expect(Array.from(minSlider.classList).join(' ')).to.eq('draggable');\n\n // pointer down\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor changes to 'grab'\n const classList = minSlider.classList;\n expect(classList.contains('draggable')).to.be.true;\n expect(classList.contains('dragging')).to.be.true;\n\n // slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 70 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(168);\n // min date is updated\n expect(minDateInput.value).to.eq('4/23/1940');\n\n // stop dragging\n window.dispatchEvent(new PointerEvent('pointerup'));\n await el.updateComplete;\n\n // cursor returns to normal\n expect(Array.from(container.classList)).not.to.include('dragging');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial state\n expect(maxSlider.getBoundingClientRect().x).to.eq(298);\n\n // slide to left\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 160 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268);\n // max date is updated\n expect(maxDateInput.value).to.eq('10/8/2000');\n await el.updateComplete;\n\n // try to slide min slider past max slider\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 62 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 190 }));\n await el.updateComplete;\n\n // slider moves all the way to meet the right slider\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(258);\n\n // try to slide max slider past min slider\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 50 }));\n await el.updateComplete;\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268); // max slider didn't move\n });\n\n it(\"emits a custom event when the element's date range changes\", async () => {\n const el = await createCustomElementInHTMLContainer();\n el.updateDelay = 30; // set slightly longer debounce delay for these tests\n\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n const updateEventPromise = oneEvent(el, 'histogramDateRangeUpdated');\n\n // simulate typing a new value into input\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n\n // verify that event is emitted\n const { detail } = await updateEventPromise;\n expect(detail.minDate).to.equal('1/1/1955');\n expect(detail.maxDate).to.equal('12/4/2020');\n\n let eventCount = 0;\n el.addEventListener('histogramDateRangeUpdated', () => (eventCount += 1));\n\n // events are not sent if no change since the last event that was sent\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(60);\n expect(eventCount).to.equal(0);\n\n const updateEventPromise2 = oneEvent(el, 'histogramDateRangeUpdated');\n\n // with the debounce, multiple quick changes only result in one event sent\n minDateInput.value = '1965';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10); // wait less than the debounce delay\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1975';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1985';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n const event2 = await updateEventPromise2;\n expect(event2.detail.minDate).to.equal('1/1/1985');\n expect(eventCount).to.equal(1); // only one event was fired\n });\n\n it('shows/hides tooltip when hovering over (or pointing at) a bar', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = (el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown) as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n\n // hover\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^33 items\\n1\\/1\\/1900 - 4\\/23\\/1940/);\n expect(getComputedStyle(tooltip).display).to.eq('block');\n\n // leave\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\n await el.updateComplete;\n expect(getComputedStyle(tooltip).display).to.eq('none');\n expect(tooltip.innerText).to.eq('');\n\n // ensure singular item is not pluralized\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^1 item\\n4\\/23\\/1940 - 8\\/13\\/1980/);\n });\n\n it('does not show tooltip while dragging', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = (el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown) as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n // pointer down and slide right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 100 }));\n await el.updateComplete;\n\n // hover over bar\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n // tooltip display is suppressed while dragging\n expect(tooltip.style.display).to.eq('');\n });\n\n it('passes the a11y audit', async () => {\n await fixture<HistogramDateRange>(subject).then(el =>\n expect(el).shadowDom.to.be.accessible()\n );\n });\n\n it('allows range to be pre-selected', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"Dec 4, 2020\"\n minSelectedDate=\"2012\"\n maxSelectedDate=\"2019\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('2012');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2019');\n });\n\n it('extends the selected range when the histogram is clicked outside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1950\"\n maxSelectedDate=\"1955\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\n )[1]; // click on second bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n expect(el.minSelectedDate).to.eq('1910'); // range was extended to left\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to right\n });\n\n it('handles invalid pre-selected range by defaulting to overall max and min', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"2000xyz\"\n maxSelectedDate=\"5000\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('1900');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2020');\n });\n\n it('handles missing data', async () => {\n let el = await fixture<HistogramDateRange>(\n html`<histogram-date-range>\n minDate=\"1900\" maxDate=\"2020\" bins=\"\"\n </histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data');\n el = await fixture<HistogramDateRange>(\n html`<histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n bins=\"[]\"\n missingDataMessage=\"no data available\"\n ></histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data available');\n });\n\n it('has a disabled state', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n disabled\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('.inner-container')\n ?.classList.contains('disabled')\n ).to.eq(true);\n\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8); // initial state\n\n // attempt to slide to right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor is not draggable if disabled\n expect(Array.from(minSlider.classList).join(' ')).to.eq('');\n\n // attempt to slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 70 }));\n await el.updateComplete;\n\n // slider does not moved if element disabled\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8);\n });\n\n it('has a loading state with an activity indicator', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n loading\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('ia-activity-indicator')\n ?.attributes?.getNamedItem('mode')?.value\n ).to.eq('processing');\n });\n});\n"]}
1
+ {"version":3,"file":"histogram-date-range.test.js","sourceRoot":"","sources":["../../test/histogram-date-range.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, fixture, expect, oneEvent, aTimeout } from '@open-wc/testing';\n\nimport { HistogramDateRange } from '../src/histogram-date-range';\nimport '../src/histogram-date-range';\n\nconst SLIDER_WIDTH = 10;\nconst WIDTH = 200;\n\nconst subject = html`\n <histogram-date-range\n width=\"${WIDTH}\"\n tooltipWidth=\"140\"\n height=\"50\"\n dateFormat=\"M/D/YYYY\"\n minDate=\"1900\"\n maxDate=\"12/4/2020\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n`;\n\nasync function createCustomElementInHTMLContainer(): Promise<HistogramDateRange> {\n document.head.insertAdjacentHTML(\n 'beforeend',\n `<style>\n html {\n font-size:10px;\n }\n .container {\n width: 400px;\n height: 400px;\n display: flex;\n background: #FFF6E1;\n justify-content: center;\n align-items: center;\n }\n </style>`\n );\n // https://open-wc.org/docs/testing/helpers/#customize-the-fixture-container\n const parentNode = document.createElement('div');\n parentNode.setAttribute('class', 'container');\n return fixture<HistogramDateRange>(subject, { parentNode });\n}\n\ndescribe('HistogramDateRange', () => {\n it('shows scaled histogram bars when provided with data', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars).map(b => b.height.baseVal.value);\n\n expect(heights).to.eql([38, 7, 50]);\n });\n\n it('changes the position of the sliders and standardizes date format when dates are entered', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n expect(el.minSliderX).to.eq(SLIDER_WIDTH);\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n const pressEnterEvent = new KeyboardEvent('keyup', {\n key: 'Enter',\n });\n\n // valid min date\n minDateInput.value = '1950';\n minDateInput.dispatchEvent(pressEnterEvent);\n\n expect(Math.floor(el.minSliderX)).to.eq(84);\n expect(el.minSelectedDate).to.eq('1/1/1950'); // set to correct format\n\n // attempt to set date earlier than first item\n minDateInput.value = '10/1/1850';\n minDateInput.dispatchEvent(new Event('blur'));\n\n expect(Math.floor(el.minSliderX)).to.eq(SLIDER_WIDTH); // leftmost valid position\n // allow date value less than slider range\n expect(el.minSelectedDate).to.eq('10/1/1850');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // set valid max date\n maxDateInput.value = '3/12/1975';\n maxDateInput.dispatchEvent(pressEnterEvent);\n\n expect(Math.floor(el.maxSliderX)).to.eq(121);\n expect(maxDateInput.value).to.eq('3/12/1975');\n\n // attempt to set date later than last item\n maxDateInput.value = '12/31/2199';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH); // rightmost valid position\n // allow date value greater than slider range\n expect(maxDateInput.value).to.eq('12/31/2199');\n });\n\n it('handles invalid date inputs', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n minDateInput.value = '5/17/1961';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101);\n expect(minDateInput.value).to.eq('5/17/1961');\n\n // enter invalid value\n minDateInput.value = 'invalid';\n minDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.minSliderX)).to.eq(101); // does not move\n expect(minDateInput.value).to.eq('5/17/1961'); // resets back to previous date\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial values\n expect(el.maxSliderX).to.eq(WIDTH - SLIDER_WIDTH);\n expect(maxDateInput.value).to.eq('12/4/2020');\n\n // enter invalid value\n maxDateInput.value = 'Abc 12, 1YYY';\n maxDateInput.dispatchEvent(new Event('blur'));\n await el.updateComplete;\n\n expect(Math.floor(el.maxSliderX)).to.eq(WIDTH - SLIDER_WIDTH); // does not move\n expect(maxDateInput.value).to.eq('12/4/2020'); // resets back to previous date\n });\n\n it('updates the date inputs when the sliders are moved', async () => {\n const el = await createCustomElementInHTMLContainer();\n\n /* -------------------------- minimum (left) slider ------------------------- */\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n const container = el.shadowRoot?.querySelector(\n '#container'\n ) as HTMLDivElement;\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n\n // initial state\n expect(minSlider.getBoundingClientRect().x).to.eq(108);\n expect(Array.from(minSlider.classList).join(' ')).to.eq('draggable');\n\n // pointer down\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor changes to 'grab'\n const classList = minSlider.classList;\n expect(classList.contains('draggable')).to.be.true;\n expect(classList.contains('dragging')).to.be.true;\n\n // slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 70 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(168);\n // min date is updated\n expect(minDateInput.value).to.eq('4/23/1940');\n\n // stop dragging\n window.dispatchEvent(new PointerEvent('pointerup'));\n await el.updateComplete;\n\n // cursor returns to normal\n expect(Array.from(container.classList)).not.to.include('dragging');\n\n /* -------------------------- maximum (right) slider ------------------------- */\n const maxSlider = el.shadowRoot?.querySelector('#slider-max') as SVGElement;\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n\n // initial state\n expect(maxSlider.getBoundingClientRect().x).to.eq(298);\n\n // slide to left\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 195 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 160 }));\n await el.updateComplete;\n\n // slider has moved\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268);\n // max date is updated\n expect(maxDateInput.value).to.eq('10/8/2000');\n await el.updateComplete;\n\n // try to slide min slider past max slider\n minSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 62 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 190 }));\n await el.updateComplete;\n\n // slider moves all the way to meet the right slider\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(258);\n\n // try to slide max slider past min slider\n maxSlider.dispatchEvent(new PointerEvent('pointerdown', { clientX: 120 }));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 50 }));\n await el.updateComplete;\n expect(Math.round(maxSlider.getBoundingClientRect().x)).to.eq(268); // max slider didn't move\n });\n\n it(\"emits a custom event when the element's date range changes\", async () => {\n const el = await createCustomElementInHTMLContainer();\n el.updateDelay = 30; // set debounce delay of 30ms\n\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n const updateEventPromise = oneEvent(el, 'histogramDateRangeUpdated');\n\n // simulate typing a new value into input\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n\n // will wait longer than debounce delay\n const { detail } = await updateEventPromise;\n // verify that event is emitted\n expect(detail.minDate).to.equal('1/1/1955');\n expect(detail.maxDate).to.equal('12/4/2020');\n\n let eventCount = 0;\n el.addEventListener('histogramDateRangeUpdated', () => (eventCount += 1));\n\n // events are not sent if no change since the last event that was sent\n minDateInput.value = '1955';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(60); // wait longer than debounce delay\n expect(eventCount).to.equal(0);\n\n const updateEventPromise2 = oneEvent(el, 'histogramDateRangeUpdated');\n\n // with the debounce, multiple quick changes only result in one event sent\n minDateInput.value = '1965';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10); // wait less than the debounce delay\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1975';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n minDateInput.dispatchEvent(new Event('focus'));\n minDateInput.value = '1985';\n minDateInput.dispatchEvent(new Event('blur'));\n await aTimeout(10);\n\n const event2 = await updateEventPromise2;\n expect(event2.detail.minDate).to.equal('1/1/1985');\n expect(eventCount).to.equal(1); // only one event was fired\n });\n\n it('shows/hides tooltip when hovering over (or pointing at) a bar', async () => {\n const el = await createCustomElementInHTMLContainer();\n // include a number which will require commas (1,000,000)\n el.bins = [1000000, 1, 100];\n await aTimeout(10);\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n\n // hover\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(\n /^1,000,000 items\\n1\\/1\\/1900 - 4\\/23\\/1940/\n );\n expect(getComputedStyle(tooltip).display).to.eq('block');\n\n // leave\n bars[0].dispatchEvent(new PointerEvent('pointerleave'));\n await el.updateComplete;\n expect(getComputedStyle(tooltip).display).to.eq('none');\n expect(tooltip.innerText).to.eq('');\n\n // ensure singular item is not pluralized\n bars[1].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n expect(tooltip.innerText).to.match(/^1 item\\n4\\/23\\/1940 - 8\\/13\\/1980/);\n });\n\n it('does not show tooltip while dragging', async () => {\n const el = await createCustomElementInHTMLContainer();\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const tooltip = el.shadowRoot?.querySelector('#tooltip') as HTMLDivElement;\n expect(tooltip.innerText).to.eq('');\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n // pointer down and slide right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 100 }));\n await el.updateComplete;\n\n // hover over bar\n bars[0].dispatchEvent(new PointerEvent('pointerenter'));\n await el.updateComplete;\n // tooltip display is suppressed while dragging\n expect(tooltip.style.display).to.eq('');\n });\n\n it('passes the a11y audit', async () => {\n await fixture<HistogramDateRange>(subject).then(el =>\n expect(el).shadowDom.to.be.accessible()\n );\n });\n\n it('allows range to be pre-selected', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"Dec 4, 2020\"\n minSelectedDate=\"2012\"\n maxSelectedDate=\"2019\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('2012');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('2019');\n });\n\n it('extends the selected range when the histogram is clicked outside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1950\"\n maxSelectedDate=\"1955\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\n )[1]; // click on second bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n await el.updateComplete;\n expect(el.minSelectedDate).to.eq('1910'); // range was extended to left\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to right\n });\n\n it('narrows the selected range when the histogram is clicked inside of the current range', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"1900\"\n maxSelectedDate=\"2020\"\n bins=\"[33, 1, 1, 1, 10, 10, 1, 1, 1, 50, 100]\"\n >\n </histogram-date-range>\n `\n );\n\n ///////////////////////////////////////////////\n // NB: the slider nearest the clicked bar moves\n ///////////////////////////////////////////////\n\n const leftBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\n )[3]; // click on fourth bar to the left\n\n leftBarToClick.dispatchEvent(new Event('click'));\n expect(el.minSelectedDate).to.eq('1932'); // range was extended to the right\n\n const rightBarToClick = Array.from(\n el.shadowRoot?.querySelectorAll('.bar') as NodeList\n )[8]; // click on second bar from the right\n\n rightBarToClick.dispatchEvent(new Event('click'));\n expect(el.maxSelectedDate).to.eq('1998'); // range was extended to the left\n });\n\n it('handles invalid pre-selected range by defaulting to overall max and min', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n minSelectedDate=\"2000xyz\"\n maxSelectedDate=\"5000\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n // malformed min date defaults to overall min\n expect(minDateInput.value).to.eq('1900');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n // well-formed max date is allowed\n expect(maxDateInput.value).to.eq('5000');\n });\n\n it('handles year values less than 1000 by overriding date format to just display year', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n dateFormat=\"M/D/YYYY\"\n minDate=\"-2000\"\n maxDate=\"2000\"\n minSelectedDate=\"-500\"\n maxSelectedDate=\"500\"\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n const minDateInput = el.shadowRoot?.querySelector(\n '#date-min'\n ) as HTMLInputElement;\n expect(minDateInput.value).to.eq('-500');\n\n const maxDateInput = el.shadowRoot?.querySelector(\n '#date-max'\n ) as HTMLInputElement;\n expect(maxDateInput.value).to.eq('500');\n });\n\n it('handles missing data', async () => {\n let el = await fixture<HistogramDateRange>(\n html`<histogram-date-range>\n minDate=\"1900\" maxDate=\"2020\" bins=\"\"\n </histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data');\n el = await fixture<HistogramDateRange>(\n html`<histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n bins=\"[]\"\n missingDataMessage=\"no data available\"\n ></histogram-date-range>`\n );\n expect(el.shadowRoot?.innerHTML).to.contain('no data available');\n });\n\n it('correctly displays data consisting of a single bin', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range minDate=\"2020\" maxDate=\"2020\" bins=\"[50]\">\n </histogram-date-range>\n `\n );\n const bars = el.shadowRoot?.querySelectorAll(\n '.bar'\n ) as unknown as SVGRectElement[];\n const heights = Array.from(bars).map(b => b.height.baseVal.value);\n expect(heights).to.eql([157]);\n });\n\n it('has a disabled state', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n disabled\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('.inner-container')\n ?.classList.contains('disabled')\n ).to.eq(true);\n\n const minSlider = el.shadowRoot?.querySelector('#slider-min') as SVGElement;\n\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8); // initial state\n\n // attempt to slide to right\n minSlider.dispatchEvent(new PointerEvent('pointerdown'));\n await el.updateComplete;\n\n // cursor is not draggable if disabled\n expect(Array.from(minSlider.classList).join(' ')).to.eq('');\n\n // attempt to slide to right\n window.dispatchEvent(new PointerEvent('pointermove', { clientX: 70 }));\n await el.updateComplete;\n\n // slider does not moved if element disabled\n expect(Math.round(minSlider.getBoundingClientRect().x)).to.eq(8);\n });\n\n it('has a loading state with an activity indicator', async () => {\n const el = await fixture<HistogramDateRange>(\n html`\n <histogram-date-range\n minDate=\"1900\"\n maxDate=\"2020\"\n loading\n bins=\"[33, 1, 100]\"\n >\n </histogram-date-range>\n `\n );\n expect(\n el.shadowRoot\n ?.querySelector('ia-activity-indicator')\n ?.attributes?.getNamedItem('mode')?.value\n ).to.eq('processing');\n });\n});\n"]}