UNPKG

2.38 MBSource Map (JSON)View Raw
1{"version":3,"sources":["webpack://LineUpJS/webpack/universalModuleDefinition","webpack://LineUpJS/webpack/bootstrap","webpack://LineUpJS/./node_modules/fast-deep-equal/index.js","webpack://LineUpJS/./node_modules/lodash.get/index.js","webpack://LineUpJS/./node_modules/detect-browser/index.js","webpack://LineUpJS/./node_modules/reflect-metadata/Reflect.js","webpack://LineUpJS/./node_modules/tslib/tslib.es6.js","webpack://LineUpJS/./src/internal/interable.ts","webpack://LineUpJS/./src/internal/worker.ts","webpack://LineUpJS/./src/internal/math.ts","webpack://LineUpJS/./src/internal/utils.ts","webpack://LineUpJS/./node_modules/d3-dispatch/src/dispatch.js","webpack://LineUpJS/./src/internal/AEventDispatcher.ts","webpack://LineUpJS/./src/model/interfaces.ts","webpack://LineUpJS/./src/model/Column.ts","webpack://LineUpJS/./src/model/annotations.ts","webpack://LineUpJS/./src/model/INumberColumn.ts","webpack://LineUpJS/./src/model/ValueColumn.ts","webpack://LineUpJS/./src/model/CompositeColumn.ts","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/colors.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/category10.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/Accent.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/Dark2.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/Pastel1.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/Paired.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/Pastel2.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/Set1.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/Set2.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/categorical/Set3.js","webpack://LineUpJS/./node_modules/d3-color/src/define.js","webpack://LineUpJS/./node_modules/d3-color/src/color.js","webpack://LineUpJS/./node_modules/d3-color/src/math.js","webpack://LineUpJS/./node_modules/d3-color/src/lab.js","webpack://LineUpJS/./node_modules/d3-color/src/cubehelix.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/basis.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/constant.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/color.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/rgb.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/array.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/basisClosed.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/date.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/number.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/object.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/string.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/transform/parse.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/value.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/round.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/transform/decompose.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/transform/index.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/zoom.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/hsl.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/hcl.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/cubehelix.js","webpack://LineUpJS/./node_modules/d3-interpolate/src/quantize.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/ramp.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/BrBG.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/PRGn.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/PiYG.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/PuOr.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/RdBu.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/RdGy.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/diverging/Spectral.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-single/Blues.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-single/Greens.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-single/Greys.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-single/Purples.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-single/Reds.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js","webpack://LineUpJS/./node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js","webpack://LineUpJS/./src/internal/OrderedSet.ts","webpack://LineUpJS/./src/model/internal.ts","webpack://LineUpJS/./src/model/CategoricalColorMappingFunction.ts","webpack://LineUpJS/./src/model/missing.ts","webpack://LineUpJS/./src/model/internalCategorical.ts","webpack://LineUpJS/./src/model/CategoricalColumn.ts","webpack://LineUpJS/./src/model/SetColumn.ts","webpack://LineUpJS/./src/styles/index.ts","webpack://LineUpJS/./src/model/AggregateGroupColumn.ts","webpack://LineUpJS/./src/model/Ranking.ts","webpack://LineUpJS/./src/internal/debounce.ts","webpack://LineUpJS/./src/model/RankColumn.ts","webpack://LineUpJS/./src/model/SelectionColumn.ts","webpack://LineUpJS/./src/model/ActionColumn.ts","webpack://LineUpJS/./src/model/StringColumn.ts","webpack://LineUpJS/./src/internal/mathInterfaces.ts","webpack://LineUpJS/./src/model/AnnotateColumn.ts","webpack://LineUpJS/./src/model/BooleanColumn.ts","webpack://LineUpJS/./src/model/ArrayColumn.ts","webpack://LineUpJS/./src/model/BooleansColumn.ts","webpack://LineUpJS/./node_modules/d3-format/src/formatDecimal.js","webpack://LineUpJS/./node_modules/d3-format/src/exponent.js","webpack://LineUpJS/./node_modules/d3-format/src/formatSpecifier.js","webpack://LineUpJS/./node_modules/d3-format/src/formatTrim.js","webpack://LineUpJS/./node_modules/d3-format/src/formatPrefixAuto.js","webpack://LineUpJS/./node_modules/d3-format/src/defaultLocale.js","webpack://LineUpJS/./node_modules/d3-format/src/formatRounded.js","webpack://LineUpJS/./node_modules/d3-format/src/formatTypes.js","webpack://LineUpJS/./node_modules/d3-format/src/identity.js","webpack://LineUpJS/./node_modules/d3-format/src/locale.js","webpack://LineUpJS/./node_modules/d3-format/src/formatGroup.js","webpack://LineUpJS/./node_modules/d3-format/src/formatNumerals.js","webpack://LineUpJS/./node_modules/d3-format/src/precisionFixed.js","webpack://LineUpJS/./node_modules/d3-array/src/ascending.js","webpack://LineUpJS/./node_modules/d3-array/src/bisector.js","webpack://LineUpJS/./node_modules/d3-array/src/bisect.js","webpack://LineUpJS/./node_modules/d3-array/src/cross.js","webpack://LineUpJS/./node_modules/d3-array/src/array.js","webpack://LineUpJS/./node_modules/d3-array/src/ticks.js","webpack://LineUpJS/./node_modules/d3-scale/src/init.js","webpack://LineUpJS/./node_modules/d3-collection/src/map.js","webpack://LineUpJS/./node_modules/d3-collection/src/set.js","webpack://LineUpJS/./node_modules/d3-scale/src/array.js","webpack://LineUpJS/./node_modules/d3-scale/src/constant.js","webpack://LineUpJS/./node_modules/d3-scale/src/number.js","webpack://LineUpJS/./node_modules/d3-scale/src/continuous.js","webpack://LineUpJS/./node_modules/d3-scale/src/tickFormat.js","webpack://LineUpJS/./node_modules/d3-format/src/precisionPrefix.js","webpack://LineUpJS/./node_modules/d3-format/src/precisionRound.js","webpack://LineUpJS/./node_modules/d3-scale/src/linear.js","webpack://LineUpJS/./node_modules/d3-scale/src/nice.js","webpack://LineUpJS/./node_modules/d3-scale/src/log.js","webpack://LineUpJS/./node_modules/d3-scale/src/pow.js","webpack://LineUpJS/./node_modules/d3-time/src/interval.js","webpack://LineUpJS/./node_modules/d3-time/src/millisecond.js","webpack://LineUpJS/./node_modules/d3-time/src/second.js","webpack://LineUpJS/./node_modules/d3-time/src/duration.js","webpack://LineUpJS/./node_modules/d3-time/src/minute.js","webpack://LineUpJS/./node_modules/d3-time/src/hour.js","webpack://LineUpJS/./node_modules/d3-time/src/day.js","webpack://LineUpJS/./node_modules/d3-time/src/week.js","webpack://LineUpJS/./node_modules/d3-time/src/month.js","webpack://LineUpJS/./node_modules/d3-time/src/year.js","webpack://LineUpJS/./node_modules/d3-time/src/utcMinute.js","webpack://LineUpJS/./node_modules/d3-time/src/utcHour.js","webpack://LineUpJS/./node_modules/d3-time/src/utcDay.js","webpack://LineUpJS/./node_modules/d3-time/src/utcWeek.js","webpack://LineUpJS/./node_modules/d3-time/src/utcMonth.js","webpack://LineUpJS/./node_modules/d3-time/src/utcYear.js","webpack://LineUpJS/./node_modules/d3-time-format/src/locale.js","webpack://LineUpJS/./node_modules/d3-time-format/src/defaultLocale.js","webpack://LineUpJS/./node_modules/d3-time-format/src/isoFormat.js","webpack://LineUpJS/./node_modules/d3-time-format/src/isoParse.js","webpack://LineUpJS/./src/model/MappingFunction.ts","webpack://LineUpJS/./src/model/internalNumber.ts","webpack://LineUpJS/./src/model/NumberColumn.ts","webpack://LineUpJS/./src/model/BoxPlotColumn.ts","webpack://LineUpJS/./src/model/MapColumn.ts","webpack://LineUpJS/./src/model/CategoricalMapColumn.ts","webpack://LineUpJS/./src/model/CategoricalsColumn.ts","webpack://LineUpJS/./src/model/internalDate.ts","webpack://LineUpJS/./src/model/DateColumn.ts","webpack://LineUpJS/./src/model/DatesColumn.ts","webpack://LineUpJS/./src/model/DatesMapColumn.ts","webpack://LineUpJS/./src/model/GroupColumn.ts","webpack://LineUpJS/./src/model/HierarchyColumn.ts","webpack://LineUpJS/./src/model/ColorMappingFunction.ts","webpack://LineUpJS/./src/model/ImpositionCompositeColumn.ts","webpack://LineUpJS/./src/model/NumbersColumn.ts","webpack://LineUpJS/./src/model/ImpositionBoxPlotColumn.ts","webpack://LineUpJS/./src/model/ImpositionCompositesColumn.ts","webpack://LineUpJS/./src/model/CompositeNumberColumn.ts","webpack://LineUpJS/./src/model/ReduceColumn.ts","webpack://LineUpJS/./src/model/StackColumn.ts","webpack://LineUpJS/./src/model/MultiLevelCompositeColumn.ts","webpack://LineUpJS/./src/model/NestedColumn.ts","webpack://LineUpJS/./src/model/NumberMapColumn.ts","webpack://LineUpJS/./src/model/OrdinalColumn.ts","webpack://LineUpJS/./src/model/ScriptColumn.ts","webpack://LineUpJS/./src/model/StringMapColumn.ts","webpack://LineUpJS/./src/model/StringsColumn.ts","webpack://LineUpJS/./src/model/LinkColumn.ts","webpack://LineUpJS/./src/model/LinkMapColumn.ts","webpack://LineUpJS/./src/model/LinksColumn.ts","webpack://LineUpJS/./node_modules/lineupengine/src/abortAble.js","webpack://LineUpJS/./src/provider/interfaces.ts","webpack://LineUpJS/./src/internal/accessor.ts","webpack://LineUpJS/./src/provider/utils.ts","webpack://LineUpJS/./src/provider/internal.ts","webpack://LineUpJS/./src/provider/ADataProvider.ts","webpack://LineUpJS/./src/model/models.ts","webpack://LineUpJS/./src/provider/ACommonDataProvider.ts","webpack://LineUpJS/./src/provider/sort.ts","webpack://LineUpJS/./src/internal/scheduler.ts","webpack://LineUpJS/./src/provider/tasks.ts","webpack://LineUpJS/./src/provider/DirectRenderTasks.ts","webpack://LineUpJS/./src/model/IArrayColumn.ts","webpack://LineUpJS/./src/model/ICategoricalColumn.ts","webpack://LineUpJS/./src/model/IDateColumn.ts","webpack://LineUpJS/./src/provider/ScheduledTasks.ts","webpack://LineUpJS/./src/renderer/interfaces.ts","webpack://LineUpJS/./src/provider/LocalDataProvider.ts","webpack://LineUpJS/./src/renderer/utils.ts","webpack://LineUpJS/./src/constants.ts","webpack://LineUpJS/./src/renderer/ActionRenderer.ts","webpack://LineUpJS/./src/renderer/AggregateGroupRenderer.ts","webpack://LineUpJS/./src/ui/missing.ts","webpack://LineUpJS/./src/renderer/missing.ts","webpack://LineUpJS/./src/renderer/StringCellRenderer.ts","webpack://LineUpJS/./src/renderer/AnnotationRenderer.ts","webpack://LineUpJS/./src/renderer/impose.ts","webpack://LineUpJS/./src/renderer/BarCellRenderer.ts","webpack://LineUpJS/./src/renderer/DefaultCellRenderer.ts","webpack://LineUpJS/./src/renderer/BooleanCellRenderer.ts","webpack://LineUpJS/./src/renderer/BoxplotCellRenderer.ts","webpack://LineUpJS/./src/renderer/BrightnessCellRenderer.ts","webpack://LineUpJS/./src/renderer/CategoricalCellRenderer.ts","webpack://LineUpJS/./src/renderer/CategoricalHeatmapCellRenderer.ts","webpack://LineUpJS/./src/renderer/CategoricalStackedDistributionlCellRenderer.ts","webpack://LineUpJS/./src/renderer/CircleCellRenderer.ts","webpack://LineUpJS/./src/renderer/DotCellRenderer.ts","webpack://LineUpJS/./src/renderer/GroupCellRenderer.ts","webpack://LineUpJS/./src/renderer/ANumbersCellRenderer.ts","webpack://LineUpJS/./node_modules/popper.js/dist/esm/popper.js","webpack://LineUpJS/./src/renderer/HeatmapCellRenderer.ts","webpack://LineUpJS/./src/internal/merge.ts","webpack://LineUpJS/./src/ui/dialogs/ADialog.ts","webpack://LineUpJS/./src/ui/dialogs/APopup.ts","webpack://LineUpJS/./src/ui/dialogs/InputNumberDialog.ts","webpack://LineUpJS/./src/internal/drag.ts","webpack://LineUpJS/./src/renderer/histogram.ts","webpack://LineUpJS/./src/renderer/HistogramCellRenderer.ts","webpack://LineUpJS/./src/renderer/ImageCellRenderer.ts","webpack://LineUpJS/./src/renderer/AAggregatedGroupRenderer.ts","webpack://LineUpJS/./src/renderer/MultiLevelCellRenderer.ts","webpack://LineUpJS/./src/renderer/InterleavingCellRenderer.ts","webpack://LineUpJS/./src/renderer/LinkCellRenderer.ts","webpack://LineUpJS/./src/renderer/TableCellRenderer.ts","webpack://LineUpJS/./src/renderer/LinkMapCellRenderer.ts","webpack://LineUpJS/./src/renderer/LoadingCellRenderer.ts","webpack://LineUpJS/./src/renderer/MapBarCellRenderer.ts","webpack://LineUpJS/./src/renderer/RankCellRenderer.ts","webpack://LineUpJS/./src/renderer/SelectionRenderer.ts","webpack://LineUpJS/./src/renderer/SetCellRenderer.ts","webpack://LineUpJS/./src/renderer/SparklineCellRenderer.ts","webpack://LineUpJS/./src/renderer/UpSetCellRenderer.ts","webpack://LineUpJS/./src/renderer/VerticalBarCellRenderer.ts","webpack://LineUpJS/./src/renderer/DateCellRenderer.ts","webpack://LineUpJS/./src/ui/dialogs/InputDateDialog.ts","webpack://LineUpJS/./src/renderer/DateHistogramCellRenderer.ts","webpack://LineUpJS/./src/renderer/renderers.ts","webpack://LineUpJS/./src/ui/dialogs/CategoricalColorMappingDialog.ts","webpack://LineUpJS/./src/ui/dialogs/CategoricalFilterDialog.ts","webpack://LineUpJS/./src/ui/dialogs/CategoricalMappingFilterDialog.ts","webpack://LineUpJS/./src/ui/dialogs/ChangeRendererDialog.ts","webpack://LineUpJS/./src/ui/dialogs/ColorMappingDialog.ts","webpack://LineUpJS/./src/internal/dnd.ts","webpack://LineUpJS/./src/ui/dialogs/MoreColumnOptionsDialog.ts","webpack://LineUpJS/./src/ui/header.ts","webpack://LineUpJS/./src/ui/dialogs/CompositeChildrenDialog.ts","webpack://LineUpJS/./src/ui/dialogs/CutOffHierarchyDialog.ts","webpack://LineUpJS/./src/ui/dialogs/DateFilterDialog.ts","webpack://LineUpJS/./src/ui/dialogs/EditPatternDialog.ts","webpack://LineUpJS/./src/ui/dialogs/GroupDialog.ts","webpack://LineUpJS/./src/ui/dialogs/MappingLineDialog.ts","webpack://LineUpJS/./src/ui/dialogs/MappingDialog.ts","webpack://LineUpJS/./src/ui/dialogs/NumberFilterDialog.ts","webpack://LineUpJS/./src/ui/dialogs/utils.ts","webpack://LineUpJS/./src/ui/dialogs/ReduceDialog.ts","webpack://LineUpJS/./src/ui/dialogs/RenameDialog.ts","webpack://LineUpJS/./src/ui/dialogs/ScriptEditDialog.ts","webpack://LineUpJS/./src/ui/dialogs/SearchDialog.ts","webpack://LineUpJS/./src/ui/dialogs/ShowTopNDialog.ts","webpack://LineUpJS/./src/ui/dialogs/SortDialog.ts","webpack://LineUpJS/./src/ui/dialogs/StringFilterDialog.ts","webpack://LineUpJS/./src/ui/dialogs/WeightsEditDialog.ts","webpack://LineUpJS/./src/ui/toolbar.ts","webpack://LineUpJS/./src/ui/dialogs/groupNumber.ts","webpack://LineUpJS/./src/ui/dialogs/groupString.ts","webpack://LineUpJS/./src/ui/dialogs/groupDate.ts","webpack://LineUpJS/./src/config.ts","webpack://LineUpJS/./src/browser.ts","webpack://LineUpJS/./src/ui/dialogs/DialogManager.ts","webpack://LineUpJS/./node_modules/lineupengine/src/animation/index.js","webpack://LineUpJS/./src/ui/ALineUp.ts","webpack://LineUpJS/./node_modules/lineupengine/src/animation/KeyFinder.js","webpack://LineUpJS/./node_modules/lineupengine/src/internal/scroll.js","webpack://LineUpJS/./node_modules/lineupengine/src/internal/index.js","webpack://LineUpJS/./node_modules/lineupengine/src/logic.js","webpack://LineUpJS/./node_modules/lineupengine/src/mixin/IMixin.js","webpack://LineUpJS/./node_modules/lineupengine/src/styles/index.js","webpack://LineUpJS/./node_modules/lineupengine/src/ARowRenderer.js","webpack://LineUpJS/./node_modules/lineupengine/src/style/StyleManager.js","webpack://LineUpJS/./node_modules/lineupengine/src/style/GridStyleManager.js","webpack://LineUpJS/./node_modules/lineupengine/src/table/MultiTableRowRenderer.js","webpack://LineUpJS/./node_modules/lineupengine/src/mixin/PrefetchMixin.js","webpack://LineUpJS/./node_modules/lineupengine/src/table/internal/ACellAdapter.js","webpack://LineUpJS/./node_modules/lineupengine/src/table/ACellTableSection.js","webpack://LineUpJS/./src/ui/animation.ts","webpack://LineUpJS/./src/ui/RenderColumn.ts","webpack://LineUpJS/./src/ui/MultiLevelRenderColumn.ts","webpack://LineUpJS/./src/ui/interfaces.ts","webpack://LineUpJS/./src/ui/SelectionManager.ts","webpack://LineUpJS/./src/ui/EngineRanking.ts","webpack://LineUpJS/./src/ui/SlopeGraph.ts","webpack://LineUpJS/./src/ui/EngineRenderer.ts","webpack://LineUpJS/./src/ui/domElementCache.ts","webpack://LineUpJS/./src/ui/dialogs/ChooseRankingDialog.ts","webpack://LineUpJS/./src/ui/panel/SearchBox.ts","webpack://LineUpJS/./src/ui/dialogs/RenameRankingDialog.ts","webpack://LineUpJS/./src/ui/dialogs/MoreRankingOptionsDialog.ts","webpack://LineUpJS/./src/ui/dialogs/AddonDialog.ts","webpack://LineUpJS/./src/ui/panel/Hierarchy.ts","webpack://LineUpJS/./src/ui/panel/SidePanelEntryVis.ts","webpack://LineUpJS/./src/ui/panel/SidePanelRanking.ts","webpack://LineUpJS/./src/ui/panel/SidePanel.ts","webpack://LineUpJS/./src/ui/LineUp.ts","webpack://LineUpJS/./src/ui/taggle/rules.ts","webpack://LineUpJS/./src/ui/taggle/TaggleRenderer.ts","webpack://LineUpJS/./src/ui/taggle/Taggle.ts","webpack://LineUpJS/./src/builder/column/ColumnBuilder.ts","webpack://LineUpJS/./src/builder/LineUpBuilder.ts","webpack://LineUpJS/./src/builder/RankingBuilder.ts","webpack://LineUpJS/./src/builder/column/CategoricalColumnBuilder.ts","webpack://LineUpJS/./src/builder/column/NumberColumnBuilder.ts","webpack://LineUpJS/./src/builder/column/StringColumnBuilder.ts","webpack://LineUpJS/./src/builder/column/DateColumnBuilder.ts","webpack://LineUpJS/./src/builder/column/HierarchyColumnBuilder.ts","webpack://LineUpJS/./src/builder/column/ActionsColumnBuilder.ts","webpack://LineUpJS/./src/builder/column/BooleanColumnBuilder.ts","webpack://LineUpJS/./src/builder/DataBuilder.ts","webpack://LineUpJS/./src/builder/adapter/column.ts","webpack://LineUpJS/./src/builder/adapter/ranking.ts","webpack://LineUpJS/./src/builder/adapter/utils.ts","webpack://LineUpJS/./src/builder/adapter/lineup.ts","webpack://LineUpJS/./src/builder/adapter/builderAdapter.ts","webpack://LineUpJS/./src/model/index.ts","webpack://LineUpJS/./src/provider/RemoteDataProvider.ts","webpack://LineUpJS/./src/renderer/index.ts","webpack://LineUpJS/./src/index.ts","webpack://LineUpJS/./src/bundle.ts"],"names":["root","factory","exports","module","define","amd","window","enumerable","get","getter","value","key","bind","Object","prototype","hasOwnProperty","call","object","property","isArray","Array","keyList","keys","hasProp","equal","a","b","i","length","arrA","arrB","dateA","Date","dateB","getTime","regexpA","RegExp","regexpB","toString","reIsDeepProp","reIsPlainProp","reLeadingDot","rePropName","reEscapeChar","reIsHostCtor","freeGlobal","global","freeSelf","self","Function","uid","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","exec","IE_PROTO","funcToString","objectToString","reIsNative","replace","Symbol","splice","Map","getNative","nativeCreate","symbolProto","undefined","symbolToString","Hash","entries","index","this","clear","entry","set","ListCache","MapCache","assocIndexOf","array","other","baseGet","path","type","isSymbol","test","isKey","stringToPath","toKey","baseIsNative","isObject","func","tag","isFunction","result","e","isHostObject","toSource","getMapData","map","data","__data__","getValue","has","pop","push","memoize","string","baseToString","match","number","quote","resolver","TypeError","memoized","args","arguments","apply","cache","Cache","isObjectLike","defaultValue","defineProperty","BrowserInfo","name","version","os","NodeInfo","process","platform","BotInfo","bot","userAgentRules","operatingSystemRules","parseUserAgent","ua","matchedRule","reduce","matched","_a","browser","regex","uaMatch","versionParts","split","slice","concat","count","output","ii","createVersionParts","join","detectOS","getNodeVersion","detect","navigator","userAgent","Reflect","exporter","makeExporter","target","previous","configurable","writable","hasOwn","supportsSymbol","toPrimitiveSymbol","toPrimitive","iteratorSymbol","iterator","supportsCreate","create","supportsProto","__proto__","downLevel","HashMap","MakeDictionary","functionPrototype","getPrototypeOf","usePolyfill","env","_Map","cacheSentinel","arraySentinel","MapIterator","values","selector","_index","_keys","_values","_selector","next","done","throw","error","return","_cacheKey","_cacheIndex","_find","delete","size","getKey","getEntry","insert","indexOf","_","CreateMapPolyfill","_Set","Set","_map","add","Metadata","WeakMap","rootKey","CreateUniqueKey","_key","table","GetOrCreateWeakMapTable","CreateUUID","FillRandomBytes","buffer","Math","random","Uint8Array","crypto","getRandomValues","msCrypto","offset","byte","toLowerCase","CreateWeakMapPolyfill","GetOrCreateMetadataMap","O","P","Create","targetMetadata","IsUndefined","metadataMap","OrdinaryHasOwnMetadata","MetadataKey","OrdinaryGetOwnMetadata","OrdinaryDefineOwnMetadata","MetadataValue","OrdinaryOwnMetadataKeys","obj","method","GetMethod","IsCallable","IsObject","GetIterator","k","IteratorStep","nextValue","IteratorClose","Type","x","IsNull","ToPrimitive","input","PreferredType","hint","exoticToPrim","toString_1","valueOf","toString_2","OrdinaryToPrimitive","ToPropertyKey","argument","ToString","IsArray","IsConstructor","V","f","OrdinaryGetPrototypeOf","proto","prototypeProto","constructor","__","decorators","propertyKey","attributes","decorated","decorator","DecorateConstructor","descriptor","DecorateProperty","metadataKey","metadataValue","IsPropertyKey","OrdinaryHasMetadata","parent","OrdinaryGetMetadata","OrdinaryMetadataKeys","ownKeys","parentKeys","_i","ownKeys_1","parentKeys_1","extendStatics","d","setPrototypeOf","p","__extends","__assign","assign","t","s","n","__decorate","desc","c","r","getOwnPropertyDescriptor","decorate","isSeqEmpty","seq","every","isIndicesAble","it","Uint16Array","Uint32Array","Float32Array","Int8Array","Int16Array","Int32Array","Float64Array","filters","_length","l","forEach","filter","callback","LazyFilter","outer","valid","v","some","initial","acc","j","mapV","map12","ALazyMap","map23","map34","iterable","_arr","from","arr","lazySeq","LazySeq","seqs","shift","MAX_WORKER_THREADS","max","hardwareConcurrency","blob","workers","cleanUpWorkerTimer","workerTaskCounter","cleanUpWorker","toFree","findIndex","tasks","worker","terminate","finshedTask","w","Worker","refs","checkOutWorker","clearTimeout","emptyWorker","find","setTimeout","pushStats","refData","refIndices","indices","Promise","resolve","receiver","msg","removeEventListener","stats","addEventListener","postMessage","transferAbles","toResult","setRef","ref","broadCast","deleteRef","startsWith","deleteRefs","getNumberOfBins","ceil","log","LN2","min","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","extent","fill","quantile","NaN","floor","sort","pushAll","vs","boxplotBuilder","fixedLength","sum","missing","isNaN","pushAndSave","invalid","mean","whiskerHigh","whiskerLow","outlier","median","q1","q3","buildImpl","iqr","left","right","reversedOutliers","reverse","build","buildArr","normalizedStatsBuilder","numberOfBins","hist","x0","binWidth","x1","bin1","binN","low","high","center","toBin","maxBin","computeGranularity","histGranularity","getFullYear","minYear","maxYear","getMonth","getDate","setDate","setMonth","pushDateHist","dateStatsBuilder","template","byDay","templateHist","h","categoricalStatsBuilder","categories","m","cat","precision","round","scale","pow","similar","delta","abs","isPromiseLike","then","createIndexArray","dataSize","toIndexArray","maxDataIndex","joinIndexArrays","groups","total","createLike","g","sortComplex","comparators","asc","lookup","dateValueCache2Value","categoricalValueCache2Value","sortWorkerMain","wself","resolveRefs","msgHandlers","sortOrders","order","dateStats","categoricalStats","cats","numberStats","boxplotStats","evt","createWorkerBlob","fs","source","lastIndexOf","sources","Blob","URL","createObjectURL","equalArrays","ai","fixCSS","id","node","lastChild","removeChild","arrs","getSortLabel","String","noop","dispatch","Error","Dispatch","parseTypenames","typenames","types","trim","on","typename","T","copy","that","suffix","prefix","ECompareValueType","events","createEventList","listenerEvents","listeners","forwarder","fireImpl","primaryType","origin","listener","listenersChanged","Boolean","_type","_active","fire","context","forward","unforward","defaultGroup","color","othersGroup","item","group","isMultiLevelColumn","col","width","renderer","groupRenderer","summaryRenderer","visible","metadata","label","summary","description","fixed","frozen","assignNewId","idGenerator","fqid","fqpath","Column","EVENT_WIDTH_CHANGED","EVENT_LABEL_CHANGED","EVENT_METADATA_CHANGED","EVENT_VISIBILITY_CHANGED","EVENT_SUMMARY_RENDERER_TYPE_CHANGED","EVENT_RENDERER_TYPE_CHANGED","EVENT_GROUP_RENDERER_TYPE_CHANGED","EVENT_DIRTY","EVENT_DIRTY_HEADER","EVENT_DIRTY_VALUES","EVENT_DIRTY_CACHES","getWidth","hide","setVisible","show","isVisible","getVisible","flatten","_levelsToGo","_padding","setWidth","setWidthImpl","setMetaData","bak","getMetaData","sortByMe","ascending","priority","isSortingAscByDefault","findMyRanker","sortBy","groupByMe","toggleGrouping","isGroupedBy","getGroupCriteria","toggleMySorting","toggleSorting","isSortedByMeImpl","ranker","criterias","isSortedByMe","getSortCriteria","groupSortByMe","groupSortBy","toggleMyGroupSorting","toggleGroupSorting","isGroupSortedByMe","getGroupSortCriteria","removeMe","remove","attach","detach","insertAfterMe","insertAfter","dump","toDescRef","getRenderer","getGroupRenderer","getSummaryRenderer","restore","_factory","rendererType","getLabel","row","_row","getExportValue","format","getColor","toCompareValue","_valueCache","toCompareValueType","UINT8","toCompareGroupValue","_rows","toCompareGroupValueType","STRING","isFiltered","clearFilter","setRenderer","setGroupRenderer","setSummaryRenderer","markDirty","FLAT_ALL_COLUMNS","supportType","for","category","SupportType","SortByDefault","clazz","hasMetadata","ESortMethod","EAdvancedSortMethod","featureLevel","categorical","date","composite","support","Categories","Category","getSortType","categoryOf","dialogAddons","isSupportType","getMetadata","categoryOfDesc","models","isMapAbleColumn","getMapping","isNumberColumn","getNumber","isBoxPlotColumn","getBoxPlotData","isNumbersColumn","getNumbers","accessor","loaded","lazyLoaded","ValueColumn","EVENT_DATA_LOADED","isLoaded","getRaw","setLoaded","RENDERER_LOADING","_children","CompositeColumn","EVENT_FILTER_CHANGED","EVENT_ADD_COLUMN","EVENT_MOVE_COLUMN","EVENT_REMOVE_COLUMN","levelsToGo","padding","children","child","canJustAddNumbers","insertImpl","move","old","moveImpl","oldIndex","at","moveAfter","removeImpl","specifier","colors","extend","definition","Color","reI","reN","reP","reHex3","reHex6","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","Rgb","parseInt","rgbn","rgba","hsla","rgbConvert","o","rgb","opacity","hex","Hsl","hslConvert","hsl","hsl2rgb","m1","m2","displayable","brighter","darker","deg2rad","PI","rad2deg","labConvert","Lab","Hcl","cos","sin","z","rgb2lrgb","y","xyz2lab","lab","lab2xyz","lrgb2rgb","hclConvert","atan2","sqrt","hcl","A","B","C","D","E","ED","EB","BC_DA","cubehelixConvert","Cubehelix","bl","basis","t1","v0","v1","v2","v3","t2","t3","cosh","sinh","linear","constant","gamma","nogamma","exponential","start","end","rgbGamma","rgbSpline","spline","rgbBasis","nb","na","setTime","reA","reB","cssNode","cssRoot","cssView","svgNode","am","bm","bs","bi","lastIndex","q","degrees","identity","translateX","translateY","rotate","skewX","scaleX","scaleY","atan","interpolateTransform","parse","pxComma","pxParen","degParen","xa","ya","xb","yb","translate","document","createElement","documentElement","defaultView","style","transform","getComputedStyle","appendChild","getPropertyValue","decompose","createElementNS","setAttribute","baseVal","consolidate","matrix","SQRT2","hue","cubehelixGamma","cubehelix","cubehelixLong","scheme","ramp","warm","cool","ts","range","magma","inferno","plasma","toStringTag","list","addAll","console","assert","deleteAll","act","callbackfn","thisArg","integrateDefaults","defaults","typed","patternFunction","pattern","joinGroups","parents","gparents","unshift","subGroups","duplicateGroup","clone","isGroupParent","toGroupID","groupRoots","roots","MAX_COLORS","colorPool","mapIndices","everyIndices","forEachIndices","chooseUIntByDataLength","dataLength","UINT32","UINT16","DEFAULT_CATEGORICAL_COLOR_FUNCTION","toJSON","eq","ReplacmentColorMappingFunction","restoreCategoricalColorMapping","isMissingValue","isUnknown","missingGroup","toCategory","nextColor","COMPARE_CATEGORY_VALUE_TYPES","FLOAT_ASC","toGroupCompareCategoryValue","rows","valueCache","mostFrequent","topCat","topCount","findMostFrequent","getCategory","COMPARE_GROUP_CATEGORY_VALUE_TYPES","FLOAT","compareCategory","aNull","bNull","localeCompare","toCategories","isEmptyFilter","filterMissing","isEqualCategoricalFilter","al","arrayEquals","isCategoryIncluded","filterObj","includes","currentFilter","colorMapping","CategoricalColumn","EVENT_COLOR_MAPPING_CHANGED","getCategories","getValues","getLabels","getMap","getMapLabel","getSet","iterCategory","categoricalColorMappingFunction","getColorMapping","setColorMapping","mapping","getFilter","setFilter","was","_group","current","separator","SetColumn","getSortedSet","normalize","sv","getColors","mode","BINARY","cardinality","styles","getStyle","EAggregationState","COLUMN_PADDING","FILTERED_OPACITY","parseFloat","DASH","height","UPSET","inactive","DOT","BOX_PLOT","box","stroke","AGGREGATE","strokeWidth","levelOffset","levelWidth","SLOPEGRAPH_WIDTH","CSS_PREFIX","RESIZE_SPACE","RESIZE_ANIMATION_DURATION","AGGREGATION_LEVEL_WIDTH","cssClass","engineCssClass","ENGINE_CSS_PREFIX","aria","text","createAggregateDesc","EDirtyReason","AggregateGroupColumn","EVENT_AGGREGATE","isAggregated","ranking","setAggregated","EXPAND","COLLAPSE","sortCriteria","groupColumns","groupSortCriteria","columns","dirtyOrder","reason","Ranking","EVENT_DIRTY_ORDER","dirtyOrderSortDirty","SORT_CRITERIA_DIRTY","dirtyOrderGroupDirty","GROUP_CRITERIA_DIRTY","dirtyOrderGroupSortDirty","GROUP_SORT_CRITERIA_DIRTY","dirtyOrderFiltering","FILTER_CHANGED","index2pos","EVENT_GROUPS_CHANGED","EVENT_GROUP_CRITERIA_CHANGED","EVENT_GROUP_SORT_CRITERIA_CHANGED","EVENT_COLUMN_VISIBILITY_CHANGED","EVENT_SORT_CRITERIA_CHANGED","EVENT_ORDER_CHANGED","setLabel","setGroups","dirtyReason","oldGroups","unifyGroups","offsets","subarray","subs","gi","getRank","dataIndex","getOrder","getOrderLength","getGroups","getFlatGroups","traverse","sortColumn","help","setGroupCriteria","restoreSortCriteria","dumped","setSortCriteria","setGroupSortCriteria","getPrimarySortCriteria","toggleSortingLogic","newSort","defaultAsc","newGroupings","hierarchyLogic","groupBy","equalCriteria","COLUMN_SORT_DIRTY","triggerResort","column","cols","groupColumn","COLUMN_GROUP_DIRTY","autoAdaptAggregationColumn","targetWidth","COLUMN_GROUP_SORT_DIRTY","triggerGroupResort","sortCriterias","bakMulti","FORWARD_COLUMN_EVENTS","oldValue","newValue","reference","findByPath","isSortCriteria","sortCriteriaChanged","isGroupSortCriteria","groupSortCriteriaChanged","newGrouping","isGroupColumn","removed","idOrFilter","flatColumns","clearFilters","debounce","timeToDelay","choose","tm","ctx","createRankDesc","RankColumn","createSelectionDesc","SelectionColumn","EVENT_SELECT","setValue","setImpl","setValues","setterAll","setter","toggleValue","isSelected","SELECTED_GROUP","NOT_SELECTED_GROUP","createActionDesc","actions","groupActions","EAlignment","EStringGroupCriteriaType","compare","ActionColumn","currentGroupCriteria","alignment","escape","StringColumn","EVENT_GROUPING_CHANGED","groupCriteria","FILTER_MISSING","ff","groupValue","annotations","AnnotateColumn","EVENT_VALUE_CHANGED","trueMarker","GROUP_TRUE","falseMarker","GROUP_FALSE","BooleanColumn","getCategoryOfBoolean","_dataLength","originalLabels","labels","_d","ArrayColumn","BooleansColumn","toExponential","coefficient","formatDecimal","re","formatSpecifier","FormatSpecifier","align","sign","symbol","zero","comma","prefixExponent","exponent","toFixed","toPrecision","formatRounded","toUpperCase","prefixes","locale","grouping","thousands","substring","currency","decimal","numerals","formatNumerals","percent","newFormat","formatTypes","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","i1","i0","formatTrim","charCodeAt","Infinity","formatPrefix","lo","hi","mid","ascendingBisect","bisector","bisectRight","bisect","e10","e5","e2","ticks","step","stop","tickIncrement","isFinite","power","LN10","tickStep","step0","step1","initRange","domain","each","empty","clamper","bimap","interpolate","d0","d1","r0","r1","polymap","clamp","unknown","transformer","untransform","piecewise","rescale","invert","rangeRound","u","continuous","precisionPrefix","precisionRound","precisionFixed","linearish","tickFormat","nice","interval","transformLog","transformExp","exp","transformLogn","transformExpn","pow10","reflect","loggish","logs","pows","base","log10","log2","logp","powp","transformPow","transformSqrt","transformSquare","powish","newInterval","floori","offseti","field","getMilliseconds","getUTCSeconds","getSeconds","getMinutes","getHours","setHours","getTimezoneOffset","weekday","getDay","sunday","monday","tuesday","wednesday","thursday","friday","saturday","setFullYear","utcMinute","setUTCSeconds","getUTCMinutes","utcHour","setUTCMinutes","getUTCHours","utcDay","setUTCHours","setUTCDate","getUTCDate","utcWeekday","getUTCDay","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","utcMonth","setUTCMonth","getUTCMonth","getUTCFullYear","utcYear","setUTCFullYear","localDate","H","M","S","L","utcDate","UTC","newYear","timeFormat","timeParse","utcFormat","utcParse","pads","numberRe","percentRe","requoteRe","requote","formatRe","names","formatLookup","parseWeekdayNumberSunday","parseWeekdayNumberMonday","parseWeekNumberSunday","U","parseWeekNumberISO","parseWeekNumberMonday","W","parseFullYear","parseYear","parseZone","Z","parseMonthNumber","parseDayOfMonth","parseDayOfYear","parseHour24","parseMinutes","parseSeconds","parseMilliseconds","parseMicroseconds","parseLiteralPercent","parseUnixTimestamp","Q","parseUnixTimestampSeconds","formatDayOfMonth","formatHour24","formatHour12","formatDayOfYear","formatMilliseconds","formatMicroseconds","formatMonthNumber","formatMinutes","formatSeconds","formatWeekdayNumberMonday","day","formatWeekNumberSunday","formatWeekNumberISO","formatWeekdayNumberSunday","formatWeekNumberMonday","formatFullYear","formatZone","formatUTCDayOfMonth","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","getUTCMilliseconds","formatUTCMicroseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","dow","formatUTCWeekNumberSunday","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCFullYear","formatUTCZone","formatLiteralPercent","formatUnixTimestamp","formatUnixTimestampSeconds","locale_dateTime","dateTime","locale_date","locale_time","time","locale_periods","periods","locale_weekdays","days","locale_shortWeekdays","shortDays","locale_months","months","locale_shortMonths","shortMonths","periodRe","periodLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formats","utcFormats","parses","parseSpecifier","pad","charAt","newParse","newDate","week","X","formatLocale","toISOString","toScale","fixDomain","getRange","ScaleMappingFunction","code","value_min","value_max","value_range","value_domain","mi","ma","ScriptMappingFunction","restoreMapping","mappingFunction","mappingFunctions","script","pow2","pow3","DEFAULT_FORMATTER","toCompareBoxPlotValue","getSortMethod","getBoxPlotNumber","getRawBoxPlotData","numberCompare","aMissing","bMissing","FIRST_IS_NAN","isEqualNumberFilter","isNumberIncluded","isDummyNumberFilter","restoreNumberFilter","filterAccuracy","numberFormat","currentGroupThresholds","groupSortMethod","original","colorMappingFunction","NumberColumn","getNumberFormat","stratifyThreshholds","stratifyThresholds","EVENT_MAPPING_CHANGED","EVENT_SORTMETHOD_CHANGED","raw","getRawValue","iterNumber","iterRawNumber","getRawNumber","sortMethod","getOriginalMapping","setMapping","getGroupThresholds","setGroupThresholds","threshold","treshholdIndex","setSortMethod","BoxPlotColumn","byKey","toKeyValue","MapColumn","CategoricalMapColumn","parseValue","getCategoryMap","CategoricalsColumn","shiftFilterDateDay","setMinutes","setSeconds","setMilliseconds","toDateGroup","grouper","granularity","centuryP","circular","century","decadeP","decade","year","chooseAggregatedDate","dates","trueMedian","EDateSort","currentGrouper","dateFormat","DEFAULT_DATE_FORMAT","dateParse","DateColumn","getFormatter","iterDate","DOUBLE_ASC","getDateGrouper","setDateGrouper","DatesColumn","getDates","av","EGroupSortMethod","DatesMapColumn","getDateMap","createGroupDesc","GroupColumn","COUNT","currentMaxDepth","currentLeaves","currentLeavesNameCache","currentLeavesPathCache","hierarchySeparator","hierarchy","initHierarchy","currentNode","computeLeaves","updateCaches","HierarchyColumn","EVENT_CUTOFF_CHANGED","maxDepth","cutOffNode","getCutOff","setCutOff","leaves","visit","depth","resolveInnerNodes","queue","isHierarchical","deriveHierarchy","SequentialColorFunction","FUNCTIONS","interpolateBlues","interpolateGreens","interpolateGreys","interpolateOranges","interpolatePurples","interpolateReds","interpolateCool","interpolateCubehelixDefault","interpolateWarm","interpolatePlasma","interpolateMagma","interpolateViridis","interpolateInferno","interpolateYlOrRd","interpolateYlOrBr","interpolateBuGn","interpolateBuPu","interpolateGnBu","interpolateOrRd","interpolatePuBuGn","interpolatePuBu","interpolatePuRd","interpolateRdPu","interpolateYlGnBu","interpolateYlGn","interpolateRainbow","DivergentColorFunction","interpolateBrBG","interpolatePRGn","interpolatePiYG","interpolatePuOr","interpolateRdBu","interpolateRdGy","interpolateRdYlBu","interpolateRdYlGn","interpolateSpectral","UnknownColorFunction","SolidColorFunction","steps","perStep","QuantizedColorFunction","CustomColorMappingFunction","DEFAULT_COLOR_FUNCTION","createImpositionDesc","ImpositionCompositeColumn","wrapper","rest","NumbersColumn","getRawNumbers","CENTER","createImpositionBoxPlotDesc","ImpositionBoxPlotColumn","createImpositionsDesc","ImpositionCompositesColumn","compute","CompositeNumberColumn","createReduceDesc","ReduceColumn","selected","EVENT_REDUCE_CHANGED","getReduce","setReduce","createStackDesc","collapsed","adaptChange","adaptWidthChange","StackColumn","weights","getWeights","EVENT_COLLAPSE_CHANGED","EVENT_WEIGHTS_CHANGED","EVENT_MULTI_LEVEL_CHANGED","setCollapsed","getCollapsed","weight","full","oldWeight","factor","widths","guess","setWeights","COLLAPSED_RENDERER","MultiLevelCompositeColumn","createNestedDesc","NestedColumn","NumberMapColumn","OrdinalColumn","DEFAULT_SCRIPT","createScriptDesc","allFactory","_all","byName","byID","byIndex","ScriptColumn","EVENT_SCRIPT_CHANGED","setScript","getScript","clean","raws","ColumnContext","ColumnWrapper","getMapValue","StringMapColumn","StringsColumn","patternTemplates","LinkColumn","setPattern","EVENT_PATTERN_CHANGED","getPattern","getLink","href","transformValue","alt","getLinkMap","LinkMapColumn","LinksColumn","getLinks","ABORTED","thenFactory","loader","isAborted","abort","onfulfilled","_onrejected","loadedOrAborted","res","aborted","aborter","race","abortAbleAll","all","values_1","isAbortAble","abortAble","isAsyncUpdate","update","ready","SCHEMA_REF","isComplexAccessor","resolveValue","rowComplexGetter","rowGetter","rowGuessGetter","cleanCategories","isEmpty","deriveBaseType","options","warn","datePattern","treatAsCategorical","categoricalThreshold","deriveType","primitive","vi","first","mapAll","vii","sameLength","hasDifferentSizes","deriveColumnDescriptions","config","existing","exclude","selectColumns","foundRow","toLabel","deriveColors","exportRanking","opts","newline","header","quoteChar","verboseColumnHeaders","rangeSelection","provider","rankingId","relIndex","ctrlKey","getRankings","selection","getSelection","nearest","distance","setSelection","isAlwaysShowingGroupStrategy","strategy","toItemMeta","relativeIndex","topN","groupParents","meta","prev","prevMeta","groupEndLevel","topNGetter","last","isSummaryGroup","toDirtyReason","UNKNOWN","SORT_CRITERIA_CHANGED","GROUP_CRITERIA_CHANGED","GROUP_SORT_CRITERIA_CHANGED","mergeDirtyOrderContext","currentReason","nextReason","combined","rankings","aggregations","columnTypes","colorMappingFunctionTypes","mappingFunctionTypes","singleSelection","showTopN","aggregationStrategy","propagateAggregationState","aggregate","annotate","boolean","booleans","boxplot","categoricalMap","categoricals","dateMap","imposition","impositionBoxPlot","impositions","nested","numbers","numberMap","ordinal","rank","stack","stringMap","strings","link","linkMap","links","quantized","custom","colorMappingFunctions","typeFactory","createTypeFactory","fromDescRef","fixDesc","instantiateColumn","typeName","createColorMappingFunction","getTypeFactory","ADataProvider","EVENT_DATA_CHANGED","EVENT_BUSY","EVENT_SHOWTOPN_CHANGED","EVENT_ADD_RANKING","EVENT_REMOVE_RANKING","EVENT_SELECTION_CHANGED","EVENT_ADD_DESC","EVENT_CLEAR_DESC","EVENT_JUMP_TO_NEAREST","EVENT_GROUP_AGGREGATION_CHANGED","pushRanking","cloneRanking","insertRanking","fireBusy","busy","takeSnapshot","hasString","hasColumn","toClone","FORWARD_RANKING_EVENTS","triggerReorder","paths","removeDuplicates","level","real","unifyParents","initAggregateState","removeRanking","cleanUpRanking","clearRankings","getFirstRanking","getLastRanking","ensureOneRanking","destroy","_ranking","nextId","select","deselect","selectAll","deselectAll","getAggregationState","setAggregationState","cleanDesc","dumpColumn","restoreColumn","descRef","restoreRanking","object2Map","deriveDefault","addSupportType","getColumns","getTopNAggregated","EXPAND_TOP_N","setTopNAggregated","unaggregateParents","changed","getAggregationStrategy","changedParents","aggregateAllOf","aggregateAll","state","getShowTopN","setShowTopN","jumpToNearest","selectAllOf","clearSelection","toggleSelection","additional","selectedRows","view","exportTable","EVENT_REMOVE_DESC","injectAccessor","rankingIndex","nextRankingId","pushDesc","clearColumns","removeDesc","ignoreBeingUsed","findDesc","missingFloat","missingFloatAsc","toCompareLookUp","rawLength","INT8","INT16","INT32","DOUBLE","createSetter","missingCount","isSorting","valueCaches","criteria","chooseMissingByLength","ri","pushValues","free","ANOTHER_ROUND","oneShotIterator","calc","wrappee","onrejected","taskId","runTasks","deadline","task","didTimeout","timeRemaining","requestAnimationFrame","reSchedule","ww","requestIdleCallback","pushMulti","abortOrDummy","isAbortedOrDummy","abortAll","clearIdleCallback","onfullfilled","taskNow","TaskNow","taskLater","TaskLater","tasksAll","_joined","valueCacheData","byOrder","byOrderAcc","builder","orders","currentChunkSize","chunkCounter","actOrder","builderForEach","numberStatsBuilder","dacc","setValueCacheData","dateValueCacheBuilder","name2index","categoricalValueCacheBuilder","dirtyColumn","sortDirect","lookups","setData","dirtyRanking","preCompute","preComputeData","preComputeCol","copyData2Summary","copyCache","fromPrefix","tkey","_singleCall","groupCompare","rg","groupRows","_col","groupExampleRows","groupBoxPlotStats","groupNumberStats","groupCategoricalStats","groupDateStats","summaryBoxPlotStats","summaryBoxPlotStatsD","summaryNumberStats","summaryNumberStatsD","summaryCategoricalStats","summaryCategoricalStatsD","summaryDateStats","summaryDateStatsD","cached","dataNumberStats","dataBoxPlotStats","dataCategoricalStats","dataDateStats","creator","dontCache","isMapColumn","endsWith","isArrayColumn","isCategoricalLikeColumn","isSetColumn","isCategoricalColumn","isCategoricalsColumn","isCategory","isDateColumn","isDatesColumn","ERenderMode","WorkerTaskScheduler","checker","ogroups","multi","chainCopy","chain","joined","canAbort","isValidCacheEntry","subTask","created","valueCacheKey","singleCall","indexArray","toTransfer","_data","ooptions","filterGlobally","jumpToSearchResult","taskExecutor","mapToDataRow","_dataRows","toRows","reorderAll","getTotalNumberOfRows","getTaskExecutor","dataChanged","clearData","appendData","trackRanking","addKey","removeKey","removeCol","addCol","resolveFilter","noSorting","createSorter","needsFiltering","needsGrouping","needsSorting","groupOrder","pushGroup","groupKey","groupCaches","filterCaches","toGroup","fc","before","sortGroup","groupLookup","singleGroup","sortTask","groupSortTask","groupC","sortGroups","enforceSorting","groupIndices","reasons","needsGroupSorting","isSortedBy","isGroupedSortedBy","sortedGroups","viewRaw","viewRawRows","getRow","mappingSample","searchAndJump","search","noRenderer","setText","textContent","querySelectorAll","forEachChild","matchColumns","childElementCount","dataset","columnId","rendererId","idsAndRenderer","idAndRenderer","cnode","querySelector","asElement","classList","innerHTML","wideEnough","wideEnoughCat","adaptColorCache","adaptTextColorToBgColor","bgColor","adaptDynamicColorToBgColor","title","adapt","innerText","span","ownerDocument","uniqueId","idCounter","exampleText","examples","multiLevelGridCSSClass","idPrefix","canRender","SUMMARY","className","icon","ni","onclick","event","preventDefault","stopPropagation","action","createGroup","createSummary","matchNodes","addTopN","doc","renderGroups","isRow","isLeafGroup","alwaysShowGroup","isSummary","hasTopN","hasTopNStrategy","lastParent","isLastGroup","toggle","isCollapsed","isFirst","isShowAll","childTopN","nextState","isDummyGroup","render","fillStyle","fillRect","filterMissingMarkup","bakMissing","filterMissingNumberMarkup","findFilterMissing","getElementsByClassName","previousElementSibling","updateFilterMissingNumberMarkup","element","getElementsByTagName","disabled","lastElementChild","renderMissingValue","dashX","dashY","renderMissingDOM","renderMissingCanvas","interactiveSummary","form","isRegex","checked","onchange","oninput","onsubmit","actCol","_context","interactive","StringCellRenderer","firstElementChild","imposer","valueHint","renderValue","CELL","colWidth","bar","backgroundColor","groupTitle","summaryTitle","_mode","BOXPLOT","MAPPED_BOXPLOT","sortedByMe","renderDOMBoxPlot","topPadding","strokeStyle","beginPath","rect","bottomPos","middlePos","moveTo","lineTo","renderBoxPlot","isMissing","_interactive","mappedSummary","rawSummary","hasRange","computeLabel","whiskers","nextElementSibling","leftWhisker","rightWhisker","display","outliers","numOutliers","insertAdjacentElement","toHeatMapColor","valueColor","filterUpdate","interactiveHist","staticSummary","showLabels","bins","gHist","inner","gCount","relY","background","setCategoricalFilter","markFilter","bin","included","contained","parentElement","createContext","cellDimension","mover","offsetX","getContext","canvas","clearRect","onmousemove","onmouseleave","maps","toMostFrequentCategoricals","templateRows","selectedCol","stackedBar","gBins","flexGrow","getCanvasRenderer","pi2","radius","save","globalAlpha","arc","getDOMRenderer","dots","tmp","top","formatter","seq1","seq2","ConcatSequence","concatSeq","_ctx","normalized","templateRow","ANumbersCellRenderer","_hist","isBrowser","longerTimeoutBrowsers","timeoutDuration","fn","called","scheduled","functionToCheck","getStyleComputedProperty","nodeType","css","getParentNode","nodeName","parentNode","host","getScrollParent","body","_getStyleComputedProp","overflow","overflowX","overflowY","isIE11","MSInputMethodContext","documentMode","isIE10","isIE","getOffsetParent","noOffsetParent","offsetParent","getRoot","findCommonOffsetParent","element1","element2","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","createRange","setStart","setEnd","commonAncestorContainer","contains","element1root","getScroll","side","upperSide","html","scrollingElement","includeScroll","subtract","scrollTop","scrollLeft","modifier","bottom","getBordersSize","axis","sideA","sideB","getSize","computedStyle","getWindowSizes","classCallCheck","instance","Constructor","createClass","defineProperties","props","protoProps","staticProps","_extends","getClientRect","getBoundingClientRect","sizes","clientWidth","clientHeight","horizScrollbar","offsetWidth","vertScrollbar","offsetHeight","getOffsetRectRelativeToArbitraryNode","fixedPosition","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","getViewportOffsetRectRelativeToArtbitraryNode","excludeScroll","relativeOffset","innerWidth","innerHeight","isFixed","getFixedPositionOffsetParent","el","getBoundaries","popper","boundariesElement","boundaries","boundariesNode","_getWindowSizes","isPaddingNumber","getArea","_ref","computeAutoPlacement","placement","refRect","rects","sortedAreas","area","filteredAreas","_ref2","computedPlacement","variation","getReferenceOffsets","commonOffsetParent","getOuterSizes","marginBottom","marginRight","getOppositePlacement","hash","getPopperOffsets","referenceOffsets","popperRect","popperOffsets","isHoriz","mainSide","secondarySide","measurement","secondaryMeasurement","check","runModifiers","modifiers","ends","prop","cur","enabled","isDestroyed","arrowStyles","flipped","positionFixed","flip","originalPlacement","position","isCreated","onUpdate","onCreate","isModifierEnabled","modifierName","getSupportedPropertyName","upperProp","toCheck","removeAttribute","willChange","disableEventListeners","removeOnDestroy","getWindow","setupEventListeners","updateBound","passive","scrollElement","attachToScrollParents","scrollParents","isBody","eventsEnabled","enableEventListeners","scheduleUpdate","cancelAnimationFrame","isNumeric","setStyles","unit","isFirefox","isModifierRequired","requestingName","requestedName","requesting","isRequired","_requesting","requested","placements","validPlacements","clockwise","counter","BEHAVIORS","parseOffset","basePlacement","useHeight","fragments","frag","divider","splitRegex","ops","op","mergeWithPrevious","str","toValue","index2","Defaults","shiftvariation","_data$offsets","isVertical","shiftOffsets","preventOverflow","transformProp","popperStyles","primary","escapeWithReference","secondary","keepTogether","opSide","arrow","_data$offsets$arrow","arrowElement","len","sideCapitalized","altSide","arrowElementSize","popperMarginSide","popperBorderSide","sideValue","placementOpposite","flipOrder","behavior","refOffsets","overlapsRef","overflowsLeft","overflowsRight","overflowsTop","overflowsBottom","overflowsBoundaries","flippedVariationByRef","flipVariations","flippedVariationByContent","flipVariationsByContent","flippedVariation","getOppositeVariation","subtractLength","bound","computeStyle","legacyGpuAccelerationOption","gpuAcceleration","offsetParentRect","shouldRound","noRound","referenceWidth","popperWidth","isVariation","horizontalToInteger","verticalToInteger","getRoundedOffsets","devicePixelRatio","prefixedProperty","invertTop","invertLeft","applyStyle","onLoad","modifierOptions","Popper","_this","jquery","Utils","PopperUtils","bKeys","dialogContext","attachment","currentTarget","manager","dialogManager","dialog","livePreview","popup","toggleDialog","cancelSubDialogs","autoClose","showLivePreviews","livePreviews","enableLivePreviews","submitter","submit","equals","appendDialogButtons","insertAdjacentHTML","open","removeLike","closest","auto","focus","reset","triggerSubmit","cancel","removeAboveLevel","checkValidity","findInput","cleanUp","triggerDialogClosed","ioptions","valueAsNumber","dragHandle","handle","container","onStart","onDrag","onEnd","minDelta","ueberElement","toContainerRelative","elem","clientLeft","handleShift","mouseMove","clientX","mouseUp","onmousedown","filteredColor","histogramTemplate","guessedBins","histogramUpdate","unfiltered","colorOf","nodes","matchBins","mappingHintTemplate","mappingHintUpdate","filteredHistTemplate","filterMin","filterMax","formatRaw","initFilter","minHint","maxHint","minValue","parseRaw","maxValue","minImpl","edit","shiftKey","ondblclick","maxImpl","button","px","unpercent","getHistDOMRenderer","updateFilter","fContext","createFilterContext","createFilterInfo","dialogCtx","maxLevel","backgroundImage","src","image","Image","onload","single","aggregatedIndex","createData","stacked","GROUP","toWait","missingWeight","ci","gridColumnStart","stackShift","cr","callbacks","sorted","medianIndex","rr","summaries","grouped","sample","dummyBin","groupedHist","LinkCellRenderer","createFixed","TableCellRenderer","example","createFixedGroup","groupByKey","LinkMapCellRenderer","fromTSpan","toTSpan","unselected","unchecked","createDOMContext","posx","moveNext","yPos","repeat","matchRows","calculateSetPath","catindexes","line","hasTrueValues","CANVAS_HEIGHT","tooltipPrefix","one","xpos","chosen","valueAsDate","dummyDomain","now","createDateFilter","applyFilter","summaryNode","rerender","defaultCellRenderer","brightness","catdistributionbar","circle","default","dot","heatmap","catheatmap","histogram","datehistogram","interleaving","loading","mapbars","sparkline","upset","verticalbar","sets","schemeCategory10","schemeAccent","schemeDark2","schemePastel1","schemePastel2","schemeSet1","schemeSet2","schemeSet3","updateStats","someMode","noFilter","joint","items","currentGroup","currentSummary","createTemplate","wrapped","gradient","isCustom","applyColor","s0","s1","dm1","toColor","content","toggles","customs","updateColor","updateSelectedColor","continuouos","continuouos2","quantized2","steps2","updateGradients","steppedGradient","di","stepSize","half","hasDnDType","available","dataTransfer","typesToCheck","dndTransferStorage","isEdgeDnD","updateDropEffect","dT","effectAllowed","copyDnD","dropEffect","dropAble","mimeTypes","onDrop","onDragOver","canDrop","effect","getData","mime","colId","addIcon","addIconDOM","getToolbar","isActionMode","createToolbarMenuItems","updateIconState","createHeader","dragAble","mergeDropAble","rearrangeAble","resizeable","extraPrefix","extra","createShortcutMenuItems","toggleToolbarIcons","dragAbleColumn","resolveDrop","MIMETYPE_PREFIX","alternative","JSON","pushChild","mergeImpl","mergeWith","numberish","draginfo","toInsertParent","rearrangeDropAble","sizeHelper","currentFooterTransformation","originalWidth","dragWidth","updateHeader","minWidth","sublabel","typeCat","updateMoreDialogIcons","groupedBy","active","actionCSSClass","showLabel","featureCategory","setHighlightColumn","onClick","willAutoHide","toolbar","shortcuts","hybrids","moreEntries","defaultVisibleClientWidth","rotated","scrollWidth","toggleRotatedHeader","availableWidth","shortCuts","moreIcon","needMore","onDragStart","draggable","payload","over","stringify","substr","createChildren","innerNodes","innerNodePaths","setCustomValidity","newNode","newNodeIndex","maxDepthText","handler","templates","handlers","getToolbarDialogAddons","addon","append","updateDisabled","disable","elems","sortOrder","adapter","unnormalizeRaw","normalizeRaw","common","updated","openDialog","handled","destroyed","trigger","mappingLines","mappingAdapter","updateLines","computeScale","rawDomain","scaleType","others","bb","copyMapping","createMappings","selectedIndex","patchedDomain","getAttribute","createNumberFilter","sortMethods","methods","checkbox","toInput","inputs","updateBar","distributeWeights","missingIndices","validWeights","buttons","reportValidity","ui","uiDialog","dialogClass","extraArgs","uiSortMethod","isAscByDefault","sortGroupBy","rename","vis","_evt","removeAll","toggleCompressExpand","mcol","compress","expand","toolbarDialogAddons","sortNumber","sortNumbers","sortBoxPlot","sortDates","groupNumber","isThreshold","thresholds","groupString","valueRadioButton","startsWithRadioButton","regexRadioButton","showOrHideTextarea","newType","groupDate","toolbarActions","filterNumber","filterDate","filterString","filterCategorical","filterOrdinal","colorMapped","colorMappedCategorical","cutoff","editMapping","editPattern","editWeights","compositeContained","splitCombined","invertSelection","ss","sortActions","getFullToolbar","caches","toolbarIcon","getOwnMetadata","getAllToolbarActions","possible","getPossibleRenderer","resolveToolbarActions","flags","advancedModelFeatures","advancedRankingFeatures","advancedUIFeatures","cacheKey","cacheAddon","toolbarAddons","getAllToolbarDialogAddons","resolveToolbarDialogAddons","defaultOptions","renderers","labelRotation","summaryHeader","animated","expandLineOnHover","sidePanel","sidePanelCollapsed","hierarchyIndicator","defaultSlopeGraphMode","overviewMode","groupSort","onDialogBackgroundClick","rowHeight","groupHeight","groupPadding","rowPadding","levelOfDetail","customRowUpdate","dynamicHeight","disableFrozenColumns","ignoreUnsupportedBrowser","getUnsupportedBrowserError","info","fVersion","EAnimationMode","escKeyListener","which","removeLast","openDialogs","DialogManager","EVENT_DIALOG_CLOSED","EVENT_DIALOG_OPENED","setHighlight","mask","clipPath","webkitClipPath","clearHighlight","takeDown","setUp","ignoreIncompatibleBrowser","highlightListeners","isBrowserSupported","ALineUp","EVENT_HIGHLIGHT_CHANGED","setDataProvider","dataIndices","enableHighlightListening","_enable","defaultPhases","delay","nodeY","animation","SHOW","HIDE","UPDATE_REMOVE","KeyFinder","lastFilled","key2index","exceptions","findValidStart","posByKey","pos","fillCacheTillKey","defaultRowHeight","fillCache","heightOf","exceptionsLookup","exceptionHeightOf","returnDefault","numberOfRows","positions","ScrollHandler","sync","timer","handleAnimationImpl","handleAnimation","handleTimeouts","asInfo","isWaiting","addScroll","scroller","__le_scroller__","isScrollEventWaiting","EScrollResult","RowHeightException","nonUniformContext","rowHeights","mostFrequentValue","totalHeight","between","heightExceptions","firstRowPos","endPos","y2","offset2","indexShift","offsetShift","isGuess","shifted2","lastPos","heightExceptions_1","firstException","lastException","updateFrozen","oldLast","added","PREFIX","CSS_CLASS_LOADING","CSS_CLASS_FROZEN","CSS_CLASS_HIDDEN","CSS_CLASS_MULTI","CSS_CLASS_EVEN","CSS_CLASS_SHIFTED","CSS_CLASS_SCROLLBAR_TESTER","CSS_CLASS_HEADER","CSS_CLASS_BODY","CSS_CLASS_FOOTER","CSS_CLASS_THEAD","CSS_CLASS_TBODY","CSS_CLASS_TR","CSS_CLASS_TH","CSS_CLASS_TD","CSS_CLASS_SCROLLING","CSS_CLASS_ROW_ANIMATION","isLoadingCell","ARowRenderer","pool","loadingPool","forcedFirst","forcedLast","visibleFirstRowPos","scrollListener","lastScrollInfo","abortAnimation","async","minScrollDelta","mixins","scrollingHint","batchSize","striped","viewportOversize","createAdapter","mixinClass","fragment","createDocumentFragment","addMixin","addAtBeginning","addAtBottom","removeFromBeginning","removeFromBottom","updateOffset","bodyScroller","scrollOffset","scrollTotal","sizer","tagName","insertBefore","firstChild","init","isGoingDown","onScrolledVertically","recreate","updateRow","createRow","selectProxy","proxy","recycle","replaceChild","_b","ex","perform","torecycle","forEachRow","inplace","to","fromBeginning","nextSibling","previousSibling","updateSizer","setTransform","bodySizer","recreateAnimated","recreatePure","clearPool","previousKey","currentKey","rows_1","UPDATE","UPDATE_CREATE","nodeYCurrentHeight","nextPos","prevHeight","animate","phases","previousFinder","currentFinder","currentTimer","actPhase","executePhase","phase","anim","run","offsetTop","dummyAnimation","previousHeight","currentHeight","curr","revalidate","shiftTop","scrollResult","onScrolledImpl","onScrolled","shiftLast","currentDelta","shiftFirst","currentFirstRow","NONE","toadd","SOME","toaddBottom","ALL","SOME_TOP","SOME_BOTTOM","manipulate","toRecycle","toAdd","toRecycle_1","anyelem","__transform__","assignStyles","plain","hyphen","setProperty","tableIds","tableId","thead","tbody","tr","th","td","tableCSSClasses","ids","_super","GridStyleManager","cssClasses","headerScroller","measureScrollbar","updateRule","borderRight","frozenShift","selectors","updateColumns","deleteRule","rules","ruleNames","cssSelectors","thStyles","tdStyles","StyleManager","testVerifyTimeout","createTextNode","verifySheet","sheet","cssRules","selectorText","rule","insertRule","cssRule","getSheetRule","addRule","stored","MultiTableRowRenderer","htmlId","sections","columnPadding","main","isGoingRight","onScrolledHorizontally","scrollEnd","headerFooter","bodyFooter","maxHeight","pushTable","extras","pushSeparator","section","widthChanged","PrefetchMixin","prefetchTimeout","cleanupTimeout","prefetchRows","cleanUpRows","prefetchDown","nextLast","prefetchUp","syncFrozen","triggerPrefetch","prefetchDownPossible","prefetchUpPossible","isLast","cleanUpTop","newFirst","cleanUpBottom","newLast","triggerCleanUp","ACellAdapter","mixinClasses","cellPool","visibleColumns","visibleFirstColumnPos","horizontallyShifted","columnAdapter","createColumnAdapter","columnMixins","columnFragment","leftShift","addColumnMixin","addColumnAtStart","addColumnAtEnd","removeColumnFromStart","removeColumnFromEnd","updateColumnOffset","onScrolledHorizontallyImpl","removeCellFromStart","recycleCell","removeCellFromEnd","removeFrozenCells","columnIndices","columnIndices_1","columnIndex","removeFrozenColumns","removeAllColumns","includingFrozen","removeAllCells","frozen_1","frozen_2","selectProxyCell","columnObj","pooled","updateCell","createCell","updateShiftedState","handleCellReady","selectCell","rowIndex","addCellAtStart","cell","insertFrozenCells","columnIndices_2","insertFrozenColumns","addCellAtEnd","verifyRows","verifyRow","updateHeaders","fragment_1","document_1","ids_1","firstColumnPos","id_1","mergeColumns","updateImpl","cell_1","byId","updateShiftedStates","shifted","headers","bodies","headers_1","bodies_1","headers_2","_c","bodies_2","shiftingChanged","colObjs","ACellTableSection","LocalCell","hidden","onVisibilityChanged","updateShifts","_left","_visible","wasHidden","updateColumnWidths","oldLeft","toGroupLookup","item2groupIndex","group2firstItemIndex","lineupAnimation","previousData","currentData","prevHelper","currHelper","currentRowIndex","referenceIndex","appearPosition","_previousFinder","previousRowIndex","removePosition","singleRenderer","singleTemplate","cloneNode","singleId","groupTemplate","groupId","summaryTemplate","summaryId","hasSummaryLine","isGroup","oldRenderer","currentRenderer","oldGroup","getGroup","chainAbortAble","renderCell","mapper","mapped","EMode","mc","updateNested","matchChildren","cc","updateWidthRule","gridTemplateColumns","sub","hr","showHint","startNode","elementFromPoint","clientY","endNode","xShift","yShift","SelectionManager","EVENT_SELECT_RANGE","startIndex","endIndex","sy","ey","MIN_DISTANCE","selectRange","updateState","selectedDataIndices","RankingEvents","EVENT_UPDATE_DATA","EVENT_RECREATE","PASSIVE","roptions","loadingCanvas","highlight","canvasPool","currentCanvasShift","currentCanvasWidth","canvasMouseHandler","hoveredRows","unhover","enter","leave","updateHoveredRow","EngineRanking","isCanvasRenderedRow","highlightHandler","delayedUpdate","updateBody","delayedUpdateAll","updateAll","delayedUpdateColumnWidths","createCol","reindex","disableListener","_oldValue","renderCtx","createRenderer","visibility","updateCanvasRule","updateColumnSummaryFlag","_document","createCellHandled","initCellClasses","selectCanvas","rowFlags","rowany","__lu__","visibleRenderedWidth","pushLazyRedraw","renderRow","imageSmoothingEnabled","domColumns","renderCellImpl","visibleElements","firstDOM","updateCellImpl","updateCanvasCell","me","needDOM","updateHeaderOf","toRowMeta","agg","hoverLod","computedLod","wasLow","wasGroup","recycleCanvas","canvas2","updateCanvasBody","enable","hover","updateSelection","updateColumn","after","groupData","pushItem","ordered","gparent","rowContext","findNearest","lookFor","firstBeforePos","firstAfterPos","nearestPos","scrollIntoView","regular","posOf","scrollHeight","found","getHighlight","debounceUpdate","replacement","leftSlopes","rightSlopes","chosenSelectionOnly","ITEM","BAND","initHeader","scroll","icons","rebuild","leftRanking","leftContext","rightRanking","rightContext","prepareRightSlopes","computeSlopes","fakeGroups","padded","slopes","gr","heightPerRow","fakeGroup","createFakeGroup","intersection","filterIndices","chooseSelection","leftVisibleFirst","leftVisibleLast","rightVisibleFirst","rightVisibleLast","alreadyVisible","selectionLookup","updatePath","selectionSlopes","ownerSVGElement","matchLength","addPath","openDataIndices","slopeGraphs","updateAbles","zoomFactor","enabledHighlightListening","helper","EngineRenderer","chooseRenderer","chooseGroupRenderer","chooseSummaryRenderer","footer","toDisable","initProvider","zoomOut","updateZoomFactor","zoomIn","fontSize","pushUpdateAble","updateAble","takeDownProvider","addRanking","setHighlightToNearest","updateHist","updateUpdateAbles","updateRotatedHeaderState","slope","round2","defaultHeight","updateSlopeGraphs","formatItem","placeholder","onfocus","onblur","blur","onkeydown","handleKey","itemTemplate","buildDialog","li","isItem","onmouseenter","highlighted","KEYS","click","highlightPrevious","highlightNext","SearchBox","filterResults","ul","allChildrenHidden","addons","groupAdder","groupSortAdder","sortAdder","renderSorting","renderGroupSorting","toColumn","addonKey","onChange","prevent","customize","addGroupAdder","addSortAdder","addGroupSortAdder","addAdder","adder","onSelect","used","summaryUpdater","recreateSummary","appendSummary","updateSummary","dropdown","updateHierarchy","updateList","isWrapper","additionalDescs","chooser","collapseable","descs","initChooser","changeDataStorage","panel","wrapDesc","updateChooser","createEntry","makeActive","updateRanking","resetButton","groupByType","SidePanel","spaceFillingRule","availableHeight","visibleHeight","groupSeparators","violation","isDynamicLeafHeight","resizeListener","violationChanged","TaggleRenderer","switchRule","_rule","setViolation","spaceFilling","updateLodRules","_color","asArray","asMap","buildColumn","ColumnBuilder","rotation","registerRenderer","registerToolbarAction","registerToolbarDialogAddon","groupRowHeight","disableAdvancedRankingFeatures","disableAdvancedModelFeatures","disableAdvancedUIFeatures","supportTypes","allColumns","impose","colorColumn","scripted","weightedSum","numberColumn","numberColumn1","weight1","numberColumn2","weight2","numberColumnAndWeights","post","operation","numberColumns","RankingBuilder","ALL_MAGIC_FLAG","addColumn","col2","buildRanking","asOrdinal","asSet","derive","isSet","val","buildCategoricalColumn","asBoxPlot","ext","buildNumberColumn","editable","buildStringColumn","buildDateColumn","buildHierarchicalColumn","groupAction","buildActionsColumn","marker","buildBooleanColumn","providerOptions","rankBuilders","_deriveColors","scheduledTaskExecutor","deriveColumns","registerColumnType","defaultRanking","addSupportTypes","buildData","oldPos","buildTaggle","asTaggle","asLineUp","si","pick","lineupOptions","prevRankings","prevColumns","prevHighlight","onSelectionChanged","onHighlightChanged","componentDidMount","buildProvider","createInstance","resolveColumnDescs","columnDescs","deriveColumnNames","resolveRankings","builders","rankingBuilders","buildColumns","buildRankings","updateLineUp","changeDetector","providerChanged","changedLineUpOptions","updateProvider","columnsChanged","componentDidUpdate","componentWillUnmount","builderAdapter","buildString","buildNumber","buildHierarchy","buildDate","buildCategorical","missingCategory","buildActions","buildGeneric","buildWeightedSumRanking","buildSupportRanking","buildScriptRanking","buildReduceRanking","buildNestedRanking","buildImposeRanking","buildAllColumnsRanking","isSame","isTypeInstance","superClass","Adapter","defineColumn","functions","CustomColumn","createIndex2Pos","server","maxCacheSize","loadFromServer","fetch","computeMissing","union","unionAdd","_v","loadInCache","_m","toLoad","rendererClasses","AAggregatedGroupRenderer","ActionRenderer","AggregateGroupRenderer","AnnotationRenderer","BarCellRenderer","BooleanCellRenderer","BoxplotCellRenderer","BrightnessCellRenderer","CategoricalCellRenderer","CategoricalHeatmapCellRenderer","CategoricalStackedDistributionlCellRenderer","CircleCellRenderer","DateCellRenderer","DateHistogramCellRenderer","DefaultCellRenderer","DotCellRenderer","GroupCellRenderer","HeatmapCellRenderer","HistogramCellRenderer","ImageCellRenderer","InterleavingCellRenderer","LoadingCellRenderer","MapBarCellRenderer","MultiLevelCellRenderer","RankCellRenderer","SelectionRenderer","SetCellRenderer","SparklineCellRenderer","UpSetCellRenderer","VerticalBarCellRenderer","rendererUtils","createLocalDataProvider","createLineUp","createTaggle","buildId","license"],"mappings":"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DACA,sEACA/C,IAAI,KCES,GAAA44B,GAZK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA/C,IAAI,KCES,GAAA44B,GAZK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA/C,IAAI,KCES,GAAA44B,GAZK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA/C,IAAI,KCES,GAAA44B,GAZK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA/C,IAAI,KCES,GAAA44B,GAZK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,yDACA,+DACA,sEACA/C,IAAI,KCAS,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCES,GAAA44B,GAVK,IAAI59B,MAAM,GAAG+H,OAC/B,qBACA,2BACA,iCACA,uCACA,6CACA,mDACA,0DACA/C,IAAI,KCRS,MAAyB,GAAU,IAAK,GAAK,GAAM,IAAW,IAAK,GAAK,ICA5E64B,GAAO,GAAyB,IAAW,IAAK,IAAM,KAAO,GAAU,GAAI,IAAM,KAEjFC,GAAO,GAAyB,GAAU,IAAK,IAAM,KAAO,GAAU,GAAI,IAAM,KAEvF,GAAI,KAEO,gBACThsB,EAAI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","file":"LineUpJS.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"LineUpJS\"] = factory();\n\telse\n\t\troot[\"LineUpJS\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 8);\n","'use strict';\n\nvar isArray = Array.isArray;\nvar keyList = Object.keys;\nvar hasProp = Object.prototype.hasOwnProperty;\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n var arrA = isArray(a)\n , arrB = isArray(b)\n , i\n , length\n , key;\n\n if (arrA && arrB) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n if (arrA != arrB) return false;\n\n var dateA = a instanceof Date\n , dateB = b instanceof Date;\n if (dateA != dateB) return false;\n if (dateA && dateB) return a.getTime() == b.getTime();\n\n var regexpA = a instanceof RegExp\n , regexpB = b instanceof RegExp;\n if (regexpA != regexpB) return false;\n if (regexpA && regexpB) return a.toString() == b.toString();\n\n var keys = keyList(a);\n length = keys.length;\n\n if (length !== keyList(b).length)\n return false;\n\n for (i = length; i-- !== 0;)\n if (!hasProp.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n key = keys[i];\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n return a!==a && b!==b;\n};\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n symbolTag = '[object Symbol]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n splice = arrayProto.splice;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BrowserInfo = /** @class */ (function () {\n function BrowserInfo(name, version, os) {\n this.name = name;\n this.version = version;\n this.os = os;\n }\n return BrowserInfo;\n}());\nexports.BrowserInfo = BrowserInfo;\nvar NodeInfo = /** @class */ (function () {\n function NodeInfo(version) {\n this.version = version;\n this.name = 'node';\n this.os = process.platform;\n }\n return NodeInfo;\n}());\nexports.NodeInfo = NodeInfo;\nvar BotInfo = /** @class */ (function () {\n function BotInfo() {\n this.bot = true; // NOTE: deprecated test name instead\n this.name = 'bot';\n this.version = null;\n this.os = null;\n }\n return BotInfo;\n}());\nexports.BotInfo = BotInfo;\n// tslint:disable-next-line:max-line-length\nvar SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;\nvar SEARCHBOT_OS_REGEX = /(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves\\/Teoma)|(ia_archiver)/;\nvar REQUIRED_VERSION_PARTS = 3;\nvar userAgentRules = [\n ['aol', /AOLShield\\/([0-9\\._]+)/],\n ['edge', /Edge\\/([0-9\\._]+)/],\n ['yandexbrowser', /YaBrowser\\/([0-9\\._]+)/],\n ['vivaldi', /Vivaldi\\/([0-9\\.]+)/],\n ['kakaotalk', /KAKAOTALK\\s([0-9\\.]+)/],\n ['samsung', /SamsungBrowser\\/([0-9\\.]+)/],\n ['silk', /\\bSilk\\/([0-9._-]+)\\b/],\n ['miui', /MiuiBrowser\\/([0-9\\.]+)$/],\n ['beaker', /BeakerBrowser\\/([0-9\\.]+)/],\n ['edge-chromium', /Edg\\/([0-9\\.]+)/],\n ['chromium-webview', /(?!Chrom.*OPR)wv\\).*Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/],\n ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/],\n ['phantomjs', /PhantomJS\\/([0-9\\.]+)(:?\\s|$)/],\n ['crios', /CriOS\\/([0-9\\.]+)(:?\\s|$)/],\n ['firefox', /Firefox\\/([0-9\\.]+)(?:\\s|$)/],\n ['fxios', /FxiOS\\/([0-9\\.]+)/],\n ['opera-mini', /Opera Mini.*Version\\/([0-9\\.]+)/],\n ['opera', /Opera\\/([0-9\\.]+)(?:\\s|$)/],\n ['opera', /OPR\\/([0-9\\.]+)(:?\\s|$)/],\n ['ie', /Trident\\/7\\.0.*rv\\:([0-9\\.]+).*\\).*Gecko$/],\n ['ie', /MSIE\\s([0-9\\.]+);.*Trident\\/[4-7].0/],\n ['ie', /MSIE\\s(7\\.0)/],\n ['bb10', /BB10;\\sTouch.*Version\\/([0-9\\.]+)/],\n ['android', /Android\\s([0-9\\.]+)/],\n ['ios', /Version\\/([0-9\\._]+).*Mobile.*Safari.*/],\n ['safari', /Version\\/([0-9\\._]+).*Safari/],\n ['facebook', /FBAV\\/([0-9\\.]+)/],\n ['instagram', /Instagram\\s([0-9\\.]+)/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Mobile/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Gecko\\)$/],\n ['searchbot', SEARCHBOX_UA_REGEX],\n];\nvar operatingSystemRules = [\n ['iOS', /iP(hone|od|ad)/],\n ['Android OS', /Android/],\n ['BlackBerry OS', /BlackBerry|BB10/],\n ['Windows Mobile', /IEMobile/],\n ['Amazon OS', /Kindle/],\n ['Windows 3.11', /Win16/],\n ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],\n ['Windows 98', /(Windows 98)|(Win98)/],\n ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],\n ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],\n ['Windows Server 2003', /(Windows NT 5.2)/],\n ['Windows Vista', /(Windows NT 6.0)/],\n ['Windows 7', /(Windows NT 6.1)/],\n ['Windows 8', /(Windows NT 6.2)/],\n ['Windows 8.1', /(Windows NT 6.3)/],\n ['Windows 10', /(Windows NT 10.0)/],\n ['Windows ME', /Windows ME/],\n ['Open BSD', /OpenBSD/],\n ['Sun OS', /SunOS/],\n ['Chrome OS', /CrOS/],\n ['Linux', /(Linux)|(X11)/],\n ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],\n ['QNX', /QNX/],\n ['BeOS', /BeOS/],\n ['OS/2', /OS\\/2/],\n ['Search Bot', SEARCHBOT_OS_REGEX],\n];\nfunction detect() {\n if (typeof navigator !== 'undefined') {\n return parseUserAgent(navigator.userAgent);\n }\n return getNodeVersion();\n}\nexports.detect = detect;\nfunction parseUserAgent(ua) {\n // opted for using reduce here rather than Array#first with a regex.test call\n // this is primarily because using the reduce we only perform the regex\n // execution once rather than once for the test and for the exec again below\n // probably something that needs to be benchmarked though\n var matchedRule = ua !== '' &&\n userAgentRules.reduce(function (matched, _a) {\n var browser = _a[0], regex = _a[1];\n if (matched) {\n return matched;\n }\n var uaMatch = regex.exec(ua);\n return !!uaMatch && [browser, uaMatch];\n }, false);\n if (!matchedRule) {\n return null;\n }\n var name = matchedRule[0], match = matchedRule[1];\n if (name === 'searchbot') {\n return new BotInfo();\n }\n var versionParts = match[1] && match[1].split(/[._]/).slice(0, 3);\n if (versionParts) {\n if (versionParts.length < REQUIRED_VERSION_PARTS) {\n versionParts = versionParts.concat(createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length));\n }\n }\n else {\n versionParts = [];\n }\n return new BrowserInfo(name, versionParts.join('.'), detectOS(ua));\n}\nexports.parseUserAgent = parseUserAgent;\nfunction detectOS(ua) {\n for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) {\n var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1];\n var match = regex.test(ua);\n if (match) {\n return os;\n }\n }\n return null;\n}\nexports.detectOS = detectOS;\nfunction getNodeVersion() {\n var isNode = typeof process !== 'undefined' && process.version;\n return isNode ? new NodeInfo(process.version.slice(1)) : null;\n}\nexports.getNodeVersion = getNodeVersion;\nfunction createVersionParts(count) {\n var output = [];\n for (var ii = 0; ii < count; ii++) {\n output.push('0');\n }\n return output;\n}\n","/*! *****************************************************************************\nCopyright (C) Microsoft. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\nvar Reflect;\n(function (Reflect) {\n // Metadata Proposal\n // https://rbuckton.github.io/reflect-metadata/\n (function (factory) {\n var root = typeof global === \"object\" ? global :\n typeof self === \"object\" ? self :\n typeof this === \"object\" ? this :\n Function(\"return this;\")();\n var exporter = makeExporter(Reflect);\n if (typeof root.Reflect === \"undefined\") {\n root.Reflect = Reflect;\n }\n else {\n exporter = makeExporter(root.Reflect, exporter);\n }\n factory(exporter);\n function makeExporter(target, previous) {\n return function (key, value) {\n if (typeof target[key] !== \"function\") {\n Object.defineProperty(target, key, { configurable: true, writable: true, value: value });\n }\n if (previous)\n previous(key, value);\n };\n }\n })(function (exporter) {\n var hasOwn = Object.prototype.hasOwnProperty;\n // feature test for Symbol support\n var supportsSymbol = typeof Symbol === \"function\";\n var toPrimitiveSymbol = supportsSymbol && typeof Symbol.toPrimitive !== \"undefined\" ? Symbol.toPrimitive : \"@@toPrimitive\";\n var iteratorSymbol = supportsSymbol && typeof Symbol.iterator !== \"undefined\" ? Symbol.iterator : \"@@iterator\";\n var supportsCreate = typeof Object.create === \"function\"; // feature test for Object.create support\n var supportsProto = { __proto__: [] } instanceof Array; // feature test for __proto__ support\n var downLevel = !supportsCreate && !supportsProto;\n var HashMap = {\n // create an object in dictionary mode (a.k.a. \"slow\" mode in v8)\n create: supportsCreate\n ? function () { return MakeDictionary(Object.create(null)); }\n : supportsProto\n ? function () { return MakeDictionary({ __proto__: null }); }\n : function () { return MakeDictionary({}); },\n has: downLevel\n ? function (map, key) { return hasOwn.call(map, key); }\n : function (map, key) { return key in map; },\n get: downLevel\n ? function (map, key) { return hasOwn.call(map, key) ? map[key] : undefined; }\n : function (map, key) { return map[key]; },\n };\n // Load global or shim versions of Map, Set, and WeakMap\n var functionPrototype = Object.getPrototypeOf(Function);\n var usePolyfill = typeof process === \"object\" && process.env && process.env[\"REFLECT_METADATA_USE_MAP_POLYFILL\"] === \"true\";\n var _Map = !usePolyfill && typeof Map === \"function\" && typeof Map.prototype.entries === \"function\" ? Map : CreateMapPolyfill();\n var _Set = !usePolyfill && typeof Set === \"function\" && typeof Set.prototype.entries === \"function\" ? Set : CreateSetPolyfill();\n var _WeakMap = !usePolyfill && typeof WeakMap === \"function\" ? WeakMap : CreateWeakMapPolyfill();\n // [[Metadata]] internal slot\n // https://rbuckton.github.io/reflect-metadata/#ordinary-object-internal-methods-and-internal-slots\n var Metadata = new _WeakMap();\n /**\n * Applies a set of decorators to a property of a target object.\n * @param decorators An array of decorators.\n * @param target The target object.\n * @param propertyKey (Optional) The property key to decorate.\n * @param attributes (Optional) The property descriptor for the target key.\n * @remarks Decorators are applied in reverse order.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * Example = Reflect.decorate(decoratorsArray, Example);\n *\n * // property (on constructor)\n * Reflect.decorate(decoratorsArray, Example, \"staticProperty\");\n *\n * // property (on prototype)\n * Reflect.decorate(decoratorsArray, Example.prototype, \"property\");\n *\n * // method (on constructor)\n * Object.defineProperty(Example, \"staticMethod\",\n * Reflect.decorate(decoratorsArray, Example, \"staticMethod\",\n * Object.getOwnPropertyDescriptor(Example, \"staticMethod\")));\n *\n * // method (on prototype)\n * Object.defineProperty(Example.prototype, \"method\",\n * Reflect.decorate(decoratorsArray, Example.prototype, \"method\",\n * Object.getOwnPropertyDescriptor(Example.prototype, \"method\")));\n *\n */\n function decorate(decorators, target, propertyKey, attributes) {\n if (!IsUndefined(propertyKey)) {\n if (!IsArray(decorators))\n throw new TypeError();\n if (!IsObject(target))\n throw new TypeError();\n if (!IsObject(attributes) && !IsUndefined(attributes) && !IsNull(attributes))\n throw new TypeError();\n if (IsNull(attributes))\n attributes = undefined;\n propertyKey = ToPropertyKey(propertyKey);\n return DecorateProperty(decorators, target, propertyKey, attributes);\n }\n else {\n if (!IsArray(decorators))\n throw new TypeError();\n if (!IsConstructor(target))\n throw new TypeError();\n return DecorateConstructor(decorators, target);\n }\n }\n exporter(\"decorate\", decorate);\n // 4.1.2 Reflect.metadata(metadataKey, metadataValue)\n // https://rbuckton.github.io/reflect-metadata/#reflect.metadata\n /**\n * A default metadata decorator factory that can be used on a class, class member, or parameter.\n * @param metadataKey The key for the metadata entry.\n * @param metadataValue The value for the metadata entry.\n * @returns A decorator function.\n * @remarks\n * If `metadataKey` is already defined for the target and target key, the\n * metadataValue for that key will be overwritten.\n * @example\n *\n * // constructor\n * @Reflect.metadata(key, value)\n * class Example {\n * }\n *\n * // property (on constructor, TypeScript only)\n * class Example {\n * @Reflect.metadata(key, value)\n * static staticProperty;\n * }\n *\n * // property (on prototype, TypeScript only)\n * class Example {\n * @Reflect.metadata(key, value)\n * property;\n * }\n *\n * // method (on constructor)\n * class Example {\n * @Reflect.metadata(key, value)\n * static staticMethod() { }\n * }\n *\n * // method (on prototype)\n * class Example {\n * @Reflect.metadata(key, value)\n * method() { }\n * }\n *\n */\n function metadata(metadataKey, metadataValue) {\n function decorator(target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey) && !IsPropertyKey(propertyKey))\n throw new TypeError();\n OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey);\n }\n return decorator;\n }\n exporter(\"metadata\", metadata);\n /**\n * Define a unique metadata entry on the target.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param metadataValue A value that contains attached metadata.\n * @param target The target object on which to define metadata.\n * @param propertyKey (Optional) The property key for the target.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * Reflect.defineMetadata(\"custom:annotation\", options, Example);\n *\n * // property (on constructor)\n * Reflect.defineMetadata(\"custom:annotation\", options, Example, \"staticProperty\");\n *\n * // property (on prototype)\n * Reflect.defineMetadata(\"custom:annotation\", options, Example.prototype, \"property\");\n *\n * // method (on constructor)\n * Reflect.defineMetadata(\"custom:annotation\", options, Example, \"staticMethod\");\n *\n * // method (on prototype)\n * Reflect.defineMetadata(\"custom:annotation\", options, Example.prototype, \"method\");\n *\n * // decorator factory as metadata-producing annotation.\n * function MyAnnotation(options): Decorator {\n * return (target, key?) => Reflect.defineMetadata(\"custom:annotation\", options, target, key);\n * }\n *\n */\n function defineMetadata(metadataKey, metadataValue, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey);\n }\n exporter(\"defineMetadata\", defineMetadata);\n /**\n * Gets a value indicating whether the target object or its prototype chain has the provided metadata key defined.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns `true` if the metadata key was defined on the target object or its prototype chain; otherwise, `false`.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.hasMetadata(\"custom:annotation\", Example);\n *\n * // property (on constructor)\n * result = Reflect.hasMetadata(\"custom:annotation\", Example, \"staticProperty\");\n *\n * // property (on prototype)\n * result = Reflect.hasMetadata(\"custom:annotation\", Example.prototype, \"property\");\n *\n * // method (on constructor)\n * result = Reflect.hasMetadata(\"custom:annotation\", Example, \"staticMethod\");\n *\n * // method (on prototype)\n * result = Reflect.hasMetadata(\"custom:annotation\", Example.prototype, \"method\");\n *\n */\n function hasMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryHasMetadata(metadataKey, target, propertyKey);\n }\n exporter(\"hasMetadata\", hasMetadata);\n /**\n * Gets a value indicating whether the target object has the provided metadata key defined.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns `true` if the metadata key was defined on the target object; otherwise, `false`.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.hasOwnMetadata(\"custom:annotation\", Example);\n *\n * // property (on constructor)\n * result = Reflect.hasOwnMetadata(\"custom:annotation\", Example, \"staticProperty\");\n *\n * // property (on prototype)\n * result = Reflect.hasOwnMetadata(\"custom:annotation\", Example.prototype, \"property\");\n *\n * // method (on constructor)\n * result = Reflect.hasOwnMetadata(\"custom:annotation\", Example, \"staticMethod\");\n *\n * // method (on prototype)\n * result = Reflect.hasOwnMetadata(\"custom:annotation\", Example.prototype, \"method\");\n *\n */\n function hasOwnMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryHasOwnMetadata(metadataKey, target, propertyKey);\n }\n exporter(\"hasOwnMetadata\", hasOwnMetadata);\n /**\n * Gets the metadata value for the provided metadata key on the target object or its prototype chain.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns The metadata value for the metadata key if found; otherwise, `undefined`.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.getMetadata(\"custom:annotation\", Example);\n *\n * // property (on constructor)\n * result = Reflect.getMetadata(\"custom:annotation\", Example, \"staticProperty\");\n *\n * // property (on prototype)\n * result = Reflect.getMetadata(\"custom:annotation\", Example.prototype, \"property\");\n *\n * // method (on constructor)\n * result = Reflect.getMetadata(\"custom:annotation\", Example, \"staticMethod\");\n *\n * // method (on prototype)\n * result = Reflect.getMetadata(\"custom:annotation\", Example.prototype, \"method\");\n *\n */\n function getMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryGetMetadata(metadataKey, target, propertyKey);\n }\n exporter(\"getMetadata\", getMetadata);\n /**\n * Gets the metadata value for the provided metadata key on the target object.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns The metadata value for the metadata key if found; otherwise, `undefined`.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.getOwnMetadata(\"custom:annotation\", Example);\n *\n * // property (on constructor)\n * result = Reflect.getOwnMetadata(\"custom:annotation\", Example, \"staticProperty\");\n *\n * // property (on prototype)\n * result = Reflect.getOwnMetadata(\"custom:annotation\", Example.prototype, \"property\");\n *\n * // method (on constructor)\n * result = Reflect.getOwnMetadata(\"custom:annotation\", Example, \"staticMethod\");\n *\n * // method (on prototype)\n * result = Reflect.getOwnMetadata(\"custom:annotation\", Example.prototype, \"method\");\n *\n */\n function getOwnMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryGetOwnMetadata(metadataKey, target, propertyKey);\n }\n exporter(\"getOwnMetadata\", getOwnMetadata);\n /**\n * Gets the metadata keys defined on the target object or its prototype chain.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns An array of unique metadata keys.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.getMetadataKeys(Example);\n *\n * // property (on constructor)\n * result = Reflect.getMetadataKeys(Example, \"staticProperty\");\n *\n * // property (on prototype)\n * result = Reflect.getMetadataKeys(Example.prototype, \"property\");\n *\n * // method (on constructor)\n * result = Reflect.getMetadataKeys(Example, \"staticMethod\");\n *\n * // method (on prototype)\n * result = Reflect.getMetadataKeys(Example.prototype, \"method\");\n *\n */\n function getMetadataKeys(target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryMetadataKeys(target, propertyKey);\n }\n exporter(\"getMetadataKeys\", getMetadataKeys);\n /**\n * Gets the unique metadata keys defined on the target object.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns An array of unique metadata keys.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.getOwnMetadataKeys(Example);\n *\n * // property (on constructor)\n * result = Reflect.getOwnMetadataKeys(Example, \"staticProperty\");\n *\n * // property (on prototype)\n * result = Reflect.getOwnMetadataKeys(Example.prototype, \"property\");\n *\n * // method (on constructor)\n * result = Reflect.getOwnMetadataKeys(Example, \"staticMethod\");\n *\n * // method (on prototype)\n * result = Reflect.getOwnMetadataKeys(Example.prototype, \"method\");\n *\n */\n function getOwnMetadataKeys(target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryOwnMetadataKeys(target, propertyKey);\n }\n exporter(\"getOwnMetadataKeys\", getOwnMetadataKeys);\n /**\n * Deletes the metadata entry from the target object with the provided key.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns `true` if the metadata entry was found and deleted; otherwise, false.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.deleteMetadata(\"custom:annotation\", Example);\n *\n * // property (on constructor)\n * result = Reflect.deleteMetadata(\"custom:annotation\", Example, \"staticProperty\");\n *\n * // property (on prototype)\n * result = Reflect.deleteMetadata(\"custom:annotation\", Example.prototype, \"property\");\n *\n * // method (on constructor)\n * result = Reflect.deleteMetadata(\"custom:annotation\", Example, \"staticMethod\");\n *\n * // method (on prototype)\n * result = Reflect.deleteMetadata(\"custom:annotation\", Example.prototype, \"method\");\n *\n */\n function deleteMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n var metadataMap = GetOrCreateMetadataMap(target, propertyKey, /*Create*/ false);\n if (IsUndefined(metadataMap))\n return false;\n if (!metadataMap.delete(metadataKey))\n return false;\n if (metadataMap.size > 0)\n return true;\n var targetMetadata = Metadata.get(target);\n targetMetadata.delete(propertyKey);\n if (targetMetadata.size > 0)\n return true;\n Metadata.delete(target);\n return true;\n }\n exporter(\"deleteMetadata\", deleteMetadata);\n function DecorateConstructor(decorators, target) {\n for (var i = decorators.length - 1; i >= 0; --i) {\n var decorator = decorators[i];\n var decorated = decorator(target);\n if (!IsUndefined(decorated) && !IsNull(decorated)) {\n if (!IsConstructor(decorated))\n throw new TypeError();\n target = decorated;\n }\n }\n return target;\n }\n function DecorateProperty(decorators, target, propertyKey, descriptor) {\n for (var i = decorators.length - 1; i >= 0; --i) {\n var decorator = decorators[i];\n var decorated = decorator(target, propertyKey, descriptor);\n if (!IsUndefined(decorated) && !IsNull(decorated)) {\n if (!IsObject(decorated))\n throw new TypeError();\n descriptor = decorated;\n }\n }\n return descriptor;\n }\n function GetOrCreateMetadataMap(O, P, Create) {\n var targetMetadata = Metadata.get(O);\n if (IsUndefined(targetMetadata)) {\n if (!Create)\n return undefined;\n targetMetadata = new _Map();\n Metadata.set(O, targetMetadata);\n }\n var metadataMap = targetMetadata.get(P);\n if (IsUndefined(metadataMap)) {\n if (!Create)\n return undefined;\n metadataMap = new _Map();\n targetMetadata.set(P, metadataMap);\n }\n return metadataMap;\n }\n // 3.1.1.1 OrdinaryHasMetadata(MetadataKey, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinaryhasmetadata\n function OrdinaryHasMetadata(MetadataKey, O, P) {\n var hasOwn = OrdinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn)\n return true;\n var parent = OrdinaryGetPrototypeOf(O);\n if (!IsNull(parent))\n return OrdinaryHasMetadata(MetadataKey, parent, P);\n return false;\n }\n // 3.1.2.1 OrdinaryHasOwnMetadata(MetadataKey, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinaryhasownmetadata\n function OrdinaryHasOwnMetadata(MetadataKey, O, P) {\n var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false);\n if (IsUndefined(metadataMap))\n return false;\n return ToBoolean(metadataMap.has(MetadataKey));\n }\n // 3.1.3.1 OrdinaryGetMetadata(MetadataKey, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinarygetmetadata\n function OrdinaryGetMetadata(MetadataKey, O, P) {\n var hasOwn = OrdinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn)\n return OrdinaryGetOwnMetadata(MetadataKey, O, P);\n var parent = OrdinaryGetPrototypeOf(O);\n if (!IsNull(parent))\n return OrdinaryGetMetadata(MetadataKey, parent, P);\n return undefined;\n }\n // 3.1.4.1 OrdinaryGetOwnMetadata(MetadataKey, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinarygetownmetadata\n function OrdinaryGetOwnMetadata(MetadataKey, O, P) {\n var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false);\n if (IsUndefined(metadataMap))\n return undefined;\n return metadataMap.get(MetadataKey);\n }\n // 3.1.5.1 OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinarydefineownmetadata\n function OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {\n var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ true);\n metadataMap.set(MetadataKey, MetadataValue);\n }\n // 3.1.6.1 OrdinaryMetadataKeys(O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinarymetadatakeys\n function OrdinaryMetadataKeys(O, P) {\n var ownKeys = OrdinaryOwnMetadataKeys(O, P);\n var parent = OrdinaryGetPrototypeOf(O);\n if (parent === null)\n return ownKeys;\n var parentKeys = OrdinaryMetadataKeys(parent, P);\n if (parentKeys.length <= 0)\n return ownKeys;\n if (ownKeys.length <= 0)\n return parentKeys;\n var set = new _Set();\n var keys = [];\n for (var _i = 0, ownKeys_1 = ownKeys; _i < ownKeys_1.length; _i++) {\n var key = ownKeys_1[_i];\n var hasKey = set.has(key);\n if (!hasKey) {\n set.add(key);\n keys.push(key);\n }\n }\n for (var _a = 0, parentKeys_1 = parentKeys; _a < parentKeys_1.length; _a++) {\n var key = parentKeys_1[_a];\n var hasKey = set.has(key);\n if (!hasKey) {\n set.add(key);\n keys.push(key);\n }\n }\n return keys;\n }\n // 3.1.7.1 OrdinaryOwnMetadataKeys(O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinaryownmetadatakeys\n function OrdinaryOwnMetadataKeys(O, P) {\n var keys = [];\n var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false);\n if (IsUndefined(metadataMap))\n return keys;\n var keysObj = metadataMap.keys();\n var iterator = GetIterator(keysObj);\n var k = 0;\n while (true) {\n var next = IteratorStep(iterator);\n if (!next) {\n keys.length = k;\n return keys;\n }\n var nextValue = IteratorValue(next);\n try {\n keys[k] = nextValue;\n }\n catch (e) {\n try {\n IteratorClose(iterator);\n }\n finally {\n throw e;\n }\n }\n k++;\n }\n }\n // 6 ECMAScript Data Typ0es and Values\n // https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values\n function Type(x) {\n if (x === null)\n return 1 /* Null */;\n switch (typeof x) {\n case \"undefined\": return 0 /* Undefined */;\n case \"boolean\": return 2 /* Boolean */;\n case \"string\": return 3 /* String */;\n case \"symbol\": return 4 /* Symbol */;\n case \"number\": return 5 /* Number */;\n case \"object\": return x === null ? 1 /* Null */ : 6 /* Object */;\n default: return 6 /* Object */;\n }\n }\n // 6.1.1 The Undefined Type\n // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-undefined-type\n function IsUndefined(x) {\n return x === undefined;\n }\n // 6.1.2 The Null Type\n // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-null-type\n function IsNull(x) {\n return x === null;\n }\n // 6.1.5 The Symbol Type\n // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-symbol-type\n function IsSymbol(x) {\n return typeof x === \"symbol\";\n }\n // 6.1.7 The Object Type\n // https://tc39.github.io/ecma262/#sec-object-type\n function IsObject(x) {\n return typeof x === \"object\" ? x !== null : typeof x === \"function\";\n }\n // 7.1 Type Conversion\n // https://tc39.github.io/ecma262/#sec-type-conversion\n // 7.1.1 ToPrimitive(input [, PreferredType])\n // https://tc39.github.io/ecma262/#sec-toprimitive\n function ToPrimitive(input, PreferredType) {\n switch (Type(input)) {\n case 0 /* Undefined */: return input;\n case 1 /* Null */: return input;\n case 2 /* Boolean */: return input;\n case 3 /* String */: return input;\n case 4 /* Symbol */: return input;\n case 5 /* Number */: return input;\n }\n var hint = PreferredType === 3 /* String */ ? \"string\" : PreferredType === 5 /* Number */ ? \"number\" : \"default\";\n var exoticToPrim = GetMethod(input, toPrimitiveSymbol);\n if (exoticToPrim !== undefined) {\n var result = exoticToPrim.call(input, hint);\n if (IsObject(result))\n throw new TypeError();\n return result;\n }\n return OrdinaryToPrimitive(input, hint === \"default\" ? \"number\" : hint);\n }\n // 7.1.1.1 OrdinaryToPrimitive(O, hint)\n // https://tc39.github.io/ecma262/#sec-ordinarytoprimitive\n function OrdinaryToPrimitive(O, hint) {\n if (hint === \"string\") {\n var toString_1 = O.toString;\n if (IsCallable(toString_1)) {\n var result = toString_1.call(O);\n if (!IsObject(result))\n return result;\n }\n var valueOf = O.valueOf;\n if (IsCallable(valueOf)) {\n var result = valueOf.call(O);\n if (!IsObject(result))\n return result;\n }\n }\n else {\n var valueOf = O.valueOf;\n if (IsCallable(valueOf)) {\n var result = valueOf.call(O);\n if (!IsObject(result))\n return result;\n }\n var toString_2 = O.toString;\n if (IsCallable(toString_2)) {\n var result = toString_2.call(O);\n if (!IsObject(result))\n return result;\n }\n }\n throw new TypeError();\n }\n // 7.1.2 ToBoolean(argument)\n // https://tc39.github.io/ecma262/2016/#sec-toboolean\n function ToBoolean(argument) {\n return !!argument;\n }\n // 7.1.12 ToString(argument)\n // https://tc39.github.io/ecma262/#sec-tostring\n function ToString(argument) {\n return \"\" + argument;\n }\n // 7.1.14 ToPropertyKey(argument)\n // https://tc39.github.io/ecma262/#sec-topropertykey\n function ToPropertyKey(argument) {\n var key = ToPrimitive(argument, 3 /* String */);\n if (IsSymbol(key))\n return key;\n return ToString(key);\n }\n // 7.2 Testing and Comparison Operations\n // https://tc39.github.io/ecma262/#sec-testing-and-comparison-operations\n // 7.2.2 IsArray(argument)\n // https://tc39.github.io/ecma262/#sec-isarray\n function IsArray(argument) {\n return Array.isArray\n ? Array.isArray(argument)\n : argument instanceof Object\n ? argument instanceof Array\n : Object.prototype.toString.call(argument) === \"[object Array]\";\n }\n // 7.2.3 IsCallable(argument)\n // https://tc39.github.io/ecma262/#sec-iscallable\n function IsCallable(argument) {\n // NOTE: This is an approximation as we cannot check for [[Call]] internal method.\n return typeof argument === \"function\";\n }\n // 7.2.4 IsConstructor(argument)\n // https://tc39.github.io/ecma262/#sec-isconstructor\n function IsConstructor(argument) {\n // NOTE: This is an approximation as we cannot check for [[Construct]] internal method.\n return typeof argument === \"function\";\n }\n // 7.2.7 IsPropertyKey(argument)\n // https://tc39.github.io/ecma262/#sec-ispropertykey\n function IsPropertyKey(argument) {\n switch (Type(argument)) {\n case 3 /* String */: return true;\n case 4 /* Symbol */: return true;\n default: return false;\n }\n }\n // 7.3 Operations on Objects\n // https://tc39.github.io/ecma262/#sec-operations-on-objects\n // 7.3.9 GetMethod(V, P)\n // https://tc39.github.io/ecma262/#sec-getmethod\n function GetMethod(V, P) {\n var func = V[P];\n if (func === undefined || func === null)\n return undefined;\n if (!IsCallable(func))\n throw new TypeError();\n return func;\n }\n // 7.4 Operations on Iterator Objects\n // https://tc39.github.io/ecma262/#sec-operations-on-iterator-objects\n function GetIterator(obj) {\n var method = GetMethod(obj, iteratorSymbol);\n if (!IsCallable(method))\n throw new TypeError(); // from Call\n var iterator = method.call(obj);\n if (!IsObject(iterator))\n throw new TypeError();\n return iterator;\n }\n // 7.4.4 IteratorValue(iterResult)\n // https://tc39.github.io/ecma262/2016/#sec-iteratorvalue\n function IteratorValue(iterResult) {\n return iterResult.value;\n }\n // 7.4.5 IteratorStep(iterator)\n // https://tc39.github.io/ecma262/#sec-iteratorstep\n function IteratorStep(iterator) {\n var result = iterator.next();\n return result.done ? false : result;\n }\n // 7.4.6 IteratorClose(iterator, completion)\n // https://tc39.github.io/ecma262/#sec-iteratorclose\n function IteratorClose(iterator) {\n var f = iterator[\"return\"];\n if (f)\n f.call(iterator);\n }\n // 9.1 Ordinary Object Internal Methods and Internal Slots\n // https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots\n // 9.1.1.1 OrdinaryGetPrototypeOf(O)\n // https://tc39.github.io/ecma262/#sec-ordinarygetprototypeof\n function OrdinaryGetPrototypeOf(O) {\n var proto = Object.getPrototypeOf(O);\n if (typeof O !== \"function\" || O === functionPrototype)\n return proto;\n // TypeScript doesn't set __proto__ in ES5, as it's non-standard.\n // Try to determine the superclass constructor. Compatible implementations\n // must either set __proto__ on a subclass constructor to the superclass constructor,\n // or ensure each class has a valid `constructor` property on its prototype that\n // points back to the constructor.\n // If this is not the same as Function.[[Prototype]], then this is definately inherited.\n // This is the case when in ES6 or when using __proto__ in a compatible browser.\n if (proto !== functionPrototype)\n return proto;\n // If the super prototype is Object.prototype, null, or undefined, then we cannot determine the heritage.\n var prototype = O.prototype;\n var prototypeProto = prototype && Object.getPrototypeOf(prototype);\n if (prototypeProto == null || prototypeProto === Object.prototype)\n return proto;\n // If the constructor was not a function, then we cannot determine the heritage.\n var constructor = prototypeProto.constructor;\n if (typeof constructor !== \"function\")\n return proto;\n // If we have some kind of self-reference, then we cannot determine the heritage.\n if (constructor === O)\n return proto;\n // we have a pretty good guess at the heritage.\n return constructor;\n }\n // naive Map shim\n function CreateMapPolyfill() {\n var cacheSentinel = {};\n var arraySentinel = [];\n var MapIterator = /** @class */ (function () {\n function MapIterator(keys, values, selector) {\n this._index = 0;\n this._keys = keys;\n this._values = values;\n this._selector = selector;\n }\n MapIterator.prototype[\"@@iterator\"] = function () { return this; };\n MapIterator.prototype[iteratorSymbol] = function () { return this; };\n MapIterator.prototype.next = function () {\n var index = this._index;\n if (index >= 0 && index < this._keys.length) {\n var result = this._selector(this._keys[index], this._values[index]);\n if (index + 1 >= this._keys.length) {\n this._index = -1;\n this._keys = arraySentinel;\n this._values = arraySentinel;\n }\n else {\n this._index++;\n }\n return { value: result, done: false };\n }\n return { value: undefined, done: true };\n };\n MapIterator.prototype.throw = function (error) {\n if (this._index >= 0) {\n this._index = -1;\n this._keys = arraySentinel;\n this._values = arraySentinel;\n }\n throw error;\n };\n MapIterator.prototype.return = function (value) {\n if (this._index >= 0) {\n this._index = -1;\n this._keys = arraySentinel;\n this._values = arraySentinel;\n }\n return { value: value, done: true };\n };\n return MapIterator;\n }());\n return /** @class */ (function () {\n function Map() {\n this._keys = [];\n this._values = [];\n this._cacheKey = cacheSentinel;\n this._cacheIndex = -2;\n }\n Object.defineProperty(Map.prototype, \"size\", {\n get: function () { return this._keys.length; },\n enumerable: true,\n configurable: true\n });\n Map.prototype.has = function (key) { return this._find(key, /*insert*/ false) >= 0; };\n Map.prototype.get = function (key) {\n var index = this._find(key, /*insert*/ false);\n return index >= 0 ? this._values[index] : undefined;\n };\n Map.prototype.set = function (key, value) {\n var index = this._find(key, /*insert*/ true);\n this._values[index] = value;\n return this;\n };\n Map.prototype.delete = function (key) {\n var index = this._find(key, /*insert*/ false);\n if (index >= 0) {\n var size = this._keys.length;\n for (var i = index + 1; i < size; i++) {\n this._keys[i - 1] = this._keys[i];\n this._values[i - 1] = this._values[i];\n }\n this._keys.length--;\n this._values.length--;\n if (key === this._cacheKey) {\n this._cacheKey = cacheSentinel;\n this._cacheIndex = -2;\n }\n return true;\n }\n return false;\n };\n Map.prototype.clear = function () {\n this._keys.length = 0;\n this._values.length = 0;\n this._cacheKey = cacheSentinel;\n this._cacheIndex = -2;\n };\n Map.prototype.keys = function () { return new MapIterator(this._keys, this._values, getKey); };\n Map.prototype.values = function () { return new MapIterator(this._keys, this._values, getValue); };\n Map.prototype.entries = function () { return new MapIterator(this._keys, this._values, getEntry); };\n Map.prototype[\"@@iterator\"] = function () { return this.entries(); };\n Map.prototype[iteratorSymbol] = function () { return this.entries(); };\n Map.prototype._find = function (key, insert) {\n if (this._cacheKey !== key) {\n this._cacheIndex = this._keys.indexOf(this._cacheKey = key);\n }\n if (this._cacheIndex < 0 && insert) {\n this._cacheIndex = this._keys.length;\n this._keys.push(key);\n this._values.push(undefined);\n }\n return this._cacheIndex;\n };\n return Map;\n }());\n function getKey(key, _) {\n return key;\n }\n function getValue(_, value) {\n return value;\n }\n function getEntry(key, value) {\n return [key, value];\n }\n }\n // naive Set shim\n function CreateSetPolyfill() {\n return /** @class */ (function () {\n function Set() {\n this._map = new _Map();\n }\n Object.defineProperty(Set.prototype, \"size\", {\n get: function () { return this._map.size; },\n enumerable: true,\n configurable: true\n });\n Set.prototype.has = function (value) { return this._map.has(value); };\n Set.prototype.add = function (value) { return this._map.set(value, value), this; };\n Set.prototype.delete = function (value) { return this._map.delete(value); };\n Set.prototype.clear = function () { this._map.clear(); };\n Set.prototype.keys = function () { return this._map.keys(); };\n Set.prototype.values = function () { return this._map.values(); };\n Set.prototype.entries = function () { return this._map.entries(); };\n Set.prototype[\"@@iterator\"] = function () { return this.keys(); };\n Set.prototype[iteratorSymbol] = function () { return this.keys(); };\n return Set;\n }());\n }\n // naive WeakMap shim\n function CreateWeakMapPolyfill() {\n var UUID_SIZE = 16;\n var keys = HashMap.create();\n var rootKey = CreateUniqueKey();\n return /** @class */ (function () {\n function WeakMap() {\n this._key = CreateUniqueKey();\n }\n WeakMap.prototype.has = function (target) {\n var table = GetOrCreateWeakMapTable(target, /*create*/ false);\n return table !== undefined ? HashMap.has(table, this._key) : false;\n };\n WeakMap.prototype.get = function (target) {\n var table = GetOrCreateWeakMapTable(target, /*create*/ false);\n return table !== undefined ? HashMap.get(table, this._key) : undefined;\n };\n WeakMap.prototype.set = function (target, value) {\n var table = GetOrCreateWeakMapTable(target, /*create*/ true);\n table[this._key] = value;\n return this;\n };\n WeakMap.prototype.delete = function (target) {\n var table = GetOrCreateWeakMapTable(target, /*create*/ false);\n return table !== undefined ? delete table[this._key] : false;\n };\n WeakMap.prototype.clear = function () {\n // NOTE: not a real clear, just makes the previous data unreachable\n this._key = CreateUniqueKey();\n };\n return WeakMap;\n }());\n function CreateUniqueKey() {\n var key;\n do\n key = \"@@WeakMap@@\" + CreateUUID();\n while (HashMap.has(keys, key));\n keys[key] = true;\n return key;\n }\n function GetOrCreateWeakMapTable(target, create) {\n if (!hasOwn.call(target, rootKey)) {\n if (!create)\n return undefined;\n Object.defineProperty(target, rootKey, { value: HashMap.create() });\n }\n return target[rootKey];\n }\n function FillRandomBytes(buffer, size) {\n for (var i = 0; i < size; ++i)\n buffer[i] = Math.random() * 0xff | 0;\n return buffer;\n }\n function GenRandomBytes(size) {\n if (typeof Uint8Array === \"function\") {\n if (typeof crypto !== \"undefined\")\n return crypto.getRandomValues(new Uint8Array(size));\n if (typeof msCrypto !== \"undefined\")\n return msCrypto.getRandomValues(new Uint8Array(size));\n return FillRandomBytes(new Uint8Array(size), size);\n }\n return FillRandomBytes(new Array(size), size);\n }\n function CreateUUID() {\n var data = GenRandomBytes(UUID_SIZE);\n // mark as random - RFC 4122 § 4.4\n data[6] = data[6] & 0x4f | 0x40;\n data[8] = data[8] & 0xbf | 0x80;\n var result = \"\";\n for (var offset = 0; offset < UUID_SIZE; ++offset) {\n var byte = data[offset];\n if (offset === 4 || offset === 6 || offset === 8)\n result += \"-\";\n if (byte < 16)\n result += \"0\";\n result += byte.toString(16).toLowerCase();\n }\n return result;\n }\n }\n // uses a heuristic used by v8 and chakra to force an object into dictionary mode.\n function MakeDictionary(obj) {\n obj.__ = undefined;\n delete obj.__;\n return obj;\n }\n });\n})(Reflect || (Reflect = {}));\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","\nexport interface IForEachAble<T> extends Iterable<T> {\n forEach(callback: (v: T, i: number) => void): void;\n}\n\n/**\n * @internal\n */\nexport function isForEachAble<T>(v: IForEachAble<T> | any): v is IForEachAble<T> {\n return typeof v.forEach === 'function';\n}\n\n/**\n * generalized version of Array function similar to Scala ISeq\n */\nexport interface ISequence<T> extends IForEachAble<T> {\n readonly length: number;\n filter(callback: (v: T, i: number) => boolean): ISequence<T>;\n map<U>(callback: (v: T, i: number) => U): ISequence<U>;\n\n some(callback: (v: T, i: number) => boolean): boolean;\n every(callback: (v: T, i: number) => boolean): boolean;\n reduce<U>(callback: (acc: U, v: T, i: number) => U, initial: U): U;\n}\n\n/**\n * @internal\n */\nexport function isSeqEmpty(seq: ISequence<any>) {\n return seq.every(() => false); // more efficent than counting length\n}\n\n/**\n * helper function for faster access to avoid function calls\n * @internal\n */\nexport function isIndicesAble<T>(it: Iterable<T>): it is ArrayLike<T> & Iterable<T> {\n return Array.isArray(it) || it instanceof Uint8Array || it instanceof Uint16Array || it instanceof Uint32Array || it instanceof Float32Array || it instanceof Int8Array || it instanceof Int16Array || it instanceof Int32Array || it instanceof Float64Array;\n}\n\ndeclare type ISequenceBase<T> = ISequence<T> | (ArrayLike<T> & Iterable<T>);\n\n/**\n * sequence implementation that does the operation lazily on the fly\n */\nclass LazyFilter<T> implements ISequence<T> {\n private _length = -1;\n\n constructor(private readonly it: ISequenceBase<T>, private readonly filters: ((v: T, i: number) => boolean)[]) {\n\n }\n\n get length() {\n // cached\n if (this._length >= 0) {\n return this._length;\n }\n let l = 0;\n this.forEach(() => l++);\n this._length = l;\n return l;\n }\n\n filter(callback: (v: T, i: number) => boolean): ISequence<T> {\n // propagate filter\n return new LazyFilter(this.it, this.filters.concat(callback));\n }\n\n map<U>(callback: (v: T, i: number) => U): ISequence<U> {\n // create lazy map out of myself\n return new LazyMap1(this, callback);\n }\n\n forEach(callback: (v: T, i: number) => void) {\n if (isIndicesAble(this.it)) {\n // fast array version\n outer: for (let i = 0; i < this.it.length; ++i) {\n const v = this.it[i];\n for (const f of this.filters) {\n if (!f(v, i)) {\n continue outer;\n }\n }\n callback(v, i);\n }\n return;\n }\n\n // iterator version\n let valid = 0;\n const it = this.it[Symbol.iterator]();\n let v = it.next();\n let i = 0;\n outer: while (!v.done) {\n for (const f of this.filters) {\n if (f(v.value, i)) {\n continue;\n }\n v = it.next();\n i++;\n continue outer;\n }\n callback(v.value, valid++);\n v = it.next();\n i++;\n }\n }\n\n [Symbol.iterator]() {\n const it = this.it[Symbol.iterator]();\n const next = () => {\n let v = it.next();\n let i = -1;\n outer: while (!v.done) {\n i++;\n for (const f of this.filters) {\n if (f(v.value, i)) {\n continue;\n }\n // invalid go to next\n v = it.next();\n continue outer;\n }\n return v;\n }\n return v;\n };\n return {next};\n }\n\n some(callback: (v: T, i: number) => boolean) {\n if (isIndicesAble(this.it)) {\n // fast array version\n outer: for (let i = 0; i < this.it.length; ++i) {\n const v = this.it[i];\n for (const f of this.filters) {\n if (!f(v, i)) {\n continue outer;\n }\n }\n if (callback(v, i)) {\n return true;\n }\n }\n return false;\n }\n\n let valid = 0;\n const it = this.it[Symbol.iterator]();\n let v = it.next();\n let i = 0;\n outer: while (!v.done) {\n for (const f of this.filters) {\n if (f(v.value, i)) {\n continue;\n }\n v = it.next();\n i++;\n continue outer;\n }\n if (callback(v.value, valid++)) {\n return true;\n }\n v = it.next();\n i++;\n }\n return false;\n }\n\n every(callback: (v: T, i: number) => boolean) {\n if (isIndicesAble(this.it)) {\n // fast array version\n outer: for (let i = 0; i < this.it.length; ++i) {\n const v = this.it[i];\n for (const f of this.filters) {\n if (!f(v, i)) {\n continue outer;\n }\n }\n if (!callback(v, i)) {\n return false;\n }\n }\n return true;\n }\n\n let valid = 0;\n const it = this.it[Symbol.iterator]();\n let v = it.next();\n let i = 0;\n outer: while (!v.done) {\n for (const f of this.filters) {\n if (f(v.value, i)) {\n continue;\n }\n v = it.next();\n i++;\n continue outer;\n }\n if (!callback(v.value, valid++)) {\n return false;\n }\n v = it.next();\n i++;\n }\n return true;\n }\n\n reduce<U>(callback: (acc: U, v: T, i: number) => U, initial: U) {\n if (isIndicesAble(this.it)) {\n // fast array version\n let acc = initial;\n let j = 0;\n outer: for (let i = 0; i < this.it.length; ++i) {\n const v = this.it[i];\n for (const f of this.filters) {\n if (!f(v, i)) {\n continue outer;\n }\n }\n acc = callback(acc, v, j++);\n }\n return acc;\n }\n\n let valid = 0;\n const it = this.it[Symbol.iterator]();\n let v = it.next();\n let i = 0;\n let r = initial;\n outer: while (!v.done) {\n for (const f of this.filters) {\n if (f(v.value, i)) {\n continue;\n }\n v = it.next();\n i++;\n continue outer;\n }\n r = callback(r, v.value, valid++);\n v = it.next();\n i++;\n }\n return r;\n }\n}\n\n/**\n * lazy mapping operation\n */\nabstract class ALazyMap<T, T2> implements ISequence<T2> {\n constructor(protected readonly it: ISequenceBase<T>) {\n\n }\n\n get length() {\n return this.it.length;\n }\n\n filter(callback: (v: T2, i: number) => boolean): ISequence<T2> {\n return new LazyFilter(this, [callback]);\n }\n\n abstract map<U>(callback: (v: T2, i: number) => U): ISequence<U>;\n protected abstract mapV(v: T, i: number): T2;\n\n\n forEach(callback: (v: T2, i: number) => void) {\n if (isIndicesAble(this.it)) {\n for (let i = 0; i < this.it.length; ++i) {\n callback(this.mapV(this.it[i], i), i);\n }\n return;\n }\n const it = this.it[Symbol.iterator]();\n for (let v = it.next(), i = 0; !v.done; v = it.next(), i++) {\n callback(this.mapV(v.value, i), i);\n }\n }\n\n [Symbol.iterator]() {\n const it = this.it[Symbol.iterator]();\n let i = 0;\n const next = () => {\n const v = it.next();\n if (v.done) {\n return {\n value: <T2><any>undefined,\n done: true\n };\n }\n const value = this.mapV(v.value, i);\n i++;\n return {\n value,\n done: false\n };\n };\n return {next};\n }\n\n some(callback: (v: T2, i: number) => boolean) {\n if (isIndicesAble(this.it)) {\n for (let i = 0; i < this.it.length; ++i) {\n if (callback(this.mapV(this.it[i], i), i)) {\n return true;\n }\n }\n return false;\n }\n\n const it = this.it[Symbol.iterator]();\n for (let v = it.next(), i = 0; !v.done; v = it.next(), i++) {\n if (callback(this.mapV(v.value, i), i)) {\n return true;\n }\n }\n return false;\n }\n\n every(callback: (v: T2, i: number) => boolean) {\n if (isIndicesAble(this.it)) {\n for (let i = 0; i < this.it.length; ++i) {\n if (!callback(this.mapV(this.it[i], i), i)) {\n return false;\n }\n }\n return true;\n }\n\n const it = this.it[Symbol.iterator]();\n for (let v = it.next(), i = 0; !v.done; v = it.next(), i++) {\n if (!callback(this.mapV(v.value, i), i)) {\n return false;\n }\n }\n return true;\n }\n\n reduce<U>(callback: (acc: U, v: T2, i: number) => U, initial: U) {\n if (isIndicesAble(this.it)) {\n let acc = initial;\n for (let i = 0; i < this.it.length; ++i) {\n acc = callback(acc, this.mapV(this.it[i], i), i);\n }\n return acc;\n }\n\n const it = this.it[Symbol.iterator]();\n let acc = initial;\n for (let v = it.next(), i = 0; !v.done; v = it.next(), i++) {\n acc = callback(acc, this.mapV(v.value, i), i);\n }\n return acc;\n }\n}\n\nclass LazyMap1<T1, T2> extends ALazyMap<T1, T2> implements ISequence<T2> {\n constructor(it: ISequenceBase<T1>, protected readonly map12: (v: T1, i: number) => T2) {\n super(it);\n }\n\n protected mapV(v: T1, i: number) {\n return this.map12(v, i);\n }\n\n map<U>(callback: (v: T2, i: number) => U): ISequence<U> {\n return new LazyMap2(this.it, this.map12, callback);\n }\n}\n\nclass LazyMap2<T1, T2, T3> extends ALazyMap<T1, T3> implements ISequence<T3> {\n constructor(it: ISequenceBase<T1>, private readonly map12: (v: T1, i: number) => T2, private readonly map23: (v: T2, i: number) => T3) {\n super(it);\n }\n\n map<U>(callback: (v: T3, i: number) => U): ISequence<U> {\n return new LazyMap3(this.it, this.map12, this.map23, callback);\n }\n\n protected mapV(v: T1, i: number) {\n return this.map23(this.map12(v, i), i);\n }\n}\n\n\nclass LazyMap3<T1, T2, T3, T4> extends ALazyMap<T1, T4> implements ISequence<T4> {\n constructor(it: ISequenceBase<T1>, private readonly map12: (v: T1, i: number) => T2, private readonly map23: (v: T2, i: number) => T3, private readonly map34: (v: T3, i: number) => T4) {\n super(it);\n }\n\n map<U>(callback: (v: T4, i: number) => U): ISequence<U> {\n const map1U = (v: T1, i: number) => callback(this.map34(this.map23(this.map12(v, i), i), i), i);\n return new LazyMap1(this.it, map1U);\n }\n\n protected mapV(v: T1, i: number) {\n return this.map34(this.map23(this.map12(v, i), i), i);\n }\n}\n\nclass LazySeq<T> implements ISequence<T> {\n private _arr: ISequenceBase<T> | null = null;\n\n constructor(private readonly iterable: Iterable<T>) {\n\n }\n\n get arr() {\n if (this._arr) {\n return this._arr;\n }\n if (isIndicesAble(this.iterable)) {\n this._arr = this.iterable;\n } else {\n this._arr = Array.from(this.iterable);\n }\n return this._arr!;\n }\n\n [Symbol.iterator]() {\n return this.iterable[Symbol.iterator]();\n }\n\n filter(callback: (v: T, i: number) => boolean) {\n return new LazyFilter(this.arr, [callback]);\n }\n\n map<U>(callback: (v: T, i: number) => U) {\n return new LazyMap1(this.arr, callback);\n }\n\n forEach(callback: (v: T, i: number) => void) {\n if (isIndicesAble(this.iterable)) {\n for (let i = 0; i < this.iterable.length; ++i) {\n callback(this.iterable[i], i);\n }\n return;\n }\n const it = this[Symbol.iterator]();\n for (let v = it.next(), i = 0; !v.done; v = it.next(), i++) {\n callback(v.value, i);\n }\n }\n\n some(callback: (v: T, i: number) => boolean) {\n if (isIndicesAble(this.iterable)) {\n for (let i = 0; i < this.iterable.length; ++i) {\n if (callback(this.iterable[i], i)) {\n return true;\n }\n }\n return false;\n }\n\n const it = this[Symbol.iterator]();\n for (let v = it.next(), i = 0; !v.done; v = it.next(), i++) {\n if (callback(v.value, i)) {\n return true;\n }\n }\n return false;\n }\n\n every(callback: (v: T, i: number) => boolean) {\n if (isIndicesAble(this.iterable)) {\n for (let i = 0; i < this.iterable.length; ++i) {\n if (!callback(this.iterable[i], i)) {\n return false;\n }\n }\n return true;\n }\n\n const it = this[Symbol.iterator]();\n for (let v = it.next(), i = 0; !v.done; v = it.next(), i++) {\n if (!callback(v.value, i)) {\n return false;\n }\n }\n return true;\n }\n\n reduce<U>(callback: (acc: U, v: T, i: number) => U, initial: U) {\n if (isIndicesAble(this.iterable)) {\n let acc = initial;\n for (let i = 0; i < this.iterable.length; ++i) {\n acc = callback(acc, this.iterable[i], i);\n }\n return acc;\n }\n\n const it = this[Symbol.iterator]();\n let acc = initial;\n for (let v = it.next(), i = 0; !v.done; v = it.next(), i++) {\n acc = callback(acc, v.value, i);\n }\n return acc;\n }\n\n get length() {\n const it = this.iterable;\n if (isIndicesAble(it)) {\n return it.length;\n }\n if (it instanceof Set || it instanceof Map) {\n return it.size;\n }\n return this.arr.length;\n }\n}\n\n/**\n * @internal\n */\nexport function lazySeq<T>(iterable: Iterable<T>): ISequence<T> {\n return new LazySeq(iterable);\n}\n\n\nclass ConcatSequence<T> implements ISequence<T> {\n constructor(private readonly seqs: ISequence<ISequence<T>>) {\n //\n }\n\n [Symbol.iterator]() {\n const seqs = Array.from(this.seqs);\n let it = seqs.shift()![Symbol.iterator]();\n const next = (): {value: T, done: boolean} => {\n const v = it.next();\n if (!v.done) {\n return v;\n }\n if (seqs.length === 0) {\n // last last\n return v;\n }\n // next iterator and compute next element\n it = seqs.shift()![Symbol.iterator]();\n return next();\n };\n return {next};\n }\n\n filter(callback: (v: T, i: number) => boolean): ISequence<T> {\n return new LazyFilter(this, [callback]);\n }\n\n map<U>(callback: (v: T, i: number) => U): ISequence<U> {\n return new LazyMap1(this, callback);\n }\n\n forEach(callback: (v: T, i: number) => void) {\n this.seqs.forEach((s) => s.forEach(callback));\n }\n\n some(callback: (v: T, i: number) => boolean) {\n return this.seqs.some((s) => s.some(callback));\n }\n\n every(callback: (v: T, i: number) => boolean) {\n return this.seqs.every((s) => s.every(callback));\n }\n\n reduce<U>(callback: (acc: U, v: T, i: number) => U, initial: U) {\n return this.seqs.reduce((acc, s) => s.reduce(callback, acc), initial);\n }\n\n get length() {\n return this.seqs.reduce((a, b) => a + b.length, 0);\n }\n}\n\n/**\n * @internal\n */\nexport function concatSeq<T>(seqs: ISequence<ISequence<T>>): ISequence<T>;\nexport function concatSeq<T>(seq1: ISequence<T>, seq2: ISequence<T>, ...seqs: ISequence<T>[]): ISequence<T>;\nexport function concatSeq<T>(seq1: ISequence<T>[] | ISequence<T>, seq2?: ISequence<T>, ...seqs: ISequence<T>[]): ISequence<T> {\n if (seq2) {\n return new ConcatSequence([<ISequence<T>>seq1, seq2].concat(seqs));\n }\n return new ConcatSequence(<ISequence<T>[]>seq1);\n}\n","import {IWorkerMessage, INumberStatsMessageRequest, IAdvancedBoxPlotData, ICategoricalStatistics, IDateStatistics, IStatistics, ICategoricalStatsMessageRequest, IDateStatsMessageRequest, IBoxPlotStatsMessageRequest} from './';\nimport {UIntTypedArray, IndicesArray} from '../model';\n\n/**\n * @internal\n */\nexport interface IPoorManWorkerScopeEventMap {\n message: MessageEvent;\n error: ErrorEvent;\n}\n\ndeclare type IPoorManTransferAble = ArrayBuffer | MessagePort | ImageBitmap;\n\n/**\n * @internal\n */\nexport interface IPoorManWorkerScope {\n onmessage: ((this: IPoorManWorkerScope, ev: MessageEvent) => any) | null;\n onerror: ((this: IPoorManWorkerScope, ev: ErrorEvent) => any) | null;\n close(): void;\n postMessage(message: any, transfer?: IPoorManTransferAble[]): void;\n addEventListener<K extends keyof IPoorManWorkerScopeEventMap>(type: K, listener: (this: IPoorManWorkerScope, ev: IPoorManWorkerScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\n removeEventListener<K extends keyof IPoorManWorkerScopeEventMap>(type: K, listener: (this: IPoorManWorkerScope, ev: IPoorManWorkerScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\n}\n\n// function workerMain(self: IPoorManWorkerScope) {\n// self.addEventListener('message', (evt) => {\n// self.postMessage(`Worker: ${evt.data} - Polo`);\n// });\n// }\n\n/**\n * @internal\n */\nexport function toFunctionBody(f: Function) {\n const source = f.toString();\n return source.slice(source.indexOf('{') + 1, source.lastIndexOf('}'));\n}\n\n/**\n * create a blob out of the given function or string\n * @internal\n */\nexport function createWorkerCodeBlob(fs: (string | Function)[]) {\n const sources = fs.map((d) => d.toString()).join('\\n\\n');\n\n const blob = new Blob([sources], {type: 'application/javascript'});\n return URL.createObjectURL(blob);\n}\n\nconst MIN_WORKER_THREADS = 1;\nconst MAX_WORKER_THREADS = Math.max(navigator.hardwareConcurrency - 1, 1); // keep one for the ui\n\nconst THREAD_CLEANUP_TIME = 10000; // 10s\n\ninterface ITaskWorker {\n /**\n * worker index\n */\n index: number;\n /**\n * worker itself\n */\n worker: Worker;\n /**\n * set of active task numbers\n */\n tasks: Set<number>;\n /**\n * list of references that are stored on this worker\n */\n refs: Set<string>;\n}\n\n/**\n * task scheduler based on web worker\n * @internal\n */\nexport class WorkerTaskScheduler {\n private readonly workers: ITaskWorker[] = [];\n private cleanUpWorkerTimer: number = -1;\n /**\n * worker task id\n */\n private workerTaskCounter = 0;\n\n constructor(private readonly blob: string) {\n for (let i = 0; i < MIN_WORKER_THREADS; ++i) {\n const w = new Worker(blob);\n this.workers.push({worker: w, tasks: new Set(), refs: new Set(), index: i});\n }\n }\n\n terminate() {\n this.workers.splice(0, this.workers.length).forEach((w) => w.worker.terminate());\n }\n\n private readonly cleanUpWorker = () => {\n // delete workers when they are not needed anymore and empty\n while(this.workers.length > MIN_WORKER_THREADS) {\n const toFree = this.workers.findIndex((d) => d.tasks.size === 0);\n if (toFree < 0) {\n break;\n }\n const w = this.workers.splice(toFree, 1)[0]!;\n w.worker.terminate();\n }\n // maybe reschedule\n this.finshedTask();\n }\n\n private checkOutWorker() {\n if (this.cleanUpWorkerTimer >= 0) {\n clearTimeout(this.cleanUpWorkerTimer);\n this.cleanUpWorkerTimer = -1;\n }\n\n const emptyWorker = this.workers.find((d) => d.tasks.size === 0);\n\n if (emptyWorker) {\n return emptyWorker;\n }\n\n if (this.workers.length >= MAX_WORKER_THREADS) {\n // find the one with the fewest tasks\n return this.workers.reduce((a, b) => a == null || a.tasks.size > b.tasks.size ? b : a, <ITaskWorker | null>null)!;\n }\n\n // create new one\n const r: ITaskWorker = {\n worker: new Worker(this.blob),\n tasks: new Set<number>(),\n refs: new Set(),\n index: this.workers.length,\n };\n this.workers.push(r);\n return r;\n }\n\n private finshedTask() {\n if (this.cleanUpWorkerTimer === -1 && this.workers.length > MIN_WORKER_THREADS) {\n this.cleanUpWorkerTimer = self.setTimeout(this.cleanUpWorker, THREAD_CLEANUP_TIME);\n }\n }\n\n pushStats(type: 'numberStats', args: Partial<INumberStatsMessageRequest>, refData: string, data: Float32Array, refIndices?: string, indices?: IndicesArray): Promise<IStatistics>;\n pushStats(type: 'boxplotStats', args: Partial<IBoxPlotStatsMessageRequest>, refData: string, data: Float32Array, refIndices?: string, indices?: IndicesArray): Promise<IAdvancedBoxPlotData>;\n pushStats(type: 'categoricalStats', args: Partial<ICategoricalStatsMessageRequest>, refData: string, data: UIntTypedArray, refIndices?: string, indices?: IndicesArray): Promise<ICategoricalStatistics>;\n pushStats(type: 'dateStats', args: Partial<IDateStatsMessageRequest>, refData: string, data: Float64Array, refIndices?: string, indices?: IndicesArray): Promise<IDateStatistics>;\n pushStats(type: 'numberStats' | 'boxplotStats' | 'categoricalStats' | 'dateStats', args: any, refData: string, data: Float32Array | UIntTypedArray | Float64Array, refIndices?: string, indices?: IndicesArray) {\n return new Promise((resolve) => {\n const uid = this.workerTaskCounter++;\n const {worker, tasks, refs} = this.checkOutWorker();\n\n const receiver = (msg: MessageEvent) => {\n const r = <IWorkerMessage>msg.data;\n if (r.uid !== uid || r.type !== type) {\n return;\n }\n // console.log('worker', index, uid, 'finish', r);\n worker.removeEventListener('message', receiver);\n tasks.delete(uid);\n this.finshedTask();\n resolve((<any>r).stats);\n };\n\n worker.addEventListener('message', receiver);\n\n tasks.add(uid);\n\n const msg: any = Object.assign({\n type,\n uid,\n refData,\n refIndices: refIndices || null\n }, args);\n\n if (!refData || !refs.has(refData)) {\n // need to transfer to worker\n msg.data = data;\n if (refData) { // save that this worker has this ref\n refs.add(refData);\n }\n // console.log(index, 'set ref (i)', refData);\n }\n if (indices && (!refIndices || !refs.has(refIndices))) {\n // need to transfer\n msg.indices = indices!;\n if (refIndices) {\n refs.add(refIndices);\n }\n // console.log(index, 'set ref (i)', refIndices);\n }\n // console.log('worker', index, uid, msg);\n\n worker.postMessage(msg);\n });\n }\n\n push<M, R>(type: string, args: M, transferAbles: ArrayBuffer[]): Promise<R>;\n push<M, R, T>(type: string, args: M, transferAbles: ArrayBuffer[], toResult: (r: R) => T): Promise<T>;\n push<M, R, T>(type: string, args: M, transferAbles: ArrayBuffer[], toResult?: (r: R) => T): Promise<T> {\n return new Promise<T>((resolve) => {\n const uid = this.workerTaskCounter++;\n const {worker, tasks} = this.checkOutWorker();\n\n const receiver = (msg: MessageEvent) => {\n const r = <IWorkerMessage>msg.data;\n if (r.uid !== uid || r.type !== type) {\n return;\n }\n // console.log('worker', index, uid, 'finish', r);\n worker.removeEventListener('message', receiver);\n tasks.delete(uid);\n this.finshedTask();\n resolve(toResult ? toResult(<any>r) : <any>r);\n };\n\n worker.addEventListener('message', receiver);\n tasks.add(uid);\n const msg = Object.assign({\n type,\n uid\n }, args);\n // console.log('worker', index, uid, msg);\n\n worker.postMessage(msg, transferAbles);\n });\n }\n\n setRef(ref: string, data: Float32Array | UIntTypedArray | Int32Array | Float64Array | IndicesArray) {\n for (const w of this.workers) {\n w.refs.add(ref);\n }\n this.broadCast('setRef', {\n ref,\n data\n });\n }\n\n deleteRef(ref: string, startsWith = false) {\n const uid = this.workerTaskCounter++;\n const msg = {\n type: 'deleteRef',\n uid,\n ref,\n startsWith\n };\n for (const w of this.workers) {\n // console.log(w.index, 'delete ref', ref, startsWith);\n w.worker.postMessage(msg);\n if (!startsWith) {\n w.refs.delete(ref);\n continue;\n }\n for (const r of Array.from(w.refs)) {\n if (r.startsWith(ref)) {\n w.refs.delete(r);\n }\n }\n }\n }\n\n deleteRefs() {\n const uid = this.workerTaskCounter++;\n const msg = {\n type: 'deleteRef',\n uid,\n ref: '',\n startsWith: true\n };\n for (const w of this.workers) {\n // console.log(w.index, 'delete refs');\n w.worker.postMessage(msg);\n w.refs.clear();\n }\n }\n\n broadCast<T>(type: string, args: T) {\n const uid = this.workerTaskCounter++;\n // don't store in tasks queue since there is no response\n const msg = Object.assign({\n type,\n uid\n }, args);\n // console.log('broadcast', msg);\n for (const w of this.workers) {\n w.worker.postMessage(msg);\n }\n }\n\n}\n","import {ICategory, IndicesArray, UIntTypedArray} from '../model';\nimport {IForEachAble, ISequence, isIndicesAble} from './interable';\nimport {createWorkerCodeBlob, IPoorManWorkerScope, toFunctionBody} from './worker';\nimport {IAdvancedBoxPlotData, IStatistics, INumberBin, IDateBin, IDateStatistics, ICategoricalStatistics, ICategoricalBin, IDateHistGranularity} from './mathInterfaces';\n\n\n/**\n * computes the optimal number of bins for a given array length\n * @internal\n * @param {number} length\n * @returns {number}\n */\nexport function getNumberOfBins(length: number) {\n if (length === 0) {\n return 1;\n }\n // as by default used in d3 the Sturges' formula\n return Math.ceil(Math.log(length) / Math.LN2) + 1;\n}\n\n/**\n * @internal\n */\nexport function min(values: number[]): number;\nexport function min<T>(values: T[], acc: (v: T) => number): number;\nexport function min<T>(values: T[], acc?: (v: T) => number) {\n let min = Number.POSITIVE_INFINITY;\n for (const d of values) {\n const v = acc ? acc(d) : <number><any>d;\n if (v < min) {\n min = v;\n }\n }\n return min;\n}\n\n/**\n * @internal\n */\nexport function max(values: number[]): number;\nexport function max<T>(values: T[], acc: (v: T) => number): number;\nexport function max<T>(values: T[], acc?: (v: T) => number) {\n let max = Number.NEGATIVE_INFINITY;\n for (const d of values) {\n const v = acc ? acc(d) : <number><any>d;\n if (v > max) {\n max = v;\n }\n }\n return max;\n}\n\n/**\n * @internal\n */\nexport function extent(values: number[]): [number, number];\nexport function extent<T>(values: T[], acc: (v: T) => number): [number, number];\nexport function extent<T>(values: T[], acc?: (v: T) => number) {\n let max = Number.NEGATIVE_INFINITY;\n let min = Number.POSITIVE_INFINITY;\n for (const d of values) {\n const v = acc ? acc(d) : <number><any>d;\n if (v < min) {\n min = v;\n }\n if (v > max) {\n max = v;\n }\n }\n return [min, max];\n}\n\n/**\n * @internal\n */\nexport function range(length: number) {\n const r: number[] = new Array(length);\n for (let i = 0; i < length; ++i) {\n r[i] = i;\n }\n return r;\n}\n\n/**\n * an empty range\n * @internal\n */\nexport function empty(length: number) {\n const r: null[] = new Array(length);\n r.fill(null);\n return r;\n}\n\n/**\n * computes the X quantile assumes the values are sorted\n * @internal\n */\nexport function quantile(values: ArrayLike<number>, quantile: number, length = values.length) {\n if (length === 0) {\n return NaN;\n }\n const target = (length - 1) * quantile;\n const index = Math.floor(target);\n if (index === target) {\n return values[index];\n }\n const v = values[index];\n const vAfter = values[index + 1];\n return v + (vAfter - v) * (target - index); // shift by change\n}\n\n/**\n * @internal\n */\nexport function median(values: number[]): number;\nexport function median<T>(values: T[], acc: (v: T) => number): number;\nexport function median<T>(values: T[], acc?: (v: T) => number) {\n const arr = acc ? values.map(acc) : (<number[]><any>values).slice();\n arr.sort((a, b) => (a < b ? -1 : (a > b ? 1 : 0)));\n return quantile(arr, 0.5);\n}\n\nfunction pushAll<T>(push: (v: T) => void) {\n return (vs: IForEachAble<T>) => {\n if (!isIndicesAble(vs)) {\n vs.forEach(push);\n return;\n }\n // tslint:disable-next-line:prefer-for-of\n for (let j = 0; j < vs.length; ++j) {\n push(vs[j]);\n }\n };\n}\n\n/**\n * common interface for a bulider pattern\n * @internal\n */\nexport interface IBuilder<T, R> {\n /**\n * push an entry\n */\n push(v: T): void;\n /**\n * push multiple values at once\n */\n pushAll(vs: IForEachAble<T>): void;\n\n /**\n * build the result\n */\n build(): R;\n}\n\n/**\n * @internal\n */\nexport function boxplotBuilder(fixedLength?: number): IBuilder<number, IAdvancedBoxPlotData> & {buildArr: (s: Float32Array) => IAdvancedBoxPlotData} {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n let sum = 0;\n let length = 0;\n let missing = 0;\n\n // if fixed size use the typed array else a regular array\n const values: number[] = [];\n const vs: Float32Array | null = fixedLength != null ? new Float32Array(fixedLength) : null;\n\n const push = (v: number) => {\n length += 1;\n if (v == null || isNaN(v)) {\n missing += 1;\n return;\n }\n if (v < min) {\n min = v;\n }\n if (v > max) {\n max = v;\n }\n sum += v;\n };\n\n const pushAndSave = (v: number) => {\n push(v);\n if (vs) {\n vs[length] = v;\n } else {\n values.push(v);\n }\n };\n\n\n const invalid = {\n min: NaN,\n max: NaN,\n mean: NaN,\n missing,\n count: length,\n whiskerHigh: NaN,\n whiskerLow: NaN,\n outlier: [],\n median: NaN,\n q1: NaN,\n q3: NaN\n };\n\n const buildImpl = (s: ArrayLike<number>) => {\n const valid = length - missing;\n const median = quantile(s, 0.5, valid)!;\n const q1 = quantile(s, 0.25, valid)!;\n const q3 = quantile(s, 0.75, valid)!;\n\n const iqr = q3 - q1;\n const left = q1 - 1.5 * iqr;\n const right = q3 + 1.5 * iqr;\n\n let outlier: number[] = [];\n // look for the closests value which is bigger than the computed left\n let whiskerLow = left;\n // tslint:disable-next-line:prefer-for-of\n for (let i = 0; i < valid; ++i) {\n const v = s[i];\n if (left < v) {\n whiskerLow = v;\n break;\n }\n // outlier\n outlier.push(v);\n }\n // look for the closests value which is smaller than the computed right\n let whiskerHigh = right;\n const reversedOutliers: number[] = [];\n for (let i = valid - 1; i >= 0; --i) {\n const v = s[i];\n if (v < right) {\n whiskerHigh = v;\n break;\n }\n // outlier\n reversedOutliers.push(v);\n }\n\n outlier = outlier.concat(reversedOutliers.reverse());\n\n return {\n min,\n max,\n count: length,\n missing,\n mean: sum / valid,\n whiskerHigh,\n whiskerLow,\n outlier,\n median,\n q1,\n q3\n };\n };\n\n const build = () => {\n const valid = length - missing;\n\n if (valid === 0) {\n return invalid;\n }\n\n const s = vs ? vs.sort() : Float32Array.from(values).sort();\n return buildImpl(s);\n };\n\n const buildArr = (vs: Float32Array) => {\n const s = vs.slice().sort();\n // tslint:disable-next-line:prefer-for-of\n for (let j = 0; j < vs.length; ++j) {\n push(vs[j]);\n }\n // missing are the last\n return buildImpl(s);\n };\n\n return {\n push: pushAndSave,\n build,\n buildArr,\n pushAll: pushAll(pushAndSave)\n };\n}\n\n/**\n * @internal\n */\nexport function normalizedStatsBuilder(numberOfBins: number): IBuilder<number, IStatistics> {\n\n const hist: INumberBin[] = [];\n\n let x0 = 0;\n const binWidth = 1. / numberOfBins;\n for (let i = 0; i < numberOfBins; ++i, x0 += binWidth) {\n hist.push({\n x0,\n x1: x0 + binWidth,\n count: 0\n });\n }\n\n const bin1 = 0 + binWidth;\n const binN = 1 - binWidth;\n\n const toBin = (v: number) => {\n if (v < bin1) {\n return 0;\n }\n if (v >= binN) {\n return numberOfBins - 1;\n }\n if (numberOfBins === 3) {\n return 1;\n }\n let low = 1;\n let high = numberOfBins - 1;\n // binary search\n while (low < high) {\n const center = Math.floor((high + low) / 2);\n if (v < hist[center].x1) {\n high = center;\n } else {\n low = center + 1;\n }\n }\n return low;\n };\n\n // filter out NaN\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n let sum = 0;\n let length = 0;\n let missing = 0;\n\n const push = (v: number) => {\n length += 1;\n if (v == null || isNaN(v)) {\n missing += 1;\n return;\n }\n if (v < min) {\n min = v;\n }\n if (v > max) {\n max = v;\n }\n sum += v;\n\n hist[toBin(v)].count++;\n };\n\n const build = () => {\n const valid = length - missing;\n if (valid === 0) {\n return {\n count: missing,\n missing,\n min: NaN,\n max: NaN,\n mean: NaN,\n hist,\n maxBin: 0\n };\n }\n return {\n count: length,\n min,\n max,\n mean: sum / valid,\n missing,\n hist,\n maxBin: hist.reduce((a, b) => Math.max(a, b.count), 0)\n };\n };\n\n return {push, build, pushAll: pushAll(push)};\n}\n\n/**\n * guesses the histogram granularity to use based on min and max date\n */\nfunction computeGranularity(min: Date | null, max: Date | null): {histGranularity: IDateHistGranularity, hist: IDateBin[]} {\n if (min == null || max == null) {\n return {histGranularity: 'year', hist: []};\n }\n const hist: IDateBin[] = [];\n\n if (max.getFullYear() - min.getFullYear() >= 2) {\n // more than two years difference\n const minYear = min.getFullYear();\n const maxYear = max.getFullYear();\n for (let i = minYear; i <= maxYear; ++i) {\n hist.push({\n x0: new Date(i, 0, 1),\n x1: new Date(i + 1, 0, 1),\n count: 0\n });\n }\n return {hist, histGranularity: 'year'};\n }\n\n if ((max.getTime() - min.getTime()) <= 1000 * 60 * 60 * 24 * 31) {\n // less than a month use day\n let x0 = new Date(min.getFullYear(), min.getMonth(), min.getDate());\n while (x0 <= max) {\n const x1 = new Date(x0);\n x1.setDate(x1.getDate() + 1);\n hist.push({\n x0,\n x1,\n count: 0\n });\n x0 = x1;\n }\n return {hist, histGranularity: 'day'};\n }\n\n // by month\n let x0 = new Date(min.getFullYear(), min.getMonth(), 1);\n while (x0 <= max) {\n const x1 = new Date(x0);\n x1.setMonth(x1.getMonth() + 1);\n hist.push({\n x0,\n x1,\n count: 0\n });\n x0 = x1;\n }\n return {hist, histGranularity: 'month'};\n}\n\nfunction pushDateHist(hist: IDateBin[], v: Date, count: number = 1) {\n if (v < hist[0].x1) {\n hist[0].count += count;\n return;\n }\n const l = hist.length - 1;\n if (v > hist[l].x0) {\n hist[l].count += count;\n return;\n }\n if (l === 2) {\n hist[1].count += count;\n return;\n }\n\n let low = 1;\n let high = l;\n // binary search\n while (low < high) {\n const center = Math.floor((high + low) / 2);\n if (v < hist[center].x1) {\n high = center;\n } else {\n low = center + 1;\n }\n }\n hist[low].count += count;\n}\n/**\n * @internal\n */\nexport function dateStatsBuilder(template?: IDateStatistics): IBuilder<Date | null, IDateStatistics> {\n let min: Date | null = null;\n let max: Date | null = null;\n let count = 0;\n let missing = 0;\n\n // yyyymmdd, count\n const byDay = new Map<number, {x: Date, count: number}>();\n const templateHist = template ? template.hist.map((d) => ({x0: d.x0, x1: d.x1, count: 0})) : null;\n\n const push = (v: Date | null) => {\n count += 1;\n if (!v || v == null) {\n missing += 1;\n return;\n }\n if (min == null || v < min) {\n min = v;\n }\n if (max == null || v > max) {\n max = v;\n }\n if (templateHist) {\n pushDateHist(templateHist, v, 1);\n return;\n }\n const key = v.getFullYear() * 10000 + v.getMonth() * 100 + v.getDate();\n if (byDay.has(key)) {\n byDay.get(key)!.count++;\n } else {\n byDay.set(key, {count: 1, x: v});\n }\n };\n\n const build = () => {\n if (templateHist) {\n return {\n min,\n max,\n missing,\n count,\n maxBin: templateHist.reduce((acc, h) => Math.max(acc, h.count), 0),\n hist: templateHist,\n histGranularity: template!.histGranularity\n };\n }\n // copy template else derive\n const {histGranularity, hist} = computeGranularity(min, max);\n\n byDay.forEach((v) => pushDateHist(hist, v.x, v.count));\n\n return {\n min,\n max,\n missing,\n count,\n maxBin: hist.reduce((acc, h) => Math.max(acc, h.count), 0),\n hist,\n histGranularity\n };\n };\n\n return {push, build, pushAll: pushAll(push)};\n}\n\n/**\n * computes a categorical histogram\n * @param arr the data array\n * @param categories the list of known categories\n * @returns {{hist: {cat: string, y: number}[]}}\n * @internal\n */\nexport function categoricalStatsBuilder(categories: {name: string}[]): IBuilder<{name: string} | null, ICategoricalStatistics> {\n const m = new Map<string, number>();\n categories.forEach((cat) => m.set(cat.name, 0));\n\n let missing = 0;\n let count = 0;\n\n const push = (v: ICategory | null) => {\n count += 1;\n if (v == null) {\n missing += 1;\n } else {\n m.set(v.name, (m.get(v.name) || 0) + 1);\n }\n };\n\n const build = () => {\n const entries: ICategoricalBin[] = categories.map((d) => ({cat: d.name, count: m.get(d.name)!}));\n const maxBin = entries.reduce((a, b) => Math.max(a, b.count), Number.NEGATIVE_INFINITY);\n\n return {\n maxBin,\n hist: entries,\n count,\n missing\n };\n };\n\n return {push, build, pushAll: pushAll(push)};\n}\n\n/**\n * round to the given commas similar to d3.round\n * @param {number} v\n * @param {number} precision\n * @returns {number}\n * @internal\n */\nexport function round(v: number, precision: number = 0) {\n if (precision === 0) {\n return Math.round(v);\n }\n const scale = Math.pow(10, precision);\n return Math.round(v * scale) / scale;\n}\n\n/**\n * compares two number whether they are similar up to delta\n * @param {number} a first numbre\n * @param {number} b second number\n * @param {number} delta\n * @returns {boolean} a and b are similar\n * @internal\n */\nexport function similar(a: number, b: number, delta = 0.5) {\n if (a === b) {\n return true;\n }\n return Math.abs(a - b) < delta;\n}\n\n\n/**\n * @internal\n */\nexport function isPromiseLike<T>(value: any): value is PromiseLike<T> {\n return value instanceof Promise || typeof value.then === 'function';\n}\n\n\n/**\n * @internal\n */\nexport function createIndexArray(length: number, dataSize = length) {\n if (dataSize <= 255) {\n return new Uint8Array(length);\n }\n if (dataSize <= 65535) {\n return new Uint16Array(length);\n }\n return new Uint32Array(length);\n}\n\n/**\n * @internal\n */\nexport function toIndexArray(arr: ISequence<number> | IndicesArray, maxDataIndex?: number): UIntTypedArray {\n if (arr instanceof Uint8Array || arr instanceof Uint16Array || arr instanceof Uint32Array) {\n return arr.slice();\n }\n const l = maxDataIndex != null ? maxDataIndex : arr.length;\n if (l <= 255) {\n return Uint8Array.from(arr);\n }\n if (l <= 65535) {\n return Uint16Array.from(arr);\n }\n return Uint32Array.from(arr);\n}\n\nfunction createLike(template: IndicesArray, total: number, maxDataIndex?: number) {\n if (template instanceof Uint8Array) {\n return new Uint8Array(total);\n }\n if (template instanceof Uint16Array) {\n return new Uint16Array(total);\n }\n if (template instanceof Uint32Array) {\n return new Uint32Array(total);\n }\n return createIndexArray(total, maxDataIndex);\n}\n\n/**\n * @internal\n */\nexport function joinIndexArrays(groups: IndicesArray[], maxDataIndex?: number) {\n switch (groups.length) {\n case 0:\n return [];\n case 1:\n return groups[0];\n default:\n const total = groups.reduce((a, b) => a + b.length, 0);\n const r = createLike(groups[0], total, maxDataIndex);\n let shift = 0;\n for (const g of groups) {\n r.set(g, shift);\n shift += g.length;\n }\n return r;\n }\n}\n\n\nfunction asc(a: any, b: any) {\n return a < b ? -1 : ((a > b) ? 1 : 0);\n}\n\nfunction desc(a: any, b: any) {\n return a < b ? 1 : ((a > b) ? -1 : 0);\n}\n\n\nexport declare type ILookUpArray = Uint8Array | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array | string[] | Float32Array | Float64Array;\n\n/**\n * sort the given index array based on the lookup array\n * @internal\n */\nexport function sortComplex(indices: UIntTypedArray | number[], comparators: {asc: boolean, lookup: ILookUpArray}[]) {\n if (indices.length < 2) {\n return indices;\n }\n\n switch (comparators.length) {\n case 0:\n // sort by indices\n return indices.sort();\n case 1:\n const c = comparators[0]!.asc ? asc : desc;\n const cLookup = comparators[0]!.lookup;\n return indices.sort((a, b) => {\n const r = c(cLookup[a]!, cLookup[b]!);\n return r !== 0 ? r : a - b;\n });\n case 2:\n const c1 = comparators[0]!.asc ? asc : desc;\n const c1Lookup = comparators[0]!.lookup;\n const c2 = comparators[1]!.asc ? asc : desc;\n const c2Lookup = comparators[1]!.lookup;\n return indices.sort((a, b) => {\n let r = c1(c1Lookup[a], c1Lookup[b]);\n r = r !== 0 ? r : c2(c2Lookup[a], c2Lookup[b]);\n return r !== 0 ? r : a - b;\n });\n default:\n const l = comparators.length;\n const fs = comparators.map((d) => d.asc ? asc : desc);\n return indices.sort((a, b) => {\n for (let i = 0; i < l; ++i) {\n const l = comparators[i].lookup;\n const r = fs[i](l[a], l[b]);\n if (r !== 0) {\n return r;\n }\n }\n return a - b;\n });\n }\n}\n\n// note the whole worker thing is in this one file to be able to copy the code\n\n/**\n * base worker message\n * @internal\n */\nexport interface IWorkerMessage {\n type: string;\n uid: number;\n}\n\n/**\n * @internal\n */\nexport interface IStatsWorkerMessage extends IWorkerMessage {\n /**\n * reference key for the indices array\n */\n refIndices: string | null;\n indices?: UIntTypedArray;\n\n /**\n * reference key for the data indices\n */\n refData: string;\n data?: UIntTypedArray | Float32Array | Int32Array | Float64Array;\n}\n\n/**\n * @internal\n */\nexport interface ISortMessageRequest {\n type: 'sort';\n uid: number;\n\n ref: string;\n indices: UIntTypedArray;\n sortOrders?: {asc: boolean, lookup: ILookUpArray}[];\n}\n\n/**\n * @internal\n */\nexport interface ISortMessageResponse {\n type: 'sort';\n\n ref: string;\n order: IndicesArray;\n}\n\n/**\n * @internal\n */\nexport interface IDeleteRefMessageRequest {\n type: 'deleteRef';\n\n ref: string;\n startsWith?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface ISetRefMessageRequest {\n type: 'setRef';\n uid: number;\n\n ref: string;\n data: UIntTypedArray | Float32Array | Int32Array | Float64Array | null;\n}\n\n/**\n * @internal\n */\nexport interface IDateStatsMessageRequest {\n type: 'dateStats';\n uid: number;\n\n refIndices: string | null;\n indices?: UIntTypedArray;\n\n refData: string;\n data?: UIntTypedArray;\n\n template?: IDateStatistics;\n}\n\n/**\n * @internal\n */\nexport interface IDateStatsMessageResponse {\n type: 'dateStats';\n uid: number;\n\n stats: IDateStatistics;\n}\n\n/**\n * @internal\n */\nexport interface INumberStatsMessageRequest {\n type: 'numberStats';\n uid: number;\n\n refIndices: string | null;\n indices?: UIntTypedArray;\n\n refData: string;\n data?: Float32Array;\n\n numberOfBins: number;\n}\n\n/**\n * @internal\n */\nexport interface INumberStatsMessageResponse {\n type: 'numberStats';\n uid: number;\n\n stats: IStatistics;\n}\n\n/**\n * @internal\n */\nexport interface IBoxPlotStatsMessageRequest {\n type: 'boxplotStats';\n uid: number;\n\n refIndices: string | null;\n indices?: UIntTypedArray;\n\n refData: string;\n data?: Float32Array;\n}\n\n/**\n * @internal\n */\nexport interface IBoxPlotStatsMessageResponse {\n type: 'boxplotStats';\n uid: number;\n\n stats: IAdvancedBoxPlotData;\n}\n\n/**\n * @internal\n */\nexport interface ICategoricalStatsMessageRequest {\n type: 'categoricalStats';\n uid: number;\n\n refIndices: string | null;\n indices?: UIntTypedArray;\n\n refData: string;\n data?: UIntTypedArray;\n\n categories: string[];\n}\n\n/**\n * @internal\n */\nexport interface ICategoricalStatsMessageResponse {\n type: 'categoricalStats';\n uid: number;\n\n stats: ICategoricalStatistics;\n}\n\n/**\n * helper to build a value cache for dates, use dateValueCache2Value to convert back\n * @internal\n */\nexport function dateValueCacheBuilder(length: number) {\n const vs = new Float64Array(length);\n let i = 0;\n return {\n push: (d: Date | null) => vs[i++] = d == null ? NaN : d.getTime(),\n cache: vs\n };\n}\n\n/**\n * @internal\n */\nexport function dateValueCache2Value(v: number) {\n return isNaN(v) ? null : new Date(v);\n}\n\n/**\n * @internal\n */\nexport function categoricalValueCacheBuilder(length: number, categories: {name: string}[]) {\n const vs = createIndexArray(length, categories.length + 1);\n const name2index = new Map<string, number>();\n for (let i = 0; i < categories.length; ++i) {\n name2index.set(categories[i].name, i + 1); // shift by one for missing = 0\n }\n let i = 0;\n return {\n push: (d: {name: string} | null) => vs[i++] = d == null ? 0 : name2index.get(d.name) || 0,\n cache: vs\n };\n}\n\n/**\n * @internal\n */\nexport function categoricalValueCache2Value<T extends {name: string}>(v: number, categories: T[]) {\n return v === 0 ? null : categories[v - 1];\n}\n\n\nfunction sortWorkerMain() {\n const wself = <IPoorManWorkerScope><any>self;\n\n // stored refs to avoid duplicate copy\n const refs = new Map<string, UIntTypedArray | Float32Array | Int32Array | Float64Array>();\n\n const sort = (r: ISortMessageRequest) => {\n if (r.sortOrders) {\n sortComplex(r.indices, r.sortOrders);\n }\n const order = r.indices;\n\n wself.postMessage(<ISortMessageResponse>{\n type: r.type,\n uid: r.uid,\n ref: r.ref,\n order\n }, [r.indices.buffer]);\n };\n\n const setRef = (r: ISetRefMessageRequest) => {\n if (r.data) {\n refs.set(r.ref, r.data);\n } else {\n refs.delete(r.ref);\n }\n };\n\n const deleteRef = (r: IDeleteRefMessageRequest) => {\n if (!r.startsWith) {\n refs.delete(r.ref);\n return;\n }\n\n for (const key of Array.from(refs.keys())) {\n if (key.startsWith(r.ref)) {\n refs.delete(key);\n }\n }\n };\n\n const resolveRefs = <T extends UIntTypedArray | Float32Array | Int32Array>(r: IStatsWorkerMessage) => {\n // resolve refs or save the new data\n\n const data: T = r.data ? <T><any>r.data : <T><any>refs.get(r.refData)!;\n const indices = r.indices ? r.indices : (r.refIndices ? <UIntTypedArray>refs.get(r.refIndices)! : undefined);\n if (r.refData) {\n refs.set(r.refData, data);\n }\n if (r.refIndices) {\n refs.set(r.refIndices, indices!);\n }\n return {data, indices};\n };\n\n const dateStats = (r: IDateStatsMessageRequest) => {\n const {data, indices} = resolveRefs<Int32Array>(r);\n\n const b = dateStatsBuilder(r.template);\n if (indices) {\n // tslint:disable-next-line:prefer-for-of\n for (let ii = 0; ii < indices.length; ++ii) {\n const v = data[indices[ii]];\n b.push(dateValueCache2Value(v));\n }\n } else {\n // tslint:disable-next-line:prefer-for-of\n for (let i = 0; i < data.length; ++i) {\n b.push(dateValueCache2Value(data[i]));\n }\n }\n wself.postMessage(<IDateStatsMessageResponse>{\n type: r.type,\n uid: r.uid,\n stats: b.build()\n });\n };\n\n const categoricalStats = (r: ICategoricalStatsMessageRequest) => {\n const {data, indices} = resolveRefs<UIntTypedArray>(r);\n\n const cats = r.categories.map((name) => ({name}));\n const b = categoricalStatsBuilder(cats);\n if (indices) {\n // tslint:disable-next-line:prefer-for-of\n for (let ii = 0; ii < indices.length; ++ii) {\n b.push(categoricalValueCache2Value(data[indices[ii]], cats));\n }\n } else {\n // tslint:disable-next-line:prefer-for-of\n for (let i = 0; i < data.length; ++i) {\n b.push(categoricalValueCache2Value(data[i], cats));\n }\n }\n\n wself.postMessage(<ICategoricalStatsMessageResponse>{\n type: r.type,\n uid: r.uid,\n stats: b.build()\n });\n };\n\n const numberStats = (r: INumberStatsMessageRequest) => {\n const {data, indices} = resolveRefs<Float32Array>(r);\n\n const b = normalizedStatsBuilder(r.numberOfBins);\n\n if (indices) {\n // tslint:disable-next-line:prefer-for-of\n for (let ii = 0; ii < indices.length; ++ii) {\n b.push(data[indices[ii]]);\n }\n } else {\n // tslint:disable-next-line:prefer-for-of\n for (let i = 0; i < data.length; ++i) {\n b.push(data[i]);\n }\n }\n\n wself.postMessage(<INumberStatsMessageResponse>{\n type: r.type,\n uid: r.uid,\n stats: b.build()\n });\n };\n\n const boxplotStats = (r: IBoxPlotStatsMessageRequest) => {\n const {data, indices} = resolveRefs<Float32Array>(r);\n\n const b = boxplotBuilder(indices ? indices.length : undefined);\n\n let stats: IAdvancedBoxPlotData;\n if (!indices) {\n stats = b.buildArr(data);\n } else {\n // tslint:disable-next-line:prefer-for-of\n for (let ii = 0; ii < indices.length; ++ii) {\n b.push(data[indices[ii]]);\n }\n stats = b.build();\n }\n\n wself.postMessage(<IBoxPlotStatsMessageResponse>{\n type: r.type,\n uid: r.uid,\n stats\n });\n };\n\n // message type to handler function\n const msgHandlers: {[key: string]: (r: any) => void} = {\n sort,\n setRef,\n deleteRef,\n dateStats,\n categoricalStats,\n numberStats,\n boxplotStats\n };\n\n wself.addEventListener('message', (evt) => {\n const r = evt.data;\n if (typeof r.uid !== 'number' || typeof r.type !== 'string') {\n return;\n }\n const h = msgHandlers[r.type];\n if (h) {\n h(r);\n }\n });\n}\n\n/**\n * copy source code of a worker and create a blob out of it\n * to avoid webpack imports all the code functions need to be in this file\n * @internal\n */\nexport function createWorkerBlob() {\n return createWorkerCodeBlob([\n pushAll.toString(),\n quantile.toString(),\n normalizedStatsBuilder.toString(),\n boxplotBuilder.toString(),\n computeGranularity.toString(),\n pushDateHist.toString(),\n dateStatsBuilder.toString(),\n categoricalStatsBuilder.toString(),\n createIndexArray.toString(),\n asc.toString(),\n desc.toString(),\n sortComplex.toString(),\n dateValueCache2Value.toString(),\n categoricalValueCache2Value.toString(),\n toFunctionBody(sortWorkerMain)\n ]);\n}\n","\n/** @internal */\nexport function equalArrays<T>(a: T[], b: T[]) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((ai, i) => ai === b[i]);\n}\n\n\n/**\n * converts a given id to css compatible one\n * @param id\n * @return {string|void}\n * @internal\n */\nexport function fixCSS(id: string) {\n return id.replace(/[\\s!#$%&'()*+,.\\/:;<=>?@\\[\\\\\\]^`{|}~]+/g, '_'); //replace non css stuff to _\n}\n\n/**\n * clear node clearing\n * @param node\n * @internal\n */\nexport function clear<T extends Node>(node: T) {\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n return node;\n}\n\n/**\n * @internal\n * to avoid [].concat(...) which doesn't work for large arrays\n * @param arrs\n */\nexport function concat<T>(arrs: (T[] | T)[]): T[] {\n const r: T[] = [];\n for (const a of arrs) {\n if (!Array.isArray(a)) {\n r.push(a);\n continue;\n }\n for (const ai of a) {\n r.push(ai);\n }\n }\n return r;\n}\n\n\n/**\n * generates a label for the given sort method\n * @internal\n * @param method sort method\n */\nexport function getSortLabel(method: string) {\n switch (method) {\n case 'min':\n return 'Mininum';\n case 'max':\n return 'Maximum';\n case 'median':\n return 'Median';\n case 'mean':\n return 'Mean';\n case 'q1':\n return '25% Quantile';\n case 'q3':\n return '75% Quantile';\n default:\n return String(method);\n }\n}\n","var noop = {value: function() {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","import {dispatch, Dispatch} from 'd3-dispatch';\n\n/**\n * helper function to suffix the given event types\n * @internal\n */\nexport function suffix(suffix: string, ...prefix: string[]) {\n return prefix.map((p) => `${p}${suffix}`);\n}\n\nexport interface IEventContext {\n /**\n * who is sending this event\n */\n readonly source: AEventDispatcher;\n\n /**\n * who was sending this event in case of forwarding\n */\n readonly origin: AEventDispatcher;\n /**\n * the event type\n */\n readonly type: string;\n /**\n * in case of multi propagation the 'main' event type, aka the first one\n */\n readonly primaryType: string;\n /**\n * the arguments to the listener\n */\n readonly args: any[];\n}\n\nexport interface IEventListener {\n (this: IEventContext, ...args: any[]): any;\n}\n\nexport interface IEventHandler {\n on(type: string | string[], listener: IEventListener | null): this;\n}\n\nconst __DEBUG = false;\n\n/**\n * base class for event dispatching using d3 event mechanism, thus .suffix is supported for multiple registrations\n */\nexport default class AEventDispatcher implements IEventHandler {\n private readonly listeners: Dispatch<any>;\n private readonly listenerEvents: Set<string>;\n private readonly forwarder: (...args: any[]) => void;\n\n constructor() {\n const events = this.createEventList();\n this.listenerEvents = new Set(events);\n this.listeners = dispatch(...events);\n\n const that = this;\n this.forwarder = function (this: IEventContext, ...args: any[]) {\n that.fireImpl(this.type, this.primaryType, this.origin, ...args);\n };\n }\n\n on(type: string | string[], listener: IEventListener | null): this {\n if (Array.isArray(type)) {\n type.forEach((d) => {\n if (this.listenerEvents.has(d.split('.')[0])) {\n this.listenersChanged(d, Boolean(listener!));\n this.listeners.on(d, listener!);\n } else if (__DEBUG && !d.includes('.')) {\n console.warn(this, 'invalid event type', d);\n }\n });\n } else if (this.listenerEvents.has((<string>type).split('.')[0])) {\n this.listenersChanged(<string>type, Boolean(listener!));\n this.listeners.on(<string>type, listener!);\n } else if (__DEBUG && !type.includes('.')) {\n console.warn(this, 'invalid event type', type);\n }\n return this;\n }\n\n /**\n * helper function that will be called upon a listener has changed\n * @param _type event type\n * @param _active registered or deregistered\n */\n protected listenersChanged(_type: string, _active: boolean) {\n // hook\n }\n\n /**\n * return the list of events to be able to dispatch\n * @return {Array} by default no events\n */\n protected createEventList(): string[] {\n return [];\n }\n\n protected fire(type: string | string[], ...args: any[]) {\n const primaryType = Array.isArray(type) ? type[0] : type;\n this.fireImpl(type, primaryType, this, ...args);\n }\n\n private fireImpl(type: string | string[], primaryType: string, origin: AEventDispatcher, ...args: any[]) {\n const fireImpl = (t: string) => {\n if (!this.listenerEvents.has(t)) {\n if (__DEBUG) {\n console.warn(this, 'invalid event type', t);\n }\n return;\n }\n //local context per event, set a this argument\n const context: IEventContext = {\n source: this, //who is sending this event,\n origin,\n type: t, //the event type\n primaryType, //in case of multi propagation the 'main' event type\n args //the arguments to the listener\n };\n this.listeners.apply(t, context, args);\n };\n if (Array.isArray(type)) {\n type.forEach(fireImpl);\n } else {\n fireImpl(<string>type);\n }\n }\n\n /**\n * forwards one or more events from a given dispatcher to the current one\n * i.e. when one of the given events is fired in 'from' it will be forwarded to all my listeners\n * @param {IEventHandler} from the event dispatcher to forward from\n * @param {string[]} types the event types to forward\n */\n protected forward(from: IEventHandler, ...types: string[]) {\n from.on(types, this.forwarder);\n }\n\n /**\n * removes the forwarding declarations\n * @param {IEventHandler} from the originated dispatcher\n * @param {string[]} types event types to forward\n */\n protected unforward(from: IEventHandler, ...types: string[]) {\n from.on(types, null);\n }\n}\n","import Column from './Column';\nimport Ranking from './Ranking';\nimport CompositeColumn from './CompositeColumn';\nimport {IColorMappingFunction, IMappingFunction} from './INumberColumn';\nimport {ICategoricalColorMappingFunction, ICategory} from './ICategoricalColumn';\nimport {IScriptMappingFunctionType} from './MappingFunction';\n\n\nexport interface IColumnConstructor {\n new(id: string, desc: Readonly<IColumnDesc> & any, factory: ITypeFactory): Column;\n}\n\nexport interface IStyleColumn {\n /**\n * column description\n */\n description: string;\n\n /**\n * column summary line (subtitle)\n */\n summary: string;\n\n /**\n * color of this column\n * @deprecated not used anymore\n */\n color: string;\n\n /**\n * frozen column\n * @default isSupportType\n */\n frozen: boolean;\n\n /**\n * whether the column can be removed or not\n * @default false\n */\n fixed: boolean;\n\n /**\n * default renderer to use\n */\n renderer: string;\n\n /**\n * default group renderer to use\n */\n groupRenderer: string;\n\n /**\n * default summary renderer to use\n */\n summaryRenderer: string;\n\n /**\n * initial width of the column\n * @default 100 or 200 for strings\n */\n width: number;\n\n /**\n * is this column visible by default\n * @default true\n */\n visible: boolean;\n}\n\n/**\n * default color that should be used\n * @type {string}\n */\nexport const DEFAULT_COLOR = '#C1C1C1';\n\n\nexport interface IColumnDesc extends Partial<IStyleColumn> {\n /**\n * label of the column\n */\n label: string;\n /**\n * the column type\n */\n type: string;\n}\n\nexport interface IValueColumnDesc<T> extends IColumnDesc {\n /**\n * is the data lazy loaded and not yet available\n * @default false\n */\n lazyLoaded?: boolean;\n\n /**\n * value accessor of this column\n * @param row the current row\n * @param desc the description of this column\n */\n accessor?(row: IDataRow, desc: Readonly<IValueColumnDesc<T>>): T;\n}\n\nexport interface IFlatColumn {\n readonly col: Column;\n readonly offset: number;\n readonly width: number;\n}\n\nexport interface IColumnParent {\n remove(col: Column): boolean;\n\n insert(col: Column, index?: number): Column | null;\n\n insertAfter(col: Column, reference: Column): Column | null;\n\n move(col: Column, index?: number): Column | null;\n\n moveAfter(col: Column, reference: Column): Column | null;\n\n findMyRanker(): Ranking | null;\n\n readonly fqid: string;\n\n indexOf(col: Column): number;\n\n at(index: number): Column;\n\n readonly fqpath: string;\n\n}\n\n\nexport interface IColumnMetaData {\n label: string;\n summary: string;\n description: string;\n}\n\nexport declare type ICompareValue = string | number | null;\n\n\n/**\n * a data row for rendering\n */\nexport interface IDataRow {\n /**\n * the value\n */\n readonly v: any;\n /**\n * the underlying data index\n */\n readonly i: number;\n}\n\n\nexport interface IGroup {\n name: string;\n color: string;\n parent?: Readonly<IGroupParent> | null;\n}\n\nexport declare type IndicesArray = (ReadonlyArray<number> | UIntTypedArray) & ArrayLike<number>;\n\nexport interface IOrderedGroup extends IGroup {\n order: IndicesArray;\n}\n\nexport const defaultGroup: IGroup = {\n name: 'Default',\n color: 'gray'\n};\n\nexport const othersGroup: IGroup = {\n name: 'Others',\n color: 'gray'\n};\n\n\nexport interface IGroupParent extends IGroup {\n subGroups: (Readonly<IGroupParent> | Readonly<IGroup>)[];\n}\n\nexport interface IGroupItem {\n readonly dataIndex: number;\n readonly group: Readonly<IOrderedGroup>;\n readonly relativeIndex: number;\n}\n\nexport declare type IGroupData = Readonly<IOrderedGroup>;\n\nexport function isGroup(item: IGroupData | IGroupItem): item is IGroupData {\n return item && (<IGroupItem>item).group == null; // use .group as separator\n}\n\nexport declare type UIntTypedArray = Uint8Array | Uint16Array | Uint32Array;\n\nexport enum ECompareValueType {\n BINARY,\n COUNT, // count max to the number of rows\n UINT8,\n UINT16,\n UINT32,\n INT8,\n INT16,\n INT32,\n FLOAT,\n FLOAT_ASC,\n DOUBLE,\n DOUBLE_ASC,\n STRING\n}\n\n\nexport interface ITypedDump {\n readonly type: string;\n [key: string]: any;\n}\n\n\nexport interface IColumnDump {\n id: string;\n width?: number;\n desc: any;\n label?: string;\n summary?: string;\n renderer?: string;\n /**\n * @deprecated\n */\n rendererType?: string;\n groupRenderer?: string;\n summaryRenderer?: string;\n\n // type specific\n [key: string]: any;\n}\n\nexport interface IRankingDump {\n /**\n * columsn of this ranking\n */\n columns?: IColumnDump[];\n\n /**\n * sort criteria\n */\n sortCriteria?: {asc: boolean, sortBy: string}[];\n\n /**\n * group sort criteria\n */\n groupSortCriteria?: {asc: boolean, sortBy: string}[];\n\n /**\n * uids of group columns\n */\n groupColumns?: string[];\n\n /**\n * compatability\n * @deprecated\n */\n sortColumn?: {sortBy: string, asc: boolean};\n}\n\nexport interface ITypeFactory {\n (dump: IColumnDump): Column;\n\n colorMappingFunction(dump?: ITypedDump | string | ((v: number) => string)): IColorMappingFunction;\n mappingFunction(dump?: ITypedDump | IScriptMappingFunctionType): IMappingFunction;\n categoricalColorMappingFunction(dump: ITypedDump | undefined, categories: ICategory[]): ICategoricalColorMappingFunction;\n}\n\nexport interface IMultiLevelColumn extends CompositeColumn {\n getCollapsed(): boolean;\n\n setCollapsed(value: boolean): void;\n}\n\nexport function isMultiLevelColumn(col: Column): col is IMultiLevelColumn {\n return typeof ((<IMultiLevelColumn>col).getCollapsed) === 'function';\n}\n\nexport interface ISortCriteria {\n readonly col: Column;\n readonly asc: boolean;\n}\n","import {AEventDispatcher, ISequence, similar, fixCSS, IEventListener} from '../internal';\nimport {isSortingAscByDefault} from './annotations';\nimport {IColumnDump, ISortCriteria, defaultGroup, ECompareValueType, IColumnDesc, IDataRow, IGroup, IColumnParent, IColumnMetaData, IFlatColumn, ICompareValue, DEFAULT_COLOR, ITypeFactory} from './interfaces';\nimport Ranking from './Ranking';\n\n/**\n * emitted when the width property changes\n * @asMemberOf Column\n * @event\n */\nexport declare function widthChanged(previous: number, current: number): void;\n\n/**\n * emitted when the label property changes\n * @asMemberOf Column\n * @event\n */\nexport declare function labelChanged(previous: string, current: string): void;\n\n/**\n * emitted when the meta data property changes\n * @asMemberOf Column\n * @event\n */\nexport declare function metaDataChanged(previous: IColumnMetaData, current: IColumnMetaData): void;\n\n/**\n * emitted when state of the column is dirty\n * @asMemberOf Column\n * @event\n */\nexport declare function dirty(): void;\n\n/**\n * emitted when state of the column related to its header is dirty\n * @asMemberOf Column\n * @event\n */\nexport declare function dirtyHeader(): void;\n\n/**\n * emitted when state of the column related to its values is dirty\n * @asMemberOf Column\n * @event\n */\nexport declare function dirtyValues(): void;\n\n/**\n * emitted when state of the column related to cached values (hist, compare, ...) is dirty\n * @asMemberOf Column\n * @event\n */\nexport declare function dirtyCaches(): void;\n\n/**\n * emitted when the renderer type property changes\n * @asMemberOf Column\n * @event\n */\nexport declare function rendererTypeChanged(previous: string, current: string): void;\n\n/**\n * emitted when the group renderer property changes\n * @asMemberOf Column\n * @event\n */\nexport declare function groupRendererChanged(previous: string, current: string): void;\n\n/**\n * emitted when the pattern property changes\n * @asMemberOf Column\n * @event\n */\nexport declare function summaryRendererChanged(previous: string, current: string): void;\n\n/**\n * emitted when the visibility of this column changes\n * @asMemberOf Column\n * @event\n */\nexport declare function visibilityChanged(previous: boolean, current: boolean): void;\n\n/**\n * a column in LineUp\n */\nexport default class Column extends AEventDispatcher {\n /**\n * magic variable for showing all columns\n * @type {number}\n */\n static readonly FLAT_ALL_COLUMNS = -1;\n\n static readonly EVENT_WIDTH_CHANGED = 'widthChanged';\n static readonly EVENT_LABEL_CHANGED = 'labelChanged';\n static readonly EVENT_METADATA_CHANGED = 'metaDataChanged';\n static readonly EVENT_DIRTY = 'dirty';\n static readonly EVENT_DIRTY_HEADER = 'dirtyHeader';\n static readonly EVENT_DIRTY_VALUES = 'dirtyValues';\n static readonly EVENT_DIRTY_CACHES = 'dirtyCaches';\n static readonly EVENT_RENDERER_TYPE_CHANGED = 'rendererTypeChanged';\n static readonly EVENT_GROUP_RENDERER_TYPE_CHANGED = 'groupRendererChanged';\n static readonly EVENT_SUMMARY_RENDERER_TYPE_CHANGED = 'summaryRendererChanged';\n static readonly EVENT_VISIBILITY_CHANGED = 'visibilityChanged';\n\n /**\n * the id of this column\n */\n private uid: string;\n\n /**\n * width of the column\n * @type {number}\n * @private\n */\n private width: number = 100;\n\n /**\n * parent column of this column, set when added to a ranking or combined column\n */\n parent: Readonly<IColumnParent> | null = null;\n\n private metadata: Readonly<IColumnMetaData>;\n private renderer: string;\n private groupRenderer: string;\n private summaryRenderer: string;\n private visible: boolean;\n\n constructor(id: string, public readonly desc: Readonly<IColumnDesc>) {\n super();\n this.uid = fixCSS(id);\n this.renderer = this.desc.renderer || this.desc.type;\n this.groupRenderer = this.desc.groupRenderer || this.desc.type;\n this.summaryRenderer = this.desc.summaryRenderer || this.desc.type;\n this.width = this.desc.width != null && this.desc.width > 0 ? this.desc.width : 100;\n this.visible = this.desc.visible !== false;\n\n this.metadata = {\n label: desc.label || this.id,\n summary: desc.summary || '',\n description: desc.description || ''\n };\n }\n\n get fixed() {\n return Boolean(this.desc.fixed);\n }\n\n get frozen() {\n return Boolean(this.desc.frozen);\n }\n\n get id() {\n return this.uid;\n }\n\n assignNewId(idGenerator: () => string) {\n this.uid = fixCSS(idGenerator());\n }\n\n get label() {\n return this.metadata.label;\n }\n\n get description() {\n return this.metadata.description;\n }\n\n /**\n * returns the fully qualified id i.e. path the parent\n * @returns {string}\n */\n get fqid() {\n return this.parent ? `${this.parent.fqid}_${this.id}` : this.id;\n }\n\n get fqpath() {\n return this.parent ? `${this.parent.fqpath}@${this.parent.indexOf(this)}` : '';\n }\n\n protected createEventList() {\n return super.createEventList().concat([Column.EVENT_WIDTH_CHANGED,\n Column.EVENT_LABEL_CHANGED, Column.EVENT_METADATA_CHANGED, Column.EVENT_VISIBILITY_CHANGED, Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED,\n Column.EVENT_RENDERER_TYPE_CHANGED, Column.EVENT_GROUP_RENDERER_TYPE_CHANGED,\n Column.EVENT_DIRTY, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES]);\n }\n\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n getWidth() {\n return this.width;\n }\n\n hide() {\n this.setVisible(false);\n }\n\n show() {\n this.setVisible(true);\n }\n\n isVisible() {\n return this.visible;\n }\n\n getVisible() {\n return this.isVisible();\n }\n\n setVisible(value: boolean) {\n if (this.visible === value) {\n return;\n }\n this.fire([Column.EVENT_VISIBILITY_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.visible, this.visible = value);\n }\n\n /**\n * visitor pattern for flattening the columns\n * @param {IFlatColumn} r the result array\n * @param {number} offset left offset\n * @param {number} _levelsToGo how many levels down\n * @param {number} _padding padding between columns\n * @returns {number} the used width by this column\n */\n flatten(r: IFlatColumn[], offset: number, _levelsToGo = 0, _padding = 0): number {\n const w = this.getWidth();\n r.push({col: this, offset, width: w});\n return w;\n }\n\n setWidth(value: number) {\n if (similar(this.width, value, 0.5)) {\n return;\n }\n this.fire([Column.EVENT_WIDTH_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.width, this.width = value);\n }\n\n setWidthImpl(value: number) {\n this.width = value;\n }\n\n setMetaData(value: Readonly<IColumnMetaData>) {\n if (value.label === this.label && this.description === value.description && this.metadata.summary === value.summary) {\n return;\n }\n const bak = this.getMetaData();\n //copy to avoid reference\n this.metadata = {\n label: value.label,\n summary: value.summary,\n description: value.description\n };\n\n this.fire([Column.EVENT_LABEL_CHANGED, Column.EVENT_METADATA_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], bak, this.getMetaData());\n }\n\n getMetaData(): Readonly<IColumnMetaData> {\n return Object.assign({}, this.metadata);\n }\n\n /**\n * triggers that the ranking is sorted by this column\n * @param ascending ascending order?\n * @param priority sorting priority\n * @returns {boolean} was successful\n */\n sortByMe(ascending = isSortingAscByDefault(this), priority = 0) {\n const r = this.findMyRanker();\n if (r) {\n return r.sortBy(this, ascending, priority);\n }\n return false;\n }\n\n groupByMe(): boolean {\n const r = this.findMyRanker();\n if (r) {\n return r.toggleGrouping(this);\n }\n return false;\n }\n\n /**\n *\n * @return {number}\n */\n isGroupedBy(): number {\n const r = this.findMyRanker();\n if (!r) {\n return -1;\n }\n return r.getGroupCriteria().indexOf(this);\n }\n\n /**\n * toggles the sorting order of this column in the ranking\n * @returns {boolean} was successful\n */\n toggleMySorting() {\n const r = this.findMyRanker();\n if (r) {\n return r.toggleSorting(this);\n }\n return false;\n }\n\n private isSortedByMeImpl(selector: ((r: Ranking) => ISortCriteria[])): {asc: 'asc' | 'desc' | undefined, priority: number | undefined} {\n const ranker = this.findMyRanker();\n if (!ranker) {\n return {asc: undefined, priority: undefined};\n }\n const criterias = selector(ranker);\n const index = criterias.findIndex((c) => c.col === this);\n if (index < 0) {\n return {asc: undefined, priority: undefined};\n }\n return {\n asc: criterias[index].asc ? 'asc' : 'desc',\n priority: index\n };\n }\n\n isSortedByMe() {\n return this.isSortedByMeImpl((r) => r.getSortCriteria());\n }\n\n groupSortByMe(ascending = isSortingAscByDefault(this), priority = 0) {\n const r = this.findMyRanker();\n if (r) {\n return r.groupSortBy(this, ascending, priority);\n }\n return false;\n }\n\n toggleMyGroupSorting() {\n const r = this.findMyRanker();\n if (r) {\n return r.toggleGroupSorting(this);\n }\n return false;\n }\n\n isGroupSortedByMe() {\n return this.isSortedByMeImpl((r) => r.getGroupSortCriteria());\n }\n\n /**\n * removes the column from the ranking\n * @returns {boolean} was successful\n */\n removeMe() {\n if (this.fixed) {\n return false;\n }\n if (this.parent) {\n return this.parent.remove(this);\n }\n return false;\n }\n\n /**\n * called when the columns added to a ranking\n */\n attach(parent: IColumnParent) {\n this.parent = parent;\n }\n\n /**\n * called when the column is removed from the ranking\n */\n detach() {\n this.parent = null;\n }\n\n /**\n * inserts the given column after itself\n * @param col the column to insert\n * @returns {boolean} was successful\n */\n insertAfterMe(col: Column) {\n if (this.parent) {\n return this.parent.insertAfter(col, this) != null;\n }\n return false;\n }\n\n /**\n * finds the underlying ranking column\n * @returns {Ranking|null} my current ranking\n */\n findMyRanker(): Ranking | null {\n if (this.parent) {\n return this.parent.findMyRanker();\n }\n return null;\n }\n\n /**\n * dumps this column to JSON compatible format\n * @param toDescRef helper mapping function\n * @returns {any} dump of this column\n */\n dump(toDescRef: (desc: any) => any): any {\n const r: IColumnDump = {\n id: this.id,\n desc: toDescRef(this.desc),\n width: this.width\n };\n if (this.label !== (this.desc.label || this.id)) {\n r.label = this.label;\n }\n if (this.metadata.summary) {\n r.summary = this.metadata.summary;\n }\n if (this.getRenderer() !== this.desc.type) {\n r.renderer = this.getRenderer();\n }\n if (this.getGroupRenderer() !== this.desc.type) {\n r.groupRenderer = this.getGroupRenderer();\n }\n if (this.getSummaryRenderer() !== this.desc.type) {\n r.summaryRenderer = this.getSummaryRenderer();\n }\n return r;\n }\n\n /**\n * restore the column content from a dump\n * @param dump column dump\n * @param _factory helper for creating columns\n */\n restore(dump: IColumnDump, _factory: ITypeFactory) {\n this.uid = dump.id;\n this.width = dump.width || this.width;\n this.metadata = {\n label: dump.label || this.label,\n summary: dump.summary || '',\n description: this.description\n };\n if (dump.renderer || dump.rendererType) {\n this.renderer = dump.renderer || dump.rendererType || this.renderer;\n }\n if (dump.groupRenderer) {\n this.groupRenderer = dump.groupRenderer;\n }\n if (dump.summaryRenderer) {\n this.summaryRenderer = dump.summaryRenderer;\n }\n }\n\n /**\n * return the label of a given row for the current column\n * @param row the current row\n * @return {string} the label of this column at the specified row\n */\n getLabel(row: IDataRow): string {\n const v = this.getValue(row);\n return v == null ? '' : String(v);\n }\n\n /**\n * return the value of a given row for the current column\n * @param _row the current row\n * @return the value of this column at the specified row\n */\n getValue(_row: IDataRow): any | null {\n return ''; //no value\n }\n\n /**\n * returns the value to be used when exporting\n * @param format format hint\n */\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n return format === 'text' ? this.getLabel(row) : this.getValue(row);\n }\n\n getColor(_row: IDataRow) {\n return DEFAULT_COLOR;\n }\n\n toCompareValue(_row: IDataRow, _valueCache?: any): ICompareValue | ICompareValue[] {\n return 0;\n }\n\n toCompareValueType(): ECompareValueType | ECompareValueType[] {\n return ECompareValueType.UINT8;\n }\n\n /**\n * group the given row into a bin/group\n * @param _row\n * @return {IGroup}\n */\n group(_row: IDataRow, _valueCache?: any): IGroup {\n return Object.assign({}, defaultGroup);\n }\n\n toCompareGroupValue(_rows: ISequence<IDataRow>, group: IGroup, _valueCache?: ISequence<any>): ICompareValue | ICompareValue[] {\n return group.name.toLowerCase();\n }\n\n toCompareGroupValueType(): ECompareValueType | ECompareValueType[] {\n return ECompareValueType.STRING;\n }\n\n /**\n * flag whether any filter is applied\n * @return {boolean}\n */\n isFiltered() {\n return false;\n }\n\n /**\n * clear the filter\n * @return {boolean} whether the filtered needed to be reseted\n */\n clearFilter() {\n // hook to clear the filter\n return false;\n }\n\n /**\n * predicate whether the current row should be included\n * @param row\n * @return {boolean}\n */\n filter(row: IDataRow, _valueCache?: any) {\n return row != null;\n }\n\n /**\n * determines the renderer type that should be used to render this column. By default the same type as the column itself\n * @return {string}\n */\n getRenderer(): string {\n return this.renderer;\n }\n\n getGroupRenderer(): string {\n return this.groupRenderer;\n }\n\n getSummaryRenderer(): string {\n return this.summaryRenderer;\n }\n\n setRenderer(renderer: string) {\n if (renderer === this.renderer) {\n // nothing changes\n return;\n }\n this.fire([Column.EVENT_RENDERER_TYPE_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.renderer, this.renderer = renderer);\n }\n\n setGroupRenderer(renderer: string) {\n if (renderer === this.groupRenderer) {\n // nothing changes\n return;\n }\n this.fire([Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.groupRenderer, this.groupRenderer = renderer);\n }\n\n setSummaryRenderer(renderer: string) {\n if (renderer === this.summaryRenderer) {\n // nothing changes\n return;\n }\n this.fire([Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], this.summaryRenderer, this.summaryRenderer = renderer);\n }\n\n /**\n * marks the header, values, or both as dirty such that the values are reevaluated\n * @param type specify in more detail what is dirty, by default whole column\n */\n markDirty(type: 'header' | 'values' | 'all' = 'all') {\n switch (type) {\n case 'header':\n return this.fire([Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY]);\n case 'values':\n return this.fire([Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY]);\n default:\n return this.fire([Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY]);\n }\n }\n}\n","import 'reflect-metadata';\nimport Column from './Column';\nimport {IColumnDesc, IColumnConstructor} from './interfaces';\n\nconst supportType = Symbol.for('SupportType');\nconst category = Symbol.for('Category');\n\nexport function SupportType() {\n return Reflect.metadata(supportType, true);\n}\n\nexport function SortByDefault(order: 'ascending'|'descending' = 'ascending') {\n if (order === 'descending') {\n return Reflect.metadata(Symbol.for('sortDescendingByDefault'), true);\n }\n return (d: any) => d;\n}\n\nexport function isSortingAscByDefault(col: Column) {\n const clazz = (<any>col).constructor;\n return !Reflect.hasMetadata(Symbol.for('sortDescendingByDefault'), clazz);\n}\n\nexport class Categories {\n readonly string = {label: 'label', order: 1, name: 'string', featureLevel: 'basic'};\n readonly categorical = {label: 'categorical', order: 2, name: 'categorical', featureLevel: 'basic'};\n readonly number = {label: 'numerical', order: 3, name: 'number', featureLevel: 'basic'};\n readonly date = {label: 'date', order: 4, name: 'date', featureLevel: 'basic'};\n readonly array = {label: 'matrix', order: 5, name: 'array', featureLevel: 'advanced'};\n readonly map = {label: 'map', order: 6, name: 'map', featureLevel: 'advanced'};\n readonly composite = {label: 'combined', order: 7, name: 'composite', featureLevel: 'advanced'};\n readonly support = {label: 'support', order: 8, name: 'support', featureLevel: 'advanced'};\n readonly other = {label: 'others', order: 9, name: 'other', featureLevel: 'advanced'};\n}\n\nexport const categories = new Categories();\n\nexport function Category(cat: keyof Categories) {\n return Reflect.metadata(category, cat);\n}\n\nexport function getSortType(col: Column): 'abc'|'num'|undefined {\n const cat = categoryOf(col);\n const type = col.desc.type;\n if (cat === categories.string || cat === categories.categorical) {\n return 'abc';\n }\n if (cat === categories.number || type === 'rank' || isSortingAscByDefault(col)) {\n return 'num';\n }\n const numbers = new Set(['rank', 'number', 'numbers', 'ordinal', 'boxplot', 'script', 'reduce', 'stack']);\n return numbers.has(type) ? 'num' : undefined;\n}\n\nexport function toolbar(...keys: string[]) {\n return Reflect.metadata(Symbol.for('toolbarIcon'), keys);\n}\n\nexport function dialogAddons(key: string, ...keys: string[]) {\n return Reflect.metadata(Symbol.for(`toolbarDialogAddon${key}`), keys);\n}\n\nexport function isSupportType(col: Column) {\n const clazz = (<any>col).constructor;\n return Reflect.hasMetadata(supportType, clazz);\n}\n\nexport interface IColumnCategory {\n label: string;\n name: string;\n order: number;\n featureLevel: 'basic' | 'advanced';\n}\n\nexport function categoryOf(col: IColumnConstructor | Column): IColumnCategory {\n const cat = <keyof Categories>Reflect.getMetadata(category, col instanceof Column ? Object.getPrototypeOf(col).constructor : col) || 'other';\n return <IColumnCategory>categories[cat] || categories.other;\n}\n\nexport function categoryOfDesc(col: IColumnDesc | string, models: { [key: string]: IColumnConstructor }): IColumnCategory {\n const type = typeof col === 'string' ? col : col.type;\n const clazz = models[type];\n return clazz ? categoryOf(clazz) : <IColumnCategory>categories.other;\n}\n","import {IAdvancedBoxPlotData, IBoxPlotData, IForEachAble} from '../internal';\nimport Column from './Column';\nimport {IArrayColumn} from './IArrayColumn';\nimport {IColumnDesc, IDataRow, ITypedDump, ITypeFactory} from './interfaces';\n\n\nexport interface IColorMappingFunction {\n apply(v: number): string;\n\n toJSON(): ITypedDump | string;\n\n clone(): IColorMappingFunction;\n\n eq(other: IColorMappingFunction): boolean;\n}\n\nexport interface IColorMappingFunctionConstructor {\n new(dump: ITypedDump | string, factory: ITypeFactory): IColorMappingFunction;\n}\n\nexport interface IMappingFunction {\n //new(domain: number[]);\n\n apply(v: number): number;\n\n toJSON(): ITypedDump;\n\n domain: number[];\n\n clone(): IMappingFunction;\n\n eq(other: IMappingFunction): boolean;\n\n getRange(formatter: (v: number) => string): [string, string];\n}\n\nexport interface IMappingFunctionConstructor {\n new(dump: ITypedDump): IMappingFunction;\n}\n\n\nexport interface IMapAbleDesc {\n /**\n * dump of mapping function\n */\n map?: ITypedDump;\n /**\n * either map or domain should be available\n */\n domain?: [number, number];\n /**\n * @default [0,1]\n */\n range?: [number, number];\n\n /**\n * @deprecated use colorMapping instead\n */\n color?: string;\n\n /**\n * color mapping\n */\n colorMapping?: string | ((v: number) => string) | ITypedDump;\n}\n\n\nexport interface IMapAbleColumn extends INumberColumn {\n getOriginalMapping(): IMappingFunction;\n\n getMapping(): IMappingFunction;\n\n setMapping(mapping: IMappingFunction): void;\n\n getColorMapping(): IColorMappingFunction;\n\n setColorMapping(mapping: IColorMappingFunction): void;\n\n getFilter(): INumberFilter;\n\n setFilter(value: INumberFilter | null): void;\n\n getRange(): [string, string];\n}\n\nexport function isMapAbleColumn(col: Column): col is IMapAbleColumn;\nexport function isMapAbleColumn(col: IColumnDesc): col is IMapAbleDesc & IColumnDesc;\nexport function isMapAbleColumn(col: Column | IColumnDesc) {\n return (col instanceof Column && typeof (<IMapAbleColumn>col).getMapping === 'function' || (!(col instanceof Column) && isNumberColumn(col) && ((<IColumnDesc>col).type.startsWith('number') || (<IColumnDesc>col).type.startsWith('boxplot'))));\n}\n\n\nexport interface INumberColumn extends Column {\n getNumber(row: IDataRow): number;\n\n getRawNumber(row: IDataRow): number;\n\n iterNumber(row: IDataRow): IForEachAble<number>;\n iterRawNumber(row: IDataRow): IForEachAble<number>;\n\n getNumberFormat(): (v: number) => string;\n}\n\nexport interface INumberDesc extends IMapAbleDesc {\n /**\n * d3 formatting option\n * @default .3n\n */\n numberFormat?: string;\n\n /**\n * The accuracy defines the deviation of values to the applied filter boundary.\n * Use an accuracy closer to 0 for columns with smaller numbers (e.g., 1e-9).\n * @default 0.001\n */\n filterAccuracy?: number;\n}\n\n/**\n * checks whether the given column or description is a number column, i.e. the value is a number\n * @param col\n * @returns {boolean}\n */\nexport function isNumberColumn(col: Column): col is INumberColumn;\nexport function isNumberColumn(col: IColumnDesc): col is INumberDesc & IColumnDesc;\nexport function isNumberColumn(col: Column | IColumnDesc) {\n return (col instanceof Column && typeof (<INumberColumn>col).getNumber === 'function' || (!(col instanceof Column) && (<IColumnDesc>col).type.match(/(number|stack|ordinal)/) != null));\n}\n\n\nexport enum ESortMethod {\n min = 'min',\n max = 'max',\n median = 'median',\n q1 = 'q1',\n q3 = 'q3'\n}\n\nexport interface IBoxPlotColumn extends INumberColumn, IMapAbleColumn {\n getBoxPlotData(row: IDataRow): IBoxPlotData | null;\n\n getMapping(): IMappingFunction;\n\n getRawBoxPlotData(row: IDataRow): IBoxPlotData | null;\n\n getSortMethod(): string;\n\n setSortMethod(sortMethod: string): void;\n}\n\nexport function isBoxPlotColumn(col: Column): col is IBoxPlotColumn {\n return typeof (<IBoxPlotColumn>col).getBoxPlotData === 'function';\n}\n\nexport enum EAdvancedSortMethod {\n min = 'min',\n max = 'max',\n median = 'median',\n q1 = 'q1',\n q3 = 'q3',\n mean = 'mean'\n}\n\nexport interface IAdvancedBoxPlotColumn extends IBoxPlotColumn {\n getBoxPlotData(row: IDataRow): IAdvancedBoxPlotData | null;\n\n getRawBoxPlotData(row: IDataRow): IAdvancedBoxPlotData | null;\n}\n\nexport interface INumbersColumn extends IAdvancedBoxPlotColumn, IArrayColumn<number> {\n getNumbers(row: IDataRow): number[];\n\n getRawNumbers(row: IDataRow): number[];\n}\n\nexport function isNumbersColumn(col: Column): col is INumbersColumn {\n return isBoxPlotColumn(col) && typeof (<INumbersColumn>col).getNumbers === 'function';\n}\n\n\nexport interface INumberFilter {\n min: number;\n max: number;\n filterMissing: boolean;\n}\n","import Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, dirtyCaches, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged} from './Column';\nimport {IValueColumnDesc, IDataRow, ITypeFactory} from './interfaces';\nimport {IEventListener} from '../internal';\n\n/**\n * emitted when the data of this column has been loaded\n * @asMemberOf ValueColumn\n * @event\n */\nexport declare function dataLoaded(previous: boolean, current: boolean): void;\n\n/**\n * a column having an accessor to get the cell value\n */\nexport default class ValueColumn<T> extends Column {\n static readonly EVENT_DATA_LOADED = 'dataLoaded';\n\n static readonly RENDERER_LOADING = 'loading';\n\n private readonly accessor: (row: IDataRow, desc: Readonly<IValueColumnDesc<T>>) => T;\n\n /**\n * is the data available\n * @type {boolean}\n */\n private loaded: boolean;\n\n constructor(id: string, desc: Readonly<IValueColumnDesc<T>>) {\n super(id, desc);\n //find accessor\n this.accessor = desc.accessor! || (() => null);\n this.loaded = desc.lazyLoaded !== true;\n }\n\n protected createEventList() {\n return super.createEventList().concat([ValueColumn.EVENT_DATA_LOADED]);\n }\n\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n\n getLabel(row: IDataRow) {\n if (!this.isLoaded()) {\n return '';\n }\n const v = this.getValue(row);\n return v == null ? '' : String(v);\n }\n\n getRaw(row: IDataRow): T | null {\n if (!this.isLoaded()) {\n return null;\n }\n return this.accessor(row, this.desc);\n }\n\n getValue(row: IDataRow): T | null {\n return this.getRaw(row);\n }\n\n isLoaded() {\n return this.loaded;\n }\n\n setLoaded(loaded: boolean) {\n if (this.loaded === loaded) {\n return;\n }\n this.fire([ValueColumn.EVENT_DATA_LOADED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.loaded, this.loaded = loaded);\n }\n\n getRenderer(): string {\n if (!this.isLoaded()) {\n return ValueColumn.RENDERER_LOADING;\n }\n return super.getRenderer();\n }\n\n /**\n * patch the dump such that the loaded attribute is defined (for lazy loading columns)\n * @param toDescRef\n * @returns {any}\n */\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.loaded = this.loaded;\n\n if (!this.loaded && r.renderer === ValueColumn.RENDERER_LOADING) {\n delete r.renderer;\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n if (dump.loaded !== undefined) {\n this.loaded = dump.loaded;\n }\n super.restore(dump, factory);\n }\n}\n","import {suffix, IEventListener} from '../internal';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport {Category, toolbar} from './annotations';\nimport {IDataRow, IColumnParent, IFlatColumn, ITypeFactory} from './interfaces';\nimport {isNumberColumn} from './INumberColumn';\nimport ValueColumn from './ValueColumn';\n\n/**\n * emitted when the filter property changes\n * @asMemberOf CompositeColumn\n * @event\n */\nexport declare function filterChanged(previous: any | null, current: any | null): void;\n\n/**\n * emitted when a column has been added\n * @asMemberOf CompositeColumn\n * @event\n */\nexport declare function addColumn(col: Column, index: number): void;\n\n/**\n * emitted when a column has been moved within this composite columm\n * @asMemberOf CompositeColumn\n * @event\n */\nexport declare function moveColumn(col: Column, index: number, oldIndex: number): void;\n\n/**\n * emitted when a column has been removed\n * @asMemberOf CompositeColumn\n * @event\n */\nexport declare function removeColumn(col: Column, index: number): void;\n\n/**\n * implementation of a combine column, standard operations how to select\n */\n@toolbar('compositeContained', 'splitCombined')\n@Category('composite')\nexport default class CompositeColumn extends Column implements IColumnParent {\n static readonly EVENT_FILTER_CHANGED = 'filterChanged';\n static readonly EVENT_ADD_COLUMN = 'addColumn';\n static readonly EVENT_MOVE_COLUMN = 'moveColumn';\n static readonly EVENT_REMOVE_COLUMN = 'removeColumn';\n\n protected readonly _children: Column[] = [];\n\n protected createEventList() {\n return super.createEventList().concat([CompositeColumn.EVENT_FILTER_CHANGED, CompositeColumn.EVENT_ADD_COLUMN, CompositeColumn.EVENT_MOVE_COLUMN, CompositeColumn.EVENT_REMOVE_COLUMN]);\n }\n\n on(type: typeof CompositeColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n assignNewId(idGenerator: () => string) {\n super.assignNewId(idGenerator);\n this._children.forEach((c) => c.assignNewId(idGenerator));\n }\n\n get children() {\n return this._children.slice();\n }\n\n get length() {\n return this._children.length;\n }\n\n flatten(r: IFlatColumn[], offset: number, levelsToGo = 0, padding = 0) {\n let w = 0;\n //no more levels or just this one\n if (levelsToGo === 0 || levelsToGo <= Column.FLAT_ALL_COLUMNS) {\n w = this.getWidth();\n r.push({col: this, offset, width: w});\n if (levelsToGo === 0) {\n return w;\n }\n }\n //push children\n this._children.forEach((c) => {\n if (c.isVisible() && levelsToGo <= Column.FLAT_ALL_COLUMNS) {\n c.flatten(r, offset, levelsToGo - 1, padding);\n }\n });\n return w;\n }\n\n dump(toDescRef: (desc: any) => any) {\n const r = super.dump(toDescRef);\n r.children = this._children.map((d) => d.dump(toDescRef));\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n dump.children.map((child: any) => {\n const c = factory(child);\n if (c) {\n this.push(c);\n }\n });\n super.restore(dump, factory);\n }\n\n /**\n * inserts a column at a the given position\n * @param col\n * @param index\n * @returns {any}\n */\n insert(col: Column, index: number): Column | null {\n if (!isNumberColumn(col) && this.canJustAddNumbers) { //indicator it is a number type\n return null;\n }\n this._children.splice(index, 0, col);\n //listen and propagate events\n return this.insertImpl(col, index);\n }\n\n move(col: Column, index: number): Column | null {\n if (col.parent !== this) { //not moving\n return null;\n }\n const old = this._children.indexOf(col);\n if (index === old) {\n // no move needed\n return col;\n }\n //delete first\n this._children.splice(old, 1);\n // adapt target index based on previous index, i.e shift by one\n this._children.splice(old < index ? index - 1 : index, 0, col);\n //listen and propagate events\n return this.moveImpl(col, index, old);\n }\n\n protected insertImpl(col: Column, index: number) {\n col.attach(this);\n this.forward(col, ...suffix('.combine', Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY, CompositeColumn.EVENT_FILTER_CHANGED, Column.EVENT_RENDERER_TYPE_CHANGED, Column.EVENT_GROUP_RENDERER_TYPE_CHANGED));\n this.fire([CompositeColumn.EVENT_ADD_COLUMN, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], col, index);\n return col;\n }\n\n protected moveImpl(col: Column, index: number, oldIndex: number) {\n this.fire([CompositeColumn.EVENT_MOVE_COLUMN, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY, Column.EVENT_RENDERER_TYPE_CHANGED, Column.EVENT_GROUP_RENDERER_TYPE_CHANGED], col, index, oldIndex);\n return col;\n }\n\n push(col: Column) {\n return this.insert(col, this._children.length);\n }\n\n at(index: number) {\n return this._children[index];\n }\n\n indexOf(col: Column) {\n return this._children.indexOf(col);\n }\n\n insertAfter(col: Column, ref: Column) {\n const i = this.indexOf(ref);\n if (i < 0) {\n return null;\n }\n return this.insert(col, i + 1);\n }\n\n moveAfter(col: Column, ref: Column) {\n const i = this.indexOf(ref);\n if (i < 0) {\n return null;\n }\n return this.move(col, i + 1);\n }\n\n\n remove(col: Column) {\n const i = this._children.indexOf(col);\n if (i < 0) {\n return false;\n }\n this._children.splice(i, 1); //remove and deregister listeners\n return this.removeImpl(col, i);\n }\n\n protected removeImpl(col: Column, index: number) {\n col.detach();\n this.unforward(col, ...suffix('.combine', Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY, CompositeColumn.EVENT_FILTER_CHANGED));\n this.fire([CompositeColumn.EVENT_REMOVE_COLUMN, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], col, index);\n return true;\n }\n\n isFiltered() {\n return this._children.some((d) => d.isFiltered());\n }\n\n clearFilter() {\n return this._children.map((d) => d.clearFilter()).some((d) => d);\n }\n\n filter(row: IDataRow) {\n return this._children.every((d) => d.filter(row));\n }\n\n isLoaded(): boolean {\n return this._children.every((c) => !(c instanceof ValueColumn || c instanceof CompositeColumn) || (<ValueColumn<any> | CompositeColumn>c).isLoaded());\n }\n\n get canJustAddNumbers() {\n return false;\n }\n}\n","export default function(specifier) {\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n return colors;\n}\n","import colors from \"../colors\";\n\nexport default colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n","import colors from \"../colors\";\n\nexport default colors(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n","import colors from \"../colors\";\n\nexport default colors(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n","import colors from \"../colors\";\n\nexport default colors(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n","import colors from \"../colors\";\n\nexport default colors(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n","import colors from \"../colors\";\n\nexport default colors(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n","import colors from \"../colors\";\n\nexport default colors(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n","import colors from \"../colors\";\n\nexport default colors(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n","import colors from \"../colors\";\n\nexport default colors(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex3 = /^#([0-9a-f]{3})$/,\n reHex6 = /^#([0-9a-f]{6})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: function() {\n return this.rgb().hex();\n },\n toString: function() {\n return this.rgb() + \"\";\n }\n});\n\nexport default function color(format) {\n var m;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00\n : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format])\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (0 <= this.r && this.r <= 255)\n && (0 <= this.g && this.g <= 255)\n && (0 <= this.b && this.b <= 255)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: function() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n },\n toString: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export var deg2rad = Math.PI / 180;\nexport var rad2deg = 180 / Math.PI;\n","import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\n// https://beta.observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * deg2rad;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n }\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter: function(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker: function(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb: function() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * rad2deg;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter: function(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker: function(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb: function() {\n return labConvert(this).rgb();\n }\n}));\n","import define, {extend} from \"./define\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color\";\nimport {deg2rad, rad2deg} from \"./math\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import constant from \"./constant\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis\";\nimport basisClosed from \"./basisClosed\";\nimport nogamma, {gamma} from \"./color\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import value from \"./value\";\n\nexport default function(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","import {basis} from \"./basis\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b -= a, function(t) {\n return d.setTime(a + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return a + b * t;\n };\n}\n","import value from \"./value\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import decompose, {identity} from \"./decompose\";\n\nvar cssNode,\n cssRoot,\n cssView,\n svgNode;\n\nexport function parseCss(value) {\n if (value === \"none\") return identity;\n if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n cssNode.style.transform = value;\n value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n cssRoot.removeChild(cssNode);\n value = value.slice(7, -1).split(\",\");\n return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb\";\nimport array from \"./array\";\nimport date from \"./date\";\nimport number from \"./number\";\nimport object from \"./object\";\nimport string from \"./string\";\nimport constant from \"./constant\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : Array.isArray(b) ? array\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n return a = +a, b -= a, function(t) {\n return Math.round(a + b * t);\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import number from \"../number\";\nimport {parseCss, parseSvg} from \"./parse\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var rho = Math.SQRT2,\n rho2 = 2,\n rho4 = 4,\n epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\n// p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\nexport default function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000;\n\n return i;\n}\n","import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n","import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n","import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n","export default function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n}\n","import {interpolateRgbBasis} from \"d3-interpolate\";\n\nexport default function(scheme) {\n return interpolateRgbBasis(scheme[scheme.length - 1]);\n}\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"d8b365f5f5f55ab4ac\",\n \"a6611adfc27d80cdc1018571\",\n \"a6611adfc27df5f5f580cdc1018571\",\n \"8c510ad8b365f6e8c3c7eae55ab4ac01665e\",\n \"8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e\",\n \"8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e\",\n \"8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e\",\n \"5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30\",\n \"5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"af8dc3f7f7f77fbf7b\",\n \"7b3294c2a5cfa6dba0008837\",\n \"7b3294c2a5cff7f7f7a6dba0008837\",\n \"762a83af8dc3e7d4e8d9f0d37fbf7b1b7837\",\n \"762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837\",\n \"762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837\",\n \"762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837\",\n \"40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b\",\n \"40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e9a3c9f7f7f7a1d76a\",\n \"d01c8bf1b6dab8e1864dac26\",\n \"d01c8bf1b6daf7f7f7b8e1864dac26\",\n \"c51b7de9a3c9fde0efe6f5d0a1d76a4d9221\",\n \"c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221\",\n \"c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221\",\n \"c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221\",\n \"8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419\",\n \"8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"998ec3f7f7f7f1a340\",\n \"5e3c99b2abd2fdb863e66101\",\n \"5e3c99b2abd2f7f7f7fdb863e66101\",\n \"542788998ec3d8daebfee0b6f1a340b35806\",\n \"542788998ec3d8daebf7f7f7fee0b6f1a340b35806\",\n \"5427888073acb2abd2d8daebfee0b6fdb863e08214b35806\",\n \"5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806\",\n \"2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08\",\n \"2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62f7f7f767a9cf\",\n \"ca0020f4a58292c5de0571b0\",\n \"ca0020f4a582f7f7f792c5de0571b0\",\n \"b2182bef8a62fddbc7d1e5f067a9cf2166ac\",\n \"b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac\",\n \"b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac\",\n \"b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac\",\n \"67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061\",\n \"67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ef8a62ffffff999999\",\n \"ca0020f4a582bababa404040\",\n \"ca0020f4a582ffffffbababa404040\",\n \"b2182bef8a62fddbc7e0e0e09999994d4d4d\",\n \"b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d\",\n \"b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d\",\n \"b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d\",\n \"67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a\",\n \"67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91bfdb\",\n \"d7191cfdae61abd9e92c7bb6\",\n \"d7191cfdae61ffffbfabd9e92c7bb6\",\n \"d73027fc8d59fee090e0f3f891bfdb4575b4\",\n \"d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4\",\n \"d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4\",\n \"d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4\",\n \"a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695\",\n \"a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf91cf60\",\n \"d7191cfdae61a6d96a1a9641\",\n \"d7191cfdae61ffffbfa6d96a1a9641\",\n \"d73027fc8d59fee08bd9ef8b91cf601a9850\",\n \"d73027fc8d59fee08bffffbfd9ef8b91cf601a9850\",\n \"d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850\",\n \"d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850\",\n \"a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837\",\n \"a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fc8d59ffffbf99d594\",\n \"d7191cfdae61abdda42b83ba\",\n \"d7191cfdae61ffffbfabdda42b83ba\",\n \"d53e4ffc8d59fee08be6f59899d5943288bd\",\n \"d53e4ffc8d59fee08bffffbfe6f59899d5943288bd\",\n \"d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd\",\n \"d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd\",\n \"9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2\",\n \"9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5f999d8c92ca25f\",\n \"edf8fbb2e2e266c2a4238b45\",\n \"edf8fbb2e2e266c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a42ca25f006d2c\",\n \"edf8fbccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824\",\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e0ecf49ebcda8856a7\",\n \"edf8fbb3cde38c96c688419d\",\n \"edf8fbb3cde38c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68856a7810f7c\",\n \"edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b\",\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e0f3dba8ddb543a2ca\",\n \"f0f9e8bae4bc7bccc42b8cbe\",\n \"f0f9e8bae4bc7bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc443a2ca0868ac\",\n \"f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee8c8fdbb84e34a33\",\n \"fef0d9fdcc8afc8d59d7301f\",\n \"fef0d9fdcc8afc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59e34a33b30000\",\n \"fef0d9fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000\",\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ece2f0a6bddb1c9099\",\n \"f6eff7bdc9e167a9cf02818a\",\n \"f6eff7bdc9e167a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf1c9099016c59\",\n \"f6eff7d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450\",\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ece7f2a6bddb2b8cbe\",\n \"f1eef6bdc9e174a9cf0570b0\",\n \"f1eef6bdc9e174a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d\",\n \"f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e7e1efc994c7dd1c77\",\n \"f1eef6d7b5d8df65b0ce1256\",\n \"f1eef6d7b5d8df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0dd1c77980043\",\n \"f1eef6d4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f\",\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fde0ddfa9fb5c51b8a\",\n \"feebe2fbb4b9f768a1ae017e\",\n \"feebe2fbb4b9f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1c51b8a7a0177\",\n \"feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"edf8b17fcdbb2c7fb8\",\n \"ffffcca1dab441b6c4225ea8\",\n \"ffffcca1dab441b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c42c7fb8253494\",\n \"ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"f7fcb9addd8e31a354\",\n \"ffffccc2e69978c679238443\",\n \"ffffccc2e69978c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67931a354006837\",\n \"ffffccd9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32\",\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fff7bcfec44fd95f0e\",\n \"ffffd4fed98efe9929cc4c02\",\n \"ffffd4fed98efe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929d95f0e993404\",\n \"ffffd4fee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04\",\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"ffeda0feb24cf03b20\",\n \"ffffb2fecc5cfd8d3ce31a1c\",\n \"ffffb2fecc5cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cf03b20bd0026\",\n \"ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"deebf79ecae13182bd\",\n \"eff3ffbdd7e76baed62171b5\",\n \"eff3ffbdd7e76baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed63182bd08519c\",\n \"eff3ffc6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594\",\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"e5f5e0a1d99b31a354\",\n \"edf8e9bae4b374c476238b45\",\n \"edf8e9bae4b374c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47631a354006d2c\",\n \"edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32\",\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"f0f0f0bdbdbd636363\",\n \"f7f7f7cccccc969696525252\",\n \"f7f7f7cccccc969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696636363252525\",\n \"f7f7f7d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525\",\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"efedf5bcbddc756bb1\",\n \"f2f0f7cbc9e29e9ac86a51a3\",\n \"f2f0f7cbc9e29e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8756bb154278f\",\n \"f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486\",\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee0d2fc9272de2d26\",\n \"fee5d9fcae91fb6a4acb181d\",\n \"fee5d9fcae91fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4ade2d26a50f15\",\n \"fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d\"\n).map(colors);\n\nexport default ramp(scheme);\n","import colors from \"../colors\";\nimport ramp from \"../ramp\";\n\nexport var scheme = new Array(3).concat(\n \"fee6cefdae6be6550d\",\n \"feeddefdbe85fd8d3cd94701\",\n \"feeddefdbe85fd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3ce6550da63603\",\n \"feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704\"\n).map(colors);\n\nexport default ramp(scheme);\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport default interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));\n","import {cubehelix} from \"d3-color\";\nimport {interpolateCubehelixLong} from \"d3-interpolate\";\n\nexport var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nexport var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));\n\nvar c = cubehelix();\n\nexport default function(t) {\n if (t < 0 || t > 1) t -= Math.floor(t);\n var ts = Math.abs(t - 0.5);\n c.h = 360 * t - 100;\n c.s = 1.5 - 1.5 * ts;\n c.l = 0.8 - 0.9 * ts;\n return c + \"\";\n}\n","import {rgb} from \"d3-color\";\n\nvar c = rgb(),\n pi_1_3 = Math.PI / 3,\n pi_2_3 = Math.PI * 2 / 3;\n\nexport default function(t) {\n var x;\n t = (0.5 - t) * Math.PI;\n c.r = 255 * (x = Math.sin(t)) * x;\n c.g = 255 * (x = Math.sin(t + pi_1_3)) * x;\n c.b = 255 * (x = Math.sin(t + pi_2_3)) * x;\n return c + \"\";\n}\n","import colors from \"../colors\";\n\nfunction ramp(range) {\n var n = range.length;\n return function(t) {\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n\nexport default ramp(colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n\nexport var magma = ramp(colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\n\nexport var inferno = ramp(colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\n\nexport var plasma = ramp(colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n","/**\n * a set that preserves the insertion order\n * @internal\n */\nexport default class OrderedSet<T> implements Iterable<T> {\n readonly [Symbol.toStringTag] = Symbol('OrderedSet');\n private readonly set = new Set<T>();\n private readonly list = <T[]>[];\n\n constructor(values: Iterable<T> = []) {\n this.addAll(Array.isArray(values) ? values : Array.from(values));\n }\n\n get size() {\n return this.set.size;\n }\n\n clear() {\n this.set.clear();\n this.list.splice(0, this.list.length);\n }\n\n addAll(values: T[]) {\n values.forEach((v) => this.add(v));\n return this;\n }\n\n add(value: T) {\n if (this.set.has(value)) {\n return this;\n }\n this.set.add(value);\n this.list.push(value);\n return this;\n }\n\n has(value: T) {\n return this.set.has(value);\n }\n\n delete(value: T) {\n const r = this.set.delete(value);\n if (!r) {\n return false;\n }\n const index = this.list.indexOf(value);\n console.assert(index >= 0);\n this.list.splice(index, 1);\n return true;\n }\n\n deleteAll(values: T[]) {\n return values.reduce((acc, act) => this.delete(act) && acc, true);\n }\n\n forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any) {\n this.list.forEach(function (this: any, v: T) {\n callbackfn.call(this, v, v, <any>this);\n }, thisArg);\n }\n\n [Symbol.iterator]() {\n return this.list[Symbol.iterator]();\n }\n}\n","import {schemeCategory10, schemeSet3} from 'd3-scale-chromatic';\nimport Column, {defaultGroup, IGroup, IGroupParent, IndicesArray, IOrderedGroup, ECompareValueType} from '.';\nimport {OrderedSet} from '../internal';\nimport {DEFAULT_COLOR} from './interfaces';\n\n\n/** @internal */\nexport function integrateDefaults<T>(desc: T, defaults: Partial<T> = {}) {\n Object.keys(defaults).forEach((key) => {\n const typed = <keyof T>key;\n if (typeof desc[typed] === 'undefined') {\n (<any>desc)[typed] = defaults[typed];\n }\n });\n return desc;\n}\n\n/** @internal */\nexport function patternFunction(pattern: string, ...args: string[]) {\n return new Function('value', ...args, `\n const escapedValue = encodeURIComponent(String(value));\n return \\`${pattern}\\`;\n `);\n}\n\n\n/** @internal */\nexport function joinGroups(groups: IGroup[]): IGroup {\n if (groups.length === 0) {\n return {...defaultGroup}; //copy\n }\n if (groups.length === 1 && !groups[0].parent) {\n return {...groups[0]}; //copy\n }\n // create a chain\n const parents: IGroupParent[] = [];\n for (const group of groups) {\n const gparents: IGroupParent[] = [];\n let g = group;\n while (g.parent) {\n // add all parents of this groups\n gparents.unshift(g.parent);\n g = g.parent;\n }\n parents.push(...gparents);\n parents.push(Object.assign({subGroups: []}, group));\n }\n parents.slice(1).forEach((g, i) => {\n g.parent = parents[i];\n g.name = `${parents[i].name} ∩ ${g.name}`;\n g.color = g.color !== DEFAULT_COLOR ? g.color : g.parent.color;\n parents[i].subGroups = [g];\n });\n\n return parents[parents.length - 1];\n}\n\nexport function duplicateGroup<T extends IOrderedGroup | IGroupParent>(group: T) {\n const clone = <T>Object.assign({}, group);\n delete (<IOrderedGroup>clone).order;\n if (isGroupParent(<any>clone)) {\n (<any>clone).subGroups = [];\n }\n if (clone.parent) {\n clone.parent = duplicateGroup(clone.parent);\n clone.parent!.subGroups.push(clone);\n }\n return clone;\n}\n\n/** @internal */\nexport function toGroupID(group: IGroup) {\n return group.name;\n}\n\n/** @internal */\nexport function isOrderedGroup(g: IOrderedGroup | Readonly<IGroupParent>): g is IOrderedGroup {\n return (<IOrderedGroup>g).order != null;\n}\n\n\n/** @internal */\nfunction isGroupParent(g: IGroup | Readonly<IGroupParent>): g is IGroupParent {\n return (<IGroupParent>g).subGroups != null;\n}\n\n/**\n * unify the parents of the given groups by reusing the same group parent if possible\n * @param groups\n */\nexport function unifyParents<T extends IOrderedGroup>(groups: T[]) {\n if (groups.length <= 1) {\n return groups;\n }\n\n const toPath = (group: T) => {\n const path: (IGroupParent | T)[] = [group];\n let p = group.parent;\n while (p) {\n path.unshift(p);\n p = p.parent;\n }\n return path;\n };\n const paths = groups.map(toPath);\n\n const isSame = (a: IGroupParent, b: (IGroupParent | T)) => {\n return (b.name === a.name && b.parent === a.parent && isGroupParent(b) && b.subGroups.length > 0);\n };\n\n const removeDuplicates = (level: (IGroupParent | T)[], i: number) => {\n const real: (IGroupParent | T)[] = [];\n while (level.length > 0) {\n const node = level.shift()!;\n if (!isGroupParent(node) || node.subGroups.length === 0) { // cannot share leaves\n real.push(node);\n continue;\n }\n const root = {...node};\n real.push(root);\n // remove duplicates that directly follow\n while (level.length > 0 && isSame(root, level[0]!)) {\n root.subGroups.push(...(<IGroupParent>level.shift()!).subGroups);\n }\n for (const child of root.subGroups) {\n (<(IGroupParent | T)>child).parent = root;\n }\n // cleanup children duplicates\n root.subGroups = removeDuplicates(<(IGroupParent | T)[]>root.subGroups, i + 1);\n }\n return real;\n };\n\n removeDuplicates(paths.map((p) => p[0]), 0);\n\n return groups;\n}\n\n/** @internal */\nexport function groupRoots(groups: IOrderedGroup[]) {\n const roots = new OrderedSet<IOrderedGroup | Readonly<IGroupParent>>();\n for (const group of groups) {\n let root: IOrderedGroup | Readonly<IGroupParent> = group;\n while (root.parent) {\n root = root.parent;\n }\n roots.add(root);\n }\n return Array.from(roots);\n}\n\n/**\n * Traverse the tree of given groups in depth first search (DFS)\n *\n * @param groups Groups to travserse\n * @param f Function to check each group. Travsering subgroups can be stopped when returning `false`.\n *\n * @internal\n */\nexport function traverseGroupsDFS(groups: IOrderedGroup[], f: (v: IGroup | IGroupParent) => boolean | void) {\n const traverse = (v: IGroup | IGroupParent) => {\n if (f(v) === false) {\n return;\n }\n if (isGroupParent(v)) {\n v.subGroups.forEach(traverse);\n }\n };\n const roots = groupRoots(groups);\n roots.forEach(traverse);\n}\n\n// based on https://github.com/d3/d3-scale-chromatic#d3-scale-chromatic\nconst colors = schemeCategory10.concat(schemeSet3);\n\n/** @internal */\nexport const MAX_COLORS = colors.length;\n\n/** @internal */\nexport function colorPool() {\n let act = 0;\n return () => colors[(act++) % colors.length];\n}\n\n\n/**\n * @internal\n */\nexport function mapIndices<T>(arr: IndicesArray, callback: (value: number, i: number) => T): T[] {\n const r: T[] = [];\n for (let i = 0; i < arr.length; ++i) {\n r.push(callback(arr[i], i));\n }\n return r;\n}\n\n/**\n * @internal\n */\nexport function everyIndices(arr: IndicesArray, callback: (value: number, i: number) => boolean): boolean {\n for (let i = 0; i < arr.length; ++i) {\n if (!callback(arr[i], i)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * @internal\n */\nexport function filterIndices(arr: IndicesArray, callback: (value: number, i: number) => boolean): number[] {\n const r: number[] = [];\n for (let i = 0; i < arr.length; ++i) {\n if (callback(arr[i], i)) {\n r.push(arr[i]);\n }\n }\n return r;\n}\n\n\n/**\n * @internal\n */\nexport function forEachIndices(arr: IndicesArray, callback: (value: number, i: number) => void) {\n for (let i = 0; i < arr.length; ++i) {\n callback(arr[i], i);\n }\n}\n\n/**\n * @internal\n */\nexport function chooseUIntByDataLength(dataLength?: number | null) {\n if (dataLength == null || typeof dataLength !== 'number' && !isNaN(dataLength)) {\n return ECompareValueType.UINT32; // worst case\n }\n if (length <= 255) {\n return ECompareValueType.UINT8;\n }\n if (length <= 65535) {\n return ECompareValueType.UINT16;\n }\n return ECompareValueType.UINT32;\n}\n\nexport function getAllToolbarActions(col: Column) {\n const actions = new OrderedSet<string>();\n\n // walk up the prototype chain\n let obj = <any>col;\n const toolbarIcon = Symbol.for('toolbarIcon');\n do {\n const m = <string[]>Reflect.getOwnMetadata(toolbarIcon, obj.constructor);\n if (m) {\n for (const mi of m) {\n actions.add(mi);\n }\n }\n obj = Object.getPrototypeOf(obj);\n } while (obj);\n return Array.from(actions);\n}\n\n\nexport function getAllToolbarDialogAddons(col: Column, key: string) {\n const actions = new OrderedSet<string>();\n\n // walk up the prototype chain\n let obj = <any>col;\n const symbol = Symbol.for(`toolbarDialogAddon${key}`);\n do {\n const m = <string[]>Reflect.getOwnMetadata(symbol, obj.constructor);\n if (m) {\n for (const mi of m) {\n actions.add(mi);\n }\n }\n obj = Object.getPrototypeOf(obj);\n } while (obj);\n return Array.from(actions);\n}\n","import {ICategory, ICategoricalColorMappingFunction} from '.';\nimport {DEFAULT_COLOR, ITypedDump} from './interfaces';\n\n\nexport const DEFAULT_CATEGORICAL_COLOR_FUNCTION: ICategoricalColorMappingFunction = {\n apply: (v) => v ? v.color : DEFAULT_COLOR,\n toJSON: () => null,\n clone: () => DEFAULT_CATEGORICAL_COLOR_FUNCTION,\n eq: (other) => other === DEFAULT_CATEGORICAL_COLOR_FUNCTION\n};\n\nexport class ReplacmentColorMappingFunction implements ICategoricalColorMappingFunction {\n public readonly map: ReadonlyMap<string, string>;\n constructor(map: Map<ICategory | string, string>) {\n this.map = new Map(Array.from(map.entries()).map(([k, v]) => <[string, string]>[typeof k === 'string' ? k : k.name, v]));\n }\n\n apply(v: ICategory) {\n return this.map.has(v.name) ? this.map.get(v.name)! : DEFAULT_CATEGORICAL_COLOR_FUNCTION.apply(v);\n }\n\n toJSON() {\n const r: any = {};\n this.map.forEach((v, k) => r[k] = v);\n return {\n type: 'replace',\n map: r\n };\n }\n\n clone() {\n return new ReplacmentColorMappingFunction(new Map(this.map.entries()));\n }\n\n eq(other: ICategoricalColorMappingFunction): boolean {\n if (!(other instanceof ReplacmentColorMappingFunction)) {\n return false;\n }\n if (other.map.size !== this.map.size) {\n return false;\n }\n return Array.from(this.map.keys()).every((k) => this.map.get(k) === other.map.get(k));\n }\n\n static restore(dump: any, categories: ICategory[]) {\n if (dump.type === 'replace') { // new dump format\n dump = dump.map;\n }\n const lookup = new Map(categories.map((d) => <[string, ICategory]>[d.name, d]));\n const r = new Map<ICategory, string>();\n for (const key of Object.keys(dump)) {\n if (lookup.has(key)) {\n r.set(lookup.get(key)!, dump[key]);\n }\n }\n return new ReplacmentColorMappingFunction(r);\n }\n}\n\n/**\n * @internal\n */\nexport function restoreCategoricalColorMapping(dump: ITypedDump | null | undefined, categories: ICategory[]): ICategoricalColorMappingFunction {\n if (!dump) {\n return DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n return ReplacmentColorMappingFunction.restore(dump, categories);\n}\n","import {IGroup} from './interfaces';\n\n\nexport function isMissingValue(v: any): boolean {\n if(v == null || v === undefined || v === '' || v === 'NA' || v === 'na' || v === 'Na' || v === 'nA' || v === 'NaN' || (typeof v === 'number' && isNaN(v))) {\n return true;\n }\n if (!Array.isArray(v)) {\n return false;\n }\n for (const vi of v) {\n if (!isMissingValue(vi)) {\n return false;\n }\n }\n return true;\n}\n\nexport function isUnknown(v?: number | null) {\n return v == null || v === undefined || isNaN(v);\n}\n\nexport const FIRST_IS_NAN = -1;\nexport const FIRST_IS_MISSING = 1;\n\n\nexport const missingGroup: IGroup = {\n name: 'Missing values',\n color: 'gray'\n};\n","import {ISequence, isSeqEmpty, empty} from '../internal';\nimport {FIRST_IS_MISSING, IDataRow, ECompareValueType, ICompareValue, ICategory, ICategoricalColumn, ICategoricalDesc, ICategoricalFilter} from '.';\nimport {colorPool} from './internal';\nimport {DEFAULT_COLOR} from './interfaces';\nimport {ICategoricalsColumn, ISetCategoricalFilter} from './ICategoricalColumn';\n\n/** @internal */\nexport function toCategory(cat: (string | Partial<ICategory>), value: number, nextColor: () => string = () => DEFAULT_COLOR) {\n if (typeof cat === 'string') {\n //just the category value\n return {name: cat, label: cat, color: nextColor(), value};\n }\n const name = cat.name == null ? String(cat.value) : cat.name;\n return {\n name,\n label: cat.label || name,\n color: cat.color || nextColor(),\n value: cat.value != null ? cat.value : value\n };\n}\n\n\n/** @internal */\nexport function toCompareCategoryValue(v: ICategory | null) {\n if (v == null) {\n return NaN;\n }\n return v.value;\n}\n\nexport const COMPARE_CATEGORY_VALUE_TYPES = ECompareValueType.FLOAT_ASC;\n\nfunction findMostFrequent(rows: ISequence<ICategory | null>, valueCache?: ISequence<ICategory | null>): {cat: ICategory | null, count: number} {\n const hist = new Map<ICategory | null, number>();\n\n if (valueCache) {\n valueCache.forEach((cat) => {\n hist.set(cat, (hist.get(cat) || 0) + 1);\n });\n } else {\n rows.forEach((cat) => {\n hist.set(cat, (hist.get(cat) || 0) + 1);\n });\n }\n\n if (hist.size === 0) {\n return {\n cat: null,\n count: 0\n };\n }\n let topCat: ICategory | null = null;\n let topCount = 0;\n hist.forEach((count, cat) => {\n if (count > topCount) {\n topCat = cat;\n topCount = count;\n }\n });\n return {\n cat: topCat,\n count: topCount\n };\n}\n\n/** @internal */\nexport function toMostFrequentCategoricals(rows: ISequence<IDataRow>, col: ICategoricalsColumn): (ICategory | null)[] {\n if (isSeqEmpty(rows)) {\n return empty(col.dataLength!);\n }\n const maps = empty(col.dataLength!).map(() => new Map<ICategory | null, number>());\n rows.forEach((row) => {\n const vs = col.getCategories(row);\n if (!vs) {\n return;\n }\n for (let i = 0; i < maps.length; ++i) {\n const hist = maps[i];\n const cat = vs[i] || null;\n hist.set(cat, (hist.get(cat) || 0) + 1);\n }\n });\n\n return maps.map((hist) => {\n if (hist.size === 0) {\n return null;\n }\n let topCat: ICategory | null = null;\n let topCount = 0;\n hist.forEach((count, cat) => {\n if (count > topCount) {\n topCat = cat;\n topCount = count;\n }\n });\n return topCat;\n });\n}\n\n/** @internal */\nexport function toGroupCompareCategoryValue(rows: ISequence<IDataRow>, col: ICategoricalColumn, valueCache?: ISequence<ICategory | null>): ICompareValue[] {\n if (isSeqEmpty(rows)) {\n return [NaN, null];\n }\n const mostFrequent = findMostFrequent(rows.map((d) => col.getCategory(d)), valueCache);\n if (mostFrequent.cat == null) {\n return [NaN, null];\n }\n return [mostFrequent.cat.value, mostFrequent.cat.name.toLowerCase()];\n}\n\nexport const COMPARE_GROUP_CATEGORY_VALUE_TYPES = [ECompareValueType.FLOAT, ECompareValueType.STRING];\n\n/** @internal */\nfunction compareCategory(a: ICategory | null, b: ICategory | null) {\n const aNull = a == null || isNaN(a.value);\n const bNull = b == null || isNaN(b.value);\n if (aNull || a == null) {\n return bNull ? 0 : FIRST_IS_MISSING;\n }\n if (bNull || b == null) {\n return -FIRST_IS_MISSING;\n }\n if (a.value === b.value) {\n return a.label.toLowerCase().localeCompare(b.label.toLowerCase());\n }\n return a.value - b.value;\n}\n\nexport function toCategories(desc: ICategoricalDesc) {\n if (!desc.categories) {\n return [];\n }\n const nextColor = colorPool();\n const l = desc.categories.length - 1;\n const cats = desc.categories.map((cat, i) => toCategory(cat, i / l, nextColor));\n return cats.sort(compareCategory);\n}\n\n/** @internal */\nfunction isEmptyFilter(f: ICategoricalFilter | null) {\n return f == null || (!f.filterMissing && (f.filter == null || f.filter === ''));\n}\n\n/** @internal */\nexport function isEqualCategoricalFilter(a: ICategoricalFilter | null, b: ICategoricalFilter | null) {\n if (a === b) {\n return true;\n }\n if (a == null || b == null) {\n return isEmptyFilter(a) === isEmptyFilter(b);\n }\n if (a.filterMissing !== b.filterMissing || (typeof a.filter !== typeof b.filter) || (Array.isArray(a.filter) !== Array.isArray(b.filter))) {\n return false;\n }\n if (Array.isArray(a.filter)) {\n return arrayEquals(<string[]>a.filter, <string[]>b.filter);\n }\n return String(a.filter) === String(b.filter);\n}\n\n/** @internal */\nexport function isEqualSetCategoricalFilter(a: ISetCategoricalFilter | null, b: ISetCategoricalFilter | null) {\n if (!isEqualCategoricalFilter(a, b)) {\n return false;\n }\n const am = a && a.mode ? a.mode : 'every';\n const bm = b && b.mode ? b.mode : 'every';\n return am === bm;\n}\n\nfunction arrayEquals<T>(a: T[], b: T[]) {\n const al = a != null ? a.length : 0;\n const bl = b != null ? b.length : 0;\n if (al !== bl) {\n return false;\n }\n if (al === 0) {\n return true;\n }\n return a.every((ai, i) => ai === b[i]);\n}\n\n/** @internal */\nexport function isCategoryIncluded(filter: ICategoricalFilter | null, category: ICategory | null) {\n if (filter == null) {\n return true;\n }\n if (category == null || isNaN(category.value)) {\n return !filter.filterMissing;\n }\n const filterObj = filter.filter;\n if (Array.isArray(filterObj)) { //array mode\n return filterObj.includes(category.name);\n }\n if (typeof filterObj === 'string' && filterObj.length > 0) { //search mode\n return category.name.toLowerCase().includes(filterObj.toLowerCase());\n }\n if (filterObj instanceof RegExp) { //regex match mode\n return filterObj.test(category.name);\n }\n return true;\n}\n","import {IEventListener, ISequence} from '../internal';\nimport {Category, toolbar} from './annotations';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';\nimport Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';\nimport {ICategoricalColumn, ICategoricalColumnDesc, ICategoricalFilter, ICategory, ICategoricalColorMappingFunction} from './ICategoricalColumn';\nimport {IDataRow, IGroup, ICompareValue, DEFAULT_COLOR, ITypeFactory, ECompareValueType} from './interfaces';\nimport {missingGroup} from './missing';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {toCategories, isCategoryIncluded, isEqualCategoricalFilter, toCompareCategoryValue, COMPARE_CATEGORY_VALUE_TYPES, toGroupCompareCategoryValue, COMPARE_GROUP_CATEGORY_VALUE_TYPES} from './internalCategorical';\n\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf CategoricalColumn\n * @event\n */\nexport declare function colorMappingChanged_CC(previous: ICategoricalColorMappingFunction, current: ICategoricalColorMappingFunction): void;\n\n\n/**\n * emitted when the filter property changes\n * @asMemberOf CategoricalColumn\n * @event\n */\nexport declare function filterChanged_CC(previous: ICategoricalFilter | null, current: ICategoricalFilter | null): void;\n\n/**\n * column for categorical values\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'group', 'groupBy', 'sortGroupBy', 'filterCategorical', 'colorMappedCategorical')\n@Category('categorical')\nexport default class CategoricalColumn extends ValueColumn<string> implements ICategoricalColumn {\n static readonly EVENT_FILTER_CHANGED = 'filterChanged';\n static readonly EVENT_COLOR_MAPPING_CHANGED = 'colorMappingChanged';\n\n readonly categories: ICategory[];\n\n private colorMapping: ICategoricalColorMappingFunction;\n\n private readonly lookup = new Map<string, Readonly<ICategory>>();\n /**\n * set of categories to show\n * @type {null}\n * @private\n */\n private currentFilter: ICategoricalFilter | null = null;\n\n constructor(id: string, desc: Readonly<ICategoricalColumnDesc>) {\n super(id, desc);\n this.categories = toCategories(desc);\n this.categories.forEach((d) => this.lookup.set(d.name, d));\n this.colorMapping = DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n\n protected createEventList() {\n return super.createEventList().concat([CategoricalColumn.EVENT_FILTER_CHANGED, CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED]);\n }\n\n on(type: typeof CategoricalColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_CC | null): this;\n on(type: typeof CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_CC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValue(row: IDataRow) {\n const v = this.getCategory(row);\n return v ? v.name : null;\n }\n\n getCategory(row: IDataRow) {\n const v = super.getValue(row);\n if (!v) {\n return null;\n }\n const vs = String(v);\n return this.lookup.has(vs) ? this.lookup.get(vs)! : null;\n }\n\n get dataLength() {\n return this.categories.length;\n }\n\n get labels() {\n return this.categories.map((d) => d.label);\n }\n\n getLabel(row: IDataRow) {\n const v = this.getCategory(row);\n return v ? v.label : '';\n }\n\n getCategories(row: IDataRow) {\n const v = this.getCategory(row);\n return [v];\n }\n\n getValues(row: IDataRow) {\n const v = this.getCategory(row);\n return this.categories.map((d) => d === v);\n }\n\n getLabels(row: IDataRow) {\n return this.getValues(row).map(String);\n }\n\n getMap(row: IDataRow) {\n const cats = this.categories;\n return this.getValues(row).map((value, i) => ({key: cats[i].label, value}));\n }\n\n getMapLabel(row: IDataRow) {\n const cats = this.categories;\n return this.getLabels(row).map((value, i) => ({key: cats[i].label, value}));\n }\n\n getSet(row: IDataRow) {\n const cat = this.getCategory(row);\n const r = new Set<ICategory>();\n if (cat) {\n r.add(cat);\n }\n return r;\n }\n\n iterCategory(row: IDataRow) {\n return [this.getCategory(row)];\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.filter = this.currentFilter;\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n\n this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);\n\n if (typeof dump.filter === 'undefined') {\n this.currentFilter = null;\n return;\n }\n const bak = dump.filter;\n if (typeof bak === 'string' || Array.isArray(bak)) {\n this.currentFilter = {filter: bak, filterMissing: false};\n } else {\n this.currentFilter = bak;\n }\n }\n\n getColor(row: IDataRow) {\n const v = this.getCategory(row);\n return v ? this.colorMapping.apply(v) : DEFAULT_COLOR;\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: ICategoricalColorMappingFunction) {\n if (this.colorMapping.eq(mapping)) {\n return;\n }\n this.fire([CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], this.colorMapping.clone(), this.colorMapping = mapping);\n }\n\n isFiltered() {\n return this.currentFilter != null;\n }\n\n filter(row: IDataRow, valueCache?: any): boolean {\n return isCategoryIncluded(this.currentFilter, valueCache !== undefined ? valueCache : this.getCategory(row));\n }\n\n getFilter() {\n return this.currentFilter == null ? null : Object.assign({}, this.currentFilter);\n }\n\n setFilter(filter: ICategoricalFilter | null) {\n if (isEqualCategoricalFilter(this.currentFilter, filter)) {\n return;\n }\n this.fire([CategoricalColumn.EVENT_FILTER_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.currentFilter, this.currentFilter = filter);\n }\n\n clearFilter() {\n const was = this.isFiltered();\n this.setFilter(null);\n return was;\n }\n\n toCompareValue(row: IDataRow, valueCache?: any) {\n return toCompareCategoryValue(valueCache !== undefined ? valueCache : this.getCategory(row));\n }\n\n toCompareValueType(): ECompareValueType {\n return COMPARE_CATEGORY_VALUE_TYPES;\n }\n\n group(row: IDataRow, valueCache?: any): IGroup {\n const cat = valueCache !== undefined ? valueCache : this.getCategory(row);\n if (!cat) {\n return Object.assign({}, missingGroup);\n }\n return {name: cat.label, color: cat.color};\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, _group: IGroup, valueCache?: ISequence<any>): ICompareValue[] {\n return toGroupCompareCategoryValue(rows, this, valueCache);\n }\n\n toCompareGroupValueType() {\n return COMPARE_GROUP_CATEGORY_VALUE_TYPES;\n }\n\n getGroupRenderer() {\n const current = super.getGroupRenderer();\n if (current === this.desc.type && this.isGroupedBy() >= 0) {\n // still the default and the stratification criteria\n return 'catdistributionbar';\n }\n return current;\n }\n}\n","import {Category, toolbar} from './annotations';\nimport CategoricalColumn from './CategoricalColumn';\nimport Column, {labelChanged, metaDataChanged, dirty, widthChanged, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport {IArrayColumn} from './IArrayColumn';\nimport {ICategoricalDesc, ISetCategoricalFilter, ICategory, ISetColumn, ICategoricalColorMappingFunction} from './ICategoricalColumn';\nimport {IDataRow, ECompareValueType, IValueColumnDesc, IGroup, DEFAULT_COLOR, ITypeFactory} from './interfaces';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IEventListener} from '../internal';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';\nimport {toCategories, isCategoryIncluded, isEqualSetCategoricalFilter} from './internalCategorical';\nimport {chooseUIntByDataLength, integrateDefaults} from './internal';\n\nexport interface ISetDesc extends ICategoricalDesc {\n separator?: string;\n}\n\nexport declare type ISetColumnDesc = ISetDesc & IValueColumnDesc<string[]>;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf SetColumn\n * @event\n */\nexport declare function colorMappingChanged_SSC(previous: ICategoricalColorMappingFunction, current: ICategoricalColorMappingFunction): void;\n\n\n/**\n * emitted when the filter property changes\n * @asMemberOf SetColumn\n * @event\n */\nexport declare function filterChanged_SSC(previous: ISetCategoricalFilter | null, current: ISetCategoricalFilter | null): void;\n\n/**\n * a string column with optional alignment\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'filterCategorical', 'colorMappedCategorical', 'group', 'groupBy')\n@Category('categorical')\nexport default class SetColumn extends ValueColumn<string[]> implements IArrayColumn<boolean>, ISetColumn {\n static readonly EVENT_FILTER_CHANGED = CategoricalColumn.EVENT_FILTER_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED;\n\n readonly categories: ICategory[];\n\n private readonly separator: RegExp;\n\n private readonly lookup = new Map<string, Readonly<ICategory>>();\n\n private colorMapping: ICategoricalColorMappingFunction;\n /**\n * set of categories to show\n * @type {null}\n * @private\n */\n private currentFilter: ISetCategoricalFilter | null = null;\n\n constructor(id: string, desc: Readonly<ISetColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'upset',\n groupRenderer: 'upset',\n summaryRenderer: 'categorical'\n }));\n this.separator = new RegExp(desc.separator || ';');\n this.categories = toCategories(desc);\n this.categories.forEach((d) => this.lookup.set(d.name, d));\n this.colorMapping = DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n\n protected createEventList() {\n return super.createEventList().concat([SetColumn.EVENT_COLOR_MAPPING_CHANGED, SetColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof SetColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_SSC | null): this;\n on(type: typeof SetColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_SSC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n get labels() {\n return this.categories.map((d) => d.label);\n }\n\n get dataLength() {\n return this.categories.length;\n }\n\n getValue(row: IDataRow): string[] | null {\n const v = this.getSortedSet(row);\n if (v.length === 0) {\n return null;\n }\n return v.map((d) => d.name);\n }\n\n getLabel(row: IDataRow) {\n return `(${this.getSortedSet(row).map((d) => d.label).join(',')})`;\n }\n\n private normalize(v: any) {\n if (typeof v === 'string') {\n return v.split(this.separator).map((s) => s.trim());\n }\n if (Array.isArray(v)) {\n return v.map((v) => String(v).trim());\n }\n if (v instanceof Set) {\n return Array.from(v).map(String);\n }\n return [];\n }\n\n getSet(row: IDataRow) {\n const sv = this.normalize(super.getValue(row));\n const r = new Set<ICategory>();\n sv.forEach((n) => {\n const cat = this.lookup.get(n);\n if (cat) {\n r.add(cat);\n }\n });\n return r;\n }\n\n getSortedSet(row: IDataRow) {\n return Array.from(this.getSet(row)).sort((a, b) => a.value === b.value ? a.label.localeCompare(b.label) : a.value - b.value);\n }\n\n getCategories(row: IDataRow) {\n return this.getSortedSet(row);\n }\n\n getColors(row: IDataRow) {\n return this.getSortedSet(row).map((d) => this.colorMapping.apply(d));\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: ICategoricalColorMappingFunction) {\n return CategoricalColumn.prototype.setColorMapping.call(this, mapping);\n }\n\n\n getValues(row: IDataRow) {\n const s = this.getSet(row);\n return this.categories.map((d) => s.has(d));\n }\n\n getLabels(row: IDataRow) {\n return this.getValues(row).map(String);\n }\n\n getMap(row: IDataRow) {\n return this.getSortedSet(row).map((d) => ({key: d.label, value: true}));\n }\n\n getMapLabel(row: IDataRow) {\n return this.getSortedSet(row).map((d) => ({key: d.label, value: 'true'}));\n }\n\n iterCategory(row: IDataRow) {\n const r = this.getSet(row);\n if (r.size > 0) {\n return Array.from(r);\n }\n return [null];\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.filter = this.currentFilter;\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);\n if (!('filter' in dump)) {\n this.currentFilter = null;\n return;\n }\n const bak = dump.filter;\n if (typeof bak === 'string' || Array.isArray(bak)) {\n this.currentFilter = {filter: bak, filterMissing: false, mode: 'some'};\n } else {\n this.currentFilter = bak;\n }\n }\n\n isFiltered() {\n return this.currentFilter != null;\n }\n\n filter(row: IDataRow): boolean {\n if (!this.currentFilter) {\n return true;\n }\n const v = Array.from(this.getSet(row));\n if (v.length === 0) {\n return isCategoryIncluded(this.currentFilter, null);\n }\n if (this.currentFilter.mode === 'every') {\n return v.every((s) => isCategoryIncluded(this.currentFilter, s));\n }\n return v.some((s) => isCategoryIncluded(this.currentFilter, s));\n }\n\n getFilter(): ISetCategoricalFilter | null {\n return this.currentFilter == null ? null : Object.assign({}, this.currentFilter);\n }\n\n setFilter(filter: ISetCategoricalFilter | null) {\n if (isEqualSetCategoricalFilter(this.currentFilter, filter)) {\n return;\n }\n this.fire([CategoricalColumn.EVENT_FILTER_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.currentFilter, this.currentFilter = filter);\n }\n\n clearFilter() {\n return CategoricalColumn.prototype.clearFilter.call(this);\n }\n\n toCompareValue(row: IDataRow) {\n const v = this.getSet(row);\n\n const vs = [v.size];\n for (const cat of this.categories) {\n vs.push(v.has(cat) ? 1 : 0);\n }\n return vs;\n }\n\n toCompareValueType() {\n return [chooseUIntByDataLength(this.categories.length)].concat(this.categories.map(() => ECompareValueType.BINARY));\n }\n\n group(row: IDataRow): IGroup {\n const v = this.getSet(row);\n const cardinality = v.size;\n const categories = this.categories.filter((c) => v.has(c));\n\n // by cardinality and then by intersection\n\n const g: IGroup = {\n name: categories.length === 0 ? 'None' : categories.map((d) => d.name).join(', '),\n color: categories.length === 1 ? categories[0].color : DEFAULT_COLOR\n };\n\n g.parent = {\n name: `#${cardinality}`,\n color: DEFAULT_COLOR,\n subGroups: [g]\n };\n\n return g;\n }\n}\n","\nconst styles = new Map<string, string>();\n// {\n// const r = /^[$]([\\w]+): ([\\w #.()'\\/,-]+)( !default)?;/gmi;\n// const s = String(vars);\n\n// let m: RegExpMatchArray | null = r.exec(s);\n// while (m != null) {\n// styles.set(m[1], m[2]);\n// m = r.exec(s);\n// }\n// }\n\n/** @internal */\nexport default function getStyle(key: string, defaultValue = '') {\n if (key[0] === '$') {\n key = key.slice(1);\n }\n if (styles.has(key)) {\n return styles.get(key)!;\n }\n return defaultValue;\n}\n\n/** @internal */\nexport const COLUMN_PADDING = parseInt(getStyle('lu_engine_grip_gap', '5px'), 10);\n/** @internal */\nexport const FILTERED_OPACITY = parseFloat(getStyle('lu_filtered_opacity', '0.2'));\n/** @internal */\nexport const DASH = {\n width: parseInt(getStyle('lu_missing_dash_width', '3px'), 10),\n height: parseInt(getStyle('lu_missing_dash_height', '10px'), 10),\n color: getStyle('lu_missing_dash_color', 'gray')\n};\n/** @internal */\nexport const UPSET = {\n color: getStyle('lu_renderer_upset_color'),\n inactive: parseFloat(getStyle('lu_renderer_upset_inactive_opacity', '0.1'))\n};\n/** @internal */\nexport const DOT = {\n color: getStyle('lu_renderer_dot_color', 'gray'),\n size: parseInt(getStyle('lu_renderer_dot_size', '5px'), 10),\n opacity: parseFloat(getStyle('lu_renderer_dot_opacity', '0.5'))\n};\n/** @internal */\nexport const BOX_PLOT = {\n box: getStyle('lu_renderer_boxplot_box', '#e0e0e0'),\n stroke: getStyle('lu_renderer_boxplot_stroke', 'black'),\n sort: getStyle('lu_renderer_boxplot_sort_indicator', '#ffa500'),\n outlier: getStyle('lu_renderer_boxplot_outlier', '#e0e0e0')\n};\n/** @internal */\nexport const AGGREGATE = {\n width: parseInt(getStyle('lu_aggregate_square_bracket_width', '4px'), 10),\n strokeWidth: parseInt(getStyle('lu_aggregate_square_bracket_stroke_width', '2px'), 10),\n color: getStyle('lu_aggregate_square_bracket_stroke_color', '#000'),\n levelOffset: parseInt(getStyle('lu_aggregate_level_offset', '2px'), 10),\n levelWidth: parseInt(getStyle('lu_aggregate_level_width', '22px'), 10)\n};\n/** @internal */\nexport const SLOPEGRAPH_WIDTH = parseInt(getStyle('lu_slope_width', '200px'), 10);\n/** @internal */\nexport const CANVAS_HEIGHT = 4;\n\n/** @internal */\nexport const CSS_PREFIX = getStyle('lu_css_prefix', 'lu');\n/** @internal */\nexport const ENGINE_CSS_PREFIX = 'le';\n\n/** @internal */\nexport const RESIZE_SPACE = parseInt(getStyle('lu_engine_resize_space', '50px'), 10);\n/** @internal */\nexport const RESIZE_ANIMATION_DURATION = parseInt(getStyle('lu_engine_resize_animation_duration', '1000ms'), 10);\n\n/** @internal */\nexport const AGGREGATION_LEVEL_WIDTH = parseInt(getStyle('lu_aggregate_level_width', '22px'), 10);\n\n/** @internal */\nexport function cssClass(suffix?: string) {\n return suffix? `${CSS_PREFIX}-${suffix}` : CSS_PREFIX;\n}\n/** @internal */\nexport function engineCssClass(suffix?: string) {\n return suffix? `${ENGINE_CSS_PREFIX}-${suffix}` : ENGINE_CSS_PREFIX;\n}\n\n/** @internal */\nexport function aria(text: string) {\n return `<span class=\"${cssClass('aria')}\" aria-hidden=\"true\">${text}</span>`;\n}\n","import {Category, SupportType, toolbar} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport {IGroup, IColumnDesc} from './interfaces';\nimport Ranking from './Ranking';\nimport {IEventListener} from '../internal';\nimport {integrateDefaults} from './internal';\nimport {AGGREGATION_LEVEL_WIDTH} from '../styles';\n\n\nexport enum EAggregationState {\n COLLAPSE = 'collapse',\n EXPAND = 'expand',\n EXPAND_TOP_N = 'expand_top'\n}\n\n/**\n * factory for creating a description creating a rank column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createAggregateDesc(label: string = 'Aggregate Groups') {\n return {type: 'aggregate', label, fixed: true};\n}\n\nexport interface IAggregateGroupColumnDesc extends IColumnDesc {\n isAggregated(ranking: Ranking, group: IGroup): EAggregationState;\n\n setAggregated(ranking: Ranking, group: IGroup, value: EAggregationState): void;\n}\n\n/**\n * emitted upon changing of the aggregate attribute\n * @aparam value -1 = no, 0 = fully aggregated, N = show top N\n * @asMemberOf AggregateGroupColumn\n * @event\n */\nexport declare function aggregate(ranking: Ranking, group: IGroup, value: boolean, state: EAggregationState): void;\n\n/**\n * a checkbox column for selections\n */\n@toolbar('setShowTopN', 'rename')\n@SupportType()\n@Category('support')\nexport default class AggregateGroupColumn extends Column {\n static readonly EVENT_AGGREGATE = 'aggregate';\n\n constructor(id: string, desc: Readonly<IAggregateGroupColumnDesc>) {\n super(id, integrateDefaults(desc, {\n width: AGGREGATION_LEVEL_WIDTH * 2\n }));\n }\n\n get frozen() {\n return this.desc.frozen !== false;\n }\n\n protected createEventList() {\n return super.createEventList().concat([AggregateGroupColumn.EVENT_AGGREGATE]);\n }\n\n on(type: typeof AggregateGroupColumn.EVENT_AGGREGATE, listener: typeof aggregate | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n isAggregated(group: IGroup) {\n const ranking = this.findMyRanker()!;\n if ((<IAggregateGroupColumnDesc>this.desc).isAggregated) {\n return (<IAggregateGroupColumnDesc>this.desc).isAggregated(ranking, group);\n }\n return false;\n }\n\n setAggregated(group: IGroup, value: boolean | EAggregationState) {\n const n: EAggregationState = typeof value === 'boolean' ? (value ? EAggregationState.EXPAND : EAggregationState.COLLAPSE): value;\n const ranking = this.findMyRanker()!;\n const current = ((<IAggregateGroupColumnDesc>this.desc).isAggregated) && (<IAggregateGroupColumnDesc>this.desc).isAggregated(ranking, group);\n if (current === n) {\n return true;\n }\n\n if ((<IAggregateGroupColumnDesc>this.desc).setAggregated) {\n (<IAggregateGroupColumnDesc>this.desc).setAggregated(ranking, group, n);\n }\n this.fire(AggregateGroupColumn.EVENT_AGGREGATE, ranking, group, n !== EAggregationState.COLLAPSE, n);\n return false;\n }\n}\n","import {equalArrays, fixCSS, IEventListener, suffix, joinIndexArrays, AEventDispatcher} from '../internal';\nimport {isSortingAscByDefault} from './annotations';\nimport Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, labelChanged, visibilityChanged, widthChanged} from './Column';\nimport CompositeColumn from './CompositeColumn';\nimport {IRankingDump, defaultGroup, IndicesArray, IOrderedGroup, IDataRow, IColumnParent, IFlatColumn, ISortCriteria, UIntTypedArray, IGroupParent, ITypeFactory, IGroup} from './interfaces';\nimport {groupRoots, traverseGroupsDFS} from './internal';\nimport {AggregateGroupColumn, SetColumn} from '.';\nimport {AGGREGATION_LEVEL_WIDTH} from '../styles';\n\nexport enum EDirtyReason {\n UNKNOWN = 'unknown',\n FILTER_CHANGED = 'filter',\n SORT_CRITERIA_CHANGED = 'sort_changed',\n SORT_CRITERIA_DIRTY = 'sort_dirty',\n GROUP_CRITERIA_CHANGED = 'group_changed',\n GROUP_CRITERIA_DIRTY = 'group_dirty',\n GROUP_SORT_CRITERIA_CHANGED = 'group_sort_changed',\n GROUP_SORT_CRITERIA_DIRTY = 'group_sort_dirty'\n}\n\n\n/**\n * emitted when a column has been added\n * @asMemberOf Ranking\n * @event\n */\nexport declare function addColumn(col: Column, index: number): void;\n\n/**\n * emitted when a column has been moved within this composite columm\n * @asMemberOf Ranking\n * @event\n */\nexport declare function moveColumn(col: Column, index: number, oldIndex: number): void;\n\n/**\n * emitted when a column has been removed\n * @asMemberOf Ranking\n * @event\n */\nexport declare function removeColumn(col: Column, index: number): void;\n/**\n * emitted when the sort criteria propery changes\n * @asMemberOf Ranking\n * @event\n */\nexport declare function sortCriteriaChanged(previous: ISortCriteria[], current: ISortCriteria[]): void;\n/**\n * emitted when the sort criteria propery changes\n * @asMemberOf Ranking\n * @event\n */\nexport declare function groupCriteriaChanged(previous: Column[], current: Column[]): void;\n/**\n * emitted when the sort criteria propery changes\n * @asMemberOf Ranking\n * @event\n */\nexport declare function groupSortCriteriaChanged(previous: ISortCriteria[], current: ISortCriteria[]): void;\n/**\n * emitted when the sort criteria propery changes\n * @asMemberOf Ranking\n * @event\n */\nexport declare function dirtyOrder(reason?: EDirtyReason[]): void;\n/**\n * @asMemberOf Ranking\n * @event\n */\nexport declare function orderChanged(previous: number[], current: number[], previousGroups: IOrderedGroup[], currentGroups: IOrderedGroup[], dirtyReason: EDirtyReason[]): void;\n/**\n * @asMemberOf Ranking\n * @event\n */\nexport declare function groupsChanged(previous: number[], current: number[], previousGroups: IOrderedGroup[], currentGroups: IOrderedGroup[]): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf NumberColumn\n * @event\n */\nexport declare function filterChanged(previous: any | null, current: any | null): void;\n/**\n * a ranking\n */\nexport default class Ranking extends AEventDispatcher implements IColumnParent {\n static readonly EVENT_WIDTH_CHANGED = Column.EVENT_WIDTH_CHANGED;\n static readonly EVENT_FILTER_CHANGED = 'filterChanged';\n static readonly EVENT_LABEL_CHANGED = Column.EVENT_LABEL_CHANGED;\n static readonly EVENT_ADD_COLUMN = CompositeColumn.EVENT_ADD_COLUMN;\n static readonly EVENT_MOVE_COLUMN = CompositeColumn.EVENT_MOVE_COLUMN;\n static readonly EVENT_REMOVE_COLUMN = CompositeColumn.EVENT_REMOVE_COLUMN;\n static readonly EVENT_DIRTY = Column.EVENT_DIRTY;\n static readonly EVENT_DIRTY_HEADER = Column.EVENT_DIRTY_HEADER;\n static readonly EVENT_DIRTY_VALUES = Column.EVENT_DIRTY_VALUES;\n static readonly EVENT_DIRTY_CACHES = Column.EVENT_DIRTY_CACHES;\n static readonly EVENT_COLUMN_VISIBILITY_CHANGED = Column.EVENT_VISIBILITY_CHANGED;\n static readonly EVENT_SORT_CRITERIA_CHANGED = 'sortCriteriaChanged';\n static readonly EVENT_GROUP_CRITERIA_CHANGED = 'groupCriteriaChanged';\n static readonly EVENT_GROUP_SORT_CRITERIA_CHANGED = 'groupSortCriteriaChanged';\n static readonly EVENT_DIRTY_ORDER = 'dirtyOrder';\n static readonly EVENT_ORDER_CHANGED = 'orderChanged';\n static readonly EVENT_GROUPS_CHANGED = 'groupsChanged';\n\n private static readonly FORWARD_COLUMN_EVENTS = suffix('.ranking', Column.EVENT_VISIBILITY_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY, Column.EVENT_VISIBILITY_CHANGED, Ranking.EVENT_FILTER_CHANGED);\n private static readonly COLUMN_GROUP_SORT_DIRTY = suffix('.groupOrder', Column.EVENT_DIRTY_CACHES, 'sortMethodChanged');\n private static readonly COLUMN_SORT_DIRTY = suffix('.order', Column.EVENT_DIRTY_CACHES);\n private static readonly COLUMN_GROUP_DIRTY = suffix('.group', Column.EVENT_DIRTY_CACHES, 'groupingChanged');\n\n\n private label: string;\n\n private readonly sortCriteria: ISortCriteria[] = [];\n private readonly groupColumns: Column[] = [];\n private readonly groupSortCriteria: ISortCriteria[] = [];\n\n /**\n * columns of this ranking\n * @type {Array}\n * @private\n */\n private readonly columns: Column[] = [];\n\n readonly dirtyOrder = (reason?: EDirtyReason[]) => {\n this.fire([Ranking.EVENT_DIRTY_ORDER, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], reason);\n };\n private readonly dirtyOrderSortDirty = () => this.dirtyOrder([EDirtyReason.SORT_CRITERIA_DIRTY]);\n private readonly dirtyOrderGroupDirty = () => this.dirtyOrder([EDirtyReason.GROUP_CRITERIA_DIRTY]);\n private readonly dirtyOrderGroupSortDirty = () => this.dirtyOrder([EDirtyReason.GROUP_SORT_CRITERIA_DIRTY]);\n private readonly dirtyOrderFiltering = () => this.dirtyOrder([EDirtyReason.FILTER_CHANGED]);\n\n /**\n * the current ordering as an sorted array of indices\n * @type {Array}\n */\n private groups: IOrderedGroup[] = [Object.assign({order: <number[]>[]}, defaultGroup)];\n private order: IndicesArray = [];\n private index2pos: IndicesArray = [];\n\n constructor(public id: string) {\n super();\n this.id = fixCSS(id);\n this.label = `Ranking ${id.startsWith('rank') ? id.slice(4) : id}`;\n }\n\n protected createEventList() {\n return super.createEventList().concat([\n Ranking.EVENT_WIDTH_CHANGED, Ranking.EVENT_FILTER_CHANGED,\n Ranking.EVENT_LABEL_CHANGED, Ranking.EVENT_GROUPS_CHANGED,\n Ranking.EVENT_ADD_COLUMN, Ranking.EVENT_REMOVE_COLUMN, Ranking.EVENT_GROUP_CRITERIA_CHANGED, Ranking.EVENT_MOVE_COLUMN,\n Ranking.EVENT_DIRTY, Ranking.EVENT_DIRTY_HEADER, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY_CACHES,\n Ranking.EVENT_GROUP_SORT_CRITERIA_CHANGED, Ranking.EVENT_COLUMN_VISIBILITY_CHANGED,\n Ranking.EVENT_SORT_CRITERIA_CHANGED, Ranking.EVENT_DIRTY_ORDER, Ranking.EVENT_ORDER_CHANGED]);\n }\n\n on(type: typeof Ranking.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Ranking.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof Ranking.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Ranking.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof Ranking.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof Ranking.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Ranking.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Ranking.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Ranking.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Ranking.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Ranking.EVENT_COLUMN_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: typeof Ranking.EVENT_SORT_CRITERIA_CHANGED, listener: typeof sortCriteriaChanged | null): this;\n on(type: typeof Ranking.EVENT_GROUP_CRITERIA_CHANGED, listener: typeof groupCriteriaChanged | null): this;\n on(type: typeof Ranking.EVENT_GROUP_SORT_CRITERIA_CHANGED, listener: typeof groupSortCriteriaChanged | null): this;\n on(type: typeof Ranking.EVENT_DIRTY_ORDER, listener: typeof dirtyOrder | null): this;\n on(type: typeof Ranking.EVENT_ORDER_CHANGED, listener: typeof orderChanged | null): this;\n on(type: typeof Ranking.EVENT_GROUPS_CHANGED, listener: typeof groupsChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n assignNewId(idGenerator: () => string) {\n this.id = fixCSS(idGenerator());\n this.columns.forEach((c) => c.assignNewId(idGenerator));\n }\n\n getLabel() {\n return this.label;\n }\n\n setLabel(value: string) {\n if (value === this.label) {\n return;\n }\n this.fire(Ranking.EVENT_LABEL_CHANGED, this.label, this.label = value);\n }\n\n setGroups(groups: IOrderedGroup[], index2pos: IndicesArray, dirtyReason: EDirtyReason[]) {\n const old = this.order;\n const oldGroups = this.groups;\n this.groups = groups;\n this.index2pos = index2pos;\n this.order = joinIndexArrays(groups.map((d) => d.order));\n // replace with subarrays to save memory\n if (groups.length > 1) {\n this.unifyGroups(groups);\n } else if (groups.length === 1) {\n // propagate to the top\n let p = groups[0].parent;\n while (p) {\n (<IOrderedGroup><any>p).order = this.order;\n p = p.parent;\n }\n }\n this.fire([Ranking.EVENT_ORDER_CHANGED, Ranking.EVENT_GROUPS_CHANGED, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], old, this.order, oldGroups, groups, dirtyReason);\n }\n\n private unifyGroups(groups: IOrderedGroup[]) {\n let offset = 0;\n const order = <UIntTypedArray>this.order;\n const offsets = new Map<Readonly<IGroupParent> | IOrderedGroup, {\n offset: number;\n size: number;\n }>();\n for (const group of groups) {\n const size = group.order.length;\n group.order = order.subarray(offset, offset + size);\n offsets.set(group, {offset, size});\n offset += size;\n }\n // propgate also to the top with views\n const roots = groupRoots(groups);\n const resolve = (g: Readonly<IGroupParent> | IOrderedGroup): {\n offset: number;\n size: number;\n } => {\n if (offsets.has(g)) { // leaf\n return offsets.get(g)!;\n }\n const subs = (<IGroupParent>g).subGroups.map((gi) => resolve(<Readonly<IGroupParent> | IOrderedGroup>gi));\n const offset = subs.length > 0 ? subs[0].offset : 0;\n const size = subs.reduce((a, b) => a + b.size, 0);\n const r = {offset, size};\n offsets.set(g, r);\n (<IOrderedGroup><any>g).order = order.subarray(offset, offset + size);\n return r;\n };\n for (const root of roots) {\n resolve(root);\n }\n }\n\n getRank(dataIndex: number) {\n if (dataIndex < 0 || dataIndex > this.index2pos.length) {\n return -1;\n }\n const v = this.index2pos[dataIndex];\n return v != null && !isNaN(v) && v > 0 ? v : -1;\n }\n\n getOrder() {\n return this.order;\n }\n\n getOrderLength() {\n return this.order.length;\n }\n\n getGroups() {\n return this.groups.slice();\n }\n\n /**\n * Returns the flat group tree in depth first search (DFS).\n */\n getFlatGroups() {\n const r: Readonly<(IGroup | IGroupParent)>[] = [];\n traverseGroupsDFS(this.groups, (v) => {\n r.push(v);\n });\n return r;\n }\n\n dump(toDescRef: (desc: any) => any): IRankingDump {\n const r: IRankingDump = {};\n r.columns = this.columns.map((d) => d.dump(toDescRef));\n r.sortCriteria = this.sortCriteria.map((s) => ({asc: s.asc, sortBy: s.col!.id}));\n r.groupSortCriteria = this.groupSortCriteria.map((s) => ({asc: s.asc, sortBy: s.col!.id}));\n r.groupColumns = this.groupColumns.map((d) => d.id);\n return r;\n }\n\n restore(dump: IRankingDump, factory: ITypeFactory) {\n this.clear();\n (dump.columns || []).map((child: any) => {\n const c = factory(child);\n if (c) {\n this.push(c);\n }\n });\n // compatibility case\n if (dump.sortColumn && dump.sortColumn.sortBy) {\n const help = this.columns.find((d) => d.id === dump.sortColumn!.sortBy);\n if (help) {\n this.sortBy(help, dump.sortColumn.asc);\n }\n }\n if (dump.groupColumns) {\n const groupColumns = <Column[]>dump.groupColumns.map((id: string) => this.columns.find((d) => d.id === id)).filter((d) => d != null);\n this.setGroupCriteria(groupColumns);\n }\n\n const restoreSortCriteria = (dumped: any) => {\n return dumped.map((s: {asc: boolean, sortBy: string}) => {\n return {\n asc: s.asc,\n col: this.columns.find((d) => d.id === s.sortBy) || null\n };\n }).filter((s: any) => s.col);\n };\n\n if (dump.sortCriteria) {\n this.setSortCriteria(restoreSortCriteria(dump.sortCriteria));\n }\n\n if (dump.groupSortCriteria) {\n this.setGroupSortCriteria(restoreSortCriteria(dump.groupSortCriteria));\n }\n }\n\n flatten(r: IFlatColumn[], offset: number, levelsToGo = 0, padding = 0) {\n let acc = offset; // + this.getWidth() + padding;\n if (levelsToGo > 0 || levelsToGo <= Column.FLAT_ALL_COLUMNS) {\n this.columns.forEach((c) => {\n if (c.getVisible() && levelsToGo <= Column.FLAT_ALL_COLUMNS) {\n acc += c.flatten(r, acc, levelsToGo - 1, padding) + padding;\n }\n });\n }\n return acc - offset;\n }\n\n getPrimarySortCriteria(): ISortCriteria | null {\n if (this.sortCriteria.length === 0) {\n return null;\n }\n return this.sortCriteria[0];\n }\n\n getSortCriteria(): ISortCriteria[] {\n return this.sortCriteria.map((d) => Object.assign({}, d));\n }\n\n getGroupSortCriteria(): ISortCriteria[] {\n return this.groupSortCriteria.map((d) => Object.assign({}, d));\n }\n\n toggleSorting(col: Column) {\n return this.setSortCriteria(this.toggleSortingLogic(col, this.sortCriteria));\n }\n\n private toggleSortingLogic(col: Column, sortCriteria: ISortCriteria[]) {\n const newSort = sortCriteria.slice();\n const current = newSort.findIndex((d) => d.col === col);\n const defaultAsc = isSortingAscByDefault(col);\n\n if (current < 0) {\n newSort.splice(0, newSort.length, {col, asc: defaultAsc});\n } else if (newSort[current].asc === defaultAsc) {\n // asc -> desc, or desc -> asc\n newSort.splice(current, 1, {col, asc: !defaultAsc});\n } else {\n // remove\n newSort.splice(current, 1);\n }\n return newSort;\n }\n\n toggleGrouping(col: Column) {\n const old = this.groupColumns.indexOf(col);\n if (old >= 0) {\n const newGroupings = this.groupColumns.slice();\n newGroupings.splice(old, 1);\n return this.setGroupCriteria(newGroupings);\n }\n return this.setGroupCriteria([col]);\n }\n\n getGroupCriteria() {\n return this.groupColumns.slice();\n }\n\n /**\n * replaces, moves, or remove the given column in the sorting hierarchy\n * @param col {Column}\n * @param priority {number} when priority < 0 remove the column only else replace at the given priority\n */\n sortBy(col: Column, ascending: boolean = false, priority: number = 0) {\n if (col.findMyRanker() !== this) {\n return false; //not one of mine\n }\n return this.setSortCriteria(this.hierarchyLogic(this.sortCriteria, this.sortCriteria.findIndex((d) => d.col === col), {col, asc: ascending}, priority));\n }\n\n /**\n * replaces, moves, or remove the given column in the group sorting hierarchy\n * @param col {Column}\n * @param priority {number} when priority < 0 remove the column only else replace at the given priority\n */\n groupSortBy(col: Column, ascending: boolean = false, priority: number = 0) {\n if (col.findMyRanker() !== this) {\n return false; //not one of mine\n }\n return this.setGroupSortCriteria(this.hierarchyLogic(this.groupSortCriteria, this.groupSortCriteria.findIndex((d) => d.col === col), {col, asc: ascending}, priority));\n }\n\n private hierarchyLogic<T>(entries: T[], index: number, entry: T, priority: number) {\n entries = entries.slice();\n if (index >= 0) {\n // move at the other position\n entries.splice(index, 1);\n if (priority >= 0) {\n entries.splice(Math.min(priority, entries.length), 0, entry);\n }\n } else if (priority >= 0) {\n entries[Math.min(priority, entries.length)] = entry;\n }\n return entries;\n }\n\n /**\n * replaces, moves, or remove the given column in the grouping hierarchy\n * @param col {Column}\n * @param priority {number} when priority < 0 remove the column only else replace at the given priority\n */\n groupBy(col: Column, priority: number = 0): boolean {\n if (col.findMyRanker() !== this) {\n return false; //not one of mine\n }\n return this.setGroupCriteria(this.hierarchyLogic(this.groupColumns, this.groupColumns.indexOf(col), col, priority));\n }\n\n setSortCriteria(value: ISortCriteria | ISortCriteria[]) {\n const values = Array.isArray(value) ? value.slice() : [value];\n const bak = this.sortCriteria.slice();\n\n if (equalCriteria(values, bak)) {\n return false;\n }\n\n // update listener\n bak.forEach((d) => {\n d.col.on(Ranking.COLUMN_SORT_DIRTY, null!);\n });\n\n values.forEach((d) => {\n d.col.on(Ranking.COLUMN_SORT_DIRTY, this.dirtyOrderSortDirty);\n });\n this.sortCriteria.splice(0, this.sortCriteria.length, ...values.slice());\n this.triggerResort(bak);\n return true;\n }\n\n setGroupCriteria(column: Column[] | Column) {\n const cols = Array.isArray(column) ? column : [column];\n\n if (equalArrays(this.groupColumns, cols)) {\n return true; //same\n }\n this.groupColumns.forEach((groupColumn) => {\n groupColumn.on(Ranking.COLUMN_GROUP_DIRTY, null);\n });\n\n const bak = this.groupColumns.slice();\n this.groupColumns.splice(0, this.groupColumns.length, ...cols);\n\n this.groupColumns.forEach((groupColumn) => {\n groupColumn.on(Ranking.COLUMN_GROUP_DIRTY, this.dirtyOrderGroupDirty);\n });\n\n this.fire([Ranking.EVENT_GROUP_CRITERIA_CHANGED, Ranking.EVENT_DIRTY_ORDER, Ranking.EVENT_DIRTY_HEADER,\n Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY_CACHES, Ranking.EVENT_DIRTY], bak, this.getGroupCriteria());\n\n this.autoAdaptAggregationColumn();\n\n return true;\n }\n\n private autoAdaptAggregationColumn() {\n // set column auto adds two levels\n const length = this.groupColumns.reduce((acc, c) => acc + (c instanceof SetColumn ? 2 : 1), 0);\n const col = this.children.find((d) => d instanceof AggregateGroupColumn);\n if (!col) {\n return;\n }\n const targetWidth = length * AGGREGATION_LEVEL_WIDTH;\n if (targetWidth > col.getWidth()) {\n col.setWidth(targetWidth);\n }\n }\n\n toggleGroupSorting(col: Column) {\n return this.setGroupSortCriteria(this.toggleSortingLogic(col, this.groupSortCriteria));\n }\n\n setGroupSortCriteria(value: ISortCriteria | ISortCriteria[]) {\n const values = Array.isArray(value) ? value.slice() : [value];\n const bak = this.groupSortCriteria.slice();\n\n if (equalCriteria(values, bak)) {\n return false;\n }\n\n bak.forEach((d) => {\n d.col.on(Ranking.COLUMN_GROUP_SORT_DIRTY, null!);\n });\n\n values.forEach((d) => {\n d.col.on(Ranking.COLUMN_GROUP_SORT_DIRTY, this.dirtyOrderGroupSortDirty);\n });\n this.groupSortCriteria.splice(0, this.groupSortCriteria.length, ...values.slice());\n this.triggerGroupResort(bak);\n return true;\n }\n\n private triggerGroupResort(bak: ISortCriteria | ISortCriteria[] | null) {\n const sortCriterias = this.getGroupSortCriteria();\n const bakMulti = Array.isArray(bak) ? bak : sortCriterias;\n this.fire([Ranking.EVENT_GROUP_SORT_CRITERIA_CHANGED, Ranking.EVENT_DIRTY_ORDER, Ranking.EVENT_DIRTY_HEADER,\n Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], bakMulti, sortCriterias);\n }\n\n private triggerResort(bak: ISortCriteria | ISortCriteria[] | null) {\n const sortCriterias = this.getSortCriteria();\n const bakMulti = Array.isArray(bak) ? bak : sortCriterias;\n this.fire([Ranking.EVENT_SORT_CRITERIA_CHANGED, Ranking.EVENT_DIRTY_ORDER, Ranking.EVENT_DIRTY_HEADER,\n Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], bakMulti, sortCriterias);\n }\n\n get children() {\n return this.columns.slice();\n }\n\n get length() {\n return this.columns.length;\n }\n\n insert(col: Column, index: number = this.columns.length) {\n this.columns.splice(index, 0, col);\n col.attach(this);\n this.forward(col, ...Ranking.FORWARD_COLUMN_EVENTS);\n col.on(`${Ranking.EVENT_FILTER_CHANGED}.order`, this.dirtyOrderFiltering);\n col.on(`${Column.EVENT_VISIBILITY_CHANGED}.ranking`, (oldValue, newValue) => this.fire([Ranking.EVENT_COLUMN_VISIBILITY_CHANGED, Ranking.EVENT_DIRTY_HEADER, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], col, oldValue, newValue));\n\n this.fire([Ranking.EVENT_ADD_COLUMN, Ranking.EVENT_DIRTY_HEADER, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], col, index);\n\n if (col.isFiltered()) {\n this.dirtyOrderFiltering();\n }\n return col;\n }\n\n move(col: Column, index: number = this.columns.length) {\n if (col.parent !== this) {\n // not a move operation!\n console.error('invalid move operation: ', col);\n return null;\n }\n const old = this.columns.indexOf(col);\n if (index === old) {\n // no move needed\n return col;\n }\n //delete first\n this.columns.splice(old, 1);\n // adapt target index based on previous index, i.e shift by one\n this.columns.splice(old < index ? index - 1 : index, 0, col);\n\n this.fire([Ranking.EVENT_MOVE_COLUMN, Ranking.EVENT_DIRTY_HEADER, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], col, index, old);\n return col;\n }\n\n moveAfter(col: Column, reference: Column) {\n const i = this.columns.indexOf(reference);\n if (i < 0) {\n return null;\n }\n return this.move(col, i + 1);\n }\n\n get fqpath() {\n return '';\n }\n\n findByPath(fqpath: string): Column {\n let p: IColumnParent | Column = <any>this;\n const indices = fqpath.split('@').map(Number).slice(1); //ignore the first entry = ranking\n while (indices.length > 0) {\n const i = indices.shift()!;\n p = (<IColumnParent>p).at(i);\n }\n return <Column>p;\n }\n\n indexOf(col: Column) {\n return this.columns.indexOf(col);\n }\n\n at(index: number) {\n return this.columns[index];\n }\n\n insertAfter(col: Column, ref: Column) {\n const i = this.columns.indexOf(ref);\n if (i < 0) {\n return null;\n }\n return this.insert(col, i + 1);\n }\n\n push(col: Column) {\n return this.insert(col);\n }\n\n remove(col: Column) {\n const i = this.columns.indexOf(col);\n if (i < 0) {\n return false;\n }\n\n this.unforward(col, ...Ranking.FORWARD_COLUMN_EVENTS);\n\n const isSortCriteria = this.sortCriteria.findIndex((d) => d.col === col);\n const sortCriteriaChanged = isSortCriteria >= 0;\n if (sortCriteriaChanged) {\n this.sortCriteria.splice(isSortCriteria, 1);\n }\n\n const isGroupSortCriteria = this.groupSortCriteria.findIndex((d) => d.col === col);\n const groupSortCriteriaChanged = isGroupSortCriteria >= 0;\n if (groupSortCriteriaChanged) {\n this.groupSortCriteria.splice(isGroupSortCriteria, 1);\n }\n\n let newGrouping: Column[] | null = null;\n const isGroupColumn = this.groupColumns.indexOf(col);\n if (isGroupColumn >= 0) { // was my grouping criteria\n newGrouping = this.groupColumns.slice();\n newGrouping.splice(isGroupColumn, 1);\n }\n\n col.detach();\n this.columns.splice(i, 1);\n\n this.fire([Ranking.EVENT_REMOVE_COLUMN, Ranking.EVENT_DIRTY_HEADER, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], col, i);\n\n if (newGrouping) {\n this.setGroupCriteria(newGrouping);\n } else if (sortCriteriaChanged) {\n this.triggerResort(null);\n } else if (groupSortCriteriaChanged) {\n this.triggerGroupResort(null);\n } else if (col.isFiltered()) {\n this.dirtyOrderFiltering();\n }\n\n return true;\n }\n\n clear() {\n if (this.columns.length === 0) {\n return;\n }\n this.sortCriteria.forEach((d) => {\n d.col.on(`${Column.EVENT_DIRTY_CACHES}.order`, null!);\n });\n this.sortCriteria.splice(0, this.sortCriteria.length);\n this.groupSortCriteria.forEach((d) => {\n d.col.on(Ranking.COLUMN_GROUP_SORT_DIRTY, null!);\n });\n this.groupSortCriteria.splice(0, this.groupSortCriteria.length);\n\n this.groupColumns.forEach((d) => {\n d.on(Ranking.COLUMN_GROUP_DIRTY, null!);\n });\n this.groupColumns.splice(0, this.groupColumns.length);\n\n this.columns.forEach((col) => {\n this.unforward(col, ...Ranking.FORWARD_COLUMN_EVENTS);\n col.detach();\n });\n const removed = this.columns.splice(0, this.columns.length);\n this.fire([Ranking.EVENT_REMOVE_COLUMN, Ranking.EVENT_DIRTY_ORDER, Ranking.EVENT_DIRTY_HEADER, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY], removed);\n }\n\n get flatColumns(): Column[] {\n const r: IFlatColumn[] = [];\n this.flatten(r, 0, Column.FLAT_ALL_COLUMNS);\n return r.map((d) => d.col);\n }\n\n find(idOrFilter: string | ((col: Column) => boolean)) {\n const filter = typeof (idOrFilter) === 'string' ? (col: Column) => col.id === idOrFilter : idOrFilter;\n const r = this.flatColumns;\n for (const v of r) {\n if (filter(v)) {\n return v;\n }\n }\n return null;\n }\n\n isFiltered() {\n return this.columns.some((d) => d.isFiltered());\n }\n\n filter(row: IDataRow) {\n return this.columns.every((d) => d.filter(row));\n }\n\n clearFilters() {\n return this.columns.map((d) => d.clearFilter()).some((d) => d);\n }\n\n findMyRanker() {\n return this;\n }\n\n get fqid() {\n return this.id;\n }\n\n /**\n * marks the header, values, or both as dirty such that the values are reevaluated\n * @param type specify in more detail what is dirty, by default whole column\n */\n markDirty(type: 'header' | 'values' | 'all' = 'all') {\n switch (type) {\n case 'header':\n return this.fire([Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY]);\n case 'values':\n return this.fire([Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY]);\n default:\n return this.fire([Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY]);\n }\n }\n}\n\nfunction equalCriteria(a: ISortCriteria[], b: ISortCriteria[]) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((ai, i) => {\n const bi = b[i];\n return ai.col === bi.col && ai.asc === bi.asc;\n });\n}\n","/**\n * @internal\n */\nexport interface IDebounceContext {\n /**\n * aka this\n */\n self: any;\n args: any[];\n}\n\n/**\n * create a delayed call, can be called multiple times but only the last one at most delayed by timeToDelay will be executed\n * @param {(...args: any[]) => void} callback the callback to call\n * @param {number} timeToDelay delay the call in milliseconds\n * @param choose optional function to merge call context\n * @return {(...args: any[]) => any} a function that can be called with the same interface as the callback but delayed\n * @internal\n */\nexport default function debounce(callback: (...args: any[]) => void, timeToDelay = 100, choose?: (current: IDebounceContext, next: IDebounceContext) => IDebounceContext) {\n let tm = -1;\n let ctx: IDebounceContext | null = null;\n\n return function (this: any, ...args: any[]) {\n if (tm >= 0) {\n clearTimeout(tm);\n tm = -1;\n }\n\n const next = {self: this, args};\n // compute current context\n ctx = ctx && choose ? choose(ctx, next) : next;\n\n tm = self.setTimeout(() => {\n console.assert(ctx != null);\n callback.apply(ctx!.self, ctx!.args);\n ctx = null;\n }, timeToDelay);\n };\n}\n","import {Category, SupportType} from './annotations';\nimport Column from './Column';\nimport {IDataRow, IColumnDesc} from './interfaces';\nimport {integrateDefaults} from './internal';\n\n\n/**\n * factory for creating a description creating a rank column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createRankDesc(label: string = 'Rank') {\n return {type: 'rank', label};\n}\n\n/**\n * a rank column\n */\n@SupportType()\n@Category('support')\nexport default class RankColumn extends Column {\n\n constructor(id: string, desc: IColumnDesc) {\n super(id, integrateDefaults(desc, {\n width: 50\n }));\n }\n\n getLabel(row: IDataRow) {\n return String(this.getValue(row));\n }\n\n getRaw(row: IDataRow) {\n const ranking = this.findMyRanker();\n if (!ranking) {\n return -1;\n }\n return ranking.getRank(row.i);\n }\n\n getValue(row: IDataRow) {\n const r = this.getRaw(row);\n return r === -1 ? null : r;\n }\n\n get frozen() {\n return this.desc.frozen !== false;\n }\n}\n","import {Category, SupportType, toolbar} from './annotations';\nimport {IndicesArray, IDataRow, IGroup, ECompareValueType, IValueColumnDesc} from './interfaces';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IEventListener} from '../internal';\nimport {integrateDefaults} from './internal';\n\n/**\n * factory for creating a description creating a rank column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createSelectionDesc(label: string = 'Selection Checkboxes') {\n return {type: 'selection', label, fixed: true};\n}\n\nexport interface ISelectionColumnDesc extends IValueColumnDesc<boolean> {\n /**\n * setter for selecting/deselecting the given row\n */\n setter(index: number, value: boolean): void;\n\n /**\n * setter for selecting/deselecting the given row\n */\n setterAll(indices: IndicesArray, value: boolean): void;\n}\n\n\n/**\n * emitted when rows are selected\n * @asMemberOf SelectionColumn\n * @param dataIndex the (de)seleced row\n * @param value true if selected else false\n * @param dataIndices in case of multiple rows are selected\n * @event\n */\nexport declare function select_SC(dataIndex: number, value: boolean, dataIndices?: IndicesArray): void;\n\n/**\n * a checkbox column for selections\n */\n@SupportType()\n@toolbar('sort', 'sortBy', 'group', 'groupBy', 'invertSelection')\n@Category('support')\nexport default class SelectionColumn extends ValueColumn<boolean> {\n private static SELECTED_GROUP: IGroup = {\n name: 'Selected',\n color: 'orange'\n };\n private static NOT_SELECTED_GROUP: IGroup = {\n name: 'Unselected',\n color: 'gray'\n };\n static readonly EVENT_SELECT = 'select';\n\n constructor(id: string, desc: Readonly<ISelectionColumnDesc>) {\n super(id, integrateDefaults(desc, {\n width: 20\n }));\n }\n\n get frozen() {\n return this.desc.frozen !== false;\n }\n\n protected createEventList() {\n return super.createEventList().concat([SelectionColumn.EVENT_SELECT]);\n }\n\n on(type: typeof SelectionColumn.EVENT_SELECT, listener: typeof select_SC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n setValue(row: IDataRow, value: boolean) {\n const old = this.getValue(row);\n if (old === value) {\n return true;\n }\n return this.setImpl(row, value);\n }\n\n setValues(rows: IndicesArray, value: boolean) {\n if (rows.length === 0) {\n return;\n }\n if ((<ISelectionColumnDesc>this.desc).setterAll) {\n (<ISelectionColumnDesc>this.desc).setterAll(rows, value);\n }\n this.fire(SelectionColumn.EVENT_SELECT, rows[0], value, rows);\n return true;\n }\n\n private setImpl(row: IDataRow, value: boolean) {\n if ((<ISelectionColumnDesc>this.desc).setter) {\n (<ISelectionColumnDesc>this.desc).setter(row.i, value);\n }\n this.fire(SelectionColumn.EVENT_SELECT, row.i, value);\n return true;\n }\n\n toggleValue(row: IDataRow) {\n const old = this.getValue(row);\n this.setImpl(row, !old);\n return !old;\n }\n\n toCompareValue(row: IDataRow) {\n const v = this.getValue(row) === true;\n return v ? 1 : 0;\n }\n\n toCompareValueType() {\n return ECompareValueType.BINARY;\n }\n\n group(row: IDataRow) {\n const isSelected = this.getValue(row);\n return Object.assign({}, isSelected ? SelectionColumn.SELECTED_GROUP : SelectionColumn.NOT_SELECTED_GROUP);\n }\n}\n","import {Category, SupportType} from './annotations';\nimport {IDataRow, IColumnDesc, IGroup} from './interfaces';\nimport Column from './Column';\n\nexport interface IAction {\n name: string;\n icon?: string;\n className?: string;\n\n action(row: IDataRow): void;\n}\n\nexport interface IGroupAction {\n name: string;\n icon?: string;\n className?: string;\n\n action(group: IGroup, rows: IDataRow[]): void;\n}\n\n/**\n * utility for creating an action description with optional label\n * @param label\n * @param actions\n * @param groupActions\n * @returns {{type: string, label: string}}\n */\nexport function createActionDesc(label = 'actions', actions: Readonly<IAction>[] = [], groupActions: Readonly<IGroupAction>[] = []) {\n return {type: 'actions', label, actions, groupActions, fixed: true};\n}\n\nexport interface IActionDesc {\n actions?: Readonly<IAction>[];\n groupActions?: Readonly<IGroupAction>[];\n}\n\nexport declare type IActionColumnDesc = IColumnDesc & IActionDesc;\n\n/**\n * a default column with no values\n */\n@SupportType()\n@Category('support')\nexport default class ActionColumn extends Column {\n\n readonly actions: IAction[];\n readonly groupActions: IGroupAction[];\n\n constructor(id: string, desc: Readonly<IActionColumnDesc>) {\n super(id, desc);\n\n this.actions = desc.actions || [];\n this.groupActions = desc.groupActions || [];\n }\n\n getLabel() {\n return '';\n }\n\n getValue() {\n return '';\n }\n\n compare() {\n return 0; //can't compare\n }\n}\n","import {Category, toolbar, dialogAddons} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport {defaultGroup, IDataRow, IGroup, ECompareValueType, IValueColumnDesc, othersGroup, ITypeFactory} from './interfaces';\nimport {missingGroup, isMissingValue} from './missing';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {equal, IEventListener, ISequence, isSeqEmpty} from '../internal';\nimport {integrateDefaults} from './internal';\n\nexport enum EAlignment {\n left = 'left',\n center = 'center',\n right = 'right'\n}\n\nexport enum EStringGroupCriteriaType {\n value = 'value',\n startsWith = 'startsWith',\n regex = 'regex'\n}\n\nexport interface IStringGroupCriteria {\n type: EStringGroupCriteriaType;\n values: (string | RegExp)[];\n}\n\nexport interface IStringDesc {\n /**\n * column alignment: left, center, right\n * @default left\n */\n alignment?: EAlignment;\n\n /**\n * escape html tags\n */\n escape?: boolean;\n}\n\n\nexport declare type IStringColumnDesc = IStringDesc & IValueColumnDesc<string>;\n\nexport interface IStringFilter {\n filter: string | RegExp | null;\n filterMissing: boolean;\n}\n\n/**\n * emitted when the filter property changes\n * @asMemberOf StringColumn\n * @event\n */\nexport declare function filterChanged_SC(previous: string | RegExp | null, current: string | RegExp | null): void;\n\n\n/**\n * emitted when the grouping property changes\n * @asMemberOf StringColumn\n * @event\n */\nexport declare function groupingChanged_SC(previous: (RegExp | string)[][], current: (RegExp | string)[][]): void;\n\n/**\n * a string column with optional alignment\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'search', 'groupBy', 'sortGroupBy', 'filterString')\n@dialogAddons('group', 'groupString')\n@Category('string')\nexport default class StringColumn extends ValueColumn<string> {\n static readonly EVENT_FILTER_CHANGED = 'filterChanged';\n static readonly EVENT_GROUPING_CHANGED = 'groupingChanged';\n\n //magic key for filtering missing ones\n private static readonly FILTER_MISSING = '__FILTER_MISSING';\n private currentFilter: IStringFilter | null = null;\n\n readonly alignment: EAlignment;\n readonly escape: boolean;\n\n private currentGroupCriteria: IStringGroupCriteria = {\n type: EStringGroupCriteriaType.startsWith,\n values: []\n };\n\n constructor(id: string, desc: Readonly<IStringColumnDesc>) {\n super(id, integrateDefaults(desc, {\n width: 200\n }));\n this.alignment = <any>desc.alignment || EAlignment.left;\n this.escape = desc.escape !== false;\n }\n\n\n protected createEventList() {\n return super.createEventList().concat([StringColumn.EVENT_GROUPING_CHANGED, StringColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof StringColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_SC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof StringColumn.EVENT_GROUPING_CHANGED, listener: typeof groupingChanged_SC | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValue(row: IDataRow): string | null {\n const v: any = super.getValue(row);\n return isMissingValue(v) ? null : String(v);\n }\n\n getLabel(row: IDataRow) {\n return this.getValue(row) || '';\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n if (this.currentFilter instanceof RegExp) {\n r.filter = `REGEX:${(<RegExp>this.currentFilter).source}`;\n } else {\n r.filter = this.currentFilter;\n }\n if (this.currentGroupCriteria) {\n const {type, values} = this.currentGroupCriteria;\n r.groupCriteria = {\n type,\n values: values.map((value) => value instanceof RegExp && type === EStringGroupCriteriaType.regex ? value.source : value)\n };\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (dump.filter) {\n const filter = dump.filter;\n if (typeof filter === 'string') {\n // compatibility case\n if ((<string>filter).startsWith('REGEX:')) {\n this.currentFilter = {\n filter: new RegExp(filter.slice(6), 'm'),\n filterMissing: false\n };\n } else if (filter === StringColumn.FILTER_MISSING) {\n this.currentFilter = {\n filter: null,\n filterMissing: true\n };\n } else {\n this.currentFilter = {\n filter,\n filterMissing: false\n };\n }\n } else {\n this.currentFilter = {\n filter: filter.filter && (<string>filter.filter).startsWith('REGEX:') ? new RegExp(filter.slice(6), 'm') : filter.filter || '',\n filterMissing: filter.filterMissing === true\n };\n }\n } else {\n this.currentFilter = null;\n }\n\n // tslint:disable-next-line: early-exit\n if (dump.groupCriteria) {\n const {type, values} = <IStringGroupCriteria>dump.groupCriteria;\n this.currentGroupCriteria = {\n type,\n values: values.map((value) => type === EStringGroupCriteriaType.regex ? new RegExp(<string>value, 'm') : value)\n };\n }\n }\n\n isFiltered() {\n return this.currentFilter != null;\n }\n\n filter(row: IDataRow) {\n if (!this.isFiltered()) {\n return true;\n }\n const r = this.getLabel(row);\n const filter = this.currentFilter!;\n const ff = filter.filter;\n\n if (r == null || r.trim() === '') {\n return !filter.filterMissing;\n }\n if (!ff) {\n return true;\n }\n if (ff instanceof RegExp) {\n return r !== '' && r.match(ff) != null; // You can not use RegExp.test(), because of https://stackoverflow.com/a/6891667\n }\n return r !== '' && r.toLowerCase().includes(ff.toLowerCase());\n }\n\n getFilter() {\n return this.currentFilter;\n }\n\n setFilter(filter: IStringFilter | null) {\n if (filter === this.currentFilter) {\n return;\n }\n const current = this.currentFilter || {filter: null, filterMissing: false};\n const target = filter || {filter: null, filterMissing: false};\n if (current.filterMissing === target.filterMissing && (current.filter === target.filter ||\n (current.filter instanceof RegExp && target.filter instanceof RegExp && current.filter.source === target.filter.source))) {\n return;\n }\n this.fire([StringColumn.EVENT_FILTER_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.currentFilter, this.currentFilter = filter);\n }\n\n clearFilter() {\n const was = this.isFiltered();\n this.setFilter(null);\n return was;\n }\n\n getGroupCriteria(): IStringGroupCriteria {\n return this.currentGroupCriteria;\n }\n\n setGroupCriteria(value: IStringGroupCriteria) {\n if (equal(this.currentGroupCriteria, value) || value == null) {\n return;\n }\n const bak = this.getGroupCriteria();\n this.currentGroupCriteria = value;\n this.fire([StringColumn.EVENT_GROUPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], bak, value);\n }\n\n group(row: IDataRow): IGroup {\n if (this.getValue(row) == null) {\n return Object.assign({}, missingGroup);\n }\n\n if (!this.currentGroupCriteria) {\n return Object.assign({}, othersGroup);\n }\n const value = this.getLabel(row);\n\n if (!value) {\n return Object.assign({}, missingGroup);\n }\n\n const {type, values} = this.currentGroupCriteria;\n if (type === EStringGroupCriteriaType.value) {\n return {\n name: value,\n color: defaultGroup.color\n };\n }\n if (type === EStringGroupCriteriaType.startsWith) {\n for (const groupValue of values) {\n if (typeof groupValue !== 'string' || !value.startsWith(groupValue)) {\n continue;\n }\n return {\n name: groupValue,\n color: defaultGroup.color\n };\n }\n return Object.assign({}, othersGroup);\n }\n for (const groupValue of values) {\n if (!(groupValue instanceof RegExp) || !groupValue.test(value)) {\n continue;\n }\n return {\n name: groupValue.source,\n color: defaultGroup.color\n };\n }\n return Object.assign({}, othersGroup);\n }\n\n\n toCompareValue(row: IDataRow) {\n const v = this.getValue(row);\n return v === '' || v == null ? null : v.toLowerCase();\n }\n\n toCompareValueType() {\n return ECompareValueType.STRING;\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, _group: IGroup, valueCache?: ISequence<any>) {\n if (isSeqEmpty(rows)) {\n return null;\n }\n // take the smallest one\n if (valueCache) {\n return valueCache.reduce((acc, v) => acc == null || v < acc ? v : acc, <null |string>null);\n }\n return rows.reduce((acc, d) => {\n const v = this.getValue(d);\n return acc == null || (v != null && v < acc) ? v : acc;\n }, <null | string>null);\n }\n\n toCompareGroupValueType() {\n return ECompareValueType.STRING;\n }\n}\n\n","import * as equalImpl from 'fast-deep-equal';\n\n// keep here to have a \"real\" export for webpack not just interfaces\n\n/**\n * deep equal comparison\n */\nexport const equal: (a: any, b: any) => boolean = (typeof equalImpl === 'function' ? equalImpl : (<any>equalImpl).default);\n\nexport interface IBin<T> {\n /**\n * bin start\n */\n x0: T;\n /**\n * bin end\n */\n x1: T;\n /**\n * bin count\n */\n count: number;\n}\n\nexport declare type INumberBin = IBin<number>;\n\nexport interface IBoxPlotData {\n readonly min: number;\n readonly max: number;\n readonly median: number;\n readonly q1: number;\n readonly q3: number;\n readonly outlier?: number[];\n readonly whiskerLow?: number;\n readonly whiskerHigh?: number;\n}\n\nexport interface IAdvancedBoxPlotData extends IBoxPlotData {\n readonly mean: number;\n\n readonly missing: number;\n readonly count: number;\n}\n\nexport interface IHistogramStats<T> {\n readonly min: T | null;\n readonly max: T | null;\n\n readonly missing: number;\n readonly count: number;\n\n readonly maxBin: number;\n readonly hist: ReadonlyArray<IBin<T>>;\n}\n\nexport interface IStatistics extends IHistogramStats<number> {\n readonly mean: number;\n}\n\nexport interface ICategoricalBin {\n cat: string;\n count: number;\n}\n\nexport declare type IDateBin = IBin<Date>;\n\nexport interface ICategoricalStatistics {\n readonly missing: number;\n readonly count: number;\n\n readonly maxBin: number;\n readonly hist: ReadonlyArray<ICategoricalBin>;\n}\n\nexport declare type IDateHistGranularity = 'year' | 'month' | 'day';\n\nexport interface IDateStatistics extends IHistogramStats<Date> {\n readonly histGranularity: IDateHistGranularity;\n}\n","import Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport {IDataRow, ITypeFactory} from './interfaces';\nimport StringColumn from './StringColumn';\nimport {IEventListener} from '../internal';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\n\n\n/**\n * emitted when the filter property changes\n * @asMemberOf AnnotateColumn\n * @event\n */\nexport declare function filterChanged_AC(previous: string | RegExp | null, current: string | RegExp | null): void;\n\n\n/**\n * emitted when the grouping property changes\n * @asMemberOf AnnotateColumn\n * @event\n */\nexport declare function groupingChanged_AC(previous: (RegExp | string)[][], current: (RegExp | string)[][]): void;\n\n/**\n * emitted when the value of a row changes\n * @asMemberOf AnnotateColumn\n * @event\n */\nexport declare function valueChanged(dataIndex: number, previous: string, current: string): void;\n\n/**\n * a string column in which the values can be edited locally\n */\nexport default class AnnotateColumn extends StringColumn {\n static readonly EVENT_VALUE_CHANGED = 'valueChanged';\n\n private readonly annotations = new Map<number, string>();\n\n protected createEventList() {\n return super.createEventList().concat([AnnotateColumn.EVENT_VALUE_CHANGED]);\n }\n\n on(type: typeof AnnotateColumn.EVENT_VALUE_CHANGED, listener: typeof valueChanged | null): this;\n on(type: typeof StringColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_AC | null): this;\n on(type: typeof StringColumn.EVENT_GROUPING_CHANGED, listener: typeof groupingChanged_AC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValue(row: IDataRow) {\n if (this.annotations.has(row.i)) {\n return this.annotations.get(row.i)!;\n }\n return super.getValue(row);\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.annotations = {};\n this.annotations.forEach((v, k) => {\n r.annotations[k] = v;\n });\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (!dump.annotations) {\n return;\n }\n Object.keys(dump.annotations).forEach((k) => {\n this.annotations.set(Number(k), dump.annotations[k]);\n });\n }\n\n setValue(row: IDataRow, value: string) {\n const old = this.getValue(row);\n if (old === value) {\n return true;\n }\n if (value === '' || value == null) {\n this.annotations.delete(row.i);\n } else {\n this.annotations.set(row.i, value);\n }\n this.fire([AnnotateColumn.EVENT_VALUE_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], row.i, old, value);\n return true;\n }\n}\n","import {Category, toolbar} from './annotations';\nimport CategoricalColumn from './CategoricalColumn';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {ICategoricalColumn, ICategory, ICategoricalColorMappingFunction, ICategoricalFilter} from './ICategoricalColumn';\nimport {IDataRow, ECompareValueType, IValueColumnDesc, ITypeFactory} from './interfaces';\nimport {IEventListener} from '../internal';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';\nimport {integrateDefaults} from './internal';\nimport {missingGroup} from './missing';\nimport {isCategoryIncluded, isEqualCategoricalFilter} from './internalCategorical';\n\nexport interface IBooleanDesc {\n /**\n * string to show for true\n * @default ✓\n */\n trueMarker?: string;\n /**\n * strint to show for false\n * @default (empty)\n */\n falseMarker?: string;\n}\n\nexport declare type IBooleanColumnDesc = IValueColumnDesc<boolean> & IBooleanDesc;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf BooleanColumn\n * @event\n */\nexport declare function colorMappingChanged_BC(previous: ICategoricalColorMappingFunction, current: ICategoricalColorMappingFunction): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf BooleanColumn\n * @event\n */\nexport declare function filterChanged_BC(previous: ICategoricalFilter | null, current: ICategoricalFilter | null): void;\n\n/**\n * a string column with optional alignment\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'group', 'groupBy', 'filterCategorical', 'colorMappedCategorical')\n@Category('categorical')\nexport default class BooleanColumn extends ValueColumn<boolean> implements ICategoricalColumn {\n static readonly EVENT_FILTER_CHANGED = 'filterChanged';\n static readonly EVENT_COLOR_MAPPING_CHANGED = 'colorMappingChanged';\n\n static readonly GROUP_TRUE = {name: 'True', color: '#444444'};\n static readonly GROUP_FALSE = {name: 'False', color: '#dddddd'};\n\n private currentFilter: ICategoricalFilter | null = null;\n\n private colorMapping: ICategoricalColorMappingFunction;\n readonly categories: ICategory[];\n\n constructor(id: string, desc: Readonly<IBooleanColumnDesc>) {\n super(id, integrateDefaults(desc, {\n width: 30,\n renderer: 'categorical',\n groupRenderer: 'categorical',\n summaryRenderer: 'categorical'\n }));\n this.categories = [\n {\n name: desc.trueMarker || '✓',\n color: BooleanColumn.GROUP_TRUE.color,\n label: BooleanColumn.GROUP_TRUE.name,\n value: 0\n },\n {\n name: desc.falseMarker || '',\n color: BooleanColumn.GROUP_FALSE.color,\n label: BooleanColumn.GROUP_FALSE.name,\n value: 1\n }\n ];\n this.colorMapping = DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n\n protected createEventList() {\n return super.createEventList().concat([BooleanColumn.EVENT_COLOR_MAPPING_CHANGED, BooleanColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof BooleanColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_BC | null): this;\n on(type: typeof BooleanColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_BC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n\n get dataLength() {\n return this.categories.length;\n }\n\n get labels() {\n return this.categories.map((d) => d.label);\n }\n\n getValue(row: IDataRow) {\n const v: any = super.getValue(row);\n if (typeof (v) === 'undefined' || v == null) {\n return null;\n }\n return v === true || v === 'true' || v === 'yes' || v === 'x';\n }\n\n getCategoryOfBoolean(v: boolean | null) {\n return v == null ? null : this.categories[v ? 0 : 1];\n }\n\n getCategory(row: IDataRow) {\n const v = this.getValue(row);\n return v == null ? null : this.categories[v ? 0 : 1];\n }\n\n getCategories(row: IDataRow) {\n return [this.getCategory(row)];\n }\n\n iterCategory(row: IDataRow) {\n return [this.getCategory(row)];\n }\n\n getColor(row: IDataRow) {\n return CategoricalColumn.prototype.getColor.call(this, row);\n }\n\n getLabel(row: IDataRow) {\n return CategoricalColumn.prototype.getLabel.call(this, row);\n }\n\n getLabels(row: IDataRow) {\n return CategoricalColumn.prototype.getLabels.call(this, row);\n }\n\n getValues(row: IDataRow) {\n return CategoricalColumn.prototype.getValues.call(this, row);\n }\n\n getMap(row: IDataRow) {\n return CategoricalColumn.prototype.getMap.call(this, row);\n }\n\n getMapLabel(row: IDataRow) {\n return CategoricalColumn.prototype.getMapLabel.call(this, row);\n }\n\n getSet(row: IDataRow) {\n const v = this.getValue(row);\n const r = new Set<ICategory>();\n if (v != null) {\n r.add(this.categories[v ? 0 : 1]);\n }\n return r;\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.colorMapping = this.colorMapping.toJSON();\n if (this.currentFilter != null) {\n r.filter = this.currentFilter;\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);\n if (typeof dump.filter === 'boolean') {\n this.currentFilter = {\n filter: [this.getCategoryOfBoolean(dump.filter)!.name],\n filterMissing: false\n };\n } else if (typeof dump.filter !== 'undefined') {\n this.currentFilter = dump.filter;\n }\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: ICategoricalColorMappingFunction) {\n if (this.colorMapping.eq(mapping)) {\n return;\n }\n this.fire([CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], this.colorMapping.clone(), this.colorMapping = mapping);\n }\n\n isFiltered() {\n return this.currentFilter != null;\n }\n\n filter(row: IDataRow) {\n return isCategoryIncluded(this.currentFilter, this.getCategory(row));\n }\n\n getFilter() {\n return this.currentFilter == null ? null : Object.assign({}, this.currentFilter);\n }\n\n setFilter(filter: boolean | null | ICategoricalFilter) {\n const f: ICategoricalFilter | null = typeof filter === 'boolean' ? {filter: [this.getCategoryOfBoolean(filter)!.name], filterMissing: false} : filter;\n if (isEqualCategoricalFilter(this.currentFilter, f)) {\n return;\n }\n this.fire([BooleanColumn.EVENT_FILTER_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.currentFilter, this.currentFilter = f);\n }\n\n clearFilter() {\n const was = this.isFiltered();\n this.setFilter(null);\n return was;\n }\n\n toCompareValue(row: IDataRow) {\n const v = this.getValue(row);\n if (v == null) {\n return NaN;\n }\n return v ? 1 : 0;\n }\n\n toCompareValueType(): ECompareValueType {\n return ECompareValueType.BINARY;\n }\n\n group(row: IDataRow) {\n const v = this.getValue(row);\n if (v == null) {\n return Object.assign({}, missingGroup);\n }\n return Object.assign({}, v ? BooleanColumn.GROUP_TRUE : BooleanColumn.GROUP_FALSE);\n }\n}\n","import {Category} from './annotations';\nimport ValueColumn from './ValueColumn';\nimport {empty} from '../internal';\nimport {IArrayColumn, IArrayDesc} from './IArrayColumn';\nimport {IDataRow, IValueColumnDesc} from './interfaces';\n\n\nexport interface IArrayColumnDesc<T> extends IArrayDesc, IValueColumnDesc<T[]> {\n // dummy\n}\n\n\n@Category('array')\nexport default class ArrayColumn<T> extends ValueColumn<T[]> implements IArrayColumn<T> {\n private readonly _dataLength: number | null;\n\n private readonly originalLabels: string[];\n\n constructor(id: string, desc: Readonly<IArrayColumnDesc<T>>) {\n super(id, desc);\n this._dataLength = desc.dataLength == null || isNaN(desc.dataLength) ? null : desc.dataLength;\n this.originalLabels = desc.labels || (empty(this._dataLength == null ? 0 : this._dataLength).map((_d, i) => `Column ${i}`));\n }\n\n\n get labels() {\n return this.originalLabels;\n }\n\n get dataLength() {\n return this._dataLength;\n }\n\n getValue(row: IDataRow) {\n const r = this.getValues(row);\n return r.every((d) => d === null) ? null : r;\n }\n\n getValues(row: IDataRow) {\n const r = super.getValue(row);\n return r == null ? [] : r;\n }\n\n getLabels(row: IDataRow) {\n return this.getValues(row).map(String);\n }\n\n getLabel(row: IDataRow): string {\n const v = this.getLabels(row);\n if (v.length === 0) {\n return '';\n }\n return v.toString();\n }\n\n getMap(row: IDataRow) {\n const labels = this.labels;\n return this.getValues(row).map((value, i) => ({key: labels[i], value}));\n }\n\n getMapLabel(row: IDataRow) {\n const labels = this.labels;\n return this.getLabels(row).map((value, i) => ({key: labels[i], value}));\n }\n}\n\n","import ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';\nimport {ISetColumn, ICategoricalColorMappingFunction} from './ICategoricalColumn';\nimport {IDataRow, DEFAULT_COLOR, ITypeFactory, ECompareValueType} from './interfaces';\nimport CategoricalColumn from './CategoricalColumn';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport Column, {labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, widthChanged, dirtyCaches} from './Column';\nimport {IEventListener} from '../internal';\nimport {chooseUIntByDataLength, integrateDefaults} from './internal';\nimport {toCategory} from './internalCategorical';\nimport {toolbar} from './annotations';\n\n\nexport declare type IBooleansColumnDesc = IArrayColumnDesc<boolean>;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf BooleansColumn\n * @event\n */\nexport declare function colorMappingChanged_BCS(previous: ICategoricalColorMappingFunction, current: ICategoricalColorMappingFunction): void;\n\n@toolbar('rename', 'clone', 'sort', 'sortBy')\nexport default class BooleansColumn extends ArrayColumn<boolean> implements ISetColumn {\n static readonly EVENT_COLOR_MAPPING_CHANGED = CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED;\n\n private colorMapping: ICategoricalColorMappingFunction;\n\n constructor(id: string, desc: Readonly<IBooleansColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'upset'\n }));\n this.colorMapping = DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n\n get categories() {\n return this.labels.map((d, i) => toCategory(d, i));\n }\n\n getSet(row: IDataRow) {\n const vs = this.getValues(row);\n return new Set(this.categories.filter((_, i) => vs[i]));\n }\n\n toCompareValue(row: IDataRow) {\n const v = this.getValue(row);\n if (v == null) {\n return NaN;\n }\n return v.reduce((a, b) => a + (b ? 1 : 0), 0);\n }\n\n toCompareValueType(): ECompareValueType {\n return chooseUIntByDataLength(this.dataLength);\n }\n\n getCategories(row: IDataRow) {\n const categories = this.categories;\n return super.getValues(row).map((v, i) => {\n return v ? categories[i]! : null;\n });\n }\n\n iterCategory(row: IDataRow) {\n return this.getCategories(row);\n }\n\n getColors(row: IDataRow) {\n return this.getCategories(row).map((d) => d ? this.colorMapping.apply(d) : DEFAULT_COLOR);\n }\n\n\n protected createEventList() {\n return super.createEventList().concat([BooleansColumn.EVENT_COLOR_MAPPING_CHANGED]);\n }\n\n on(type: typeof BooleansColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_BCS | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: ICategoricalColorMappingFunction) {\n return CategoricalColumn.prototype.setColorMapping.call(this, mapping);\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);\n }\n}\n","// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x) {\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n return new FormatSpecifier(specifier);\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n this.fill = match[1] || \" \";\n this.align = match[2] || \">\";\n this.sign = match[3] || \"-\";\n this.symbol = match[4] || \"\";\n this.zero = !!match[5];\n this.width = match[6] && +match[6];\n this.comma = !!match[7];\n this.precision = match[8] && +match[8].slice(1);\n this.trim = !!match[9];\n this.type = match[10] || \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width == null ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision == null ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import formatLocale from \"./locale\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n decimal: \".\",\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","import formatDecimal from \"./formatDecimal\";\n\nexport default function(x, p) {\n var d = formatDecimal(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatPrefixAuto from \"./formatPrefixAuto\";\nimport formatRounded from \"./formatRounded\";\n\nexport default {\n \"%\": function(x, p) { return (x * 100).toFixed(p); },\n \"b\": function(x) { return Math.round(x).toString(2); },\n \"c\": function(x) { return x + \"\"; },\n \"d\": function(x) { return Math.round(x).toString(10); },\n \"e\": function(x, p) { return x.toExponential(p); },\n \"f\": function(x, p) { return x.toFixed(p); },\n \"g\": function(x, p) { return x.toPrecision(p); },\n \"o\": function(x) { return Math.round(x).toString(8); },\n \"p\": function(x, p) { return formatRounded(x * 100, p); },\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n \"x\": function(x) { return Math.round(x).toString(16); }\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent\";\nimport formatGroup from \"./formatGroup\";\nimport formatNumerals from \"./formatNumerals\";\nimport formatSpecifier from \"./formatSpecifier\";\nimport formatTrim from \"./formatTrim\";\nimport formatTypes from \"./formatTypes\";\nimport {prefixExponent} from \"./formatPrefixAuto\";\nimport identity from \"./identity\";\n\nvar prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity,\n currency = locale.currency,\n decimal = locale.decimal,\n numerals = locale.numerals ? formatNumerals(locale.numerals) : identity,\n percent = locale.percent || \"%\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currency[0] : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currency[1] : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision == null ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Perform the initial formatting.\n var valueNegative = value < 0;\n value = formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero during formatting, treat as positive.\n if (valueNegative && +value === 0) valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : \"-\") : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","import exponent from \"./exponent\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","import {pair} from \"./pairs\";\n\nexport default function(values0, values1, reduce) {\n var n0 = values0.length,\n n1 = values1.length,\n values = new Array(n0 * n1),\n i0,\n i1,\n i,\n value0;\n\n if (reduce == null) reduce = pair;\n\n for (i0 = i = 0; i0 < n0; ++i0) {\n for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n values[i] = reduce(value0, values1[i1]);\n }\n }\n\n return values;\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.interpolator(domain); break;\n default: this.interpolator(interpolator).domain(domain); break;\n }\n return this;\n}\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\nexport default map;\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += \"\";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\nexport default set;\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(domain) {\n var a = domain[0], b = domain[domain.length - 1], t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = slice.call(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous(transform, untransform) {\n return transformer()(transform, untransform);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import exponent from \"./exponent\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy, identity} from \"./continuous\";\nimport {initRange} from \"./init\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain(),\n i0 = 0,\n i1 = d.length - 1,\n start = d[i0],\n stop = d[i1],\n step;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n\n step = tickIncrement(start, stop, count);\n\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = tickIncrement(start, stop, count);\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = tickIncrement(start, stop, count);\n }\n\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n domain(d);\n } else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n domain(d);\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous(identity, identity);\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","export default function(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n","import {ticks} from \"d3-array\";\nimport {format} from \"d3-format\";\nimport nice from \"./nice\";\nimport {copy, transformer} from \"./continuous\";\nimport {initRange} from \"./init\";\n\nfunction transformLog(x) {\n return Math.log(x);\n}\n\nfunction transformExp(x) {\n return Math.exp(x);\n}\n\nfunction transformLogn(x) {\n return -Math.log(-x);\n}\n\nfunction transformExpn(x) {\n return -Math.exp(-x);\n}\n\nfunction pow10(x) {\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n return base === 10 ? pow10\n : base === Math.E ? Math.exp\n : function(x) { return Math.pow(base, x); };\n}\n\nfunction logp(base) {\n return base === Math.E ? Math.log\n : base === 10 && Math.log10\n || base === 2 && Math.log2\n || (base = Math.log(base), function(x) { return Math.log(x) / base; });\n}\n\nfunction reflect(f) {\n return function(x) {\n return -f(-x);\n };\n}\n\nexport function loggish(transform) {\n var scale = transform(transformLog, transformExp),\n domain = scale.domain,\n base = 10,\n logs,\n pows;\n\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) {\n logs = reflect(logs), pows = reflect(pows);\n transform(transformLogn, transformExpn);\n } else {\n transform(transformLog, transformExp);\n }\n return scale;\n }\n\n scale.base = function(_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.ticks = function(count) {\n var d = domain(),\n u = d[0],\n v = d[d.length - 1],\n r;\n\n if (r = v < u) i = u, u = v, v = i;\n\n var i = logs(u),\n j = logs(v),\n p,\n k,\n t,\n n = count == null ? 10 : +count,\n z = [];\n\n if (!(base % 1) && j - i < n) {\n i = Math.round(i) - 1, j = Math.round(j) + 1;\n if (u > 0) for (; i < j; ++i) {\n for (k = 1, p = pows(i); k < base; ++k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i < j; ++i) {\n for (k = base - 1, p = pows(i); k >= 1; --k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n } else {\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n\n return r ? z.reverse() : z;\n };\n\n scale.tickFormat = function(count, specifier) {\n if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n if (typeof specifier !== \"function\") specifier = format(specifier);\n if (count === Infinity) return specifier;\n if (count == null) count = 10;\n var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return function(d) {\n var i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : \"\";\n };\n };\n\n scale.nice = function() {\n return domain(nice(domain(), {\n floor: function(x) { return pows(Math.floor(logs(x))); },\n ceil: function(x) { return pows(Math.ceil(logs(x))); }\n }));\n };\n\n return scale;\n}\n\nexport default function log() {\n var scale = loggish(transformer()).domain([1, 10]);\n\n scale.copy = function() {\n return copy(scale, log()).base(scale.base());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","import {linearish} from \"./linear\";\nimport {copy, identity, transformer} from \"./continuous\";\nimport {initRange} from \"./init\";\n\nfunction transformPow(exponent) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n };\n}\n\nfunction transformSqrt(x) {\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n return x < 0 ? -x * x : x * x;\n}\n\nexport function powish(transform) {\n var scale = transform(identity, identity),\n exponent = 1;\n\n function rescale() {\n return exponent === 1 ? transform(identity, identity)\n : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n : transform(transformPow(exponent), transformPow(1 / exponent));\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, rescale()) : exponent;\n };\n\n return linearish(scale);\n}\n\nexport default function pow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, pow()).exponent(scale.exponent());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n\nexport function sqrt() {\n return pow.apply(null, arguments).exponent(0.5);\n}\n","var t0 = new Date,\n t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = new Date(+date)), date;\n }\n\n interval.floor = interval;\n\n interval.ceil = function(date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = function(date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = function(date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = function(start, stop, step) {\n var range = [], previous;\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n}\n","import interval from \"./interval\";\n\nvar millisecond = interval(function() {\n // noop\n}, function(date, step) {\n date.setTime(+date + step);\n}, function(start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return interval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n};\n\nexport default millisecond;\nexport var milliseconds = millisecond.range;\n","import interval from \"./interval\";\nimport {durationSecond} from \"./duration\";\n\nvar second = interval(function(date) {\n date.setTime(date - date.getMilliseconds());\n}, function(date, step) {\n date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n return (end - start) / durationSecond;\n}, function(date) {\n return date.getUTCSeconds();\n});\n\nexport default second;\nexport var seconds = second.range;\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval\";\nimport {durationMinute, durationSecond} from \"./duration\";\n\nvar minute = interval(function(date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getMinutes();\n});\n\nexport default minute;\nexport var minutes = minute.range;\n","import interval from \"./interval\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration\";\n\nvar hour = interval(function(date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getHours();\n});\n\nexport default hour;\nexport var hours = hour.range;\n","import interval from \"./interval\";\nimport {durationDay, durationMinute} from \"./duration\";\n\nvar day = interval(function(date) {\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setDate(date.getDate() + step);\n}, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","import interval from \"./interval\";\nimport {durationMinute, durationWeek} from \"./duration\";\n\nfunction weekday(i) {\n return interval(function(date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","import interval from \"./interval\";\n\nvar month = interval(function(date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n","import interval from \"./interval\";\n\nvar year = interval(function(date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function(date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport default year;\nexport var years = year.range;\n","import interval from \"./interval\";\nimport {durationMinute} from \"./duration\";\n\nvar utcMinute = interval(function(date) {\n date.setUTCSeconds(0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getUTCMinutes();\n});\n\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;\n","import interval from \"./interval\";\nimport {durationHour} from \"./duration\";\n\nvar utcHour = interval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getUTCHours();\n});\n\nexport default utcHour;\nexport var utcHours = utcHour.range;\n","import interval from \"./interval\";\nimport {durationDay} from \"./duration\";\n\nvar utcDay = interval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n return (end - start) / durationDay;\n}, function(date) {\n return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n","import interval from \"./interval\";\nimport {durationWeek} from \"./duration\";\n\nfunction utcWeekday(i) {\n return interval(function(date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / durationWeek;\n });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n","import interval from \"./interval\";\n\nvar utcMonth = interval(function(date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n return date.getUTCMonth();\n});\n\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;\n","import interval from \"./interval\";\n\nvar utcYear = interval(function(date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newYear(y) {\n return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, newDate) {\n return function(string) {\n var d = newYear(1900),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newYear(d.y)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = newDate(newYear(d.y)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return newDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", localDate);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier, utcDate);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n var map = {}, i = -1, n = names.length;\n while (++i < n) map[names[i].toLowerCase()] = i;\n return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d), d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d), d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {utcFormat} from \"./defaultLocale\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : utcFormat(isoSpecifier);\n\nexport default formatIso;\n","import {isoSpecifier} from \"./isoFormat\";\nimport {utcParse} from \"./defaultLocale\";\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : utcParse(isoSpecifier);\n\nexport default parseIso;\n","import {scaleLinear, scaleLog, scalePow, scaleSqrt} from 'd3-scale';\nimport {similar} from '../internal';\nimport {IMappingFunction, IMapAbleDesc} from '.';\nimport {ITypeFactory, ITypedDump} from './interfaces';\nimport {IMappingFunctionConstructor} from './INumberColumn';\n\n/**\n * interface of a d3 scale\n */\nexport interface IScale {\n (v: number): number;\n\n invert(r: number): number;\n\n domain(): number[];\n\n domain(domain: number[]): this;\n\n range(): number[];\n\n range(range: number[]): this;\n}\n\nfunction toScale(type = 'linear'): IScale {\n switch (type) {\n case 'log':\n return scaleLog().clamp(true);\n case 'sqrt':\n return scaleSqrt().clamp(true);\n case 'pow1.1':\n return scalePow().exponent(1.1).clamp(true);\n case 'pow2':\n return scalePow().exponent(2).clamp(true);\n case 'pow3':\n return scalePow().exponent(3).clamp(true);\n default:\n return scaleLinear().clamp(true);\n }\n}\n\nfunction isSame(a: number[], b: number[]) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((ai, i) => similar(ai, b[i], 0.0001));\n}\n\n\nfunction fixDomain(domain: number[], type: string) {\n if (type === 'log' && domain[0] === 0) {\n domain[0] = 0.0000001; //0 is bad\n }\n return domain;\n}\n\n/**\n * a mapping function based on a d3 scale (linear, sqrt, log)\n */\nexport class ScaleMappingFunction implements IMappingFunction {\n private s: IScale;\n private readonly type: string;\n\n constructor();\n constructor(dump: ITypedDump);\n constructor(domain: number[], type: string, range: number[]);\n constructor(domain: ITypedDump|number[] = [0, 1], type = 'linear', range: number[] = [0, 1]) {\n if (!domain || Array.isArray(domain)) {\n this.type = type;\n this.s = toScale(type).domain(fixDomain(domain || [0, 1], this.type)).range(range);\n } else {\n const dump = domain;\n this.type = dump.type;\n this.s = toScale(dump.type).domain(dump.domain).range(dump.range);\n }\n }\n\n get domain() {\n return this.s.domain();\n }\n\n set domain(domain: number[]) {\n this.s.domain(fixDomain(domain, this.type));\n }\n\n get range() {\n return this.s.range();\n }\n\n set range(range: number[]) {\n this.s.range(range);\n }\n\n getRange(format: (v: number) => string): [string, string] {\n return [format(this.invert(0)), format(this.invert(1))];\n }\n\n apply(v: number): number {\n return this.s(v);\n }\n\n invert(r: number) {\n return this.s.invert(r);\n }\n\n get scaleType() {\n return this.type;\n }\n\n toJSON() {\n return {\n type: this.type,\n domain: this.domain,\n range: this.range\n };\n }\n\n eq(other: IMappingFunction): boolean {\n if (!(other instanceof ScaleMappingFunction)) {\n return false;\n }\n const that = <ScaleMappingFunction>other;\n return that.type === this.type && isSame(this.domain, that.domain) && isSame(this.range, that.range);\n }\n\n clone() {\n return new ScaleMappingFunction(this.domain, this.type, this.range);\n }\n}\n\nexport interface IScriptMappingFunctionContext {\n value_min: number;\n value_max: number;\n value_range: number;\n value_domain: number[];\n linear(v: number, min: number, max: number): number;\n}\n\nexport interface IScriptMappingFunctionType {\n (this: IScriptMappingFunctionContext, value: number): number;\n}\n\n/**\n * a mapping function based on a custom user function using 'value' as the current value\n */\nexport class ScriptMappingFunction implements IMappingFunction {\n private readonly f: IScriptMappingFunctionType;\n public domain: number[];\n public readonly code: string;\n\n constructor();\n constructor(dump: ITypedDump);\n constructor(domain: number[], code?: string | IScriptMappingFunctionType);\n constructor(domain: ITypedDump | number[] = [0, 1], code: string | IScriptMappingFunctionType = 'return this.linear(value,this.value_min,this.value_max);') {\n if (!domain || Array.isArray(domain)) {\n this.domain = domain || [0, 1];\n } else {\n const dump = domain;\n this.domain = dump.domain;\n code = dump.code;\n }\n this.code = typeof code === 'string' ? code : code.toString();\n this.f = typeof code === 'function' ? code : <any>(new Function('value', code));\n }\n\n getRange(): [string, string] {\n return ['?', '?'];\n }\n\n apply(v: number): number {\n const min = this.domain[0],\n max = this.domain[this.domain.length - 1];\n const r = this.f.call({\n value_min: min,\n value_max: max,\n value_range: max - min,\n value_domain: this.domain.slice(),\n linear: (v: number, mi: number, ma: number) => (v - mi) / (ma - mi)\n }, v);\n\n if (typeof r === 'number') {\n return Math.max(Math.min(r, 1), 0);\n }\n return NaN;\n }\n\n toJSON() {\n return {\n type: 'script',\n code: this.code,\n domain: this.domain\n };\n }\n\n eq(other: IMappingFunction): boolean {\n if (!(other instanceof ScriptMappingFunction)) {\n return false;\n }\n const that = <ScriptMappingFunction>other;\n return that.code === this.code || that.f === this.f;\n }\n\n clone() {\n return new ScriptMappingFunction(this.domain, this.f);\n }\n}\n\n/**\n * @internal\n */\nexport function createMappingFunction(types: {[key: string]: IMappingFunctionConstructor}) {\n return (dump: ITypedDump | IScriptMappingFunctionType): IMappingFunction => {\n if (typeof dump === 'function') {\n return new ScriptMappingFunction([0, 1], dump);\n }\n if (!dump || !dump.type) {\n return new ScaleMappingFunction();\n }\n const type = types[dump.type];\n if (!type) {\n console.warn('invalid mapping type dump', dump);\n return new ScaleMappingFunction(dump.domain || [0, 1], 'linear', dump.range || [0, 1]);\n }\n return new type(dump);\n };\n}\n\n/** @internal */\nexport function restoreMapping(desc: IMapAbleDesc, factory: ITypeFactory): IMappingFunction {\n if (desc.map) {\n return factory.mappingFunction(desc.map);\n }\n return new ScaleMappingFunction(desc.domain || [0, 1], 'linear', desc.range || [0, 1]);\n}\n\n\nexport function mappingFunctions() {\n return {\n script: ScriptMappingFunction,\n linear: ScaleMappingFunction,\n log: ScaleMappingFunction,\n 'pow1.1': ScaleMappingFunction,\n pow2: ScaleMappingFunction,\n pow3: ScaleMappingFunction\n };\n}\n","import {format} from 'd3-format';\nimport {IBoxPlotData, similar, ISequence, IAdvancedBoxPlotData, boxplotBuilder} from '../internal';\nimport {FIRST_IS_NAN, IDataRow, IBoxPlotColumn, INumberFilter, INumberColumn} from '.';\n\n\n/** @internal */\nexport const DEFAULT_FORMATTER = format('.3n');\n\n/** @internal */\nexport function compareBoxPlot(col: IBoxPlotColumn, a: IDataRow, b: IDataRow) {\n const aVal = col.getBoxPlotData(a);\n const bVal = col.getBoxPlotData(b);\n const method = <keyof IBoxPlotData>col.getSortMethod();\n if (aVal == null) {\n return bVal == null ? 0 : FIRST_IS_NAN;\n }\n if (bVal == null) {\n return FIRST_IS_NAN * -1;\n }\n return numberCompare(<number>aVal[method], <number>bVal[method]);\n}\n\nexport function toCompareBoxPlotValue(col: IBoxPlotColumn, row: IDataRow) {\n const v = col.getBoxPlotData(row);\n const method = <keyof IBoxPlotData>col.getSortMethod();\n return v == null ? NaN : <number>v[method];\n}\n\nexport function getBoxPlotNumber(col: IBoxPlotColumn, row: IDataRow, mode: 'raw' | 'normalized'): number {\n const data = mode === 'normalized' ? col.getBoxPlotData(row) : col.getRawBoxPlotData(row);\n if (data == null) {\n return NaN;\n }\n return <number>data[<keyof IBoxPlotData>col.getSortMethod()];\n}\n/**\n * save number comparison\n * @param a\n * @param b\n * @param aMissing\n * @param bMissing\n * @return {number}\n * @internal\n */\nexport function numberCompare(a: number | null, b: number | null, aMissing = false, bMissing = false) {\n aMissing = aMissing || a == null || isNaN(a);\n bMissing = bMissing || b == null || isNaN(b);\n if (aMissing) { //NaN are smaller\n return bMissing ? 0 : FIRST_IS_NAN;\n }\n if (bMissing) {\n return FIRST_IS_NAN * -1;\n }\n return a! - b!;\n}\n\n/** @internal */\nexport function noNumberFilter() {\n return ({min: -Infinity, max: Infinity, filterMissing: false});\n}\n\n/** @internal */\nexport function isEqualNumberFilter(a: INumberFilter, b: INumberFilter, delta = 0.001) {\n return similar(a.min, b.min, delta) && similar(a.max, b.max, delta) && a.filterMissing === b.filterMissing;\n}\n\n/** @internal */\nexport function isNumberIncluded(filter: INumberFilter | null, value: number) {\n if (!filter) {\n return true;\n }\n if (isNaN(value)) {\n return !filter.filterMissing;\n }\n return !((isFinite(filter.min) && value < filter.min) || (isFinite(filter.max) && value > filter.max));\n}\n\n/** @internal */\nexport function isDummyNumberFilter(filter: INumberFilter) {\n return !filter.filterMissing && !isFinite(filter.min) && !isFinite(filter.max);\n}\n\n/** @internal */\nexport function restoreNumberFilter(v: INumberFilter): INumberFilter {\n return {\n min: v.min != null && isFinite(v.min) ? v.min : -Infinity,\n max: v.max != null && isFinite(v.max) ? v.max : +Infinity,\n filterMissing: v.filterMissing\n };\n}\n\n\n/** @internal */\nexport function medianIndex(rows: ISequence<IDataRow>, col: INumberColumn) {\n //return the median row\n const data = rows.map((r, i) => ({r, i, v: col.getNumber(r)}));\n const sorted = Array.from(data.filter((r) => !isNaN(r.v))).sort((a, b) => numberCompare(a.v, b.v));\n const index = sorted[Math.floor(sorted.length / 2.0)];\n if (index === undefined) {\n return {index: 0, row: sorted[0]!.r}; //error case\n }\n return {index: index.i, row: index.r};\n}\n\n/** @internal */\nexport function toCompareGroupValue(rows: ISequence<IDataRow>, col: INumberColumn, sortMethod: keyof IAdvancedBoxPlotData, valueCache?: ISequence<number>) {\n const b = boxplotBuilder();\n if (valueCache) {\n b.pushAll(valueCache);\n } else {\n b.pushAll(rows.map((d) => col.getNumber(d)));\n }\n const vs = b.build();\n return <number>vs[sortMethod];\n}\n","import {format} from 'd3-format';\nimport {equalArrays, IEventListener, ISequence} from '../internal';\nimport {Category, dialogAddons, SortByDefault, toolbar} from './annotations';\nimport Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';\nimport {IDataRow, IGroup, ECompareValueType, IValueColumnDesc, DEFAULT_COLOR, ITypeFactory} from './interfaces';\nimport {INumberColumn, EAdvancedSortMethod, INumberDesc, INumberFilter, IMappingFunction, IColorMappingFunction, IMapAbleColumn} from './INumberColumn';\nimport {restoreMapping, ScaleMappingFunction} from './MappingFunction';\nimport {isMissingValue, isUnknown, missingGroup} from './missing';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {noNumberFilter, isDummyNumberFilter, restoreNumberFilter, toCompareGroupValue, isEqualNumberFilter, isNumberIncluded} from './internalNumber';\nimport {integrateDefaults} from './internal';\n\nexport declare type INumberColumnDesc = INumberDesc & IValueColumnDesc<number>;\n\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf NumberColumn\n * @event\n */\nexport declare function mappingChanged_NC(previous: IMappingFunction, current: IMappingFunction): void;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf NumberColumn\n * @event\n */\nexport declare function colorMappingChanged_NC(previous: IColorMappingFunction, current: IColorMappingFunction): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf NumberColumn\n * @event\n */\nexport declare function filterChanged_NC(previous: INumberFilter | null, current: INumberFilter | null): void;\n\n/**\n * emitted when the sort method property changes\n * @asMemberOf NumberColumn\n * @event\n */\nexport declare function sortMethodChanged_NC(previous: EAdvancedSortMethod, current: EAdvancedSortMethod): void;\n\n/**\n * emitted when the grouping property changes\n * @asMemberOf NumberColumn\n * @event\n */\nexport declare function groupingChanged_NC(previous: number[], current: number[]): void;\n\n/**\n * a number column mapped from an original input scale to an output range\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'groupBy', 'sortGroupBy', 'filterNumber', 'colorMapped', 'editMapping')\n@dialogAddons('sortGroup', 'sortNumber')\n@dialogAddons('group', 'groupNumber')\n@Category('number')\n@SortByDefault('descending')\nexport default class NumberColumn extends ValueColumn<number> implements INumberColumn, IMapAbleColumn {\n static readonly EVENT_MAPPING_CHANGED = 'mappingChanged';\n static readonly EVENT_COLOR_MAPPING_CHANGED = 'colorMappingChanged';\n static readonly EVENT_FILTER_CHANGED = 'filterChanged';\n static readonly EVENT_SORTMETHOD_CHANGED = 'sortMethodChanged';\n static readonly EVENT_GROUPING_CHANGED = 'groupingChanged';\n\n private mapping: IMappingFunction;\n private colorMapping: IColorMappingFunction;\n private original: IMappingFunction;\n\n /**\n * currently active filter\n * @private\n */\n private currentFilter: INumberFilter = noNumberFilter();\n\n /**\n * The accuracy defines the deviation of values to the applied filter boundary.\n * Use an accuracy closer to 0 for columns with smaller numbers (e.g., 1e-9).\n * @private\n */\n private readonly filterAccuracy: number = 0.001;\n\n private readonly numberFormat: (n: number) => string = format('.2f');\n\n private currentGroupThresholds: number[] = [];\n private groupSortMethod: EAdvancedSortMethod = EAdvancedSortMethod.median;\n\n constructor(id: string, desc: INumberColumnDesc, factory: ITypeFactory) {\n super(id, integrateDefaults(desc, {\n groupRenderer: 'boxplot',\n summaryRenderer: 'histogram'\n }));\n\n this.mapping = restoreMapping(desc, factory);\n this.original = this.mapping.clone();\n this.colorMapping = factory.colorMappingFunction(desc.colorMapping || desc.color);\n\n if (desc.numberFormat) {\n this.numberFormat = format(desc.numberFormat);\n }\n\n if (desc.filterAccuracy) {\n this.filterAccuracy = desc.filterAccuracy;\n }\n }\n\n getNumberFormat() {\n return this.numberFormat;\n }\n\n dump(toDescRef: (desc: any) => any) {\n const r = super.dump(toDescRef);\n r.map = this.mapping.toJSON();\n r.colorMapping = this.colorMapping.toJSON();\n r.filter = isDummyNumberFilter(this.currentFilter) ? null : this.currentFilter;\n r.groupSortMethod = this.groupSortMethod;\n if (this.currentGroupThresholds) {\n r.stratifyThreshholds = this.currentGroupThresholds;\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (dump.map) {\n this.mapping = factory.mappingFunction(dump.map);\n } else if (dump.domain) {\n this.mapping = new ScaleMappingFunction(dump.domain, 'linear', dump.range || [0, 1]);\n }\n if (dump.colorMapping) {\n this.colorMapping = factory.colorMappingFunction(dump.colorMapping);\n }\n if (dump.groupSortMethod) {\n this.groupSortMethod = dump.groupSortMethod;\n }\n if (dump.filter) {\n this.currentFilter = restoreNumberFilter(dump.filter);\n }\n if (dump.stratifyThreshholds) {\n this.currentGroupThresholds = dump.stratifyThresholds;\n }\n }\n\n protected createEventList() {\n return super.createEventList().concat([NumberColumn.EVENT_MAPPING_CHANGED, NumberColumn.EVENT_COLOR_MAPPING_CHANGED, NumberColumn.EVENT_FILTER_CHANGED, NumberColumn.EVENT_SORTMETHOD_CHANGED, NumberColumn.EVENT_GROUPING_CHANGED]);\n }\n\n on(type: typeof NumberColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged_NC | null): this;\n on(type: typeof NumberColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_NC | null): this;\n on(type: typeof NumberColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_NC | null): this;\n on(type: typeof NumberColumn.EVENT_SORTMETHOD_CHANGED, listener: typeof sortMethodChanged_NC | null): this;\n on(type: typeof NumberColumn.EVENT_GROUPING_CHANGED, listener: typeof groupingChanged_NC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getLabel(row: IDataRow) {\n if ((<any>this.desc).numberFormat) {\n const raw = this.getRawValue(row);\n //if a dedicated format and a number use the formatter in any case\n if (isNaN(raw)) {\n return 'NaN';\n }\n if (!isFinite(raw)) {\n return raw.toString();\n }\n return this.numberFormat(raw);\n }\n const v = super.getValue(row);\n //keep non number if it is not a number else convert using formatter\n if (typeof v === 'number') {\n return this.numberFormat(+v);\n }\n return String(v);\n }\n\n getRange() {\n return this.mapping.getRange(this.numberFormat);\n }\n\n getRawValue(row: IDataRow) {\n const v: any = super.getValue(row);\n if (isMissingValue(v)) {\n return NaN;\n }\n return +v;\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n return format === 'json' ? this.getRawValue(row) : super.getExportValue(row, format);\n }\n\n getValue(row: IDataRow) {\n const v = this.getNumber(row);\n if (isNaN(v)) {\n return null;\n }\n return v;\n }\n\n getNumber(row: IDataRow) {\n const v = this.getRawValue(row);\n if (isNaN(v)) {\n return NaN;\n }\n return this.mapping.apply(v);\n }\n\n iterNumber(row: IDataRow) {\n return [this.getNumber(row)];\n }\n\n iterRawNumber(row: IDataRow) {\n return [this.getRawNumber(row)];\n }\n\n getRawNumber(row: IDataRow) {\n return this.getRawValue(row);\n }\n\n toCompareValue(row: IDataRow, valueCache?: any) {\n return valueCache != null ? valueCache : this.getNumber(row);\n }\n\n toCompareValueType() {\n return ECompareValueType.FLOAT;\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, _group: IGroup, valueCache?: ISequence<any>): number {\n return toCompareGroupValue(rows, this, <any>this.groupSortMethod, valueCache);\n }\n\n toCompareGroupValueType() {\n return ECompareValueType.FLOAT;\n }\n\n getOriginalMapping() {\n return this.original.clone();\n }\n\n getMapping() {\n return this.mapping.clone();\n }\n\n setMapping(mapping: IMappingFunction) {\n if (this.mapping.eq(mapping)) {\n return;\n }\n this.fire([NumberColumn.EVENT_MAPPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], this.mapping.clone(), this.mapping = mapping);\n }\n\n getColor(row: IDataRow) {\n const v = this.getNumber(row);\n if (isNaN(v)) {\n return DEFAULT_COLOR;\n }\n return this.colorMapping.apply(v);\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: IColorMappingFunction) {\n if (this.colorMapping.eq(mapping)) {\n return;\n }\n this.fire([NumberColumn.EVENT_COLOR_MAPPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], this.colorMapping.clone(), this.colorMapping = mapping);\n }\n\n isFiltered() {\n return !isDummyNumberFilter(this.currentFilter);\n }\n\n getFilter(): INumberFilter {\n return Object.assign({}, this.currentFilter);\n }\n\n setFilter(value: INumberFilter | null) {\n value = value || {min: -Infinity, max: +Infinity, filterMissing: false};\n if (isEqualNumberFilter(value, this.currentFilter, this.filterAccuracy)) {\n return;\n }\n const bak = this.getFilter();\n this.currentFilter.min = isUnknown(value.min) ? -Infinity : value.min;\n this.currentFilter.max = isUnknown(value.max) ? Infinity : value.max;\n this.currentFilter.filterMissing = value.filterMissing;\n this.fire([NumberColumn.EVENT_FILTER_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], bak, this.getFilter());\n }\n\n /**\n * filter the current row if any filter is set\n * @param row\n * @returns {boolean}\n */\n filter(row: IDataRow) {\n return isNumberIncluded(this.currentFilter, this.getRawNumber(row));\n }\n\n clearFilter() {\n const was = this.isFiltered();\n this.setFilter(null);\n return was;\n }\n\n getGroupThresholds() {\n return this.currentGroupThresholds.slice();\n }\n\n setGroupThresholds(value: number[]) {\n if (equalArrays(this.currentGroupThresholds, value)) {\n return;\n }\n const bak = this.getGroupThresholds();\n this.currentGroupThresholds = value.slice();\n this.fire([NumberColumn.EVENT_GROUPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], bak, value);\n }\n\n\n group(row: IDataRow): IGroup {\n const value = this.getRawNumber(row);\n if (isNaN(value)) {\n return Object.assign({}, missingGroup);\n }\n\n let threshold = this.currentGroupThresholds;\n if (threshold.length === 0) {\n // default threshold\n const d = this.mapping.domain;\n threshold = [(d[1] - d[0]) / 2];\n }\n\n const treshholdIndex = threshold.findIndex((t) => value <= t);\n // group by thresholds / bins\n switch (treshholdIndex) {\n case -1:\n //bigger than the last threshold\n return {\n name: `${this.label} > ${this.numberFormat(threshold[threshold.length - 1])}`,\n color: this.colorMapping.apply(1)\n };\n case 0:\n //smallest\n return {\n name: `${this.label} <= ${this.numberFormat(threshold[0])}`,\n color: this.colorMapping.apply(0)\n };\n default:\n return {\n name: `${this.numberFormat(threshold[treshholdIndex - 1])} <= ${this.label} <= ${this.numberFormat(threshold[treshholdIndex])}`,\n color: this.colorMapping.apply(this.mapping.apply((threshold[treshholdIndex - 1] + threshold[treshholdIndex]) / 2))\n };\n }\n }\n\n getSortMethod() {\n return this.groupSortMethod;\n }\n\n setSortMethod(sortMethod: EAdvancedSortMethod) {\n if (this.groupSortMethod === sortMethod) {\n return;\n }\n this.fire([NumberColumn.EVENT_SORTMETHOD_CHANGED], this.groupSortMethod, this.groupSortMethod = sortMethod);\n // sort by me if not already sorted by me\n if (!this.isGroupSortedByMe().asc) {\n this.toggleMyGroupSorting();\n }\n }\n}\n","import {format} from 'd3-format';\nimport {IBoxPlotData, IEventListener} from '../internal';\nimport {Category, dialogAddons, SortByDefault, toolbar} from './annotations';\nimport Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';\nimport {IDataRow, ECompareValueType, IValueColumnDesc, ITypeFactory} from './interfaces';\nimport {ESortMethod, IBoxPlotColumn, INumberDesc, INumberFilter, IColorMappingFunction, IMappingFunction} from './INumberColumn';\nimport {restoreMapping} from './MappingFunction';\nimport NumberColumn from './NumberColumn';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {DEFAULT_FORMATTER, noNumberFilter, toCompareBoxPlotValue, getBoxPlotNumber, isDummyNumberFilter, restoreNumberFilter} from './internalNumber';\n\n\nexport interface IBoxPlotDesc extends INumberDesc {\n sort?: ESortMethod;\n}\n\nexport declare type IBoxPlotColumnDesc = IBoxPlotDesc & IValueColumnDesc<IBoxPlotData>;\n\n\n/**\n * emitted when the sort method property changes\n * @asMemberOf BoxPlotColumn\n * @event\n */\nexport declare function sortMethodChanged_BPC(previous: ESortMethod, current: ESortMethod): void;\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf BoxPlotColumn\n * @event\n */\nexport declare function mappingChanged_BPC(previous: IMappingFunction, current: IMappingFunction): void;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf BoxPlotColumn\n * @event\n */\nexport declare function colorMappingChanged_BPC(previous: IColorMappingFunction, current: IColorMappingFunction): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf BoxPlotColumn\n * @event\n */\nexport declare function filterChanged_BPC(previous: INumberFilter | null, current: INumberFilter | null): void;\n\n\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'filterNumber', 'colorMapped', 'editMapping')\n@dialogAddons('sort', 'sortBoxPlot')\n@Category('array')\n@SortByDefault('descending')\nexport default class BoxPlotColumn extends ValueColumn<IBoxPlotData> implements IBoxPlotColumn {\n static readonly EVENT_MAPPING_CHANGED = NumberColumn.EVENT_MAPPING_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = NumberColumn.EVENT_COLOR_MAPPING_CHANGED;\n static readonly EVENT_SORTMETHOD_CHANGED = NumberColumn.EVENT_SORTMETHOD_CHANGED;\n static readonly EVENT_FILTER_CHANGED = NumberColumn.EVENT_FILTER_CHANGED;\n\n private readonly numberFormat: (n: number) => string = DEFAULT_FORMATTER;\n\n private sort: ESortMethod;\n\n private mapping: IMappingFunction;\n private colorMapping: IColorMappingFunction;\n\n private original: Readonly<IMappingFunction>;\n /**\n * currently active filter\n * @type {{min: number, max: number}}\n * @private\n */\n private currentFilter: INumberFilter = noNumberFilter();\n\n\n constructor(id: string, desc: Readonly<IBoxPlotColumnDesc>, factory: ITypeFactory) {\n super(id, desc);\n this.mapping = restoreMapping(desc, factory);\n this.original = this.mapping.clone();\n this.colorMapping = factory.colorMappingFunction(desc.colorMapping);\n\n if (desc.numberFormat) {\n this.numberFormat = format(desc.numberFormat);\n }\n\n this.sort = desc.sort || ESortMethod.min;\n }\n\n getNumberFormat() {\n return this.numberFormat;\n }\n\n toCompareValue(row: IDataRow): number {\n return toCompareBoxPlotValue(this, row);\n }\n\n toCompareValueType() {\n return ECompareValueType.FLOAT;\n }\n\n getBoxPlotData(row: IDataRow): IBoxPlotData | null {\n return this.getValue(row);\n }\n\n getRange() {\n return this.mapping.getRange(this.numberFormat);\n }\n\n getRawBoxPlotData(row: IDataRow): IBoxPlotData | null {\n return this.getRawValue(row);\n }\n\n getRawValue(row: IDataRow) {\n return super.getValue(row);\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n return format === 'json' ? this.getRawValue(row) : super.getExportValue(row, format);\n }\n\n getValue(row: IDataRow) {\n const v = this.getRawValue(row);\n if (v == null) {\n return null;\n }\n const r: IBoxPlotData = {\n min: this.mapping.apply(v.min),\n max: this.mapping.apply(v.max),\n median: this.mapping.apply(v.median),\n q1: this.mapping.apply(v.q1),\n q3: this.mapping.apply(v.q3)\n };\n if (v.outlier) {\n Object.assign(r, {\n outlier: v.outlier.map((d) => this.mapping.apply(d))\n });\n }\n if (v.whiskerLow != null) {\n Object.assign(r, {\n whiskerLow: this.mapping.apply(v.whiskerLow)\n });\n }\n if (v.whiskerHigh != null) {\n Object.assign(r, {\n whiskerHigh: this.mapping.apply(v.whiskerHigh)\n });\n }\n return r;\n }\n\n getNumber(row: IDataRow): number {\n return getBoxPlotNumber(this, row, 'normalized');\n }\n\n getRawNumber(row: IDataRow): number {\n return getBoxPlotNumber(this, row, 'raw');\n }\n\n iterNumber(row: IDataRow) {\n return [this.getNumber(row)];\n }\n\n iterRawNumber(row: IDataRow) {\n return [this.getRawNumber(row)];\n }\n\n getLabel(row: IDataRow): string {\n const v = this.getRawValue(row);\n if (v == null) {\n return '';\n }\n const f = this.numberFormat;\n return `BoxPlot(min = ${f(v.min)}, q1 = ${f(v.q1)}, median = ${f(v.median)}, q3 = ${f(v.q3)}, max = ${f(v.max)})`;\n }\n\n getSortMethod() {\n return this.sort;\n }\n\n setSortMethod(sort: ESortMethod) {\n if (this.sort === sort) {\n return;\n }\n this.fire(BoxPlotColumn.EVENT_SORTMETHOD_CHANGED, this.sort, this.sort = sort);\n // sort by me if not already sorted by me\n if (!this.isSortedByMe().asc) {\n this.sortByMe();\n }\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.sortMethod = this.getSortMethod();\n r.filter = !isDummyNumberFilter(this.currentFilter) ? this.currentFilter : null;\n r.map = this.mapping.toJSON();\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (dump.sortMethod) {\n this.sort = dump.sortMethod;\n }\n if (dump.filter) {\n this.currentFilter = restoreNumberFilter(dump.filter);\n }\n if (dump.map || dump.domain) {\n this.mapping = restoreMapping(dump, factory);\n }\n if (dump.colorMapping) {\n this.colorMapping = factory.colorMappingFunction(dump.colorMapping);\n }\n }\n\n protected createEventList() {\n return super.createEventList().concat([BoxPlotColumn.EVENT_SORTMETHOD_CHANGED, BoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED, BoxPlotColumn.EVENT_MAPPING_CHANGED, BoxPlotColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof BoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_BPC | null): this;\n on(type: typeof BoxPlotColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged_BPC | null): this;\n on(type: typeof BoxPlotColumn.EVENT_SORTMETHOD_CHANGED, listener: typeof sortMethodChanged_BPC | null): this;\n on(type: typeof BoxPlotColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_BPC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getOriginalMapping() {\n return this.original.clone();\n }\n\n getMapping() {\n return this.mapping.clone();\n }\n\n setMapping(mapping: IMappingFunction) {\n if (this.mapping.eq(mapping)) {\n return;\n }\n this.fire([BoxPlotColumn.EVENT_MAPPING_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.mapping.clone(), this.mapping = mapping);\n }\n\n getColor(row: IDataRow) {\n return NumberColumn.prototype.getColor.call(this, row);\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: IColorMappingFunction) {\n if (this.colorMapping.eq(mapping)) {\n return;\n }\n this.fire([BoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.colorMapping.clone(), this.colorMapping = mapping);\n }\n\n isFiltered() {\n return NumberColumn.prototype.isFiltered.call(this);\n }\n\n getFilter(): INumberFilter {\n return NumberColumn.prototype.getFilter.call(this);\n }\n\n setFilter(value: INumberFilter | null) {\n NumberColumn.prototype.setFilter.call(this, value);\n }\n\n filter(row: IDataRow) {\n return NumberColumn.prototype.filter.call(this, row);\n }\n\n clearFilter() {\n return NumberColumn.prototype.clearFilter.call(this);\n }\n}\n\n","import {Category} from './annotations';\nimport {IKeyValue, IMapColumn} from './IArrayColumn';\nimport {IDataRow, IValueColumnDesc} from './interfaces';\nimport ValueColumn from './ValueColumn';\nimport {integrateDefaults} from './internal';\n\nexport interface IMapColumnDesc<T> extends IValueColumnDesc<IKeyValue<T>[]> {\n // dummy\n}\n\n@Category('map')\nexport default class MapColumn<T> extends ValueColumn<IKeyValue<T>[]> implements IMapColumn<T> {\n\n constructor(id: string, desc: Readonly<IMapColumnDesc<T>>) {\n super(id, integrateDefaults(desc, {\n width: 200\n }));\n }\n\n getValue(row: IDataRow) {\n const r = this.getMap(row);\n return r.length === 0 ? null : r;\n }\n\n getLabels(row: IDataRow): IKeyValue<string>[] {\n const v = this.getMap(row);\n return v.map(({key, value}) => ({key, value: String(value)}));\n }\n\n getMap(row: IDataRow) {\n return toKeyValue<T>(<any>super.getValue(row));\n }\n\n getMapLabel(row: IDataRow) {\n return this.getLabels(row);\n }\n\n getLabel(row: IDataRow) {\n const v = this.getLabels(row);\n return `{${v.map(({key, value}) => `${key}: ${value}`).join(', ')}}`;\n }\n}\n\nfunction byKey(a: IKeyValue<any>, b: IKeyValue<any>) {\n if (a === b) {\n return 0;\n }\n return a.key.localeCompare(b.key);\n}\n\nfunction toKeyValue<T>(v?: Map<string, T> | { [key: string]: T } | IKeyValue<T>[]): IKeyValue<T>[] {\n if (!v) {\n return [];\n }\n if (v instanceof Map) {\n return Array.from(v.entries()).map(([key, value]) => ({key, value})).sort(byKey);\n }\n if (Array.isArray(v)) {\n return v; // keep original order\n }\n // object\n return Object.keys(v).map((key) => ({key, value: v[key]})).sort(byKey);\n}\n","import {ICategoricalDesc, ICategory, ICategoricalLikeColumn, ICategoricalColorMappingFunction} from './ICategoricalColumn';\nimport {IDataRow, DEFAULT_COLOR, ITypeFactory} from './interfaces';\nimport MapColumn, {IMapColumnDesc} from './MapColumn';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';\nimport CategoricalColumn from './CategoricalColumn';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport Column, {labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, widthChanged, dirtyCaches} from './Column';\nimport {IEventListener} from '../internal';\nimport {toolbar} from './annotations';\nimport {toCategories} from './internalCategorical';\n\n\nexport declare type ICategoricalMapColumnDesc = ICategoricalDesc & IMapColumnDesc<string | null>;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf CategoricalMapColumn\n * @event\n */\nexport declare function colorMappingChanged_CMC(previous: ICategoricalColorMappingFunction, current: ICategoricalColorMappingFunction): void;\n\n@toolbar('rename', 'colorMappedCategorical')\nexport default class CategoricalMapColumn extends MapColumn<string | null> implements ICategoricalLikeColumn {\n static readonly EVENT_COLOR_MAPPING_CHANGED = CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED;\n\n readonly categories: ICategory[];\n\n private readonly lookup = new Map<string, Readonly<ICategory>>();\n\n private colorMapping: ICategoricalColorMappingFunction;\n\n constructor(id: string, desc: Readonly<ICategoricalMapColumnDesc>) {\n super(id, desc);\n this.categories = toCategories(desc);\n this.categories.forEach((d) => this.lookup.set(d.name, d));\n this.colorMapping = DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n protected createEventList() {\n return super.createEventList().concat([CategoricalMapColumn.EVENT_COLOR_MAPPING_CHANGED]);\n }\n\n on(type: typeof CategoricalMapColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_CMC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n\n private parseValue(v: any) {\n if (!v) {\n return null;\n }\n const vs = String(v);\n return this.lookup.has(vs) ? this.lookup.get(vs)! : null;\n }\n\n getCategoryMap(row: IDataRow) {\n return super.getMap(row).map(({key, value}) => ({\n key,\n value: this.parseValue(value)\n }));\n }\n\n getCategories(row: IDataRow) {\n return this.getCategoryMap(row).map((d) => d.value);\n }\n\n getColors(row: IDataRow) {\n return this.getCategoryMap(row).map(({key, value}) => ({key, value: value ? this.colorMapping.apply(value) : DEFAULT_COLOR}));\n }\n\n getValue(row: IDataRow) {\n const r = this.getCategoryMap(row);\n return r.length === 0 ? null : r.map(({key, value}) => ({\n key,\n value: value ? value.name : null\n }));\n }\n\n getLabels(row: IDataRow) {\n return this.getCategoryMap(row).map(({key, value}) => ({\n key,\n value: value ? value.label : ''\n }));\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: ICategoricalColorMappingFunction) {\n return CategoricalColumn.prototype.setColorMapping.call(this, mapping);\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);\n }\n\n iterCategory(row: IDataRow) {\n return this.getCategories(row);\n }\n}\n","import ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';\nimport {ICategoricalDesc, ICategory, ICategoricalColorMappingFunction, ICategoricalsColumn} from './ICategoricalColumn';\nimport {IDataRow, DEFAULT_COLOR, ITypeFactory} from './interfaces';\nimport {toolbar} from './annotations';\nimport CategoricalColumn from './CategoricalColumn';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport Column, {labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, widthChanged, dirtyCaches} from './Column';\nimport {IEventListener} from '../internal';\nimport {toCategories} from './internalCategorical';\n\nexport declare type ICategoricalsColumnDesc = ICategoricalDesc & IArrayColumnDesc<string | null>;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf CategoricalsColumn\n * @event\n */\nexport declare function colorMappingChanged_CCS(previous: ICategoricalColorMappingFunction, current: ICategoricalColorMappingFunction): void;\n\n/**\n * a string column with optional alignment\n */\n@toolbar('rename', 'colorMappedCategorical')\nexport default class CategoricalsColumn extends ArrayColumn<string | null> implements ICategoricalsColumn {\n static readonly EVENT_COLOR_MAPPING_CHANGED = CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED;\n\n readonly categories: ICategory[];\n\n private readonly lookup = new Map<string, Readonly<ICategory>>();\n\n private colorMapping: ICategoricalColorMappingFunction;\n\n constructor(id: string, desc: Readonly<ICategoricalsColumnDesc>) {\n super(id, desc);\n this.categories = toCategories(desc);\n this.categories.forEach((d) => this.lookup.set(d.name, d));\n this.colorMapping = DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n\n protected createEventList() {\n return super.createEventList().concat([CategoricalsColumn.EVENT_COLOR_MAPPING_CHANGED]);\n }\n\n on(type: typeof CategoricalsColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_CCS | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getCategories(row: IDataRow) {\n return super.getValues(row).map((v) => {\n if (!v) {\n return null;\n }\n const vs = String(v);\n return this.lookup.has(vs) ? this.lookup.get(vs)! : null;\n });\n }\n\n getColors(row: IDataRow) {\n return this.getCategories(row).map((d) => d ? this.colorMapping.apply(d) : DEFAULT_COLOR);\n }\n\n iterCategory(row: IDataRow) {\n return this.getCategories(row);\n }\n\n getValues(row: IDataRow) {\n return this.getCategories(row).map((v) => v ? v.name : null);\n }\n\n getLabels(row: IDataRow) {\n return this.getCategories(row).map((v) => v ? v.label : '');\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: ICategoricalColorMappingFunction) {\n return CategoricalColumn.prototype.setColorMapping.call(this, mapping);\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);\n }\n}\n","import {timeDay, timeHour, timeMinute, timeMonth, timeSecond, timeWeek} from 'd3-time';\nimport {timeFormat} from 'd3-time-format';\nimport {equal, ISequence, isSeqEmpty} from '../internal';\nimport {INumberFilter, IDateGrouper, IDataRow, IDateColumn} from '.';\nimport {isNumberIncluded} from './internalNumber';\n\n/** @internal */\nexport {isDummyNumberFilter as isDummyDateFilter, isEqualNumberFilter as isEqualDateFilter, noNumberFilter as noDateFilter, restoreNumberFilter as restoreDateFilter} from './internalNumber';\n\n\n/** @internal */\nexport function isDateIncluded(filter: INumberFilter | null, value: Date | null) {\n if (!filter) {\n return true;\n }\n if (value == null || !(value instanceof Date)) {\n return !filter.filterMissing;\n }\n return isNumberIncluded(filter, value!.getTime());\n}\n\n/**\n * shifts the given date such that it is on 23:59:59, or 00:00:00\n * @internal\n */\nexport function shiftFilterDateDay(date: number, type: 'min' | 'max') {\n const d = new Date(date);\n if (type === 'max') {\n d.setHours(23);\n d.setMinutes(59);\n d.setSeconds(59);\n d.setMilliseconds(999);\n } else {\n d.setHours(0);\n d.setMinutes(0);\n d.setSeconds(0);\n d.setMilliseconds(0);\n }\n return d.getTime();\n}\n\n/**\n * @internal\n */\nexport function defaultDateGrouper(): IDateGrouper {\n return {granularity: 'month', circular: false};\n}\n\n/**\n * @internal\n */\nexport function isDefaultDateGrouper(grouper: IDateGrouper) {\n return equal(defaultDateGrouper(), grouper);\n}\n\n/**\n * convert the given date to the desired grouper\n * @internal\n */\nexport function toDateGroup(grouper: IDateGrouper, value: Date): {value: number, name: string} {\n switch (grouper.granularity) {\n case 'century':\n const centuryP = Math.floor(value.getFullYear() / 100);\n if (grouper.circular) {\n const century = centuryP % 10;\n return {\n value: century,\n name: `*${century}00`\n };\n }\n return {\n value: centuryP,\n name: `${centuryP}00`\n };\n case 'decade':\n const decadeP = Math.floor(value.getFullYear() / 10);\n if (grouper.circular) {\n const decade = decadeP % 10;\n return {\n value: decade,\n name: `**${decade}0`\n };\n }\n return {\n value: decadeP,\n name: `${decadeP}0`\n };\n case 'year':\n if (grouper.circular) {\n const year = value.getFullYear() % 10;\n return {\n value: year,\n name: `***${year}`\n };\n }\n return {\n value: value.getFullYear(),\n name: String(value.getFullYear())\n };\n case 'month':\n if (grouper.circular) {\n return {\n value: value.getMonth(),\n name: timeFormat('%B')(value)\n };\n }\n return {\n value: timeMonth(value).getTime(),\n name: timeFormat('%B %Y')(value)\n };\n case 'week':\n if (grouper.circular) {\n return {\n value: value.getMonth(),\n name: timeFormat('%W')(value)\n };\n }\n return {\n value: timeWeek(value).getTime(),\n name: timeFormat('%W %Y')(value)\n };\n case 'day_of_week':\n if (grouper.circular) {\n return {\n value: value.getDay(),\n name: timeFormat('%A')(value)\n };\n }\n return {\n value: timeDay(value).getTime(),\n name: timeFormat('%x')(value)\n };\n case 'day_of_month':\n if (grouper.circular) {\n return {\n value: value.getDate(),\n name: timeFormat('%d')(value)\n };\n }\n return {\n value: timeDay(value).getTime(),\n name: timeFormat('%x')(value)\n };\n case 'day_of_year':\n if (grouper.circular) {\n // %j = day of year\n const v = timeFormat('%j')(value);\n return {\n value: parseInt(v, 10),\n name: v\n };\n }\n return {\n value: timeDay(value).getTime(),\n name: timeFormat('%x')(value)\n };\n case 'hour':\n if (grouper.circular) {\n return {\n value: value.getHours(),\n name: timeFormat('%A')(value)\n };\n }\n return {\n value: timeHour(value).getTime(),\n name: timeFormat('%x')(value)\n };\n case 'minute':\n if (grouper.circular) {\n return {\n value: value.getMinutes(),\n name: timeFormat('%A')(value)\n };\n }\n return {\n value: timeMinute(value).getTime(),\n name: timeFormat('%x')(value)\n };\n case 'second':\n if (grouper.circular) {\n return {\n value: value.getSeconds(),\n name: timeFormat('%A')(value)\n };\n }\n return {\n value: timeSecond(value).getTime(),\n name: timeFormat('%x')(value)\n };\n }\n\n return {\n value: value.getTime(),\n name: value.toString()\n };\n}\n\n\n/**\n * @internal\n */\nexport function chooseAggregatedDate(rows: ISequence<IDataRow>, grouper: IDateGrouper | null, col: IDateColumn, valueCache?: ISequence<Date | null>): {value: number | null, name: string} {\n const vs = <ISequence<Date>>(valueCache ? valueCache : rows.map((d) => col.getDate(d))).filter((d) => d instanceof Date);\n if (isSeqEmpty(vs)) {\n return {value: null, name: ''};\n }\n const median = trueMedian(vs.map((d) => d.getTime()))!;\n if (!grouper) {\n return {value: median, name: (new Date(median)).toString()};\n }\n return toDateGroup(grouper, new Date(median));\n}\n\nfunction trueMedian(dates: ISequence<number>) {\n // to avoid interpolating between the centers do it manually\n const s = Float64Array.from(dates);\n if (s.length === 1) {\n return s[0];\n }\n\n s.sort();\n return s[Math.floor(s.length / 2)];\n}\n","import {timeFormat, timeParse} from 'd3-time-format';\nimport {ISequence, equal, IEventListener} from '../internal';\nimport {Category, dialogAddons, toolbar} from './annotations';\nimport Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';\nimport {IDateColumn, IDateDesc, IDateFilter, IDateGrouper} from './IDateColumn';\nimport {defaultGroup, IDataRow, IGroup, ECompareValueType, IValueColumnDesc, DEFAULT_COLOR, ITypeFactory} from './interfaces';\nimport {isMissingValue, isUnknown, missingGroup} from './missing';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {noDateFilter, defaultDateGrouper, isDummyDateFilter, isDefaultDateGrouper, restoreDateFilter, isEqualDateFilter, isDateIncluded, toDateGroup, chooseAggregatedDate} from './internalDate';\nimport {integrateDefaults} from './internal';\n\n\nexport declare type IDateColumnDesc = IValueColumnDesc<Date> & IDateDesc;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf DateColumn\n * @event\n */\nexport declare function filterChanged_DC(previous: IDateFilter | null, current: IDateFilter | null): void;\n\n/**\n * emitted when the grouping property changes\n * @asMemberOf DateColumn\n * @event\n */\nexport declare function groupingChanged_DC(previous: IDateGrouper | null, current: IDateGrouper | null): void;\n\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'groupBy', 'sortGroupBy', 'filterDate')\n@dialogAddons('group', 'groupDate')\n@Category('date')\nexport default class DateColumn extends ValueColumn<Date> implements IDateColumn {\n static readonly EVENT_FILTER_CHANGED = 'filterChanged';\n static readonly EVENT_GROUPING_CHANGED = 'groupingChanged';\n\n static readonly DEFAULT_DATE_FORMAT = '%x';\n\n private readonly format: (date: Date | null) => string;\n private readonly parse: (date: string) => Date | null;\n\n /**\n * currently active filter\n * @type {{min: number, max: number}}\n * @private\n */\n private currentFilter: IDateFilter = noDateFilter();\n private currentGrouper: IDateGrouper = defaultDateGrouper();\n\n constructor(id: string, desc: Readonly<IDateColumnDesc>) {\n super(id, integrateDefaults(desc, {\n groupRenderer: 'datehistogram',\n summaryRenderer: 'datehistogram'\n }));\n const f = timeFormat(desc.dateFormat || DateColumn.DEFAULT_DATE_FORMAT);\n this.format = (v) => (v instanceof Date) ? f(v) : '';\n this.parse = desc.dateParse ? timeParse(desc.dateParse) : timeParse(desc.dateFormat || DateColumn.DEFAULT_DATE_FORMAT);\n }\n\n getFormatter() {\n return this.format;\n }\n\n dump(toDescRef: (desc: any) => any) {\n const r = super.dump(toDescRef);\n r.filter = isDummyDateFilter(this.currentFilter) ? null : this.currentFilter;\n if (this.currentGrouper && !isDefaultDateGrouper(this.currentGrouper)) {\n r.grouper = this.currentGrouper;\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (dump.filter) {\n this.currentFilter = restoreDateFilter(dump.filter);\n }\n if (dump.grouper) {\n this.currentGrouper = dump.grouper;\n }\n }\n\n protected createEventList() {\n return super.createEventList().concat([DateColumn.EVENT_FILTER_CHANGED, DateColumn.EVENT_GROUPING_CHANGED]);\n }\n\n on(type: typeof DateColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_DC | null): this;\n on(type: typeof DateColumn.EVENT_GROUPING_CHANGED, listener: typeof groupingChanged_DC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValue(row: IDataRow): Date | null {\n return this.getDate(row);\n }\n\n getDate(row: IDataRow) {\n const v = super.getValue(row);\n if (isMissingValue(v)) {\n return null;\n }\n if (v instanceof Date) {\n return v;\n }\n return this.parse(String(v));\n }\n\n iterDate(row: IDataRow) {\n return [this.getDate(row)];\n }\n\n getLabel(row: IDataRow) {\n const v = this.getValue(row);\n return this.format(v);\n }\n\n isFiltered() {\n return !isDummyDateFilter(this.currentFilter);\n }\n\n clearFilter() {\n const was = this.isFiltered();\n this.setFilter(null);\n return was;\n }\n\n getFilter(): IDateFilter {\n return Object.assign({}, this.currentFilter);\n }\n\n setFilter(value: IDateFilter | null) {\n value = value || {min: -Infinity, max: +Infinity, filterMissing: false};\n if (isEqualDateFilter(value, this.currentFilter)) {\n return;\n }\n const bak = this.getFilter();\n this.currentFilter.min = isUnknown(value.min) ? -Infinity : value.min;\n this.currentFilter.max = isUnknown(value.max) ? Infinity : value.max;\n this.currentFilter.filterMissing = value.filterMissing;\n this.fire([DateColumn.EVENT_FILTER_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], bak, this.getFilter());\n }\n\n /**\n * filter the current row if any filter is set\n * @param row\n * @returns {boolean}\n */\n filter(row: IDataRow, valueCache?: any) {\n return isDateIncluded(this.currentFilter, valueCache !== undefined ? valueCache : this.getDate(row));\n }\n\n toCompareValue(row: IDataRow, valueCache?: any) {\n const v = valueCache !== undefined ? valueCache : this.getValue(row);\n if (!(v instanceof Date)) {\n return NaN;\n }\n return v.getTime();\n }\n\n toCompareValueType() {\n return ECompareValueType.DOUBLE_ASC;\n }\n\n getDateGrouper() {\n return Object.assign({}, this.currentGrouper);\n }\n\n setDateGrouper(value: IDateGrouper) {\n if (equal(this.currentGrouper, value)) {\n return;\n }\n const bak = this.getDateGrouper();\n this.currentGrouper = Object.assign({}, value);\n this.fire([DateColumn.EVENT_GROUPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], bak, value);\n }\n\n group(row: IDataRow, valueCache?: any): IGroup {\n const v = valueCache !== undefined ? valueCache : this.getDate(row);\n if (!v || !(v instanceof Date)) {\n return Object.assign({}, missingGroup);\n }\n if (!this.currentGrouper) {\n return Object.assign({}, defaultGroup);\n }\n const g = toDateGroup(this.currentGrouper, v);\n return {\n name: g.name,\n color: DEFAULT_COLOR\n };\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, _group: IGroup, valueCache?: ISequence<any>): number {\n const v = chooseAggregatedDate(rows, this.currentGrouper, this, valueCache).value;\n return v == null ? NaN : v;\n }\n\n toCompareGroupValueType() {\n return ECompareValueType.DOUBLE_ASC;\n }\n}\n","import {timeFormat, timeParse} from 'd3-time-format';\nimport {median, min, max, IEventListener} from '../internal';\nimport {dialogAddons, toolbar} from './annotations';\nimport ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IDateDesc, IDatesColumn, IDateFilter} from './IDateColumn';\nimport {IDataRow, ECompareValueType, ITypeFactory} from './interfaces';\nimport {isMissingValue} from './missing';\nimport DateColumn from './DateColumn';\nimport {noDateFilter, isDummyDateFilter, restoreDateFilter} from './internalDate';\nimport {chooseUIntByDataLength, integrateDefaults} from './internal';\n\nexport enum EDateSort {\n min = 'min',\n max = 'max',\n median = 'median'\n}\n\nexport interface IDatesDesc extends IDateDesc {\n sort?: EDateSort;\n}\n\nexport declare type IDatesColumnDesc = IDatesDesc & IArrayColumnDesc<Date>;\n\n/**\n * emitted when the sort method property changes\n * @asMemberOf DatesColumn\n * @event\n */\nexport declare function sortMethodChanged_DCS(previous: EDateSort, current: EDateSort): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf DatesColumn\n * @event\n */\nexport declare function filterChanged_DCS(previous: IDateFilter | null, current: IDateFilter | null): void;\n\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'filterDate')\n@dialogAddons('sort', 'sortDates')\nexport default class DatesColumn extends ArrayColumn<Date | null> implements IDatesColumn {\n static readonly EVENT_SORTMETHOD_CHANGED = 'sortMethodChanged';\n static readonly EVENT_FILTER_CHANGED = DateColumn.EVENT_FILTER_CHANGED;\n\n private readonly format: (date: Date | null) => string;\n private readonly parse: (date: string) => Date | null;\n private sort: EDateSort;\n private currentFilter: IDateFilter = noDateFilter();\n\n constructor(id: string, desc: Readonly<IDatesColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'datehistogram',\n groupRenderer: 'datehistogram',\n summaryRenderer: 'datehistogram'\n }));\n const f = timeFormat(desc.dateFormat || DateColumn.DEFAULT_DATE_FORMAT);\n this.format = (v) => (v instanceof Date) ? f(v) : '';\n this.parse = desc.dateParse ? timeParse(desc.dateParse) : timeParse(desc.dateFormat || DateColumn.DEFAULT_DATE_FORMAT);\n this.sort = desc.sort || EDateSort.median;\n }\n\n getFormatter() {\n return this.format;\n }\n\n protected createEventList() {\n return super.createEventList().concat([DatesColumn.EVENT_SORTMETHOD_CHANGED, DatesColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof DatesColumn.EVENT_SORTMETHOD_CHANGED, listener: typeof sortMethodChanged_DCS | null): this;\n on(type: typeof DatesColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_DCS | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValue(row: IDataRow): (Date | null)[] | null {\n const r = this.getDates(row);\n return r.every((d) => d == null) ? null : r;\n }\n\n getLabels(row: IDataRow) {\n return this.getDates(row).map((v) => (v instanceof Date) ? this.format(v) : '');\n }\n\n getDates(row: IDataRow): (Date | null)[] {\n return super.getValues(row).map((v) => {\n if (isMissingValue(v)) {\n return null;\n }\n if (v instanceof Date) {\n return v;\n }\n return this.parse(String(v));\n });\n }\n\n getDate(row: IDataRow) {\n const av = <Date[]>this.getDates(row).filter(Boolean);\n if (av.length === 0) {\n return null;\n }\n return new Date(compute(av, this.sort));\n }\n\n iterDate(row: IDataRow) {\n return this.getDates(row);\n }\n\n getSortMethod() {\n return this.sort;\n }\n\n setSortMethod(sort: EDateSort) {\n if (this.sort === sort) {\n return;\n }\n this.fire([DatesColumn.EVENT_SORTMETHOD_CHANGED], this.sort, this.sort = sort);\n // sort by me if not already sorted by me\n if (!this.isSortedByMe().asc) {\n this.sortByMe();\n }\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.sortMethod = this.getSortMethod();\n r.filter = !isDummyDateFilter(this.currentFilter) ? this.currentFilter : null;\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (dump.sortMethod) {\n this.sort = dump.sortMethod;\n }\n if (dump.filter) {\n this.currentFilter = restoreDateFilter(dump.filter);\n }\n }\n\n toCompareValue(row: IDataRow) {\n const vs = <Date[]>this.getDates(row).filter(Boolean);\n if (!vs) {\n return [0, 0];\n }\n return [vs.length, compute(vs, this.sort)];\n }\n\n toCompareValueType() {\n return [chooseUIntByDataLength(this.dataLength), ECompareValueType.DOUBLE_ASC];\n }\n\n isFiltered() {\n return DateColumn.prototype.isFiltered.call(this);\n }\n\n getFilter(): IDateFilter {\n return DateColumn.prototype.getFilter.call(this);\n }\n\n setFilter(value: IDateFilter | null) {\n DateColumn.prototype.setFilter.call(this, value);\n }\n\n filter(row: IDataRow) {\n return DateColumn.prototype.filter.call(this, row);\n }\n\n clearFilter() {\n return DateColumn.prototype.clearFilter.call(this);\n }\n}\n\nfunction compute(arr: Date[], sort: EDateSort) {\n switch (sort) {\n case EDateSort.min:\n return min(arr, (d) => d.getTime())!;\n case EDateSort.max:\n return max(arr, (d) => d.getTime())!;\n case EDateSort.median:\n return median(arr, (d) => d.getTime())!;\n }\n}\n","import {timeFormat, timeParse} from 'd3-time-format';\nimport {IDateColumn, IDateFilter} from './IDateColumn';\nimport {IKeyValue} from './IArrayColumn';\nimport {IDataRow, ITypeFactory} from './interfaces';\nimport MapColumn, {IMapColumnDesc} from './MapColumn';\nimport {isMissingValue} from './missing';\nimport DatesColumn, {EDateSort, IDatesDesc} from './DatesColumn';\nimport DateColumn from './DateColumn';\nimport {dialogAddons, toolbar} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IEventListener} from '../internal';\nimport {noDateFilter, isDummyDateFilter, restoreDateFilter} from './internalDate';\nimport {integrateDefaults} from './internal';\n\nexport declare type IDateMapColumnDesc = IDatesDesc & IMapColumnDesc<Date | null>;\n\n/**\n * emitted when the sort method property changes\n * @asMemberOf DatesMapColumn\n * @event\n */\nexport declare function sortMethodChanged_DMC(previous: EDateSort, current: EDateSort): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf DatesMapColumn\n * @event\n */\nexport declare function filterChanged_DMC(previous: IDateFilter | null, current: IDateFilter | null): void;\n\n\n@toolbar('rename', 'filterDate')\n@dialogAddons('sort', 'sortDates')\nexport default class DatesMapColumn extends MapColumn<Date | null> implements IDateColumn {\n static readonly EVENT_SORTMETHOD_CHANGED = DatesColumn.EVENT_SORTMETHOD_CHANGED;\n static readonly EVENT_FILTER_CHANGED = DateColumn.EVENT_FILTER_CHANGED;\n\n private readonly format: (date: Date | null) => string;\n private readonly parse: (date: string) => Date | null;\n private sort: EDateSort;\n private currentFilter: IDateFilter = noDateFilter();\n\n constructor(id: string, desc: Readonly<IDateMapColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'default'\n }));\n const f = timeFormat(desc.dateFormat || DateColumn.DEFAULT_DATE_FORMAT);\n this.format = (v) => (v instanceof Date) ? f(v) : '';\n this.parse = desc.dateParse ? timeParse(desc.dateParse) : timeParse(desc.dateFormat || DateColumn.DEFAULT_DATE_FORMAT);\n this.sort = desc.sort || EDateSort.median;\n }\n\n getFormatter() {\n return this.format;\n }\n\n protected createEventList() {\n return super.createEventList().concat([DatesMapColumn.EVENT_SORTMETHOD_CHANGED, DatesMapColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof DatesMapColumn.EVENT_SORTMETHOD_CHANGED, listener: typeof sortMethodChanged_DMC | null): this;\n on(type: typeof DatesMapColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_DMC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n private parseValue(v: any) {\n if (isMissingValue(v)) {\n return null;\n }\n if (v instanceof Date) {\n return v;\n }\n return this.parse(String(v));\n }\n\n getDateMap(row: IDataRow) {\n return super.getMap(row).map(({key, value}) => ({\n key,\n value: this.parseValue(value)\n }));\n }\n\n iterDate(row: IDataRow) {\n return this.getDates(row);\n }\n\n getValue(row: IDataRow) {\n const r = this.getDateMap(row);\n\n return r.every((d) => d == null) ? null : r;\n }\n\n getLabels(row: IDataRow): IKeyValue<string>[] {\n return this.getDateMap(row).map(({key, value}) => ({\n key,\n value: (value instanceof Date) ? this.format(value) : ''\n }));\n }\n\n getDates(row: IDataRow): (Date | null)[] {\n return this.getDateMap(row).map((v) => v.value);\n }\n\n getDate(row: IDataRow) {\n return DatesColumn.prototype.getDate.call(this, row);\n }\n\n getSortMethod() {\n return this.sort;\n }\n\n setSortMethod(sort: EDateSort) {\n return DatesColumn.prototype.setSortMethod.call(this, sort);\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.sortMethod = this.getSortMethod();\n r.filter = !isDummyDateFilter(this.currentFilter) ? this.currentFilter : null;\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (dump.sortMethod) {\n this.sort = dump.sortMethod;\n }\n if (dump.filter) {\n this.currentFilter = restoreDateFilter(dump.filter);\n }\n }\n\n isFiltered() {\n return DateColumn.prototype.isFiltered.call(this);\n }\n\n getFilter(): IDateFilter {\n return DateColumn.prototype.getFilter.call(this);\n }\n\n setFilter(value: IDateFilter | null) {\n DateColumn.prototype.setFilter.call(this, value);\n }\n\n filter(row: IDataRow) {\n return DateColumn.prototype.filter.call(this, row);\n }\n\n clearFilter() {\n return DateColumn.prototype.clearFilter.call(this);\n }\n}\n","import {Category, SupportType, toolbar, dialogAddons} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport {IDataRow, IGroup, ECompareValueType} from './interfaces';\nimport {missingGroup} from './missing';\nimport {IEventListener, ISequence} from '../internal';\n\nexport function createGroupDesc(label = 'Group Name') {\n return {type: 'group', label};\n}\n\nexport enum EGroupSortMethod {\n name = 'name',\n count = 'count'\n}\n\n/**\n * emitted when the sort method property changes\n * @asMemberOf GroupColumn\n * @event\n */\nexport declare function sortMethodChanged(previous: EGroupSortMethod, current: EGroupSortMethod): void;\n\n\n@SupportType()\n@toolbar('rename', 'sortGroupBy')\n@dialogAddons('sortGroup', 'sortGroups')\n@Category('support')\nexport default class GroupColumn extends Column {\n static readonly EVENT_SORTMETHOD_CHANGED = 'sortMethodChanged';\n\n private groupSortMethod: EGroupSortMethod = EGroupSortMethod.name;\n\n get frozen() {\n return this.desc.frozen !== false;\n }\n\n protected createEventList() {\n return super.createEventList().concat([GroupColumn.EVENT_SORTMETHOD_CHANGED]);\n }\n\n on(type: typeof GroupColumn.EVENT_SORTMETHOD_CHANGED, listener: typeof sortMethodChanged | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getLabel() {\n return '';\n }\n\n getValue() {\n return '';\n }\n\n getSortMethod() {\n return this.groupSortMethod;\n }\n\n setSortMethod(sortMethod: EGroupSortMethod) {\n if (this.groupSortMethod === sortMethod) {\n return;\n }\n this.fire(GroupColumn.EVENT_SORTMETHOD_CHANGED, this.groupSortMethod, this.groupSortMethod = sortMethod);\n // sort by me if not already sorted by me\n if (!this.isGroupSortedByMe().asc) {\n this.toggleMyGroupSorting();\n }\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, group: IGroup) {\n if (this.groupSortMethod === 'count') {\n return rows.length;\n }\n return group.name === missingGroup.name ? null : group.name.toLowerCase();\n }\n\n toCompareGroupValueType() {\n return this.groupSortMethod === 'count' ? ECompareValueType.COUNT : ECompareValueType.STRING;\n }\n}\n","import {Category, toolbar} from './annotations';\nimport CategoricalColumn from './CategoricalColumn';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, dirtyCaches, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged} from './Column';\nimport {ICategoricalColumn, ICategory, ICategoricalColorMappingFunction} from './ICategoricalColumn';\nimport {IDataRow, IGroup, IValueColumnDesc, DEFAULT_COLOR, ITypeFactory} from './interfaces';\nimport {colorPool, integrateDefaults} from './internal';\nimport {missingGroup} from './missing';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IEventListener} from '../internal';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';\n\nexport interface ICategoryNode extends ICategory {\n children: Readonly<ICategoryNode>[];\n}\n\nexport interface IPartialCategoryNode extends Partial<ICategory> {\n children: IPartialCategoryNode[];\n}\n\nexport interface IHierarchyDesc {\n hierarchy: IPartialCategoryNode;\n hierarchySeparator?: string;\n}\n\nexport declare type IHierarchyColumnDesc = IHierarchyDesc & IValueColumnDesc<string>;\n\nexport interface ICategoryInternalNode extends ICategory {\n path: string;\n children: Readonly<ICategoryInternalNode>[];\n}\n\nexport interface ICutOffNode {\n node: Readonly<ICategoryInternalNode>;\n maxDepth: number;\n}\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf HierarchyColumn\n * @event\n */\nexport declare function colorMappingChanged_HC(previous: ICategoricalColorMappingFunction, current: ICategoricalColorMappingFunction): void;\n\n\n/**\n * emitted when the cut off property changes\n * @asMemberOf HierarchyColumn\n * @event\n */\nexport declare function cutOffChanged(previous: ICutOffNode, current: ICutOffNode): void;\n\n/**\n * column for hierarchical categorical values\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'cutoff', 'group', 'groupBy', 'colorMappedCategorical')\n@Category('categorical')\nexport default class HierarchyColumn extends ValueColumn<string> implements ICategoricalColumn {\n static readonly EVENT_CUTOFF_CHANGED = 'cutOffChanged';\n static readonly EVENT_COLOR_MAPPING_CHANGED = 'colorMappingChanged';\n\n private readonly hierarchySeparator: string;\n readonly hierarchy: Readonly<ICategoryInternalNode>;\n\n private currentNode: Readonly<ICategoryInternalNode>;\n private currentMaxDepth: number = Infinity;\n private currentLeaves: Readonly<ICategoryInternalNode>[] = [];\n private readonly currentLeavesNameCache = new Map<string, Readonly<ICategoryInternalNode>>();\n private readonly currentLeavesPathCache = new Map<string, Readonly<ICategoryInternalNode>>();\n\n private colorMapping: ICategoricalColorMappingFunction;\n\n constructor(id: string, desc: Readonly<IHierarchyColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'categorical'\n }));\n this.hierarchySeparator = desc.hierarchySeparator || '.';\n this.hierarchy = this.initHierarchy(desc.hierarchy);\n this.currentNode = this.hierarchy;\n this.currentLeaves = computeLeaves(this.currentNode, this.currentMaxDepth);\n this.updateCaches();\n this.colorMapping = DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n\n private initHierarchy(root: IPartialCategoryNode) {\n const colors = colorPool();\n const s = this.hierarchySeparator;\n const add = (prefix: string, node: IPartialCategoryNode): ICategoryInternalNode => {\n const name = node.name == null ? String(node.value) : node.name;\n const children = (node.children || []).map((child: IPartialCategoryNode | string): ICategoryInternalNode => {\n if (typeof child === 'string') {\n const path = prefix + child;\n return {\n path,\n name: child,\n label: path,\n color: colors(),\n value: 0,\n children: []\n };\n }\n const r = add(`${prefix}${name}${s}`, child);\n if (!r.color) {\n //hack to inject the next color\n (<any>r).color = colors();\n }\n return r;\n });\n const path = prefix + name;\n const label = node.label ? node.label : path;\n return {path, name, children, label, color: node.color!, value: 0};\n };\n return add('', root);\n }\n\n get categories() {\n return this.currentLeaves;\n }\n\n protected createEventList() {\n return super.createEventList().concat([HierarchyColumn.EVENT_COLOR_MAPPING_CHANGED, HierarchyColumn.EVENT_CUTOFF_CHANGED]);\n }\n\n on(type: typeof HierarchyColumn.EVENT_CUTOFF_CHANGED, listener: typeof cutOffChanged | null): this;\n on(type: typeof HierarchyColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_HC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.colorMapping = this.colorMapping.toJSON();\n if (isFinite(this.currentMaxDepth)) {\n r.maxDepth = this.currentMaxDepth;\n }\n if (this.currentNode !== this.hierarchy) {\n r.cutOffNode = this.currentNode.path;\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);\n if (typeof dump.maxDepth !== 'undefined') {\n this.currentMaxDepth = dump.maxDepth;\n }\n if (typeof dump.cutOffNode !== 'undefined') {\n const path = dump.cutOffNode.split(this.hierarchySeparator);\n let node: Readonly<ICategoryInternalNode> | null = this.hierarchy;\n\n let act = path.shift();\n while (act && node) {\n if (node.name !== act) {\n node = null;\n break;\n }\n const next = path.shift();\n if (!next) {\n break;\n }\n act = next;\n node = node.children.find((d) => d.name === act) || null;\n }\n this.currentNode = node || this.hierarchy;\n }\n\n if (typeof dump.maxDepth !== 'undefined' || typeof dump.cutOffNode !== 'undefined') {\n this.currentLeaves = computeLeaves(this.currentNode, this.currentMaxDepth);\n this.updateCaches();\n }\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: ICategoricalColorMappingFunction) {\n if (this.colorMapping.eq(mapping)) {\n return;\n }\n this.fire([CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], this.colorMapping.clone(), this.colorMapping = mapping);\n }\n\n getCutOff(): ICutOffNode {\n return {\n node: this.currentNode,\n maxDepth: this.currentMaxDepth\n };\n }\n\n setCutOff(value: ICutOffNode) {\n const maxDepth = value.maxDepth == null ? Infinity : value.maxDepth;\n if (this.currentNode === value.node && this.currentMaxDepth === maxDepth) {\n return;\n }\n const bak = this.getCutOff();\n this.currentNode = value.node;\n this.currentMaxDepth = maxDepth;\n this.currentLeaves = computeLeaves(value.node, maxDepth);\n this.updateCaches();\n this.fire([HierarchyColumn.EVENT_CUTOFF_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], bak, this.getCutOff());\n }\n\n getCategory(row: IDataRow) {\n let v = super.getValue(row);\n if (v == null || v === '') {\n return null;\n }\n v = v.trim();\n if (this.currentLeavesNameCache.has(v)) {\n return this.currentLeavesNameCache.get(v)!;\n }\n if (this.currentLeavesPathCache.has(v)) {\n return this.currentLeavesPathCache.get(v)!;\n }\n return this.currentLeaves.find((n) => {\n //direct hit or is a child of it\n return n.path === v || n.name === v || v!.startsWith(n.path + this.hierarchySeparator);\n }) || null;\n }\n\n get dataLength() {\n return this.currentLeaves.length;\n }\n\n get labels() {\n return this.currentLeaves.map((d) => d.label);\n }\n\n getValue(row: IDataRow) {\n const v = this.getCategory(row);\n return v ? v.name : null;\n }\n\n getCategories(row: IDataRow) {\n return [this.getCategory(row)];\n }\n\n iterCategory(row: IDataRow) {\n return [this.getCategory(row)];\n }\n\n getLabel(row: IDataRow) {\n return CategoricalColumn.prototype.getLabel.call(this, row);\n }\n\n getColor(row: IDataRow) {\n return CategoricalColumn.prototype.getColor.call(this, row);\n }\n\n getLabels(row: IDataRow) {\n return CategoricalColumn.prototype.getLabels.call(this, row);\n }\n\n getValues(row: IDataRow) {\n return CategoricalColumn.prototype.getValues.call(this, row);\n }\n\n getMap(row: IDataRow) {\n return CategoricalColumn.prototype.getMap.call(this, row);\n }\n\n getMapLabel(row: IDataRow) {\n return CategoricalColumn.prototype.getMapLabel.call(this, row);\n }\n\n getSet(row: IDataRow) {\n return CategoricalColumn.prototype.getSet.call(this, row);\n }\n\n toCompareValue(row: IDataRow) {\n return CategoricalColumn.prototype.toCompareValue.call(this, row);\n }\n\n toCompareValueType() {\n return CategoricalColumn.prototype.toCompareValueType.call(this);\n }\n\n group(row: IDataRow): IGroup {\n const base = this.getCategory(row);\n if (!base) {\n return Object.assign({}, missingGroup);\n }\n return {name: base.label, color: base.color};\n }\n\n private updateCaches() {\n this.currentLeavesPathCache.clear();\n this.currentLeavesNameCache.clear();\n\n this.currentLeaves.forEach((n) => {\n this.currentLeavesPathCache.set(n.path, n);\n this.currentLeavesNameCache.set(n.name, n);\n });\n }\n}\n\nfunction computeLeaves(node: ICategoryInternalNode, maxDepth: number = Infinity) {\n const leaves: ICategoryInternalNode[] = [];\n //depth first\n const visit = (node: ICategoryInternalNode, depth: number) => {\n //hit or end\n if (depth >= maxDepth || node.children.length === 0) {\n leaves.push(node);\n } else {\n // go down\n node.children.forEach((c) => visit(c, depth + 1));\n }\n };\n visit(node, 0);\n return leaves;\n}\n\nexport function resolveInnerNodes(node: ICategoryInternalNode) {\n //breath first\n const queue: ICategoryInternalNode[] = [node];\n let index = 0;\n while (index < queue.length) {\n const next = queue[index++];\n for (const n of next.children) {\n queue.push(n);\n }\n }\n return queue;\n}\n\nexport function isHierarchical(categories: (string | Partial<ICategory>)[]) {\n if (categories.length === 0 || typeof categories[0] === 'string') {\n return false;\n }\n // check if any has a given parent name\n return categories.some((c) => (<any>c).parent != null);\n}\n\nexport function deriveHierarchy(categories: (Partial<ICategory> & {parent: string | null})[]) {\n const lookup = new Map<string, ICategoryNode>();\n categories.forEach((c) => {\n const p = c.parent || '';\n // set and fill up proxy\n const item = Object.assign(<ICategoryNode>{\n children: [],\n label: c.name!,\n name: c.name!,\n color: DEFAULT_COLOR,\n value: 0\n }, lookup.get(c.name!) || {}, c);\n lookup.set(c.name!, item);\n\n if (!lookup.has(p)) {\n // create proxy\n lookup.set(p, {name: p, children: [], label: p, value: 0, color: DEFAULT_COLOR});\n }\n lookup.get(p)!.children.push(item);\n });\n const root = lookup.get('')!;\n console.assert(root !== undefined, 'hierarchy with no root');\n if (root.children.length === 1) {\n return root.children[0];\n }\n return root;\n}\n","import {interpolateBlues, interpolateGreens, interpolateGreys, interpolateOranges, interpolatePurples, interpolateReds, interpolateCool, interpolateCubehelixDefault, interpolateWarm, interpolatePlasma, interpolateMagma, interpolateViridis, interpolateInferno, interpolateYlOrRd, interpolateYlOrBr, interpolateBuGn, interpolateBuPu, interpolateGnBu, interpolateOrRd, interpolatePuBuGn, interpolatePuBu, interpolatePuRd, interpolateRdPu, interpolateYlGnBu, interpolateYlGn, interpolateRainbow, interpolateBrBG, interpolatePRGn, interpolatePiYG, interpolatePuOr, interpolateRdBu, interpolateRdGy, interpolateRdYlBu, interpolateRdYlGn, interpolateSpectral} from 'd3-scale-chromatic';\nimport {equal} from '../internal';\nimport {scaleLinear} from 'd3-scale';\nimport {IColorMappingFunction} from '.';\nimport {DEFAULT_COLOR, ITypedDump, ITypeFactory} from './interfaces';\nimport {IColorMappingFunctionConstructor} from './INumberColumn';\n\nexport class SequentialColorFunction implements IColorMappingFunction {\n public static readonly FUNCTIONS: {[key: string]: (v: number) => string} = {\n interpolateBlues,\n interpolateGreens,\n interpolateGreys,\n interpolateOranges,\n interpolatePurples,\n interpolateReds,\n interpolateCool,\n interpolateCubehelixDefault,\n interpolateWarm,\n interpolatePlasma,\n interpolateMagma,\n interpolateViridis,\n interpolateInferno,\n interpolateYlOrRd,\n interpolateYlOrBr,\n interpolateBuGn,\n interpolateBuPu,\n interpolateGnBu,\n interpolateOrRd,\n interpolatePuBuGn,\n interpolatePuBu,\n interpolatePuRd,\n interpolateRdPu,\n interpolateYlGnBu,\n interpolateYlGn,\n interpolateRainbow\n };\n\n public readonly apply: (v: number) => string;\n\n constructor(public readonly name: string) {\n this.apply = SequentialColorFunction.FUNCTIONS[name] || interpolateBlues;\n }\n\n toJSON() {\n return this.name;\n }\n\n clone() {\n return this; // no clone needed since not parameterized\n }\n\n eq(other: IColorMappingFunction): boolean {\n return other instanceof SequentialColorFunction && other.name === this.name;\n }\n}\n\nexport class DivergentColorFunction implements IColorMappingFunction {\n public static readonly FUNCTIONS: {[key: string]: (v: number) => string} = {\n interpolateBrBG,\n interpolatePRGn,\n interpolatePiYG,\n interpolatePuOr,\n interpolateRdBu,\n interpolateRdGy,\n interpolateRdYlBu,\n interpolateRdYlGn,\n interpolateSpectral\n };\n\n public readonly apply: (v: number) => string;\n\n constructor(public readonly name: string) {\n this.apply = DivergentColorFunction.FUNCTIONS[name] || interpolateBlues;\n }\n\n toJSON() {\n return this.name;\n }\n\n clone() {\n return this; // no clone needed since not parameterized\n }\n\n eq(other: IColorMappingFunction): boolean {\n return other instanceof DivergentColorFunction && other.name === this.name;\n }\n}\n\n\nexport class UnknownColorFunction implements IColorMappingFunction {\n constructor(public readonly apply: (v: number) => string) {\n }\n\n toJSON() {\n return this.apply.toString();\n }\n\n clone() {\n return this; // no clone needed since not parameterized\n }\n\n eq(other: IColorMappingFunction): boolean {\n return other instanceof UnknownColorFunction && other.apply === this.apply;\n }\n}\n\nexport class SolidColorFunction implements IColorMappingFunction {\n constructor(public readonly color: string) {\n\n }\n\n apply() {\n return this.color;\n }\n\n toJSON() {\n return this.color;\n }\n\n clone() {\n return this; // no clone needed since not parameterized\n }\n\n eq(other: IColorMappingFunction): boolean {\n return other instanceof SolidColorFunction && other.color === this.color;\n }\n}\n\nexport class QuantizedColorFunction implements IColorMappingFunction {\n public readonly base: IColorMappingFunction;\n public readonly steps: number;\n\n constructor(dump: ITypedDump, factory: ITypeFactory);\n constructor(base: IColorMappingFunction, steps: number)\n constructor(base: IColorMappingFunction | ITypedDump, steps: number | ITypeFactory) {\n if (typeof (<any>base).apply === 'function') {\n this.base = <IColorMappingFunction>base;\n this.steps = steps == null ? 5 : <number>steps;\n } else {\n const dump = <ITypedDump>base;\n this.base = (<ITypeFactory>steps).colorMappingFunction(dump.base);\n this.steps = dump.steps;\n }\n }\n\n apply(v: number) {\n return this.base.apply(quantize(v, this.steps));\n }\n\n toJSON() {\n return {\n type: 'quantized',\n base: this.base.toJSON(),\n steps: this.steps\n };\n }\n\n clone(): QuantizedColorFunction {\n return new QuantizedColorFunction(this.base.clone(), this.steps);\n }\n\n eq(other: IColorMappingFunction): boolean {\n return other instanceof QuantizedColorFunction && other.base.eq(this.base) && other.steps === this.steps;\n }\n}\n\nexport class CustomColorMappingFunction implements IColorMappingFunction {\n private readonly scale = scaleLinear<string>();\n public readonly entries: {value: number, color: string}[];\n\n constructor(dump: ITypedDump);\n constructor(entries: {value: number, color: string}[]);\n constructor(entries: ITypedDump | {value: number, color: string}[]) {\n this.entries = Array.isArray(entries) ? entries : entries.entries;\n this.scale\n .domain(this.entries.map((d) => d.value))\n .range(this.entries.map((d) => d.color))\n .clamp(true);\n }\n\n apply(v: number) {\n return this.scale(v);\n }\n\n toJSON() {\n return {\n type: 'custom',\n entries: this.entries\n };\n }\n\n clone() {\n return new CustomColorMappingFunction(this.entries.slice());\n }\n\n eq(other: IColorMappingFunction): boolean {\n return other instanceof CustomColorMappingFunction && equal(this.entries, other.entries);\n }\n}\n\n/**\n * @internal\n */\nexport function quantize(v: number, steps: number) {\n const perStep = 1 / steps;\n if (v <= perStep) {\n return 0;\n }\n if (v >= (1 - perStep)) {\n return 1;\n }\n for (let acc = 0; acc < 1; acc += perStep) {\n if (v < acc) {\n return acc - perStep / 2; // center\n }\n }\n return v;\n}\n\nexport function colorMappingFunctions() {\n const types: any = {\n [DEFAULT_COLOR]: SolidColorFunction,\n quantized: QuantizedColorFunction,\n custom: CustomColorMappingFunction\n };\n for (const key of Object.keys(SequentialColorFunction.FUNCTIONS)) {\n types[key] = SequentialColorFunction;\n }\n for (const key of Object.keys(DivergentColorFunction.FUNCTIONS)) {\n types[key] = DivergentColorFunction;\n }\n return types;\n}\n\nexport const DEFAULT_COLOR_FUNCTION = new SolidColorFunction(DEFAULT_COLOR);\n\n\n/**\n * @internal\n */\nexport function createColorMappingFunction(types: {[type: string]: IColorMappingFunctionConstructor}, factory: ITypeFactory) {\n return (dump: ITypedDump | string | ((v: number) => string)): IColorMappingFunction => {\n if (!dump) {\n return DEFAULT_COLOR_FUNCTION;\n }\n if (typeof dump === 'function') {\n return new UnknownColorFunction(dump);\n }\n const typeName = typeof dump === 'string' ? dump : dump.type;\n const type = types[typeName];\n if (type) {\n return new type(dump, factory);\n }\n if (Array.isArray(dump)) {\n return new CustomColorMappingFunction(dump);\n }\n return new SolidColorFunction(dump.toString());\n };\n}\n","import {suffix, IEventListener, ISequence} from '../internal';\nimport {toolbar, SortByDefault} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport CompositeColumn, {addColumn, filterChanged, moveColumn, removeColumn} from './CompositeColumn';\nimport {IDataRow, IGroup, IColumnDesc, DEFAULT_COLOR} from './interfaces';\nimport {isNumberColumn, INumberColumn, isMapAbleColumn, IColorMappingFunction, IMappingFunction, IMapAbleColumn, INumberFilter} from './INumberColumn';\nimport NumberColumn from './NumberColumn';\nimport {DEFAULT_FORMATTER, noNumberFilter} from './internalNumber';\nimport {ScaleMappingFunction} from './MappingFunction';\nimport {DEFAULT_COLOR_FUNCTION} from './ColorMappingFunction';\nimport {integrateDefaults} from './internal';\n\n\n/**\n * factory for creating a description creating a max column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createImpositionDesc(label: string = 'Imposition') {\n return {type: 'imposition', label};\n}\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf ImpositionCompositeColumn\n * @event\n */\nexport declare function mappingChanged_ICC(previous: IMappingFunction, current: IMappingFunction): void;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf ImpositionCompositeColumn\n * @event\n */\nexport declare function colorMappingChanged_ICC(previous: IColorMappingFunction, current: IColorMappingFunction): void;\n\n/**\n * implementation of a combine column, standard operations how to select\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'filterNumber', 'colorMapped', 'editMapping')\n@SortByDefault('descending')\nexport default class ImpositionCompositeColumn extends CompositeColumn implements INumberColumn, IMapAbleColumn {\n static readonly EVENT_MAPPING_CHANGED = NumberColumn.EVENT_MAPPING_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = NumberColumn.EVENT_COLOR_MAPPING_CHANGED;\n\n constructor(id: string, desc: Readonly<IColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'number',\n groupRenderer: 'boxplot',\n summaryRenderer: 'histogram'\n }));\n }\n\n get label() {\n const l = super.getMetaData().label;\n const c = this._children;\n if (l !== 'Imposition' || c.length === 0) {\n return l;\n }\n if (c.length === 1) {\n return c[0].label;\n }\n const w = this.wrapper;\n const rest = this.rest;\n return `${w ? w.label : '?'} (${rest.map((c) => c.label).join(', ')})`;\n }\n\n private get wrapper(): INumberColumn | null {\n return <INumberColumn>this._children.find(isNumberColumn) || null;\n }\n\n private get rest() {\n const w = this.wrapper;\n return this._children.filter((d) => d !== w);\n }\n\n protected createEventList() {\n return super.createEventList().concat([ImpositionCompositeColumn.EVENT_MAPPING_CHANGED, ImpositionCompositeColumn.EVENT_COLOR_MAPPING_CHANGED]);\n }\n\n on(type: typeof ImpositionCompositeColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_ICC | null): this;\n on(type: typeof ImpositionCompositeColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged_ICC | null): this;\n on(type: typeof CompositeColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n getLabel(row: IDataRow) {\n const c = this._children;\n if (c.length === 0) {\n return '';\n }\n if (c.length === 1) {\n return c[0].getLabel(row);\n }\n const w = this.wrapper;\n const rest = this.rest;\n return `${w ? w.getLabel(row) : '?'} (${rest.map((c) => `${c.label} = ${c.getLabel(row)}`).join(', ')})`;\n }\n\n getColor(row: IDataRow) {\n const c = this._children;\n switch (c.length) {\n case 0:\n return DEFAULT_COLOR;\n case 1:\n return c[0].getColor(row);\n default:\n return this.rest[0].getColor(row);\n }\n }\n\n getNumberFormat() {\n const w = this.wrapper;\n return w ? w.getNumberFormat() : DEFAULT_FORMATTER;\n }\n\n getValue(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getValue(row) : NaN;\n }\n\n getNumber(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getNumber(row) : NaN;\n }\n\n getRawNumber(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getRawNumber(row) : NaN;\n }\n\n iterNumber(row: IDataRow) {\n return [this.getNumber(row)];\n }\n\n iterRawNumber(row: IDataRow) {\n return [this.getRawNumber(row)];\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n const value = this.getRawNumber(row);\n if (isNaN(value)) {\n return null;\n }\n return {\n label: this.getLabel(row),\n color: this.getColor(row),\n value\n };\n }\n return super.getExportValue(row, format);\n }\n\n getMapping() {\n const w = this.wrapper;\n return w && isMapAbleColumn(w) ? w.getMapping() : new ScaleMappingFunction();\n }\n\n getOriginalMapping() {\n const w = this.wrapper;\n return w && isMapAbleColumn(w) ? w.getOriginalMapping() : new ScaleMappingFunction();\n }\n\n setMapping(mapping: IMappingFunction): void {\n const w = this.wrapper;\n return w && isMapAbleColumn(w) ? w.setMapping(mapping) : undefined;\n }\n\n getColorMapping() {\n const w = this.wrapper;\n return w && isMapAbleColumn(w) ? w.getColorMapping() : DEFAULT_COLOR_FUNCTION;\n }\n\n setColorMapping(mapping: IColorMappingFunction) {\n const w = this.wrapper;\n return w && isMapAbleColumn(w) ? w.setColorMapping(mapping) : undefined;\n }\n\n getFilter() {\n const w = this.wrapper;\n return w && isMapAbleColumn(w) ? w.getFilter() : noNumberFilter();\n }\n\n setFilter(value: INumberFilter | null): void {\n const w = this.wrapper;\n return w && isMapAbleColumn(w) ? w.setFilter(value) : undefined;\n }\n\n getRange(): [string, string] {\n const w = this.wrapper;\n return w && isMapAbleColumn(w) ? w.getRange() : ['0', '1'];\n }\n\n toCompareValue(row: IDataRow) {\n return NumberColumn.prototype.toCompareValue.call(this, row);\n }\n\n toCompareValueType() {\n return NumberColumn.prototype.toCompareValueType.call(this);\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, group: IGroup) {\n return NumberColumn.prototype.toCompareGroupValue.call(this, rows, group);\n }\n\n toCompareGroupValueType() {\n return NumberColumn.prototype.toCompareGroupValueType.call(this);\n }\n\n insert(col: Column, index: number): Column | null {\n if (this._children.length === 1 && !this.wrapper && !isNumberColumn(col)) {\n // at least one has to be a number column\n return null;\n }\n if (this._children.length >= 2) {\n // limit to two\n return null;\n }\n return super.insert(col, index);\n }\n\n protected insertImpl(col: Column, index: number) {\n if (isNumberColumn(col)) {\n this.forward(col, ...suffix('.impose', NumberColumn.EVENT_MAPPING_CHANGED));\n }\n if (isMapAbleColumn(col)) {\n this.forward(col, ...suffix('.impose', NumberColumn.EVENT_COLOR_MAPPING_CHANGED));\n }\n return super.insertImpl(col, index);\n }\n\n protected removeImpl(child: Column, index: number) {\n if (isNumberColumn(child)) {\n this.unforward(child, ...suffix('.impose', NumberColumn.EVENT_MAPPING_CHANGED));\n }\n if (isMapAbleColumn(child)) {\n this.unforward(child, ...suffix('.impose', NumberColumn.EVENT_COLOR_MAPPING_CHANGED));\n }\n return super.removeImpl(child, index);\n }\n}\n","import {format} from 'd3-format';\nimport {boxplotBuilder, IAdvancedBoxPlotData, IEventListener} from '../internal';\nimport {dialogAddons, SortByDefault, toolbar} from './annotations';\nimport ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';\nimport Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';\nimport {IArrayDesc} from './IArrayColumn';\nimport {IDataRow, ECompareValueType, ITypeFactory} from './interfaces';\nimport {DEFAULT_FORMATTER, getBoxPlotNumber, isDummyNumberFilter, noNumberFilter, restoreNumberFilter, toCompareBoxPlotValue} from './internalNumber';\nimport {EAdvancedSortMethod, IColorMappingFunction, IMappingFunction, INumberDesc, INumberFilter, INumbersColumn} from './INumberColumn';\nimport {restoreMapping} from './MappingFunction';\nimport {isMissingValue} from './missing';\nimport NumberColumn from './NumberColumn';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {integrateDefaults} from './internal';\n\n\nexport interface INumbersDesc extends IArrayDesc, INumberDesc {\n readonly sort?: EAdvancedSortMethod;\n}\n\nexport declare type INumbersColumnDesc = INumbersDesc & IArrayColumnDesc<number>;\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf NumbersColumn\n * @event\n */\nexport declare function mappingChanged_NCS(previous: IMappingFunction, current: IMappingFunction): void;\n/**\n * emitted when the color mapping property changes\n * @asMemberOf NumbersColumn\n * @event\n */\nexport declare function colorMappingChanged_NCS(previous: IColorMappingFunction, current: IColorMappingFunction): void;\n\n/**\n * emitted when the sort method property changes\n * @asMemberOf NumbersColumn\n * @event\n */\nexport declare function sortMethodChanged_NCS(previous: EAdvancedSortMethod, current: EAdvancedSortMethod): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf NumbersColumn\n * @event\n */\nexport declare function filterChanged_NCS(previous: INumberFilter | null, current: INumberFilter | null): void;\n\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'filterNumber', 'colorMapped', 'editMapping')\n@dialogAddons('sort', 'sortNumbers')\n@SortByDefault('descending')\nexport default class NumbersColumn extends ArrayColumn<number> implements INumbersColumn {\n static readonly EVENT_MAPPING_CHANGED = NumberColumn.EVENT_MAPPING_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = NumberColumn.EVENT_COLOR_MAPPING_CHANGED;\n static readonly EVENT_SORTMETHOD_CHANGED = NumberColumn.EVENT_SORTMETHOD_CHANGED;\n static readonly EVENT_FILTER_CHANGED = NumberColumn.EVENT_FILTER_CHANGED;\n\n static readonly CENTER = 0;\n\n private readonly numberFormat: (n: number) => string = DEFAULT_FORMATTER;\n\n private sort: EAdvancedSortMethod;\n private mapping: IMappingFunction;\n private original: IMappingFunction;\n private colorMapping: IColorMappingFunction;\n /**\n * currently active filter\n * @type {{min: number, max: number}}\n * @private\n */\n private currentFilter: INumberFilter = noNumberFilter();\n\n constructor(id: string, desc: Readonly<INumbersColumnDesc>, factory: ITypeFactory) {\n super(id, integrateDefaults(desc, Object.assign({\n renderer: 'heatmap',\n groupRenderer: 'heatmap',\n summaryRenderer: 'histogram'\n }, desc.dataLength != null && !Number.isNaN(desc.dataLength) ? {\n // better initialize the default with based on the data length\n width: Math.min(Math.max(100, desc.dataLength! * 10), 500)\n } : {})));\n this.mapping = restoreMapping(desc, factory);\n this.original = this.mapping.clone();\n this.colorMapping = factory.colorMappingFunction(desc.colorMapping || desc.color);\n\n if (desc.numberFormat) {\n this.numberFormat = format(desc.numberFormat);\n }\n\n this.sort = desc.sort || EAdvancedSortMethod.median;\n }\n\n getNumberFormat() {\n return this.numberFormat;\n }\n\n toCompareValue(row: IDataRow): number {\n return toCompareBoxPlotValue(this, row);\n }\n\n toCompareValueType() {\n return ECompareValueType.FLOAT;\n }\n\n getRawNumbers(row: IDataRow) {\n return this.getRawValue(row);\n }\n\n getBoxPlotData(row: IDataRow): IAdvancedBoxPlotData | null {\n const data = this.getRawValue(row);\n if (data == null) {\n return null;\n }\n const b = boxplotBuilder();\n for (const d of data) {\n b.push(isMissingValue(d) ? NaN : this.mapping.apply(d));\n }\n return b.build();\n }\n\n getRange() {\n return this.mapping.getRange(this.numberFormat);\n }\n\n getRawBoxPlotData(row: IDataRow): IAdvancedBoxPlotData | null {\n const data = this.getRawValue(row);\n if (data == null) {\n return null;\n }\n const b = boxplotBuilder();\n for (const d of data) {\n b.push(isMissingValue(d) ? NaN : d);\n }\n return b.build();\n }\n\n getNumbers(row: IDataRow) {\n return this.getValues(row);\n }\n\n getNumber(row: IDataRow): number {\n return getBoxPlotNumber(this, row, 'normalized');\n }\n\n getRawNumber(row: IDataRow): number {\n return getBoxPlotNumber(this, row, 'raw');\n }\n\n getValue(row: IDataRow) {\n const v = this.getValues(row);\n return v.every(isNaN) ? null : v;\n }\n\n getValues(row: IDataRow) {\n return this.getRawValue(row).map((d) => isNaN(d) ? NaN : this.mapping.apply(d));\n }\n\n iterNumber(row: IDataRow) {\n const v = this.getNumbers(row);\n if (v.every(isNaN)) {\n // missing row\n return [NaN];\n }\n return v;\n }\n\n iterRawNumber(row: IDataRow) {\n const v = this.getRawNumbers(row);\n if (v.every(isNaN)) {\n // missing row\n return [NaN];\n }\n return v;\n }\n\n getRawValue(row: IDataRow) {\n const r = super.getRaw(row);\n return r == null ? [] : r.map((d) => isMissingValue(d) ? NaN : +d);\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n return format === 'json' ? this.getRawValue(row) : super.getExportValue(row, format);\n }\n\n getLabels(row: IDataRow) {\n return this.getRawValue(row).map(this.numberFormat);\n }\n\n getSortMethod() {\n return this.sort;\n }\n\n setSortMethod(sort: EAdvancedSortMethod) {\n if (this.sort === sort) {\n return;\n }\n this.fire([NumbersColumn.EVENT_SORTMETHOD_CHANGED, NumberColumn.EVENT_DIRTY_HEADER, NumberColumn.EVENT_DIRTY_VALUES, NumbersColumn.EVENT_DIRTY_CACHES, NumberColumn.EVENT_DIRTY], this.sort, this.sort = sort);\n // sort by me if not already sorted by me\n if (!this.isSortedByMe().asc) {\n this.sortByMe();\n }\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.sortMethod = this.getSortMethod();\n r.filter = !isDummyNumberFilter(this.currentFilter) ? this.currentFilter : null;\n r.map = this.mapping.toJSON();\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (dump.sortMethod) {\n this.sort = dump.sortMethod;\n }\n if (dump.filter) {\n this.currentFilter = restoreNumberFilter(dump.filter);\n }\n if (dump.map || dump.domain) {\n this.mapping = restoreMapping(dump, factory);\n }\n if (dump.colorMapping) {\n this.colorMapping = factory.colorMappingFunction(dump.colorMapping);\n }\n }\n\n protected createEventList() {\n return super.createEventList().concat([NumbersColumn.EVENT_COLOR_MAPPING_CHANGED, NumbersColumn.EVENT_MAPPING_CHANGED, NumbersColumn.EVENT_SORTMETHOD_CHANGED, NumbersColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof NumbersColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_NCS | null): this;\n on(type: typeof NumbersColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged_NCS | null): this;\n on(type: typeof NumbersColumn.EVENT_SORTMETHOD_CHANGED, listener: typeof sortMethodChanged_NCS | null): this;\n on(type: typeof NumbersColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_NCS | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getOriginalMapping() {\n return this.original.clone();\n }\n\n getMapping() {\n return this.mapping.clone();\n }\n\n setMapping(mapping: IMappingFunction) {\n if (this.mapping.eq(mapping)) {\n return;\n }\n this.fire([NumbersColumn.EVENT_MAPPING_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.mapping.clone(), this.mapping = mapping);\n }\n\n getColor(row: IDataRow) {\n return NumberColumn.prototype.getColor.call(this, row);\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: IColorMappingFunction) {\n if (this.colorMapping.eq(mapping)) {\n return;\n }\n this.fire([NumbersColumn.EVENT_COLOR_MAPPING_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.colorMapping.clone(), this.colorMapping = mapping);\n }\n\n isFiltered() {\n return NumberColumn.prototype.isFiltered.call(this);\n }\n\n getFilter(): INumberFilter {\n return NumberColumn.prototype.getFilter.call(this);\n }\n\n setFilter(value: INumberFilter | null) {\n NumberColumn.prototype.setFilter.call(this, value);\n }\n\n filter(row: IDataRow) {\n return NumberColumn.prototype.filter.call(this, row);\n }\n\n clearFilter() {\n return NumberColumn.prototype.clearFilter.call(this);\n }\n}\n\n","import {IBoxPlotData} from '../internal';\nimport {suffix, ISequence, IEventListener} from '../internal';\nimport {toolbar, SortByDefault, dialogAddons} from './annotations';\nimport BoxPlotColumn from './BoxPlotColumn';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport CompositeColumn, {addColumn, filterChanged, moveColumn, removeColumn} from './CompositeColumn';\nimport {IDataRow, IGroup, IColumnDesc, DEFAULT_COLOR} from './interfaces';\nimport {ESortMethod, IBoxPlotColumn, INumberFilter, isBoxPlotColumn, IMappingFunction, IColorMappingFunction, isMapAbleColumn} from './INumberColumn';\nimport {ScaleMappingFunction} from './MappingFunction';\nimport NumbersColumn from './NumbersColumn';\nimport {DEFAULT_COLOR_FUNCTION} from './ColorMappingFunction';\nimport {DEFAULT_FORMATTER, noNumberFilter} from './internalNumber';\nimport {integrateDefaults} from './internal';\n\n\n/**\n * factory for creating a description creating a max column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createImpositionBoxPlotDesc(label: string = 'Imposition') {\n return {type: 'impositions', label};\n}\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf ImpositionBoxPlotColumn\n * @event\n */\nexport declare function mappingChanged_IPBC(previous: IMappingFunction, current: IMappingFunction): void;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf ImpositionBoxPlotColumn\n * @event\n */\nexport declare function colorMappingChanged_IPBC(previous: IColorMappingFunction, current: IColorMappingFunction): void;\n\n\n/**\n * implementation of a combine column, standard operations how to select\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'filterNumber', 'colorMapped', 'editMapping')\n@dialogAddons('sort', 'sortBoxPlot')\n@SortByDefault('descending')\nexport default class ImpositionBoxPlotColumn extends CompositeColumn implements IBoxPlotColumn {\n static readonly EVENT_MAPPING_CHANGED = NumbersColumn.EVENT_MAPPING_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = NumbersColumn.EVENT_COLOR_MAPPING_CHANGED;\n\n constructor(id: string, desc: Readonly<IColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'boxplot',\n groupRenderer: 'boxplot',\n summaryRenderer: 'boxplot'\n }));\n }\n\n get label() {\n const l = super.getMetaData().label;\n const c = this._children;\n if (l !== 'Imposition' || c.length === 0) {\n return l;\n }\n if (c.length === 1) {\n return c[0].label;\n }\n const w = this.wrapper;\n const rest = this.rest;\n return `${w ? w.label : '?'} (${rest.map((c) => c.label).join(', ')})`;\n }\n\n private get wrapper(): IBoxPlotColumn | null {\n return <IBoxPlotColumn>this._children.find(isBoxPlotColumn) || null;\n }\n\n private get rest() {\n const w = this.wrapper;\n return this._children.filter((d) => d !== w);\n }\n\n getLabel(row: IDataRow) {\n const c = this._children;\n if (c.length === 0) {\n return '';\n }\n if (c.length === 1) {\n return c[0].getLabel(row);\n }\n const w = this.wrapper;\n const rest = this.rest;\n return `${w ? w.getLabel(row) : '?'} (${rest.map((c) => `${c.label} = ${c.getLabel(row)}`)})`;\n }\n\n getColor(row: IDataRow) {\n const c = this._children;\n switch (c.length) {\n case 0:\n return DEFAULT_COLOR;\n case 1:\n return c[0].getColor(row);\n default:\n return this.rest[0].getColor(row);\n }\n }\n\n protected createEventList() {\n return super.createEventList().concat([ImpositionBoxPlotColumn.EVENT_MAPPING_CHANGED, ImpositionBoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED]);\n }\n\n on(type: typeof ImpositionBoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_IPBC | null): this;\n on(type: typeof ImpositionBoxPlotColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged_IPBC | null): this;\n on(type: typeof CompositeColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n getNumberFormat() {\n const w = this.wrapper;\n return w ? w.getNumberFormat() : DEFAULT_FORMATTER;\n }\n\n getValue(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getValue(row) : null;\n }\n\n getNumber(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getNumber(row) : NaN;\n }\n\n getRawNumber(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getRawNumber(row) : NaN;\n }\n\n iterNumber(row: IDataRow) {\n return [this.getNumber(row)];\n }\n\n iterRawNumber(row: IDataRow) {\n return [this.getRawNumber(row)];\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n const value = this.getRawNumber(row);\n if (isNaN(value)) {\n return null;\n }\n return {\n label: this.getLabel(row),\n color: this.getColor(row),\n value\n };\n }\n return super.getExportValue(row, format);\n }\n\n getBoxPlotData(row: IDataRow): IBoxPlotData | null {\n const w = this.wrapper;\n return w ? w.getBoxPlotData(row) : null;\n }\n\n getRawBoxPlotData(row: IDataRow): IBoxPlotData | null {\n const w = this.wrapper;\n return w ? w.getRawBoxPlotData(row) : null;\n }\n\n getMapping() {\n const w = this.wrapper;\n return w ? w.getMapping() : new ScaleMappingFunction();\n }\n\n getOriginalMapping() {\n const w = this.wrapper;\n return w ? w.getOriginalMapping() : new ScaleMappingFunction();\n }\n\n getSortMethod() {\n const w = this.wrapper;\n return w ? w.getSortMethod() : ESortMethod.min;\n }\n\n setSortMethod(value: ESortMethod) {\n const w = this.wrapper;\n return w ? w.setSortMethod(value) : undefined;\n }\n\n setMapping(mapping: IMappingFunction): void {\n const w = this.wrapper;\n return w ? w.setMapping(mapping) : undefined;\n }\n\n getColorMapping() {\n const w = this.wrapper;\n return w ? w.getColorMapping() : DEFAULT_COLOR_FUNCTION;\n }\n\n setColorMapping(mapping: IColorMappingFunction) {\n const w = this.wrapper;\n return w ? w.setColorMapping(mapping) : undefined;\n }\n\n getFilter() {\n const w = this.wrapper;\n return w ? w.getFilter() : noNumberFilter();\n }\n\n setFilter(value: INumberFilter | null): void {\n const w = this.wrapper;\n return w ? w.setFilter(value) : undefined;\n }\n\n getRange(): [string, string] {\n const w = this.wrapper;\n return w ? w.getRange() : ['0', '1'];\n }\n\n toCompareValue(row: IDataRow) {\n return BoxPlotColumn.prototype.toCompareValue.call(this, row);\n }\n\n toCompareValueType() {\n return BoxPlotColumn.prototype.toCompareValueType.call(this);\n }\n\n group(row: IDataRow) {\n return BoxPlotColumn.prototype.group.call(this, row);\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, group: IGroup) {\n return BoxPlotColumn.prototype.toCompareGroupValue.call(this, rows, group);\n }\n\n toCompareGroupValueType() {\n return BoxPlotColumn.prototype.toCompareGroupValueType.call(this);\n }\n\n insert(col: Column, index: number): Column | null {\n if (this._children.length === 1 && !this.wrapper && !isBoxPlotColumn(col)) {\n // at least one has to be a number column\n return null;\n }\n if (this._children.length >= 2) {\n // limit to two\n return null;\n }\n return super.insert(col, index);\n }\n\n protected insertImpl(col: Column, index: number) {\n if (isBoxPlotColumn(col)) {\n this.forward(col, ...suffix('.impose', BoxPlotColumn.EVENT_MAPPING_CHANGED, BoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED));\n } else if (isMapAbleColumn(col)) {\n this.forward(col, ...suffix('.impose', BoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED));\n }\n return super.insertImpl(col, index);\n }\n\n protected removeImpl(child: Column, index: number) {\n if (isBoxPlotColumn(child)) {\n this.unforward(child, ...suffix('.impose', BoxPlotColumn.EVENT_MAPPING_CHANGED, BoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED));\n } else if (isMapAbleColumn(child)) {\n this.unforward(child, ...suffix('.impose', BoxPlotColumn.EVENT_COLOR_MAPPING_CHANGED));\n }\n return super.removeImpl(child, index);\n }\n}\n","import {suffix, IEventListener, IAdvancedBoxPlotData} from '../internal';\nimport {toolbar, dialogAddons, SortByDefault} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport CompositeColumn, {addColumn, filterChanged, moveColumn, removeColumn} from './CompositeColumn';\nimport {IKeyValue} from './IArrayColumn';\nimport {IDataRow, IGroup, IColumnDesc, DEFAULT_COLOR} from './interfaces';\nimport {EAdvancedSortMethod, INumberFilter, INumbersColumn, isNumbersColumn, IMappingFunction, IColorMappingFunction, isMapAbleColumn} from './INumberColumn';\nimport {ScaleMappingFunction} from './MappingFunction';\nimport NumbersColumn from './NumbersColumn';\nimport {DEFAULT_COLOR_FUNCTION} from './ColorMappingFunction';\nimport {DEFAULT_FORMATTER, noNumberFilter} from './internalNumber';\nimport {integrateDefaults} from './internal';\n\n\n/**\n * factory for creating a description creating a max column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createImpositionsDesc(label: string = 'Imposition') {\n return {type: 'impositions', label};\n}\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf ImpositionCompositesColumn\n * @event\n */\nexport declare function mappingChanged_ICCS(previous: IMappingFunction, current: IMappingFunction): void;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf ImpositionCompositesColumn\n * @event\n */\nexport declare function colorMappingChanged_ICCS(previous: IColorMappingFunction, current: IColorMappingFunction): void;\n\n/**\n * implementation of a combine column, standard operations how to select\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'filterNumber', 'colorMapped', 'editMapping')\n@dialogAddons('sort', 'sortNumbers')\n@SortByDefault('descending')\nexport default class ImpositionCompositesColumn extends CompositeColumn implements INumbersColumn {\n static readonly EVENT_MAPPING_CHANGED = NumbersColumn.EVENT_MAPPING_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = NumbersColumn.EVENT_COLOR_MAPPING_CHANGED;\n\n constructor(id: string, desc: Readonly<IColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'numbers',\n groupRenderer: 'numbers',\n summaryRenderer: 'histogram'\n }));\n }\n\n get label() {\n const l = super.getMetaData().label;\n const c = this._children;\n if (l !== 'Imposition' || c.length === 0) {\n return l;\n }\n if (c.length === 1) {\n return c[0].label;\n }\n const w = this.wrapper;\n const rest = this.rest;\n return `${w ? w.label : '?'} (${rest.map((c) => c.label).join(', ')})`;\n }\n\n private get wrapper(): INumbersColumn | null {\n return <INumbersColumn>this._children.find(isNumbersColumn) || null;\n }\n\n private get rest() {\n const w = this.wrapper;\n return this._children.filter((d) => d !== w);\n }\n\n getLabel(row: IDataRow) {\n const c = this._children;\n if (c.length === 0) {\n return '';\n }\n if (c.length === 1) {\n return c[0].getLabel(row);\n }\n const w = this.wrapper;\n const rest = this.rest;\n return `${w ? w.getLabel(row) : '?'} (${rest.map((c) => `${c.label} = ${c.getLabel(row)}`)})`;\n }\n\n getColor(row: IDataRow) {\n const c = this._children;\n switch (c.length) {\n case 0:\n return DEFAULT_COLOR;\n case 1:\n return c[0].getColor(row);\n default:\n return this.rest[0].getColor(row);\n }\n }\n\n protected createEventList() {\n return super.createEventList().concat([ImpositionCompositesColumn.EVENT_MAPPING_CHANGED, ImpositionCompositesColumn.EVENT_COLOR_MAPPING_CHANGED]);\n }\n\n on(type: typeof ImpositionCompositesColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_ICCS | null): this;\n on(type: typeof ImpositionCompositesColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged_ICCS | null): this;\n on(type: typeof CompositeColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n get labels() {\n const w = this.wrapper;\n return w ? w.labels : [];\n }\n\n get dataLength() {\n const w = this.wrapper;\n return w ? w.dataLength : null;\n }\n\n getNumberFormat() {\n const w = this.wrapper;\n return w ? w.getNumberFormat() : DEFAULT_FORMATTER;\n }\n\n getValue(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getValue(row) : [];\n }\n\n getNumber(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getNumber(row) : NaN;\n }\n\n getRawNumber(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getRawNumber(row) : NaN;\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n const value = this.getRawNumber(row);\n if (isNaN(value)) {\n return null;\n }\n return {\n label: this.getLabels(row),\n color: this.getColor(row)\n };\n }\n return super.getExportValue(row, format);\n }\n\n getNumbers(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getNumbers(row) : [];\n }\n\n getRawNumbers(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getRawNumbers(row) : [];\n }\n\n iterNumber(row: IDataRow) {\n return this.getNumbers(row);\n }\n\n iterRawNumber(row: IDataRow) {\n return this.getRawNumbers(row);\n }\n\n getBoxPlotData(row: IDataRow): IAdvancedBoxPlotData | null {\n const w = this.wrapper;\n return w ? w.getBoxPlotData(row) : null;\n }\n\n getRawBoxPlotData(row: IDataRow): IAdvancedBoxPlotData | null {\n const w = this.wrapper;\n return w ? w.getRawBoxPlotData(row) : null;\n }\n\n getMapping() {\n const w = this.wrapper;\n return w ? w.getMapping() : new ScaleMappingFunction();\n }\n\n getOriginalMapping() {\n const w = this.wrapper;\n return w ? w.getOriginalMapping() : new ScaleMappingFunction();\n }\n\n getSortMethod() {\n const w = this.wrapper;\n return w ? w.getSortMethod() : EAdvancedSortMethod.min;\n }\n\n setSortMethod(value: EAdvancedSortMethod) {\n const w = this.wrapper;\n return w ? w.setSortMethod(value) : undefined;\n }\n\n setMapping(mapping: IMappingFunction): void {\n const w = this.wrapper;\n return w ? w.setMapping(mapping) : undefined;\n }\n\n getColorMapping() {\n const w = this.wrapper;\n return w ? w.getColorMapping() : DEFAULT_COLOR_FUNCTION;\n }\n\n setColorMapping(mapping: IColorMappingFunction) {\n const w = this.wrapper;\n return w ? w.setColorMapping(mapping) : undefined;\n }\n\n getFilter() {\n const w = this.wrapper;\n return w ? w.getFilter() : noNumberFilter();\n }\n\n setFilter(value: INumberFilter | null): void {\n const w = this.wrapper;\n return w ? w.setFilter(value) : undefined;\n }\n\n getRange(): [string, string] {\n const w = this.wrapper;\n return w ? w.getRange() : ['0', '1'];\n }\n\n getMap(row: IDataRow): IKeyValue<number>[] {\n const w = this.wrapper;\n return w ? w.getMap(row) : [];\n }\n\n getMapLabel(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getMapLabel(row) : [];\n }\n\n getLabels(row: IDataRow): string[] {\n const w = this.wrapper;\n return w ? w.getLabels(row) : [];\n }\n\n getValues(row: IDataRow) {\n const w = this.wrapper;\n return w ? w.getValues(row) : [];\n }\n\n toCompareValue(row: IDataRow) {\n return NumbersColumn.prototype.toCompareValue.call(this, row);\n }\n\n toCompareValueType() {\n return NumbersColumn.prototype.toCompareValueType.call(this);\n }\n\n toCompareGroupValue(rows: IDataRow[], group: IGroup) {\n return NumbersColumn.prototype.toCompareGroupValue.call(this, rows, group);\n }\n\n toCompareGroupValueType() {\n return NumbersColumn.prototype.toCompareGroupValueType.call(this);\n }\n\n insert(col: Column, index: number): Column | null {\n if (this._children.length === 1 && !this.wrapper && !isNumbersColumn(col)) {\n // at least one has to be a number column\n return null;\n }\n if (this._children.length >= 2) {\n // limit to two\n return null;\n }\n return super.insert(col, index);\n }\n\n protected insertImpl(col: Column, index: number) {\n if (isNumbersColumn(col)) {\n this.forward(col, ...suffix('.impose', NumbersColumn.EVENT_MAPPING_CHANGED));\n }\n if (isMapAbleColumn(col)) {\n this.forward(col, ...suffix('.impose', NumbersColumn.EVENT_COLOR_MAPPING_CHANGED));\n }\n return super.insertImpl(col, index);\n }\n\n protected removeImpl(child: Column, index: number) {\n if (isNumbersColumn(child)) {\n this.unforward(child, ...suffix('.impose', NumbersColumn.EVENT_MAPPING_CHANGED));\n }\n if (isMapAbleColumn(child)) {\n this.unforward(child, ...suffix('.impose', NumbersColumn.EVENT_COLOR_MAPPING_CHANGED));\n }\n return super.removeImpl(child, index);\n }\n}\n","import {format} from 'd3-format';\nimport CompositeColumn from './CompositeColumn';\nimport {IDataRow, IGroup, IColumnDesc} from './interfaces';\nimport {isMissingValue} from './missing';\nimport NumberColumn from './NumberColumn';\nimport {SortByDefault, toolbar} from './annotations';\nimport {ISequence} from '../internal';\nimport {INumberColumn} from './INumberColumn';\n\nexport interface ICompositeNumberDesc extends IColumnDesc {\n /**\n * d3 format number Format\n * @default 0.3n\n */\n numberFormat?: string;\n}\n\nexport declare type ICompositeNumberColumnDesc = ICompositeNumberDesc & IColumnDesc;\n\n/**\n * implementation of a combine column, standard operations how to select\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'group', 'groupBy')\n@SortByDefault('descending')\nexport default class CompositeNumberColumn extends CompositeColumn implements INumberColumn {\n private readonly numberFormat: (n: number) => string = format('.3n');\n\n constructor(id: string, desc: Readonly<ICompositeNumberColumnDesc>) {\n super(id, desc);\n\n if (desc.numberFormat) {\n this.numberFormat = format(desc.numberFormat);\n }\n }\n\n getNumberFormat() {\n return this.numberFormat;\n }\n\n getLabel(row: IDataRow) {\n if (!this.isLoaded()) {\n return '';\n }\n const v = this.getValue(row);\n //keep non number if it is not a number else convert using formatter\n return String(typeof v === 'number' && !isNaN(v) && isFinite(v) ? this.numberFormat(v) : v);\n }\n\n getValue(row: IDataRow) {\n if (!this.isLoaded()) {\n return null;\n }\n //weighted sum\n const v = this.compute(row);\n if (isMissingValue(v)) {\n return null;\n }\n return v;\n }\n\n protected compute(_row: IDataRow) {\n return NaN;\n }\n\n getNumber(row: IDataRow) {\n const r = this.getValue(row);\n return r == null ? NaN : r;\n }\n\n getRawNumber(row: IDataRow) {\n return this.getNumber(row);\n }\n\n iterNumber(row: IDataRow) {\n return [this.getNumber(row)];\n }\n\n iterRawNumber(row: IDataRow) {\n return [this.getRawNumber(row)];\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n return {\n value: this.getRawNumber(row),\n children: this.children.map((d) => d.getExportValue(row, format))\n };\n }\n return super.getExportValue(row, format);\n }\n\n toCompareValue(row: IDataRow) {\n return NumberColumn.prototype.toCompareValue.call(this, row);\n }\n\n toCompareValueType() {\n return NumberColumn.prototype.toCompareValueType.call(this);\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, group: IGroup) {\n return NumberColumn.prototype.toCompareGroupValue.call(this, rows, group);\n }\n\n toCompareGroupValueType() {\n return NumberColumn.prototype.toCompareGroupValueType.call(this);\n }\n\n getRenderer(): string {\n return NumberColumn.prototype.getRenderer.call(this);\n }\n}\n","import {median, quantile, IEventListener} from '../internal';\nimport {toolbar} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport CompositeColumn, {addColumn, filterChanged, moveColumn, removeColumn} from './CompositeColumn';\nimport CompositeNumberColumn, {ICompositeNumberColumnDesc} from './CompositeNumberColumn';\nimport {IDataRow, DEFAULT_COLOR, ITypeFactory} from './interfaces';\nimport {EAdvancedSortMethod} from './INumberColumn';\nimport {integrateDefaults} from './internal';\n\n/**\n * factory for creating a description creating a max column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createReduceDesc(label: string = 'Reduce') {\n return {type: 'reduce', label};\n}\n\nexport interface IReduceDesc {\n readonly reduce?: EAdvancedSortMethod;\n}\n\n\nexport declare type IReduceColumnDesc = IReduceDesc & ICompositeNumberColumnDesc;\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf ReduceColumn\n * @event\n */\nexport declare function reduceChanged(previous: EAdvancedSortMethod, current: EAdvancedSortMethod): void;\n\n/**\n * combines multiple columns by using the maximal value\n */\n@toolbar('reduce')\nexport default class ReduceColumn extends CompositeNumberColumn {\n static readonly EVENT_REDUCE_CHANGED = 'reduceChanged';\n\n private reduce: EAdvancedSortMethod;\n\n constructor(id: string, desc: Readonly<IReduceColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'interleaving',\n groupRenderer: 'interleaving',\n summaryRenderer: 'interleaving'\n }));\n this.reduce = desc.reduce || EAdvancedSortMethod.max;\n }\n\n get label() {\n const l = super.getMetaData().label;\n if (l !== 'Reduce') {\n return l;\n }\n return `${this.reduce[0].toUpperCase()}${this.reduce.slice(1)}(${this.children.map((d) => d.label).join(', ')})`;\n }\n\n getColor(row: IDataRow) {\n //compute the index of the maximal one\n const c = this._children;\n if (c.length === 0 || this.reduce === EAdvancedSortMethod.q1 || this.reduce === EAdvancedSortMethod.q3 || this.reduce === EAdvancedSortMethod.mean) {\n return DEFAULT_COLOR;\n }\n const v = this.compute(row);\n const selected = c.find((c) => c.getValue(row) === v);\n return selected ? selected.getColor(row) : DEFAULT_COLOR;\n }\n\n protected compute(row: IDataRow) {\n const vs = this._children.map((d) => d.getValue(row)).filter((d) => !isNaN(d));\n if (vs.length === 0) {\n return NaN;\n }\n switch (this.reduce) {\n case EAdvancedSortMethod.mean:\n return vs.reduce((a, b) => a + b, 0) / vs.length;\n case EAdvancedSortMethod.max:\n return vs.reduce((a, b) => Math.max(a, b), Number.NEGATIVE_INFINITY);\n case EAdvancedSortMethod.min:\n return vs.reduce((a, b) => Math.min(a, b), Number.POSITIVE_INFINITY);\n case EAdvancedSortMethod.median:\n return median(vs)!;\n case EAdvancedSortMethod.q1:\n return quantile(vs.sort((a, b) => a - b), 0.25)!;\n case EAdvancedSortMethod.q3:\n return quantile(vs.sort((a, b) => a - b), 0.75)!;\n }\n }\n\n protected createEventList() {\n return super.createEventList().concat([ReduceColumn.EVENT_REDUCE_CHANGED]);\n }\n\n on(type: typeof ReduceColumn.EVENT_REDUCE_CHANGED, listener: typeof reduceChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n getReduce() {\n return this.reduce;\n }\n\n setReduce(reduce: EAdvancedSortMethod) {\n if (this.reduce === reduce) {\n return;\n }\n this.fire([ReduceColumn.EVENT_REDUCE_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.reduce, this.reduce = reduce);\n }\n\n dump(toDescRef: (desc: any) => any) {\n const r = super.dump(toDescRef);\n r.reduce = this.reduce;\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n this.reduce = dump.reduce || this.reduce;\n super.restore(dump, factory);\n }\n\n get canJustAddNumbers() {\n return true;\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n return {\n value: this.getRawNumber(row),\n children: this.children.map((d) => d.getExportValue(row, format))\n };\n }\n return super.getExportValue(row, format);\n }\n}\n","import {round, IEventListener, similar} from '../internal';\nimport {toolbar} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport CompositeColumn, {addColumn, filterChanged, moveColumn, removeColumn} from './CompositeColumn';\nimport CompositeNumberColumn, {ICompositeNumberDesc} from './CompositeNumberColumn';\nimport {IDataRow, IFlatColumn, IMultiLevelColumn, ITypeFactory} from './interfaces';\nimport {integrateDefaults} from './internal';\n\n/**\n * factory for creating a description creating a stacked column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createStackDesc(label: string = 'Weighted Sum') {\n return {type: 'stack', label};\n}\n\n\n/**\n * emitted when the collapse property changes\n * @asMemberOf StackColumn\n * @event\n */\nexport declare function collapseChanged(previous: boolean, current: boolean): void;\n\n\n/**\n * emitted when the weights change\n * @asMemberOf StackColumn\n * @event\n */\nexport declare function weightsChanged(previous: number[], current: number[]): void;\n\n\n/**\n * emitted when the ratios between the children changes\n * @asMemberOf StackColumn\n * @event\n */\nexport declare function nestedChildRatio(previous: number[], current: number[]): void;\n\n/**\n * implementation of the stacked column\n */\n@toolbar('editWeights', 'compress', 'expand')\nexport default class StackColumn extends CompositeNumberColumn implements IMultiLevelColumn {\n static readonly EVENT_COLLAPSE_CHANGED = 'collapseChanged';\n static readonly EVENT_WEIGHTS_CHANGED = 'weightsChanged';\n static readonly EVENT_MULTI_LEVEL_CHANGED = 'nestedChildRatio';\n\n static readonly COLLAPSED_RENDERER = 'number';\n\n private readonly adaptChange: (old: number, newValue: number) => void;\n\n /**\n * whether this stack column is collapsed i.e. just looks like an ordinary number column\n * @type {boolean}\n * @private\n */\n private collapsed = false;\n\n constructor(id: string, desc: ICompositeNumberDesc) {\n super(id, integrateDefaults(desc, {\n renderer: 'stack',\n groupRenderer: 'stack',\n summaryRenderer: 'default'\n }));\n\n const that = this;\n this.adaptChange = function (this: {source: Column}, oldValue, newValue) {\n that.adaptWidthChange(this.source, oldValue, newValue);\n };\n }\n\n get label() {\n const l = super.getMetaData().label;\n const c = this._children;\n if (l !== 'Weighted Sum' || c.length === 0) {\n return l;\n }\n const weights = this.getWeights();\n return c.map((c, i) => `${c.label} (${round(100 * weights[i], 1)}%)`).join(' + ');\n }\n\n protected createEventList() {\n return super.createEventList().concat([StackColumn.EVENT_COLLAPSE_CHANGED, StackColumn.EVENT_WEIGHTS_CHANGED, StackColumn.EVENT_MULTI_LEVEL_CHANGED]);\n }\n\n on(type: typeof StackColumn.EVENT_COLLAPSE_CHANGED, listener: typeof collapseChanged | null): this;\n on(type: typeof StackColumn.EVENT_WEIGHTS_CHANGED, listener: typeof weightsChanged | null): this;\n on(type: typeof StackColumn.EVENT_MULTI_LEVEL_CHANGED, listener: typeof nestedChildRatio | null): this;\n on(type: typeof CompositeColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n setCollapsed(value: boolean) {\n if (this.collapsed === value) {\n return;\n }\n this.fire([StackColumn.EVENT_COLLAPSE_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.collapsed, this.collapsed = value);\n }\n\n getCollapsed() {\n return this.collapsed;\n }\n\n get canJustAddNumbers() {\n return true;\n }\n\n flatten(r: IFlatColumn[], offset: number, levelsToGo = 0, padding = 0) {\n let self = null;\n const children = levelsToGo <= Column.FLAT_ALL_COLUMNS ? this._children : this._children.filter((c) => c.isVisible());\n //no more levels or just this one\n if (levelsToGo === 0 || levelsToGo <= Column.FLAT_ALL_COLUMNS) {\n let w = this.getWidth();\n if (!this.collapsed) {\n w += (children.length - 1) * padding;\n }\n r.push(self = {col: this, offset, width: w});\n if (levelsToGo === 0) {\n return w;\n }\n }\n //push children\n let acc = offset;\n children.forEach((c) => {\n acc += c.flatten(r, acc, levelsToGo - 1, padding) + padding;\n });\n if (self) { //nesting my even increase my width\n self.width = acc - offset - padding;\n }\n return acc - offset - padding;\n }\n\n dump(toDescRef: (desc: any) => any) {\n const r = super.dump(toDescRef);\n r.collapsed = this.collapsed;\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n this.collapsed = dump.collapsed === true;\n super.restore(dump, factory);\n }\n\n /**\n * inserts a column at a the given position\n */\n insert(col: Column, index: number, weight = NaN) {\n if (!isNaN(weight)) {\n col.setWidth((weight / (1 - weight) * this.getWidth()));\n }\n col.on(`${Column.EVENT_WIDTH_CHANGED}.stack`, this.adaptChange);\n //increase my width\n super.setWidth(this.length === 0 ? col.getWidth() : (this.getWidth() + col.getWidth()));\n\n return super.insert(col, index);\n }\n\n push(col: Column, weight = NaN) {\n return this.insert(col, this.length, weight);\n }\n\n insertAfter(col: Column, ref: Column, weight = NaN) {\n const i = this.indexOf(ref);\n if (i < 0) {\n return null;\n }\n return this.insert(col, i + 1, weight);\n }\n\n /**\n * adapts weights according to an own width change\n * @param col\n * @param oldValue\n * @param newValue\n */\n private adaptWidthChange(col: Column, oldValue: number, newValue: number) {\n if (similar(oldValue, newValue, 0.5)) {\n return;\n }\n const bak = this.getWeights();\n const full = this.getWidth(),\n change = (newValue - oldValue) / full;\n const oldWeight = oldValue / full;\n const factor = (1 - oldWeight - change) / (1 - oldWeight);\n const widths = this._children.map((c) => {\n if (c === col) {\n //c.weight += change;\n return newValue;\n }\n const guess = c.getWidth() * factor;\n const w = isNaN(guess) || guess < 1 ? 0 : guess;\n c.setWidthImpl(w);\n return w;\n });\n //adapt width if needed\n super.setWidth(widths.reduce((a, b) => a + b, 0));\n\n this.fire([StackColumn.EVENT_WEIGHTS_CHANGED, StackColumn.EVENT_MULTI_LEVEL_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], bak, this.getWeights());\n }\n\n getWeights() {\n const w = this.getWidth();\n return this._children.map((d) => d.getWidth() / w);\n }\n\n setWeights(weights: number[]) {\n const bak = this.getWeights();\n const delta = weights.length - this.length;\n let s: number;\n if (delta < 0) {\n s = weights.reduce((p, a) => p + a, 0);\n if (s <= 1) {\n for (let i = 0; i < -delta; ++i) {\n weights.push((1 - s) * (1 / -delta));\n }\n } else if (s <= 100) {\n for (let i = 0; i < -delta; ++i) {\n weights.push((100 - s) * (1 / -delta));\n }\n }\n }\n weights = weights.slice(0, this.length);\n s = weights.reduce((p, a) => p + a, 0) / this.getWidth();\n weights = weights.map((d) => d / s);\n\n this._children.forEach((c, i) => {\n c.setWidthImpl(weights[i]);\n });\n this.fire([StackColumn.EVENT_WEIGHTS_CHANGED, StackColumn.EVENT_MULTI_LEVEL_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], bak, weights);\n\n }\n\n removeImpl(child: Column, index: number) {\n child.on(`${Column.EVENT_WIDTH_CHANGED}.stack`, null);\n super.setWidth(this.length === 0 ? 100 : this.getWidth() - child.getWidth());\n return super.removeImpl(child, index);\n }\n\n setWidth(value: number) {\n const factor = value / this.getWidth();\n this._children.forEach((child) => {\n //disable since we change it\n child.setWidthImpl(child.getWidth() * factor);\n });\n super.setWidth(value);\n }\n\n protected compute(row: IDataRow) {\n const w = this.getWidth();\n return this._children.reduce((acc, d) => acc + d.getValue(row) * (d.getWidth() / w), 0);\n }\n\n getRenderer() {\n if (this.getCollapsed() && this.isLoaded()) {\n return StackColumn.COLLAPSED_RENDERER;\n }\n return super.getRenderer();\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n return {\n value: this.getRawNumber(row),\n children: this.children.map((d) => d.getExportValue(row, format))\n };\n }\n return super.getExportValue(row, format);\n }\n}\n","import {similar, IEventListener} from '../internal';\nimport {toolbar} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport CompositeColumn, {addColumn, filterChanged, moveColumn, removeColumn} from './CompositeColumn';\nimport {IDataRow, IColumnDesc, IFlatColumn, IMultiLevelColumn, ITypeFactory} from './interfaces';\nimport StackColumn from './StackColumn';\n\n\n/**\n * emitted when the collapse property changes\n * @asMemberOf MultiLevelCompositeColumn\n * @event\n */\nexport declare function collapseChanged_MC(previous: boolean, current: boolean): void;\n\n/**\n * emitted when the ratios between the children changes\n * @asMemberOf MultiLevelCompositeColumn\n * @event\n */\nexport declare function nestedChildRatio_MC(previous: number, current: number): void;\n\n\n@toolbar('compress', 'expand')\nexport default class MultiLevelCompositeColumn extends CompositeColumn implements IMultiLevelColumn {\n static readonly EVENT_COLLAPSE_CHANGED = StackColumn.EVENT_COLLAPSE_CHANGED;\n static readonly EVENT_MULTI_LEVEL_CHANGED = StackColumn.EVENT_MULTI_LEVEL_CHANGED;\n\n private readonly adaptChange: (old: number, newValue: number) => void;\n\n /**\n * whether this stack column is collapsed i.e. just looks like an ordinary number column\n * @type {boolean}\n * @private\n */\n private collapsed = false;\n\n constructor(id: string, desc: Readonly<IColumnDesc>) {\n super(id, desc);\n const that = this;\n this.adaptChange = function (old, newValue) {\n that.adaptWidthChange(old, newValue);\n };\n }\n\n protected createEventList() {\n return super.createEventList().concat([MultiLevelCompositeColumn.EVENT_COLLAPSE_CHANGED, MultiLevelCompositeColumn.EVENT_MULTI_LEVEL_CHANGED]);\n }\n\n on(type: typeof MultiLevelCompositeColumn.EVENT_COLLAPSE_CHANGED, listener: typeof collapseChanged_MC | null): this;\n on(type: typeof MultiLevelCompositeColumn.EVENT_MULTI_LEVEL_CHANGED, listener: typeof nestedChildRatio_MC | null): this;\n on(type: typeof CompositeColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n setCollapsed(value: boolean) {\n if (this.collapsed === value) {\n return;\n }\n this.fire([StackColumn.EVENT_COLLAPSE_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.collapsed, this.collapsed = value);\n }\n\n getCollapsed() {\n return this.collapsed;\n }\n\n dump(toDescRef: (desc: any) => any) {\n const r = super.dump(toDescRef);\n r.collapsed = this.collapsed;\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n this.collapsed = dump.collapsed === true;\n super.restore(dump, factory);\n }\n\n flatten(r: IFlatColumn[], offset: number, levelsToGo = 0, padding = 0) {\n return StackColumn.prototype.flatten.call(this, r, offset, levelsToGo, padding);\n }\n\n /**\n * inserts a column at a the given position\n * @param col\n * @param index\n */\n insert(col: Column, index: number) {\n col.on(`${Column.EVENT_WIDTH_CHANGED}.stack`, this.adaptChange);\n //increase my width\n super.setWidth(this.length === 0 ? col.getWidth() : (this.getWidth() + col.getWidth()));\n\n return super.insert(col, index);\n }\n\n /**\n * adapts weights according to an own width change\n * @param oldValue\n * @param newValue\n */\n private adaptWidthChange(oldValue: number, newValue: number) {\n if (similar(oldValue, newValue, 0.5)) {\n return;\n }\n const act = this.getWidth();\n const next = act + (newValue - oldValue);\n this.fire([MultiLevelCompositeColumn.EVENT_MULTI_LEVEL_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], act, next);\n super.setWidth(next);\n }\n\n removeImpl(child: Column, index: number) {\n child.on(`${Column.EVENT_WIDTH_CHANGED}.stack`, null);\n super.setWidth(this.length === 0 ? 100 : this.getWidth() - child.getWidth());\n return super.removeImpl(child, index);\n }\n\n setWidth(value: number) {\n const act = this.getWidth();\n const factor = value / act;\n this._children.forEach((child) => {\n //disable since we change it\n child.setWidthImpl(child.getWidth() * factor);\n });\n if (!similar(act, value, 0.5)) {\n this.fire([MultiLevelCompositeColumn.EVENT_MULTI_LEVEL_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY], act, value);\n }\n super.setWidth(value);\n }\n\n getRenderer() {\n if (this.getCollapsed()) {\n return MultiLevelCompositeColumn.EVENT_COLLAPSE_CHANGED;\n }\n return super.getRenderer();\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n return {\n children: this.children.map((d) => d.getExportValue(row, format))\n };\n }\n return super.getExportValue(row, format);\n }\n}\n","import {IDataRow, ECompareValueType} from './interfaces';\nimport MultiLevelCompositeColumn from './MultiLevelCompositeColumn';\nimport {concat} from '../internal';\nimport {toolbar} from './annotations';\n\n/**\n * factory for creating a description creating a mean column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createNestedDesc(label: string = 'Nested') {\n return {type: 'nested', label};\n}\n\n/**\n * a nested column is a composite column where the sorting order is determined by the nested ordering of the children\n * i.e., sort by the first child if equal sort by the second child,...\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy')\nexport default class NestedColumn extends MultiLevelCompositeColumn {\n\n toCompareValue(row: IDataRow) {\n return concat(this.children.map((d) => d.toCompareValue(row)));\n }\n\n toCompareValueType(): ECompareValueType[] {\n return concat(this.children.map((d) => d.toCompareValueType()));\n }\n\n getLabel(row: IDataRow) {\n return this.children.map((d) => d.getLabel(row)).join(';');\n }\n\n getValue(row: IDataRow) {\n return this.children.map((d) => d.getValue(row)).join(';');\n }\n}\n","import {toolbar, SortByDefault, dialogAddons} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IKeyValue} from './IArrayColumn';\nimport {IDataRow, ECompareValueType, ITypeFactory} from './interfaces';\nimport {\n EAdvancedSortMethod, IAdvancedBoxPlotColumn, INumberDesc,\n INumberFilter,\n IMappingFunction,\n IColorMappingFunction} from './INumberColumn';\nimport MapColumn, {IMapColumnDesc} from './MapColumn';\nimport {restoreMapping} from './MappingFunction';\nimport {isMissingValue} from './missing';\nimport NumberColumn from './NumberColumn';\nimport {IEventListener, IAdvancedBoxPlotData, boxplotBuilder} from '../internal';\nimport {format} from 'd3-format';\nimport {DEFAULT_FORMATTER, noNumberFilter, toCompareBoxPlotValue, getBoxPlotNumber, isDummyNumberFilter, restoreNumberFilter} from './internalNumber';\nimport {integrateDefaults} from './internal';\n\n\nexport interface INumberMapDesc extends INumberDesc {\n readonly sort?: EAdvancedSortMethod;\n}\n\nexport declare type INumberMapColumnDesc = INumberMapDesc & IMapColumnDesc<number>;\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf NumberMapColumn\n * @event\n */\nexport declare function mappingChanged_NMC(previous: IMappingFunction, current: IMappingFunction): void;\n/**\n * emitted when the color mapping property changes\n * @asMemberOf NumberMapColumn\n * @event\n */\nexport declare function colorMappingChanged_NMC(previous: IColorMappingFunction, current: IColorMappingFunction): void;\n\n/**\n * emitted when the sort method property changes\n * @asMemberOf NumberMapColumn\n * @event\n */\nexport declare function sortMethodChanged_NMC(previous: EAdvancedSortMethod, current: EAdvancedSortMethod): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf NumberMapColumn\n * @event\n */\nexport declare function filterChanged_NMC(previous: INumberFilter | null, current: INumberFilter | null): void;\n\n@toolbar('rename', 'filterNumber', 'colorMapped', 'editMapping')\n@dialogAddons('sort', 'sortNumbers')\n@SortByDefault('descending')\nexport default class NumberMapColumn extends MapColumn<number> implements IAdvancedBoxPlotColumn {\n static readonly EVENT_MAPPING_CHANGED = NumberColumn.EVENT_MAPPING_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = NumberColumn.EVENT_COLOR_MAPPING_CHANGED;\n static readonly EVENT_SORTMETHOD_CHANGED = NumberColumn.EVENT_SORTMETHOD_CHANGED;\n static readonly EVENT_FILTER_CHANGED = NumberColumn.EVENT_FILTER_CHANGED;\n\n private readonly numberFormat: (n: number) => string = DEFAULT_FORMATTER;\n\n private sort: EAdvancedSortMethod;\n private mapping: IMappingFunction;\n private original: IMappingFunction;\n private colorMapping: IColorMappingFunction;\n /**\n * currently active filter\n * @type {{min: number, max: number}}\n * @private\n */\n private currentFilter: INumberFilter = noNumberFilter();\n\n constructor(id: string, desc: Readonly<INumberMapColumnDesc>, factory: ITypeFactory) {\n super(id, integrateDefaults(desc, {\n renderer: 'mapbars'\n }));\n this.mapping = restoreMapping(desc, factory);\n this.original = this.mapping.clone();\n this.colorMapping = factory.colorMappingFunction(desc.colorMapping || desc.color);\n this.sort = desc.sort || EAdvancedSortMethod.median;\n\n if (desc.numberFormat) {\n this.numberFormat = format(desc.numberFormat);\n }\n }\n\n getNumberFormat() {\n return this.numberFormat;\n }\n\n toCompareValue(row: IDataRow): number {\n return toCompareBoxPlotValue(this, row);\n }\n\n toCompareValueType() {\n return ECompareValueType.FLOAT;\n }\n\n getBoxPlotData(row: IDataRow): IAdvancedBoxPlotData | null {\n const data = this.getRawValue(row);\n if (data == null) {\n return null;\n }\n const b = boxplotBuilder();\n for (const d of data) {\n b.push(isMissingValue(d.value) ? NaN : this.mapping.apply(d.value));\n }\n return b.build();\n }\n\n getRange() {\n return this.mapping.getRange(this.numberFormat);\n }\n\n getRawBoxPlotData(row: IDataRow): IAdvancedBoxPlotData | null {\n const data = this.getRawValue(row);\n if (data == null) {\n return null;\n }\n\n const b = boxplotBuilder();\n for (const d of data) {\n b.push(isMissingValue(d.value) ? NaN : d.value);\n }\n return b.build();\n }\n\n getNumber(row: IDataRow): number {\n return getBoxPlotNumber(this, row, 'normalized');\n }\n\n getRawNumber(row: IDataRow): number {\n return getBoxPlotNumber(this, row, 'raw');\n }\n\n iterNumber(row: IDataRow) {\n const r = this.getValue(row);\n return r ? r.map((d) => d.value) : [NaN];\n }\n\n iterRawNumber(row: IDataRow) {\n const r = this.getRawValue(row);\n return r ? r.map((d) => d.value) : [NaN];\n }\n\n getValue(row: IDataRow) {\n const values = this.getRawValue(row);\n return values.length === 0 ? null : values.map(({key, value}) => ({key, value: isMissingValue(value) ? NaN : this.mapping.apply(value)}));\n }\n\n getRawValue(row: IDataRow): IKeyValue<number>[] {\n const r = super.getValue(row);\n return r == null ? [] : r;\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n return format === 'json' ? this.getRawValue(row) : super.getExportValue(row, format);\n }\n\n getLabels(row: IDataRow) {\n const v = this.getRawValue(row);\n return v.map(({key, value}) => ({key, value: this.numberFormat(value)}));\n }\n\n getSortMethod() {\n return this.sort;\n }\n\n setSortMethod(sort: EAdvancedSortMethod) {\n if (this.sort === sort) {\n return;\n }\n this.fire([NumberMapColumn.EVENT_SORTMETHOD_CHANGED], this.sort, this.sort = sort);\n // sort by me if not already sorted by me\n if (!this.isSortedByMe().asc) {\n this.sortByMe();\n }\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n r.sortMethod = this.getSortMethod();\n r.filter = !isDummyNumberFilter(this.currentFilter) ? this.currentFilter : null;\n r.map = this.mapping.toJSON();\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n if (dump.sortMethod) {\n this.sort = dump.sortMethod;\n }\n if (dump.filter) {\n this.currentFilter = restoreNumberFilter(dump.filter);\n }\n if (dump.map || dump.domain) {\n this.mapping = restoreMapping(dump, factory);\n }\n if (dump.colorMapping) {\n this.colorMapping = factory.colorMappingFunction(dump.colorMapping);\n }\n }\n\n protected createEventList() {\n return super.createEventList().concat([NumberMapColumn.EVENT_COLOR_MAPPING_CHANGED, NumberMapColumn.EVENT_MAPPING_CHANGED, NumberMapColumn.EVENT_SORTMETHOD_CHANGED, NumberMapColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof NumberMapColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_NMC | null): this;\n on(type: typeof NumberMapColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged_NMC | null): this;\n on(type: typeof NumberMapColumn.EVENT_SORTMETHOD_CHANGED, listener: typeof sortMethodChanged_NMC | null): this;\n on(type: typeof NumberMapColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_NMC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getOriginalMapping() {\n return this.original.clone();\n }\n\n getMapping() {\n return this.mapping.clone();\n }\n\n setMapping(mapping: IMappingFunction) {\n if (this.mapping.eq(mapping)) {\n return;\n }\n this.fire([NumberMapColumn.EVENT_MAPPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.mapping.clone(), this.mapping = mapping);\n }\n\n getColor(row: IDataRow) {\n return NumberColumn.prototype.getColor.call(this, row);\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: IColorMappingFunction) {\n if (this.colorMapping.eq(mapping)) {\n return;\n }\n this.fire([NumberMapColumn.EVENT_COLOR_MAPPING_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY], this.colorMapping.clone(), this.colorMapping = mapping);\n }\n\n isFiltered() {\n return NumberColumn.prototype.isFiltered.call(this);\n }\n\n getFilter(): INumberFilter {\n return NumberColumn.prototype.getFilter.call(this);\n }\n\n setFilter(value: INumberFilter | null) {\n NumberColumn.prototype.setFilter.call(this, value);\n }\n\n filter(row: IDataRow) {\n return NumberColumn.prototype.filter.call(this, row);\n }\n\n clearFilter() {\n return NumberColumn.prototype.clearFilter.call(this);\n }\n}\n\n","import {equalArrays, extent, IEventListener} from '../internal';\nimport {Category, toolbar} from './annotations';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';\nimport CategoricalColumn from './CategoricalColumn';\nimport Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';\nimport {ICategoricalColumn, ICategoricalDesc, ICategoricalFilter, ICategory, ICategoricalColorMappingFunction} from './ICategoricalColumn';\nimport {IDataRow, IValueColumnDesc, ITypeFactory} from './interfaces';\nimport NumberColumn from './NumberColumn';\nimport {INumberColumn} from './INumberColumn';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {toCategories} from './internalCategorical';\nimport {DEFAULT_FORMATTER} from './internalNumber';\nimport {integrateDefaults} from './internal';\n\nexport declare type IOrdinalColumnDesc = ICategoricalDesc & IValueColumnDesc<number>;\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf OrdinalColumn\n * @event\n */\nexport declare function mappingChanged_OC(previous: number[], current: number[]): void;\n\n/**\n * emitted when the color mapping property changes\n * @asMemberOf OrdinalColumn\n * @event\n */\nexport declare function colorMappingChanged_OC(previous: ICategoricalColorMappingFunction, current: ICategoricalColorMappingFunction): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf OrdinalColumn\n * @event\n */\nexport declare function filterChanged_OC(previous: ICategoricalFilter | null, current: ICategoricalFilter | null): void;\n\n/**\n * similar to a categorical column but the categories are mapped to numbers\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'group', 'filterOrdinal', 'colorMappedCategorical')\n@Category('categorical')\nexport default class OrdinalColumn extends ValueColumn<number> implements INumberColumn, ICategoricalColumn {\n static readonly EVENT_MAPPING_CHANGED = NumberColumn.EVENT_MAPPING_CHANGED;\n static readonly EVENT_FILTER_CHANGED = CategoricalColumn.EVENT_FILTER_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = CategoricalColumn.EVENT_COLOR_MAPPING_CHANGED;\n\n readonly categories: ICategory[];\n\n private colorMapping: ICategoricalColorMappingFunction;\n\n private readonly lookup = new Map<string, Readonly<ICategory>>();\n\n private currentFilter: ICategoricalFilter | null = null;\n\n\n constructor(id: string, desc: Readonly<IOrdinalColumnDesc>) {\n super(id, integrateDefaults(desc, {\n renderer: 'number',\n groupRenderer: 'boxplot'\n }));\n this.categories = toCategories(desc);\n this.categories.forEach((d) => this.lookup.set(d.name, d));\n this.colorMapping = DEFAULT_CATEGORICAL_COLOR_FUNCTION;\n }\n\n protected createEventList() {\n return super.createEventList().concat([OrdinalColumn.EVENT_COLOR_MAPPING_CHANGED, OrdinalColumn.EVENT_MAPPING_CHANGED, OrdinalColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof OrdinalColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged_OC | null): this;\n on(type: typeof OrdinalColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged_OC | null): this;\n on(type: typeof OrdinalColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_OC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getNumberFormat() {\n return DEFAULT_FORMATTER;\n }\n\n get dataLength() {\n return this.categories.length;\n }\n\n get labels() {\n return this.categories.map((d) => d.label);\n }\n\n getValue(row: IDataRow) {\n const v = this.getNumber(row);\n return isNaN(v) ? null : v;\n }\n\n getCategory(row: IDataRow) {\n const v = super.getValue(row);\n if (!v) {\n return null;\n }\n const vs = String(v);\n return this.lookup.has(vs) ? this.lookup.get(vs)! : null;\n }\n\n getCategories(row: IDataRow) {\n return [this.getCategory(row)];\n }\n\n iterCategory(row: IDataRow) {\n return [this.getCategory(row)];\n }\n\n iterNumber(row: IDataRow) {\n return [this.getNumber(row)];\n }\n\n iterRawNumber(row: IDataRow) {\n return [this.getRawNumber(row)];\n }\n\n getColor(row: IDataRow) {\n return CategoricalColumn.prototype.getColor.call(this, row);\n }\n\n getLabel(row: IDataRow) {\n return CategoricalColumn.prototype.getLabel.call(this, row);\n }\n\n getLabels(row: IDataRow) {\n return CategoricalColumn.prototype.getLabels.call(this, row);\n }\n\n getValues(row: IDataRow) {\n return CategoricalColumn.prototype.getValues.call(this, row);\n }\n\n getMap(row: IDataRow) {\n return CategoricalColumn.prototype.getMap.call(this, row);\n }\n\n getMapLabel(row: IDataRow) {\n return CategoricalColumn.prototype.getMapLabel.call(this, row);\n }\n\n getSet(row: IDataRow) {\n return CategoricalColumn.prototype.getSet.call(this, row);\n }\n\n getNumber(row: IDataRow) {\n const v = this.getCategory(row);\n return v ? v.value : NaN;\n }\n\n getRawNumber(row: IDataRow) {\n return this.getNumber(row);\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n const value = this.getNumber(row);\n if (isNaN(value)) {\n return null;\n }\n return {\n name: this.getLabel(row),\n value\n };\n }\n return super.getExportValue(row, format);\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = CategoricalColumn.prototype.dump.call(this, toDescRef);\n r.mapping = this.getMapping();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n CategoricalColumn.prototype.restore.call(this, dump, factory);\n if (dump.mapping) {\n this.setMapping(dump.mapping);\n }\n }\n\n getMapping() {\n return this.categories.map((d) => d.value);\n }\n\n setMapping(mapping: number[]) {\n const r = extent(mapping);\n mapping = mapping.map((d) => (d - r[0]!) / (r[1]! - r[0]!));\n const bak = this.getMapping();\n if (equalArrays(bak, mapping)) {\n return;\n }\n this.categories.forEach((d, i) => d.value = mapping[i] || 0);\n this.fire([OrdinalColumn.EVENT_MAPPING_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], bak, this.getMapping());\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: ICategoricalColorMappingFunction) {\n return CategoricalColumn.prototype.setColorMapping.call(this, mapping);\n }\n\n isFiltered() {\n return this.currentFilter != null;\n }\n\n filter(row: IDataRow): boolean {\n return CategoricalColumn.prototype.filter.call(this, row);\n }\n\n group(row: IDataRow) {\n return CategoricalColumn.prototype.group.call(this, row);\n }\n\n getFilter() {\n return this.currentFilter;\n }\n\n setFilter(filter: ICategoricalFilter | null) {\n return CategoricalColumn.prototype.setFilter.call(this, filter);\n }\n\n clearFilter() {\n return CategoricalColumn.prototype.clearFilter.call(this);\n }\n\n toCompareValue(row: IDataRow) {\n return CategoricalColumn.prototype.toCompareValue.call(this, row);\n }\n\n toCompareValueType() {\n return CategoricalColumn.prototype.toCompareValueType.call(this);\n }\n\n getRenderer(): string {\n return NumberColumn.prototype.getRenderer.call(this);\n }\n}\n","import {NumberColumn} from '.';\nimport {IEventListener} from '../internal';\nimport {SortByDefault, toolbar} from './annotations';\nimport Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';\nimport CompositeColumn, {addColumn, moveColumn, removeColumn} from './CompositeColumn';\nimport CompositeNumberColumn, {ICompositeNumberDesc} from './CompositeNumberColumn';\nimport {IDataRow, ITypeFactory} from './interfaces';\nimport {isDummyNumberFilter, noNumberFilter, restoreNumberFilter} from './internalNumber';\nimport {IColorMappingFunction, IMapAbleColumn, IMapAbleDesc, IMappingFunction, INumberFilter, isNumberColumn} from './INumberColumn';\nimport {restoreMapping} from './MappingFunction';\nimport {integrateDefaults} from './internal';\n\nconst DEFAULT_SCRIPT = `let s = 0;\ncol.forEach((c) => s += c.v);\nreturn s / col.length`;\n\n/**\n * factory for creating a description creating a mean column\n * @param label\n * @returns {{type: string, label: string}}\n */\nexport function createScriptDesc(label: string = 'script') {\n return {type: 'script', label, script: DEFAULT_SCRIPT};\n}\n\n\nfunction wrapWithContext(code: string) {\n let clean = code.trim();\n if (!clean.includes('return')) {\n clean = `return (${clean});`;\n }\n return `\n const max = function(arr) { return Math.max.apply(Math, arr); };\n const min = function(arr) { return Math.min.apply(Math, arr); };\n const extent = function(arr) { return [min(arr), max(arr)]; };\n const clamp = function(v, minValue, maxValue) { return v < minValue ? minValue : (v > maxValue ? maxValue : v); };\n const normalize = function(v, minMax, max) {\n if (Array.isArray(minMax)) {\n minMax = minMax[0];\n max = minMax[1];\n }\n return (v - minMax) / (max - minMax);\n };\n const denormalize = function(v, minMax, max) {\n if (Array.isArray(minMax)) {\n minMax = minMax[0];\n max = minMax[1];\n }\n return v * (max - minMax) + minMax;\n };\n const linear = function(v, source, target) {\n target = target || [0, 1];\n return denormalize(normalize(v, source), target);\n };\n const v = (function custom() {\n ${clean}\n })();\n\n return typeof v === 'number' ? v : NaN`;\n}\n\ninterface IColumnWrapper {\n v: any;\n raw: number | null;\n type: string;\n name: string;\n id: string;\n}\n\n/**\n * wrapper class for simpler column accessing\n */\nclass ColumnWrapper implements IColumnWrapper {\n constructor(private readonly c: Column, public readonly v: any, public readonly raw: number | null) {\n\n }\n\n get type() {\n return this.c.desc.type;\n }\n\n get name() {\n return this.c.getMetaData().label;\n }\n\n get id() {\n return this.c.id;\n }\n}\n\nclass LazyColumnWrapper implements IColumnWrapper {\n constructor(private readonly c: Column, private readonly row: IDataRow) {\n\n }\n\n get type() {\n return this.c.desc.type;\n }\n\n get name() {\n return this.c.getMetaData().label;\n }\n\n get id() {\n return this.c.id;\n }\n\n get v() {\n return this.c.getValue(this.row);\n }\n\n get raw() {\n return isNumberColumn(this.c) ? this.c.getRawNumber(this.row) : null;\n }\n}\n\n/**\n * helper context for accessing columns within a scripted columns\n */\nclass ColumnContext {\n private readonly lookup = new Map<string, IColumnWrapper>();\n private _all: ColumnContext | null = null;\n\n constructor(private readonly children: IColumnWrapper[], private readonly allFactory?: () => ColumnContext) {\n children.forEach((c) => {\n this.lookup.set(`ID@${c.id}`, c);\n this.lookup.set(`ID@${c.id.toLowerCase()}`, c);\n this.lookup.set(`NAME@${c.name}`, c);\n this.lookup.set(`NAME@${c.name.toLowerCase()}`, c);\n });\n }\n\n /**\n * get a column by name\n * @param {string} name\n * @return {IColumnWrapper}\n */\n byName(name: string) {\n return this.lookup.get(`NAME@${name}`);\n }\n\n /**\n * get a column by id\n * @param {string} id\n * @return {IColumnWrapper}\n */\n byID(id: string) {\n return this.lookup.get(`ID@${id}`);\n }\n\n /**\n * get a column by index\n * @param {number} index\n * @return {IColumnWrapper}\n */\n byIndex(index: number) {\n return this.children[index];\n }\n\n forEach(callback: ((c: IColumnWrapper, index: number) => void)) {\n return this.children.forEach(callback);\n }\n\n /**\n * number of columns\n * @return {number}\n */\n get length() {\n return this.children.length;\n }\n\n /**\n * get the all context, i.e one with all columns of this ranking\n * @return {ColumnContext}\n */\n get all() {\n if (this._all == null) {\n this._all = this.allFactory ? this.allFactory() : null;\n }\n return this._all!;\n }\n}\n\n\nexport interface IScriptDesc extends ICompositeNumberDesc, IMapAbleDesc {\n /**\n * the function to use, it has two parameters: children (current children) and values (their row values)\n * @default 'return Math.max.apply(Math,values)'\n */\n script?: string;\n}\n\nexport declare type IScriptColumnDesc = IScriptDesc;\n\n/**\n * emitted when the script property changes\n * @asMemberOf ScriptColumn\n * @event\n */\nexport declare function scriptChanged(previous: string, current: string): void;\n\n/**\n * emitted when the mapping property changes\n * @asMemberOf ScriptColumn\n * @event\n */\nexport declare function mappingChanged(previous: IMappingFunction, current: IMappingFunction): void;\n/**\n * emitted when the color mapping property changes\n * @asMemberOf ScriptColumn\n * @event\n */\nexport declare function colorMappingChanged(previous: IColorMappingFunction, current: IColorMappingFunction): void;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf ScriptColumn\n * @event\n */\nexport declare function filterChanged(previous: INumberFilter | null, current: INumberFilter | null): void;\n\n\n\n/**\n * column combiner which uses a custom JavaScript function to combined the values\n * The script iteslf can be any valid JavaScript code. It will be embedded in a function.\n * Therefore the last statement has to return a value.\n *\n * In case of a single line statement the code piece statement <code>return</code> will be automatically prefixed.\n *\n * The function signature is: <br><code>(row: any, index: number, children: Column[], values: any[], raws: (number|null)[]) => number</code>\n * <dl>\n * <dt>param: <code>row</code></dt>\n * <dd>the row in the dataset to compute the value for</dd>\n * <dt>param: <code>index</code></dt>\n * <dd>the index of the row</dd>\n * <dt>param: <code>children</code></dt>\n * <dd>the list of LineUp columns that are part of this ScriptColumn</dd>\n * <dt>param: <code>values</code></dt>\n * <dd>the computed value of each column (see <code>children</code>) for the current row</dd>\n * <dt>param: <code>raws</code></dt>\n * <dd>similar to <code>values</code>. Numeric columns return by default the normalized value, this array gives access to the original \"raw\" values before mapping is applied</dd>\n * <dt>returns:</dt>\n * <dd>the computed number <strong>in the range [0, 1] or NaN</strong></dd>\n * </dl>\n *\n * In addition to the standard JavaScript functions and objects (Math, ...) a couple of utility functions are available: </p>\n * <dl>\n * <dt><code>max(arr: number[]) => number</code></dt>\n * <dd>computes the maximum of the given array of numbers</dd>\n * <dt><code>min(arr: number[]) => number</code></dt>\n * <dd>computes the minimum of the given array of numbers</dd>\n * <dt><code>extent(arr: number[]) => [number, number]</code></dt>\n * <dd>computes both minimum and maximum and returning an array with the first element the minimum and the second the maximum</dd>\n * <dt><code>clamp(v: number, min: number, max: number) => number</code></dt>\n * <dd>ensures that the given value is within the given min/max value</dd>\n * <dt><code>normalize(v: number, min: number, max: number) => number</code></dt>\n * <dd>normalizes the given value <code>(v - min) / (max - min)</code></dd>\n * <dt><code>denormalize(v: number, min: number, max: number) => number</code></dt>\n * <dd>inverts a normalized value <code>v * (max - min) + min</code></dd>\n * <dt><code>linear(v: number, input: [number, number], output: [number, number]) => number</code></dt>\n * <dd>performs a linear mapping from input domain to output domain both given as an array of [min, max] values. <code>denormalize(normalize(v, input[0], input[1]), output[0], output[1])</code></dd>\n * </dl>\n */\n@toolbar('script', 'filterNumber', 'colorMapped', 'editMapping')\n@SortByDefault('descending')\nexport default class ScriptColumn extends CompositeNumberColumn implements IMapAbleColumn {\n static readonly EVENT_MAPPING_CHANGED = NumberColumn.EVENT_MAPPING_CHANGED;\n static readonly EVENT_COLOR_MAPPING_CHANGED = NumberColumn.EVENT_COLOR_MAPPING_CHANGED;\n static readonly EVENT_SCRIPT_CHANGED = 'scriptChanged';\n static readonly DEFAULT_SCRIPT = DEFAULT_SCRIPT;\n\n private script = ScriptColumn.DEFAULT_SCRIPT;\n private f: Function | null = null;\n private mapping: IMappingFunction;\n private original: IMappingFunction;\n private colorMapping: IColorMappingFunction;\n /**\n * currently active filter\n * @type {{min: number, max: number}}\n * @private\n */\n private currentFilter: INumberFilter = noNumberFilter();\n\n\n constructor(id: string, desc: Readonly<IScriptColumnDesc>, factory: ITypeFactory) {\n super(id, integrateDefaults(desc, {\n renderer: 'number',\n groupRenderer: 'boxplot',\n summaryRenderer: 'histogram'\n }));\n this.script = desc.script || this.script;\n this.mapping = restoreMapping(desc, factory);\n this.original = this.mapping.clone();\n this.colorMapping = factory.colorMappingFunction(desc.colorMapping || desc.color);\n }\n\n protected createEventList() {\n return super.createEventList().concat([ScriptColumn.EVENT_SCRIPT_CHANGED, ScriptColumn.EVENT_COLOR_MAPPING_CHANGED, ScriptColumn.EVENT_MAPPING_CHANGED]);\n }\n\n on(type: typeof ScriptColumn.EVENT_COLOR_MAPPING_CHANGED, listener: typeof colorMappingChanged | null): this;\n on(type: typeof ScriptColumn.EVENT_MAPPING_CHANGED, listener: typeof mappingChanged | null): this;\n on(type: typeof ScriptColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof ScriptColumn.EVENT_SCRIPT_CHANGED, listener: typeof scriptChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged | null): this;\n on(type: typeof CompositeColumn.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof CompositeColumn.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n setScript(script: string) {\n if (this.script === script) {\n return;\n }\n this.f = null;\n this.fire([ScriptColumn.EVENT_SCRIPT_CHANGED, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.script, this.script = script);\n }\n\n getScript() {\n return this.script;\n }\n\n dump(toDescRef: (desc: any) => any) {\n const r = super.dump(toDescRef);\n r.script = this.script;\n r.filter = !isDummyNumberFilter(this.currentFilter) ? this.currentFilter : null;\n r.map = this.mapping.toJSON();\n r.colorMapping = this.colorMapping.toJSON();\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n super.restore(dump, factory);\n\n this.script = dump.script || this.script;\n if (dump.filter) {\n this.currentFilter = restoreNumberFilter(dump.filter);\n }\n if (dump.map || dump.domain) {\n this.mapping = restoreMapping(dump.map, factory);\n }\n if (dump.colorMapping) {\n this.colorMapping = factory.colorMappingFunction(dump.colorMapping);\n }\n }\n\n protected compute(row: IDataRow) {\n if (this.f == null) {\n this.f = new Function('children', 'values', 'raws', 'col', 'row', 'index', wrapWithContext(this.script));\n }\n const children = this._children;\n const values = this._children.map((d) => d.getValue(row));\n const raws = <number[]>this._children.map((d) => isNumberColumn(d) ? d.getRawNumber(row) : null);\n const col = new ColumnContext(children.map((c, i) => new ColumnWrapper(c, values[i], raws[i])), () => {\n const cols = this.findMyRanker()!.flatColumns; // all except myself\n return new ColumnContext(cols.map((c) => new LazyColumnWrapper(c, row)));\n });\n return this.f.call(this, children, values, raws, col, row.v, row.i);\n }\n\n getExportValue(row: IDataRow, format: 'text' | 'json'): any {\n if (format === 'json') {\n return {\n value: this.getRawNumber(row),\n children: this.children.map((d) => d.getExportValue(row, format))\n };\n }\n return super.getExportValue(row, format);\n }\n\n getRange() {\n return this.mapping.getRange(this.getNumberFormat());\n }\n\n getOriginalMapping() {\n return this.original.clone();\n }\n\n getMapping() {\n return this.mapping.clone();\n }\n\n setMapping(mapping: IMappingFunction) {\n if (this.mapping.eq(mapping)) {\n return;\n }\n this.fire([ScriptColumn.EVENT_MAPPING_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.mapping.clone(), this.mapping = mapping);\n }\n\n getColor(row: IDataRow) {\n return NumberColumn.prototype.getColor.call(this, row);\n }\n\n getColorMapping() {\n return this.colorMapping.clone();\n }\n\n setColorMapping(mapping: IColorMappingFunction) {\n if (this.colorMapping.eq(mapping)) {\n return;\n }\n this.fire([ScriptColumn.EVENT_COLOR_MAPPING_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.colorMapping.clone(), this.colorMapping = mapping);\n }\n\n isFiltered() {\n return NumberColumn.prototype.isFiltered.call(this);\n }\n\n getFilter(): INumberFilter {\n return NumberColumn.prototype.getFilter.call(this);\n }\n\n setFilter(value: INumberFilter | null) {\n NumberColumn.prototype.setFilter.call(this, value);\n }\n\n filter(row: IDataRow) {\n return NumberColumn.prototype.filter.call(this, row);\n }\n\n clearFilter() {\n return NumberColumn.prototype.clearFilter.call(this);\n }\n}\n","import {toolbar} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IDataRow} from './interfaces';\nimport MapColumn, {IMapColumnDesc} from './MapColumn';\nimport {EAlignment, IStringDesc} from './StringColumn';\nimport {IEventListener} from '../internal';\nimport {isMissingValue} from './missing';\nimport {integrateDefaults} from './internal';\n\nexport declare type IStringMapColumnDesc = IStringDesc & IMapColumnDesc<string>;\n\n/**\n * a string column with optional alignment\n */\n@toolbar('rename', 'search')\nexport default class StringMapColumn extends MapColumn<string> {\n readonly alignment: EAlignment;\n readonly escape: boolean;\n\n constructor(id: string, desc: Readonly<IStringMapColumnDesc>) {\n super(id, integrateDefaults(desc, {\n width: 200,\n renderer: 'map'\n }));\n this.alignment = <any>desc.alignment || EAlignment.left;\n this.escape = desc.escape !== false;\n }\n\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValue(row: IDataRow) {\n const r = this.getMapValue(row);\n return r.every((d) => d.value === '') ? null : r;\n }\n\n getMapValue(row: IDataRow) {\n return super.getMap(row).map(({key, value}) => ({\n key,\n value: isMissingValue(value) ? '' : String(value)\n }));\n }\n}\n","import {toolbar} from './annotations';\nimport ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';\nimport {IDataRow} from './interfaces';\nimport {EAlignment, IStringDesc} from './StringColumn';\nimport {isMissingValue} from './missing';\nimport {integrateDefaults} from './internal';\n\nexport declare type IStringsColumnDesc = IStringDesc & IArrayColumnDesc<string>;\n\n/**\n * a string column with optional alignment\n */\n@toolbar('rename', 'search')\nexport default class StringsColumn extends ArrayColumn<string> {\n readonly alignment: EAlignment;\n readonly escape: boolean;\n\n constructor(id: string, desc: Readonly<IStringsColumnDesc>) {\n super(id, integrateDefaults(desc, {\n width: 200\n }));\n this.alignment = <any>desc.alignment || EAlignment.left;\n this.escape = desc.escape !== false;\n }\n\n getValues(row: IDataRow) {\n return super.getValues(row).map((v) => {\n return isMissingValue(v) ? '' : String(v);\n });\n }\n}\n","import {Category, toolbar, dialogAddons} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport {IDataRow, IGroup, IValueColumnDesc, ITypeFactory} from './interfaces';\nimport {patternFunction, integrateDefaults} from './internal';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IEventListener, ISequence} from '../internal';\nimport {IStringDesc, EAlignment, IStringGroupCriteria, EStringGroupCriteriaType, IStringFilter} from './StringColumn';\nimport StringColumn from './StringColumn';\n\nexport interface ILinkDesc extends IStringDesc {\n /**\n * replacement pattern, use use <code>${value}</code> for the current value, <code>${escapedValue}</code> for an url safe value and <code>${item}</code> for the whole item\n */\n pattern?: string;\n\n /**\n * optional list of pattern templates\n */\n patternTemplates?: string[];\n}\n\nexport interface ILink {\n alt: string;\n href: string;\n}\n\nexport declare type ILinkColumnDesc = ILinkDesc & IValueColumnDesc<string | ILink>;\n\n/**\n * emitted when the filter property changes\n * @asMemberOf LinkColumn\n * @event\n */\nexport declare function filterChanged_LC(previous: string | RegExp | null, current: string | RegExp | null): void;\n\n\n/**\n * emitted when the grouping property changes\n * @asMemberOf LinkColumn\n * @event\n */\nexport declare function groupingChanged_LC(previous: (RegExp | string)[][], current: (RegExp | string)[][]): void;\n\n/**\n * emitted when the pattern property changes\n * @asMemberOf LinkColumn\n * @event\n */\nexport declare function patternChanged_LC(previous: string, current: string): void;\n\n/**\n * a string column with optional alignment\n */\n@toolbar('rename', 'clone', 'sort', 'sortBy', 'search', 'groupBy', 'filterString', 'editPattern')\n@dialogAddons('group', 'groupString')\n@Category('string')\nexport default class LinkColumn extends ValueColumn<string | ILink> {\n static readonly EVENT_FILTER_CHANGED = StringColumn.EVENT_FILTER_CHANGED;\n static readonly EVENT_GROUPING_CHANGED = StringColumn.EVENT_GROUPING_CHANGED;\n static readonly EVENT_PATTERN_CHANGED = 'patternChanged';\n\n private pattern: string;\n private patternFunction: Function | null = null;\n readonly patternTemplates: string[];\n\n private currentFilter: string | RegExp | null = null;\n private currentGroupCriteria: IStringGroupCriteria = {\n type: EStringGroupCriteriaType.startsWith,\n values: []\n };\n\n readonly alignment: EAlignment;\n readonly escape: boolean;\n\n constructor(id: string, desc: Readonly<ILinkColumnDesc>) {\n super(id, integrateDefaults(desc, Object.assign({\n width: 200\n }, desc.pattern ? {\n renderer: 'link',\n groupRenderer: 'link'\n } : {})));\n this.alignment = <any>desc.alignment || EAlignment.left;\n this.escape = desc.escape !== false;\n\n this.pattern = desc.pattern || '';\n this.patternTemplates = desc.patternTemplates || [];\n }\n\n setPattern(pattern: string) {\n if (pattern === this.pattern) {\n return;\n }\n this.patternFunction = null; // reset cache\n this.fire([LinkColumn.EVENT_PATTERN_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_DIRTY_VALUES, Column.EVENT_DIRTY_CACHES, Column.EVENT_DIRTY], this.pattern, this.pattern = pattern);\n }\n\n getPattern() {\n return this.pattern;\n }\n\n protected createEventList() {\n return super.createEventList().concat([LinkColumn.EVENT_PATTERN_CHANGED, LinkColumn.EVENT_GROUPING_CHANGED, LinkColumn.EVENT_FILTER_CHANGED]);\n }\n\n on(type: typeof LinkColumn.EVENT_PATTERN_CHANGED, listener: typeof patternChanged_LC | null): this;\n on(type: typeof LinkColumn.EVENT_FILTER_CHANGED, listener: typeof filterChanged_LC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof LinkColumn.EVENT_GROUPING_CHANGED, listener: typeof groupingChanged_LC | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValue(row: IDataRow) {\n const l = this.getLink(row);\n return l == null ? null : l.href;\n }\n\n getLink(row: IDataRow): ILink | null {\n const v: string | null | ILink = super.getValue(row);\n return this.transformValue(v, row);\n }\n\n private transformValue(v: any, row: IDataRow) {\n if (v == null || v === '') {\n return null;\n }\n if (typeof v === 'string') {\n if (!this.pattern) {\n return {\n alt: v,\n href: v\n };\n }\n if (!this.patternFunction) {\n this.patternFunction = patternFunction(this.pattern, 'item');\n }\n return {\n alt: v,\n href: this.patternFunction.call(this, v, row.v)\n };\n }\n return v;\n }\n\n getLabel(row: IDataRow) {\n const l = this.getLink(row);\n return l == null ? '' : l.alt;\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = StringColumn.prototype.dump.call(this, toDescRef);\n if (this.pattern !== (<any>this.desc).pattern) {\n r.pattern = this.pattern;\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n StringColumn.prototype.restore.call(this, dump, factory);\n if (dump.pattern) {\n this.pattern = dump.pattern;\n }\n }\n\n isFiltered() {\n return this.currentFilter != null;\n }\n\n filter(row: IDataRow) {\n return StringColumn.prototype.filter.call(this, row);\n }\n\n getFilter() {\n return this.currentFilter;\n }\n\n setFilter(filter: IStringFilter) {\n return StringColumn.prototype.setFilter.call(this, filter);\n }\n\n clearFilter() {\n return StringColumn.prototype.clearFilter.call(this);\n }\n\n getGroupCriteria() {\n return this.currentGroupCriteria;\n }\n\n setGroupCriteria(value: IStringGroupCriteria) {\n return StringColumn.prototype.setGroupCriteria.call(this, value);\n }\n\n toCompareValue(a: IDataRow) {\n return StringColumn.prototype.toCompareValue.call(this, a);\n }\n\n toCompareValueType() {\n return StringColumn.prototype.toCompareValueType.call(this);\n }\n\n toCompareGroupValue(rows: ISequence<IDataRow>, group: IGroup) {\n return StringColumn.prototype.toCompareGroupValue.call(this, rows, group);\n }\n\n toCompareGroupValueType() {\n return StringColumn.prototype.toCompareGroupValueType.call(this);\n }\n\n group(row: IDataRow): IGroup {\n return StringColumn.prototype.group.call(this, row);\n }\n}\n\n","import {toolbar} from './annotations';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IDataRow, ITypeFactory} from './interfaces';\nimport {patternFunction, integrateDefaults} from './internal';\nimport MapColumn, {IMapColumnDesc} from './MapColumn';\nimport LinkColumn, {ILinkDesc} from './LinkColumn';\nimport {IEventListener} from '../internal';\nimport {EAlignment} from './StringColumn';\nimport {IKeyValue} from './IArrayColumn';\nimport {ILink} from './LinkColumn';\n\nexport declare type ILinkMapColumnDesc = ILinkDesc & IMapColumnDesc<string>;\n\n/**\n * emitted when the pattern property changes\n * @asMemberOf LinkMapColumn\n * @event\n */\nexport declare function patternChanged_LMC(previous: string, current: string): void;\n\n/**\n * a string column with optional alignment\n */\n@toolbar('rename', 'search', 'editPattern')\nexport default class LinkMapColumn extends MapColumn<string> {\n static readonly EVENT_PATTERN_CHANGED = LinkColumn.EVENT_PATTERN_CHANGED;\n\n readonly alignment: EAlignment;\n readonly escape: boolean;\n private pattern: string;\n private patternFunction: Function | null = null;\n readonly patternTemplates: string[];\n\n constructor(id: string, desc: Readonly<ILinkMapColumnDesc>) {\n super(id, integrateDefaults(desc, {\n width: 200,\n renderer: 'map'\n }));\n this.alignment = <any>desc.alignment || EAlignment.left;\n this.escape = desc.escape !== false;\n this.pattern = desc.pattern || '';\n this.patternTemplates = desc.patternTemplates || [];\n }\n\n setPattern(pattern: string) {\n LinkColumn.prototype.setPattern.call(this, pattern);\n }\n\n getPattern() {\n return this.pattern;\n }\n\n protected createEventList() {\n return super.createEventList().concat([LinkColumn.EVENT_PATTERN_CHANGED]);\n }\n\n on(type: typeof LinkColumn.EVENT_PATTERN_CHANGED, listener: typeof patternChanged_LMC | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValue(row: IDataRow) {\n const r = this.getLinkMap(row);\n return r.every((d) => d.value == null) ? null : r.map(({key, value}) => ({\n key,\n value: value ? value.href : ''\n }));\n }\n\n getLabels(row: IDataRow) {\n return this.getLinkMap(row).map(({key, value}) => ({\n key,\n value: value ? value.alt : ''\n }));\n }\n\n getLinkMap(row: IDataRow): IKeyValue<ILink>[] {\n return super.getMap(row).map(({key, value}) => ({\n key,\n value: this.transformValue(value, row, key)\n }));\n }\n\n private transformValue(v: any, row: IDataRow, key: string) {\n if (v == null || v === '') {\n return null;\n }\n if (typeof v === 'string') {\n if (!this.pattern) {\n return {\n alt: v,\n href: v\n };\n }\n if (!this.patternFunction) {\n this.patternFunction = patternFunction(this.pattern, 'item', 'key');\n }\n return {\n alt: v,\n href: this.patternFunction.call(this, v, row.v, key)\n };\n }\n return v;\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n if (this.pattern !== (<any>this.desc).pattern) {\n r.pattern = this.pattern;\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n if (dump.pattern) {\n this.pattern = dump.pattern;\n }\n super.restore(dump, factory);\n }\n}\n","import {toolbar} from './annotations';\nimport ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';\nimport Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';\nimport ValueColumn, {dataLoaded} from './ValueColumn';\nimport {IDataRow, ITypeFactory} from './interfaces';\nimport {patternFunction, integrateDefaults} from './internal';\nimport {EAlignment} from './StringColumn';\nimport {IEventListener} from '../internal';\nimport LinkColumn, {ILink, ILinkDesc} from './LinkColumn';\n\nexport declare type ILinksColumnDesc = ILinkDesc & IArrayColumnDesc<string | ILink>;\n\n/**\n * emitted when the pattern property changes\n * @asMemberOf LinksColumn\n * @event\n */\nexport declare function patternChanged_LCS(previous: string, current: string): void;\n\n@toolbar('rename', 'search', 'editPattern')\nexport default class LinksColumn extends ArrayColumn<string | ILink> {\n static readonly EVENT_PATTERN_CHANGED = LinkColumn.EVENT_PATTERN_CHANGED;\n\n readonly alignment: EAlignment;\n readonly escape: boolean;\n private pattern: string;\n private patternFunction: Function | null = null;\n readonly patternTemplates: string[];\n\n constructor(id: string, desc: Readonly<ILinksColumnDesc>) {\n super(id, integrateDefaults(desc, {\n width: 200\n }));\n this.alignment = <any>desc.alignment || EAlignment.left;\n this.escape = desc.escape !== false;\n this.pattern = desc.pattern || '';\n this.patternTemplates = desc.patternTemplates || [];\n }\n\n setPattern(pattern: string) {\n return LinkColumn.prototype.setPattern.call(this, pattern);\n }\n\n getPattern() {\n return this.pattern;\n }\n\n protected createEventList() {\n return super.createEventList().concat([LinksColumn.EVENT_PATTERN_CHANGED]);\n }\n\n on(type: typeof LinksColumn.EVENT_PATTERN_CHANGED, listener: typeof patternChanged_LCS | null): this;\n on(type: typeof ValueColumn.EVENT_DATA_LOADED, listener: typeof dataLoaded | null): this;\n on(type: typeof Column.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof Column.EVENT_LABEL_CHANGED, listener: typeof labelChanged | null): this;\n on(type: typeof Column.EVENT_METADATA_CHANGED, listener: typeof metaDataChanged | null): this;\n on(type: typeof Column.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof Column.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof Column.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof Column.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof Column.EVENT_RENDERER_TYPE_CHANGED, listener: typeof rendererTypeChanged | null): this;\n on(type: typeof Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, listener: typeof groupRendererChanged | null): this;\n on(type: typeof Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, listener: typeof summaryRendererChanged | null): this;\n on(type: typeof Column.EVENT_VISIBILITY_CHANGED, listener: typeof visibilityChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(<any>type, listener);\n }\n\n getValues(row: IDataRow) {\n return this.getLinks(row).map((d) => d ? d.href : '');\n }\n\n getLabels(row: IDataRow) {\n return this.getLinks(row).map((d) => d ? d.alt : '');\n }\n\n private transformValue(v: any, row: IDataRow, i: number) {\n if (v == null || v === '') {\n return null;\n }\n if (typeof v === 'string') {\n if (!this.pattern) {\n return {\n alt: v,\n href: v\n };\n }\n if (!this.patternFunction) {\n this.patternFunction = patternFunction(this.pattern, 'item', 'index');\n }\n return {\n alt: v,\n href: this.patternFunction.call(this, v, row.v, i)\n };\n }\n return v;\n }\n\n getLinks(row: IDataRow): ILink[] {\n return super.getValues(row).map((v, i) => {\n return this.transformValue(v, row, i);\n });\n }\n\n dump(toDescRef: (desc: any) => any): any {\n const r = super.dump(toDescRef);\n if (this.pattern !== (<any>this.desc).pattern) {\n r.pattern = this.pattern;\n }\n return r;\n }\n\n restore(dump: any, factory: ITypeFactory) {\n if (dump.pattern) {\n this.pattern = dump.pattern;\n }\n super.restore(dump, factory);\n }\n}\n","export function isPromiseLike(p) {\r\n return p != null && p && typeof p.then === 'function';\r\n}\r\n/**\r\n * the symbol returned when the promise was aborted\r\n */\r\nexport var ABORTED = Symbol('aborted');\r\nfunction thenFactory(loader, isAborted, abort) {\r\n function then(onfulfilled, _onrejected) {\r\n var fullfiller = loader.then(function (loaded) {\r\n var loadedOrAborted = isAborted() ? ABORTED : loaded;\r\n var res = onfulfilled ? onfulfilled(loadedOrAborted) : loadedOrAborted;\r\n if (isPromiseLike(res)) {\r\n return res.then(function (r) {\r\n return isAborted() ? ABORTED : r;\r\n });\r\n }\r\n return isAborted() ? ABORTED : res;\r\n });\r\n return {\r\n then: thenFactory(fullfiller, isAborted, abort),\r\n abort: abort,\r\n isAborted: isAborted\r\n };\r\n }\r\n return then;\r\n}\r\n/**\r\n * abort able Promise wrapper, returns a promise which can be aborted, and trying to avoid executing therefore the wrapped promise\r\n * @param {Promise<T>} loader\r\n * @returns {any}\r\n */\r\nexport default function abortAble(loader) {\r\n var aborted = null;\r\n var isAborted = function () { return aborted === null; };\r\n var aborter = new Promise(function (resolve) { return aborted = resolve; });\r\n var abort = function () {\r\n if (aborted == null) {\r\n return;\r\n }\r\n aborted(ABORTED);\r\n aborted = null;\r\n };\r\n var race = Promise.race([aborter, loader]);\r\n return {\r\n then: thenFactory(race, isAborted, abort),\r\n abort: abort,\r\n isAborted: isAborted\r\n };\r\n}\r\nexport function abortAbleFetch(input, init) {\r\n var controller = new AbortController();\r\n var race = new Promise(function (resolve, reject) {\r\n var r = fetch(input, Object.assign({ signal: controller.signal }, init || {}));\r\n r.then(resolve);\r\n r.catch(function (error) {\r\n if (error instanceof DOMException) {\r\n resolve(ABORTED);\r\n }\r\n else {\r\n reject(error);\r\n }\r\n });\r\n });\r\n var abort = controller.abort.bind(controller);\r\n var isAborted = function () { return controller.signal.aborted; };\r\n return {\r\n then: thenFactory(race, isAborted, abort),\r\n abort: abort,\r\n isAborted: isAborted\r\n };\r\n}\r\n/**\r\n * similar to Promise.all but for abortAble\r\n */\r\nexport function abortAbleAll(values) {\r\n var loader = Promise.all(values);\r\n var aborted = null;\r\n var isAborted = function () { return aborted === null; };\r\n var aborter = new Promise(function (resolve) { return aborted = resolve; });\r\n var abort = function () {\r\n if (aborted == null) {\r\n return;\r\n }\r\n aborted(ABORTED);\r\n for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {\r\n var v = values_1[_i];\r\n if (isAbortAble(v)) {\r\n v.abort();\r\n }\r\n }\r\n aborted = null;\r\n };\r\n var race = Promise.race([aborter, loader]);\r\n return {\r\n then: thenFactory(race, isAborted, abort),\r\n abort: abort,\r\n isAborted: isAborted\r\n };\r\n}\r\n/**\r\n * checked whether the given argument is an abortable Promise\r\n * @param {IAbortAblePromise<any> | any} abortAble\r\n * @returns {boolean}\r\n */\r\nexport function isAbortAble(abortAble) {\r\n return abortAble != null && abortAble && typeof abortAble.then === 'function' && typeof abortAble.abort === 'function';\r\n}\r\nexport function isAsyncUpdate(update) {\r\n return update !== undefined && update !== null && update && isAbortAble(update.ready);\r\n}\r\n/**\r\n * similar to Promise.resolve\r\n */\r\nexport function abortAbleResolveNow(value) {\r\n function then(onfulfilled, _onrejected) {\r\n var res = onfulfilled ? onfulfilled(value) : value;\r\n if (isAbortAble(res)) {\r\n return res;\r\n }\r\n if (isPromiseLike(res)) {\r\n return abortAble(res);\r\n }\r\n return {\r\n then: abortAbleResolveNow(res),\r\n abort: function () { return undefined; },\r\n isAborted: function () { return false; }\r\n };\r\n }\r\n return {\r\n then: then,\r\n abort: function () { return undefined; },\r\n isAborted: function () { return false; }\r\n };\r\n}\r\n//# sourceMappingURL=abortAble.js.map","import {Column, Ranking, IColumnConstructor, IColumnDesc, IGroup, IndicesArray, IDataRow, IRankingDump, EAggregationState, IColorMappingFunctionConstructor, IMappingFunctionConstructor, ITypeFactory} from '../model';\nimport {AEventDispatcher, ISequence} from '../internal';\nimport {IRenderTasks} from '../renderer';\nimport {IAbortAblePromise as IAbortAblePromiseImpl} from 'lineupengine';\n\nexport {ABORTED} from 'lineupengine';\nexport declare type IAbortAblePromise<T> = IAbortAblePromiseImpl<T>;\n\nexport declare type IAggregationStrategy = 'group' | 'item' | 'group+item' | 'group+top+item' | 'group+item+top';\n\nexport interface IDataProviderOptions {\n columnTypes: {[columnType: string]: IColumnConstructor};\n colorMappingFunctionTypes: {[colorMappingFunctionType: string]: IColorMappingFunctionConstructor};\n mappingFunctionTypes: {[mappingFunctionType: string]: IMappingFunctionConstructor};\n\n /**\n * allow just single selected rows\n * @default: false\n */\n singleSelection: boolean;\n\n /**\n * show top N rows as sample rows\n * @default 10\n */\n showTopN: number;\n\n /**\n * aggregation strategy to show upon grouping, see also showTopN\n * @default 'item'\n */\n aggregationStrategy: IAggregationStrategy;\n\n /**\n * whether to propagate a collapse operation to its children\n * @default true\n */\n propagateAggregationState: boolean;\n}\n\nexport interface IDataProvider extends AEventDispatcher {\n readonly columnTypes: {[columnType: string]: IColumnConstructor};\n\n getTotalNumberOfRows(): number;\n\n getTaskExecutor(): IRenderTasks;\n\n getTypeFactory(): ITypeFactory;\n\n takeSnapshot(col: Column): void;\n\n selectAllOf(ranking: Ranking): void;\n\n getSelection(): number[];\n\n setSelection(dataIndices: IndicesArray): void;\n\n toggleSelection(i: number, additional?: boolean): boolean;\n\n isSelected(i: number): boolean;\n\n removeRanking(ranking: Ranking): void;\n\n ensureOneRanking(): void;\n\n find(id: string): Column | null;\n\n clone(col: Column): Column;\n\n create(desc: IColumnDesc): Column | null;\n\n toDescRef(desc: IColumnDesc): any;\n\n fromDescRef(ref: any): IColumnDesc;\n\n mappingSample(col: Column): Promise<ISequence<number>> | ISequence<number>;\n\n searchAndJump(search: string | RegExp, col: Column): void;\n\n getRankings(): Ranking[];\n\n getFirstRanking(): Ranking | null;\n getLastRanking(): Ranking;\n\n getColumns(): IColumnDesc[];\n\n getAggregationStrategy(): IAggregationStrategy;\n\n isAggregated(ranking: Ranking, group: IGroup): boolean;\n\n setAggregationState(ranking: Ranking, group: IGroup, state: EAggregationState): void;\n\n getAggregationState(ranking: Ranking, group: IGroup): EAggregationState;\n\n aggregateAllOf(ranking: Ranking, aggregateAll: boolean | number | EAggregationState, groups?: IGroup[]): void;\n\n getTopNAggregated(ranking: Ranking, group: IGroup): number;\n\n setTopNAggregated(ranking: Ranking, group: IGroup, value: number): void;\n\n setShowTopN(value: number): void;\n getShowTopN(): number;\n\n getRow(dataIndex: number): Promise<IDataRow> | IDataRow;\n\n clearFilters(): void;\n}\n\n\n\nexport const SCHEMA_REF = `https://lineup.js.org/develop/schema.4.0.0.json`;\n\nexport interface IDataProviderDump {\n '$schema'?: string;\n /**\n * base for generating new uids\n */\n uid?: number;\n\n /**\n * current selection\n */\n selection?: number[];\n\n /**\n * list of aggregated group paths\n */\n aggregations?: string[] | {[key: string]: number};\n /**\n * ranking dumps\n */\n rankings?: IRankingDump[];\n\n /**\n * custom show top N setting\n */\n showTopN?: number;\n}\n\n\n\nexport interface IDeriveOptions {\n /**\n * maximal percentage of unique values to be treated as a categorical column\n */\n categoricalThreshold: number | ((unique: number, total: number) => boolean);\n\n columns: string[];\n\n /**\n * date pattern to check for string matching them\n * @default %x\n */\n datePattern: string | string[];\n}\n\n\nexport interface IExportOptions {\n /**\n * export separator, default: '\\t'\n */\n separator: string;\n /**\n * new line character, default: '\\n'\n */\n newline: string;\n /**\n * should a header be generated, default: true\n */\n header: boolean;\n /**\n * quote strings, default: false\n */\n quote: boolean;\n /**\n * quote string to use, default: '\"'\n */\n quoteChar: string;\n /**\n * filter specific column types, default: exclude all support types (selection, action, rank)\n * @param col the column description to filter\n */\n filter: (col: Column) => boolean; //!isSupportType\n\n /**\n * whether the description should be part of the column header\n */\n verboseColumnHeaders: boolean;\n}\n","import {IDataRow} from '../model';\nimport get from 'lodash.get';\n\n/**\n * @internal\n */\nexport function isComplexAccessor(column: any) {\n // something like a.b or a[4]\n return typeof column === 'string' && (column.includes('.') || column.includes('['));\n}\n\n/**\n * @internal\n */\nexport function resolveValue(value: any, column: string | number) {\n if (value != null && value.hasOwnProperty(column)) { // well complex but a direct hit\n return value[column];\n }\n return get(value, column);\n}\n\n/**\n * @internal\n */\nexport function rowComplexGetter(row: IDataRow, desc: any) {\n return resolveValue(row.v, desc.column);\n}\n\n\n/**\n * simple row getter\n * @internal\n */\nexport function rowGetter(row: IDataRow, desc: any) {\n return row.v[desc.column];\n}\n\n\n/**\n * @internal\n */\nexport function rowGuessGetter(row: IDataRow, desc: any) {\n const column = desc.column;\n if (isComplexAccessor(column)) {\n return rowComplexGetter(row, desc);\n }\n return rowGetter(row, desc);\n}\n\n","import {Ranking, isNumberColumn, Column, IColumnDesc, isSupportType, isMapAbleColumn, DEFAULT_COLOR} from '../model';\nimport {colorPool, MAX_COLORS} from '../model/internal';\nimport {concat, equal, extent, range, resolveValue} from '../internal';\nimport {timeParse} from 'd3-time-format';\nimport {IDataProvider, IDeriveOptions, IExportOptions} from './interfaces';\n\n\n/**\n * @internal\n */\nexport function cleanCategories(categories: Set<string>) {\n // remove missing values\n categories.delete(<any>null);\n categories.delete(<any>undefined);\n categories.delete('');\n categories.delete('NA');\n categories.delete('NaN');\n categories.delete('na');\n\n return Array.from(categories).map(String).sort();\n}\n\nfunction hasDifferentSizes(data: any[][]) {\n if (data.length === 0) {\n return false;\n }\n const base = data[0].length;\n\n return data.some((d) => d != null && base !== (Array.isArray(d) ? d.length : -1));\n}\n\nfunction isEmpty(v: any) {\n return v == null || (Array.isArray(v) && v.length === 0) || (v instanceof Set && v.size === 0) || (v instanceof Map && v.size === 0) || equal({}, v);\n}\n\nfunction deriveBaseType(value: any, all: () => any[], column: number | string, options: IDeriveOptions) {\n if (value == null) {\n console.warn('cannot derive from null value for column: ', column);\n return null;\n }\n // primitive\n if (typeof value === 'number') {\n return {\n type: 'number',\n domain: extent(all())\n };\n }\n if (typeof value === 'boolean') {\n return {\n type: 'boolean'\n };\n }\n\n if (value instanceof Date) {\n return {\n type: 'date'\n };\n }\n const formats = Array.isArray(options.datePattern) ? options.datePattern : [options.datePattern];\n for (const format of formats) {\n const dateParse = timeParse(format);\n if (dateParse(value) == null) {\n continue;\n }\n return {\n type: 'date',\n dateParse: format\n };\n }\n const treatAsCategorical = typeof options.categoricalThreshold === 'function' ? options.categoricalThreshold : (u: number, t: number) => u < t * (<number>options.categoricalThreshold);\n\n if (typeof value === 'string') {\n //maybe a categorical\n const values = all();\n const categories = new Set(values);\n if (treatAsCategorical(categories.size, values.length)) {\n return {\n type: 'categorical',\n categories: cleanCategories(categories)\n };\n }\n return {\n type: 'string'\n };\n }\n\n if (typeof value === 'object' && value.alt != null && value.href != null) {\n return {\n type: 'link'\n };\n }\n\n return null;\n}\n\nfunction deriveType(label: string, value: any, column: number | string, all: () => any[], options: IDeriveOptions): IColumnDesc {\n const base: any = {\n type: 'string',\n label,\n column\n };\n\n const primitive = deriveBaseType(value, all, column, options);\n if (primitive != null) {\n return Object.assign(base, primitive);\n }\n\n // set\n if (value instanceof Set) {\n const cats = new Set<string>();\n for (const value of all()) {\n if (!(value instanceof Set)) {\n continue;\n }\n value.forEach((vi) => {\n cats.add(String(vi));\n });\n }\n return Object.assign(base, {\n type: 'set',\n categories: cleanCategories(cats)\n });\n }\n\n // map\n if (value instanceof Map) {\n const first = Array.from(value.values()).find((d) => !isEmpty(d));\n const mapAll = () => {\n const r: any[] = [];\n for (const vi of all()) {\n if (!(vi instanceof Map)) {\n continue;\n }\n vi.forEach((vii) => {\n if (!isEmpty(vii)) {\n r.push(vii);\n }\n });\n }\n return r;\n };\n const p = deriveBaseType(first, mapAll, column, options);\n return Object.assign(base, p || {}, {\n type: p ? `${p.type}Map` : 'stringMap'\n });\n }\n\n // array\n if (Array.isArray(value)) {\n const values = all();\n const sameLength = !hasDifferentSizes(values);\n if (sameLength) {\n base.dataLength = value.length;\n }\n const first = value.find((v) => !isEmpty(v));\n const p = deriveBaseType(first, () => concat(values).filter((d) => !isEmpty(d)), column, options);\n if (p && p.type === 'categorical' && !sameLength) {\n return Object.assign(base, p, {\n type : 'set'\n });\n }\n if (p || isEmpty(first)) {\n return Object.assign(base, p || {}, {\n type: p ? `${p.type}s` : 'strings'\n });\n }\n\n if (typeof first === 'object' && first.key != null && first.value != null) {\n // key,value pair map\n const mapAll = () => {\n const r: any[] = [];\n for (const vi of values) {\n if (!Array.isArray(vi)) {\n continue;\n }\n for (const vii of vi) {\n if (!isEmpty(vii)) {\n r.push(vii);\n }\n }\n }\n return r;\n };\n const p = deriveBaseType(first.value, mapAll, column, options);\n return Object.assign(base, p || {}, {\n type: p ? `${p.type}Map` : 'stringMap'\n });\n }\n }\n\n // check boxplot\n const bs = ['min', 'max', 'median', 'q1', 'q3'];\n if (value !== null && typeof value === 'object' && bs.every((b) => typeof value[b] === 'number')) {\n // boxplot\n const vs = all();\n return Object.assign(base, {\n type: 'boxplot',\n domain: [\n vs.reduce((a, b) => Math.min(a, b.min), Number.POSITIVE_INFINITY),\n vs.reduce((a, b) => Math.max(a, b.max), Number.NEGATIVE_INFINITY)\n ]\n });\n }\n\n if (value !== null && typeof value === 'object') {\n // object map\n const first = Object.keys(value).map((k) => value[k]).filter((d) => !isEmpty(d));\n const mapAll = () => {\n const r: any[] = [];\n for (const vi of all()) {\n if (vi == null) {\n continue;\n }\n Object.keys(vi).forEach((k) => {\n const vii = vi[k];\n if (!isEmpty(vii)) {\n r.push(vii);\n }\n });\n }\n return r;\n };\n const p = deriveBaseType(first, mapAll, column, options);\n return Object.assign(base, p || {}, {\n type: p ? `${p.type}Map` : 'stringMap'\n });\n }\n\n console.log('cannot infer type of column:', column);\n //unknown type\n return base;\n}\n\nfunction selectColumns(existing: string[], columns: string[]) {\n const allNots = columns.every((d) => d.startsWith('-'));\n if (!allNots) {\n return columns;\n }\n // negate case, exclude columns that are given using -notation\n const exclude = new Set(columns);\n return existing.filter((d) => !exclude.has(`-${d}`));\n}\n\nfunction toLabel(key: string | number) {\n if (typeof(key) === 'number') {\n return `Col ${key + 1}`;\n }\n key = key.trim();\n if (key.length === 0) {\n return 'Unknown';\n }\n return key.split(/[\\s]+/gm).map((k) => k.length === 0 ? k : `${k[0]!.toUpperCase()}${k.slice(1)}`).join(' ');\n}\n\nexport function deriveColumnDescriptions(data: any[], options: Partial<IDeriveOptions> = {}) {\n const config = Object.assign({\n categoricalThreshold: (u: number, n: number) => u <= MAX_COLORS && u < n * 0.7, //70% unique and less equal to 22 categories\n columns: [],\n datePattern: ['%x', '%Y-%m-%d', '%Y-%m-%dT%H:%M:%S.%LZ']\n }, options);\n\n const r: IColumnDesc[] = [];\n if (data.length === 0) {\n // no data to derive something from\n return r;\n }\n\n const first = data[0];\n const columns: (number|string)[] = Array.isArray(first) ? range(first.length) : (config.columns.length > 0 ? selectColumns(Object.keys(first), config.columns) : Object.keys(first));\n\n return columns.map((key) => {\n let v = resolveValue(first, key);\n if (isEmpty(v)) {\n // cannot derive something from null try other rows\n const foundRow = data.find((row) => !isEmpty(resolveValue(row, key)));\n v = foundRow ? foundRow[key] : null;\n }\n return deriveType(toLabel(key), v, key, () => data.map((d) => resolveValue(d, key)).filter((d) => !isEmpty(d)), config);\n });\n}\n\n\n/**\n * assigns colors to columns if they are numbers and not yet defined\n * @param columns\n * @returns {IColumnDesc[]}\n */\nexport function deriveColors(columns: IColumnDesc[]) {\n const colors = colorPool();\n columns.forEach((col: IColumnDesc) => {\n if (isMapAbleColumn(col)) {\n col.colorMapping = col.colorMapping || col.color || colors() || DEFAULT_COLOR;\n }\n });\n return columns;\n}\n\n\n/**\n * utility to export a ranking to a table with the given separator\n * @param ranking\n * @param data\n * @param options\n * @returns {Promise<string>}\n */\nexport function exportRanking(ranking: Ranking, data: any[], options: Partial<IExportOptions> = {}) {\n const opts = <IExportOptions>Object.assign({\n separator: '\\t',\n newline: '\\n',\n header: true,\n quote: false,\n quoteChar: '\"',\n filter: (c: Column) => !isSupportType(c),\n verboseColumnHeaders: false\n }, options);\n\n //optionally quote not numbers\n const escape = new RegExp(`[${opts.quoteChar}]`, 'g');\n\n function quote(v: any, c?: Column) {\n const l = String(v);\n if ((opts.quote || l.indexOf('\\n') >= 0) && (!c || !isNumberColumn(c))) {\n return `${opts.quoteChar}${l.replace(escape, opts.quoteChar + opts.quoteChar)}${opts.quoteChar}`;\n }\n return l;\n }\n\n const columns = ranking.flatColumns.filter((c) => opts.filter(c));\n const order = ranking.getOrder();\n\n const r: string[] = [];\n if (opts.header) {\n r.push(columns.map((d) => quote(`${d.label}${opts.verboseColumnHeaders && d.description ? `\\n${d.description}` : ''}`)).join(opts.separator));\n }\n data.forEach((row, i) => {\n r.push(columns.map((c) => quote(c.getExportValue({v: row, i: order[i]}, 'text'), c)).join(opts.separator));\n });\n return r.join(opts.newline);\n}\n\n\n/** @internal */\nexport function map2Object<T>(map: Map<string, T>) {\n const r : { [key: string]: T} = {};\n map.forEach((v, k) => r[k] = v);\n return r;\n}\n\n/** @internal */\nexport function object2Map<T>(obj: { [key: string]: T}) {\n const r = new Map<string, T>();\n for (const k of Object.keys(obj)) {\n r.set(k, obj[k]);\n }\n return r;\n}\n\n\n/** @internal */\nexport function rangeSelection(provider: IDataProvider, rankingId: string, dataIndex: number, relIndex: number, ctrlKey: boolean) {\n const ranking = provider.getRankings().find((d) => d.id === rankingId);\n if (!ranking) { // no known reference\n return false;\n }\n const selection = provider.getSelection();\n if (selection.length === 0 || selection.includes(dataIndex)) {\n return false; // no other or deselect\n }\n const order = ranking.getOrder();\n const lookup = new Map(Array.from(order).map((d, i) => <[number, number]>[d, i]));\n const distances = selection.map((d) => {\n const index = (lookup.has(d) ? lookup.get(d)! : Infinity);\n return {s: d, index, distance: Math.abs(relIndex - index)};\n });\n const nearest = distances.sort((a, b) => a.distance - b.distance)[0]!;\n if (!isFinite(nearest.distance)) {\n return false; // all outside\n }\n if (!ctrlKey) {\n selection.splice(0, selection.length);\n selection.push(nearest.s);\n }\n if (nearest.index < relIndex) {\n for (let i = nearest.index + 1; i <= relIndex; ++i) {\n selection.push(order[i]);\n }\n } else {\n for (let i = relIndex; i <= nearest.index; ++i) {\n selection.push(order[i]);\n }\n }\n provider.setSelection(selection);\n return true;\n}\n","import {IAggregationStrategy} from './interfaces';\nimport {IOrderedGroup, IGroup, IGroupParent, IGroupData, IGroupItem, isGroup, EAggregationState} from '../model';\n\nexport function isAlwaysShowingGroupStrategy(strategy: IAggregationStrategy) {\n return strategy === 'group+item' || strategy === 'group+item+top' || strategy === 'group+top+item';\n}\n\nexport function hasTopNStrategy(strategy: IAggregationStrategy) {\n return strategy === 'group+item+top' || strategy === 'group+top+item';\n}\n\nexport function convertAggregationState(state: boolean | number | EAggregationState, topN: number) {\n if (typeof state === 'boolean') {\n return state ? 0 : -1;\n }\n if (state === EAggregationState.COLLAPSE) {\n return 0;\n }\n if (state === EAggregationState.EXPAND) {\n return -1;\n }\n if (state === EAggregationState.EXPAND_TOP_N) {\n return topN;\n }\n return state;\n}\n\nexport declare type IGroupMeta = 'first' | 'last' | 'first last' | null;\n\nexport function toItemMeta(relativeIndex: number, group: IOrderedGroup, topN: number): IGroupMeta {\n if (relativeIndex === 0) {\n return group.order.length === 1 ? 'first last' : 'first';\n }\n if ((relativeIndex === (group.order.length - 1)) || (topN > 0 && relativeIndex === (topN - 1))) {\n return 'last';\n }\n return null;\n}\n\nexport function groupParents(group: IGroup, meta: IGroupMeta) {\n const parents: {group: IGroup, meta: IGroupMeta}[] = [{group, meta}];\n\n let prev = group;\n let prevMeta = meta;\n let parent: IGroupParent | undefined | null = group.parent;\n\n while (parent) {\n if (parent.subGroups.length === 1 && (prevMeta === 'first last')) {\n meta = 'first last';\n } else if (parent.subGroups[0] === prev && (prevMeta === 'first last' || prevMeta === 'first')) {\n meta = 'first';\n } else if (parent.subGroups[parent.subGroups.length - 1] === prev && (prevMeta === 'last' || prevMeta === 'first last')) {\n meta = 'last';\n } else {\n meta = null;\n }\n parents.unshift({group: parent, meta});\n\n prev = parent;\n prevMeta = meta;\n parent = parent.parent;\n }\n return parents;\n}\n\nexport interface ITopNGetter {\n (item: IGroup): number;\n}\n\n/**\n * number of group levels this items ends\n */\nexport function groupEndLevel(item: IGroupData | IGroupItem, topNGetter: ITopNGetter) {\n const group: IGroup = isGroup(item) ? item : item.group;\n const last = isGroup(item) ? 'first last' : toItemMeta(item.relativeIndex, item.group, topNGetter(group));\n if (last !== 'last' && last !== 'first last') {\n return 0;\n }\n\n let prev = group;\n let parent: IGroupParent | undefined | null = group.parent;\n let i = 1;\n\n while (parent) {\n if (!(parent.subGroups.length === 1 || (parent.subGroups[parent.subGroups.length - 1] === prev))) {\n // not last of group - end\n return i;\n }\n ++i;\n prev = parent;\n parent = parent.parent;\n }\n\n return i;\n}\n\nexport function isSummaryGroup(group: IGroup, strategy: IAggregationStrategy, topNGetter: ITopNGetter) {\n const topN = topNGetter(group);\n return isAlwaysShowingGroupStrategy(strategy) && topN !== 0;\n}\n\nexport function toRowMeta(item: IGroupData | IGroupItem, strategy: IAggregationStrategy, topNGetter: ITopNGetter): string | null {\n if (isGroup(item)) {\n if (isSummaryGroup(item, strategy, topNGetter)) {\n return 'first';\n }\n const level = groupEndLevel(item, topNGetter);\n if (level === 0) {\n return 'first';\n }\n return `first last${level === 1 ? '' : level - 1}`;\n }\n\n const last = toItemMeta(item.relativeIndex, item.group, topNGetter(item.group));\n if (last == null) {\n return null;\n }\n const level = groupEndLevel(item, topNGetter);\n if (level === 0) {\n return null;\n }\n return `last${level === 1 ? '' : level - 1}`;\n}\n","import {AEventDispatcher, debounce, ISequence, OrderedSet, IDebounceContext, IEventListener, suffix, IEventContext} from '../internal';\nimport {Column, IColumnConstructor, Ranking, AggregateGroupColumn, createAggregateDesc, IAggregateGroupColumnDesc, isSupportType, EDirtyReason, RankColumn, createRankDesc, createSelectionDesc, IColumnDesc, IDataRow, IGroup, IndicesArray, IOrderedGroup, ISelectionColumnDesc, EAggregationState, IColumnDump, IRankingDump, IColorMappingFunctionConstructor, IMappingFunctionConstructor, ITypeFactory} from '../model';\nimport {models} from '../model/models';\nimport {forEachIndices, everyIndices, toGroupID, unifyParents} from '../model/internal';\nimport {IDataProvider, IDataProviderDump, IDataProviderOptions, SCHEMA_REF, IExportOptions} from './interfaces';\nimport {exportRanking, map2Object, object2Map} from './utils';\nimport {IRenderTasks} from '../renderer';\nimport {restoreCategoricalColorMapping} from '../model/CategoricalColorMappingFunction';\nimport {createColorMappingFunction, colorMappingFunctions} from '../model/ColorMappingFunction';\nimport {createMappingFunction, mappingFunctions} from '../model/MappingFunction';\nimport {convertAggregationState} from './internal';\n\n\n/**\n * emitted when a column has been added\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function addColumn(col: Column, index: number): void;\n\n/**\n * emitted when a column has been moved within this composite columm\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function moveColumn(col: Column, index: number, oldIndex: number): void;\n\n/**\n * emitted when a column has been removed\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function removeColumn(col: Column, index: number): void;\n/**\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function orderChanged(previous: number[], current: number[], previousGroups: IOrderedGroup[], currentGroups: IOrderedGroup[], dirtyReason: EDirtyReason[]): void;\n\n\n/**\n * emitted when state of the column is dirty\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function dirty(): void;\n\n/**\n * emitted when state of the column related to its header is dirty\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function dirtyHeader(): void;\n\n/**\n * emitted when state of the column related to its values is dirty\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function dirtyValues(): void;\n\n/**\n * emitted when state of the column related to cached values (hist, compare, ...) is dirty\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function dirtyCaches(): void;\n\n\n/**\n * emitted when the data changes\n * @asMemberOf ADataProvider\n * @param rows the new data rows\n * @event\n */\nexport declare function dataChanged(rows: IDataRow[]): void;\n\n/**\n * emitted when the selection changes\n * @asMemberOf ADataProvider\n * @param dataIndices the selected data indices\n * @event\n */\nexport declare function selectionChanged(dataIndices: number[]): void;\n/**\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function addRanking(ranking: Ranking, index: number): void;\n/**\n * @asMemberOf ADataProvider\n * @param ranking if null all rankings are removed else just the specific one\n * @event\n */\nexport declare function removeRanking(ranking: Ranking | null, index: number): void;\n\n/**\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function addDesc(desc: IColumnDesc): void;\n/**\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function removeDesc(desc: IColumnDesc): void;\n/**\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function clearDesc(): void;\n\n/**\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function showTopNChanged(previous: number, current: number): void;\n\n/**\n * emitted when the selection changes\n * @asMemberOf ADataProvider\n * @param dataIndices the selected data indices\n * @event\n */\nexport declare function jumpToNearest(dataIndices: number[]): void;\n/**\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function aggregate(ranking: Ranking, group: IGroup | IGroup[], previousTopN: number | number[], currentTopN: number | number[]): void;\n\n\n/**\n * @asMemberOf ADataProvider\n * @event\n */\nexport declare function busy(busy: boolean): void;\n\nfunction toDirtyReason(ctx: IEventContext) {\n const primary = ctx.primaryType;\n switch (primary || '') {\n case Ranking.EVENT_DIRTY_ORDER:\n return ctx.args[0] || [EDirtyReason.UNKNOWN];\n case Ranking.EVENT_SORT_CRITERIA_CHANGED:\n return [EDirtyReason.SORT_CRITERIA_CHANGED];\n case Ranking.EVENT_GROUP_CRITERIA_CHANGED:\n return [EDirtyReason.GROUP_CRITERIA_CHANGED];\n case Ranking.EVENT_GROUP_SORT_CRITERIA_CHANGED:\n return [EDirtyReason.GROUP_SORT_CRITERIA_CHANGED];\n default:\n return [EDirtyReason.UNKNOWN];\n }\n}\n\nfunction mergeDirtyOrderContext(current: IDebounceContext, next: IDebounceContext) {\n const currentReason = toDirtyReason(current.self);\n const nextReason = toDirtyReason(next.self);\n const combined = new Set(currentReason);\n for (const r of nextReason) {\n combined.add(r);\n }\n const args = [Array.from(combined)];\n return {\n self: {\n primaryType: Ranking.EVENT_DIRTY_ORDER,\n args\n },\n args\n };\n}\n\n/**\n * a basic data provider holding the data and rankings\n */\nabstract class ADataProvider extends AEventDispatcher implements IDataProvider {\n static readonly EVENT_SELECTION_CHANGED = 'selectionChanged';\n static readonly EVENT_DATA_CHANGED = 'dataChanged';\n static readonly EVENT_ADD_COLUMN = Ranking.EVENT_ADD_COLUMN;\n static readonly EVENT_MOVE_COLUMN = Ranking.EVENT_MOVE_COLUMN;\n static readonly EVENT_REMOVE_COLUMN = Ranking.EVENT_REMOVE_COLUMN;\n static readonly EVENT_ADD_RANKING = 'addRanking';\n static readonly EVENT_REMOVE_RANKING = 'removeRanking';\n static readonly EVENT_DIRTY = Ranking.EVENT_DIRTY;\n static readonly EVENT_DIRTY_HEADER = Ranking.EVENT_DIRTY_HEADER;\n static readonly EVENT_DIRTY_VALUES = Ranking.EVENT_DIRTY_VALUES;\n static readonly EVENT_DIRTY_CACHES = Ranking.EVENT_DIRTY_CACHES;\n static readonly EVENT_ORDER_CHANGED = Ranking.EVENT_ORDER_CHANGED;\n static readonly EVENT_SHOWTOPN_CHANGED = 'showTopNChanged';\n static readonly EVENT_ADD_DESC = 'addDesc';\n static readonly EVENT_CLEAR_DESC = 'clearDesc';\n static readonly EVENT_REMOVE_DESC = 'removeDesc';\n static readonly EVENT_JUMP_TO_NEAREST = 'jumpToNearest';\n static readonly EVENT_GROUP_AGGREGATION_CHANGED = AggregateGroupColumn.EVENT_AGGREGATE;\n static readonly EVENT_BUSY = 'busy';\n\n private static readonly FORWARD_RANKING_EVENTS = suffix('.provider', Ranking.EVENT_ADD_COLUMN, Ranking.EVENT_REMOVE_COLUMN,\n Ranking.EVENT_DIRTY, Ranking.EVENT_DIRTY_HEADER, Ranking.EVENT_MOVE_COLUMN,\n Ranking.EVENT_ORDER_CHANGED, Ranking.EVENT_DIRTY_VALUES, Ranking.EVENT_DIRTY_CACHES);\n\n /**\n * all rankings\n * @type {Array}\n * @private\n */\n private readonly rankings: Ranking[] = [];\n\n /**\n * the current selected indices\n * @type {OrderedSet}\n */\n private readonly selection = new OrderedSet<number>();\n\n //Map<ranking.id@group.name, -1=expand,0=collapse,N=topN>\n private readonly aggregations = new Map<string, number>(); // not part of = show all\n\n private uid = 0;\n private readonly typeFactory: ITypeFactory;\n\n private readonly options: Readonly<IDataProviderOptions> = {\n columnTypes: {},\n colorMappingFunctionTypes: {},\n mappingFunctionTypes: {},\n singleSelection: false,\n showTopN: 10,\n aggregationStrategy: 'item',\n propagateAggregationState: true,\n };\n\n /**\n * lookup map of a column type to its column implementation\n */\n readonly columnTypes: {[columnType: string]: IColumnConstructor};\n readonly colorMappingFunctionTypes: {[colorMappingFunctionType: string]: IColorMappingFunctionConstructor};\n readonly mappingFunctionTypes: {[mappingFunctionType: string]: IMappingFunctionConstructor};\n\n private showTopN: number;\n\n constructor(options: Partial<IDataProviderOptions> = {}) {\n super();\n Object.assign(this.options, options);\n this.columnTypes = Object.assign(models(), this.options.columnTypes);\n this.colorMappingFunctionTypes = Object.assign(colorMappingFunctions(), this.options.colorMappingFunctionTypes);\n this.mappingFunctionTypes = Object.assign(mappingFunctions(), this.options.mappingFunctionTypes);\n this.showTopN = this.options.showTopN;\n\n this.typeFactory = this.createTypeFactory();\n }\n\n private createTypeFactory() {\n const factory = <ITypeFactory><any>((d: IColumnDump) => {\n const desc = this.fromDescRef(d.desc);\n if (!desc || !desc.type) {\n console.warn('cannot restore column dump', d);\n return new Column(d.id || '', d.desc || {});\n }\n this.fixDesc(desc);\n const type = this.columnTypes[desc.type];\n if (type == null) {\n console.warn('invalid column type in column dump using column', d);\n return new Column(d.id || '', desc);\n }\n const c = this.instantiateColumn(type, '', desc, this.typeFactory);\n c.restore(d, factory);\n return c;\n });\n factory.colorMappingFunction = createColorMappingFunction(this.colorMappingFunctionTypes, factory);\n factory.mappingFunction = createMappingFunction(this.mappingFunctionTypes);\n factory.categoricalColorMappingFunction = restoreCategoricalColorMapping;\n return factory;\n }\n\n getTypeFactory() {\n return this.typeFactory;\n }\n\n /**\n * events:\n * * column changes: addColumn, removeColumn\n * * ranking changes: addRanking, removeRanking\n * * dirty: dirty, dirtyHeder, dirtyValues\n * * selectionChanged\n * @returns {string[]}\n */\n protected createEventList() {\n return super.createEventList().concat([\n ADataProvider.EVENT_DATA_CHANGED, ADataProvider.EVENT_BUSY,\n ADataProvider.EVENT_SHOWTOPN_CHANGED,\n ADataProvider.EVENT_ADD_COLUMN, ADataProvider.EVENT_REMOVE_COLUMN, ADataProvider.EVENT_MOVE_COLUMN,\n ADataProvider.EVENT_ADD_RANKING, ADataProvider.EVENT_REMOVE_RANKING,\n ADataProvider.EVENT_DIRTY, ADataProvider.EVENT_DIRTY_HEADER, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY_CACHES,\n ADataProvider.EVENT_ORDER_CHANGED, ADataProvider.EVENT_SELECTION_CHANGED,\n ADataProvider.EVENT_ADD_DESC, ADataProvider.EVENT_CLEAR_DESC,\n ADataProvider.EVENT_JUMP_TO_NEAREST, ADataProvider.EVENT_GROUP_AGGREGATION_CHANGED]);\n }\n\n on(type: typeof ADataProvider.EVENT_BUSY, listener: typeof busy | null): this;\n on(type: typeof ADataProvider.EVENT_DATA_CHANGED, listener: typeof dataChanged | null): this;\n on(type: typeof ADataProvider.EVENT_SHOWTOPN_CHANGED, listener: typeof showTopNChanged | null): this;\n on(type: typeof ADataProvider.EVENT_ADD_COLUMN, listener: typeof addColumn | null): this;\n on(type: typeof ADataProvider.EVENT_MOVE_COLUMN, listener: typeof moveColumn | null): this;\n on(type: typeof ADataProvider.EVENT_REMOVE_COLUMN, listener: typeof removeColumn | null): this;\n on(type: typeof ADataProvider.EVENT_ADD_RANKING, listener: typeof addRanking | null): this;\n on(type: typeof ADataProvider.EVENT_REMOVE_RANKING, listener: typeof removeRanking | null): this;\n on(type: typeof ADataProvider.EVENT_DIRTY, listener: typeof dirty | null): this;\n on(type: typeof ADataProvider.EVENT_DIRTY_HEADER, listener: typeof dirtyHeader | null): this;\n on(type: typeof ADataProvider.EVENT_DIRTY_VALUES, listener: typeof dirtyValues | null): this;\n on(type: typeof ADataProvider.EVENT_DIRTY_CACHES, listener: typeof dirtyCaches | null): this;\n on(type: typeof ADataProvider.EVENT_ORDER_CHANGED, listener: typeof orderChanged | null): this;\n on(type: typeof ADataProvider.EVENT_ADD_DESC, listener: typeof addDesc | null): this;\n on(type: typeof ADataProvider.EVENT_REMOVE_DESC, listener: typeof removeDesc | null): this;\n on(type: typeof ADataProvider.EVENT_CLEAR_DESC, listener: typeof clearDesc | null): this;\n on(type: typeof ADataProvider.EVENT_JUMP_TO_NEAREST, listener: typeof jumpToNearest | null): this;\n on(type: typeof ADataProvider.EVENT_GROUP_AGGREGATION_CHANGED, listener: typeof aggregate | null): this;\n on(type: typeof ADataProvider.EVENT_SELECTION_CHANGED, listener: typeof selectionChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n abstract getTotalNumberOfRows(): number;\n\n /**\n * returns a list of all known column descriptions\n * @returns {Array}\n */\n abstract getColumns(): IColumnDesc[];\n\n abstract getTaskExecutor(): IRenderTasks;\n\n /**\n * adds a new ranking\n * @param existing an optional existing ranking to clone\n * @return the new ranking\n */\n pushRanking(existing?: Ranking): Ranking {\n const r = this.cloneRanking(existing);\n\n this.insertRanking(r);\n return r;\n }\n\n protected fireBusy(busy: boolean) {\n this.fire(ADataProvider.EVENT_BUSY, busy);\n }\n\n takeSnapshot(col: Column): Ranking {\n this.fireBusy(true);\n const r = this.cloneRanking();\n const ranking = col.findMyRanker();\n // by convention copy all support types and the first string column\n let hasString = col.desc.type === 'string';\n let hasColumn = false;\n const toClone = !ranking ? [col] : ranking.children.filter((c) => {\n if (c === col) {\n hasColumn = true;\n return true;\n }\n if (!hasString && c.desc.type === 'string') {\n hasString = true;\n return true;\n }\n return isSupportType(c);\n });\n\n if (!hasColumn) {\n // maybe a nested one thus not in the top level\n toClone.push(col);\n }\n\n toClone.forEach((c) => {\n const clone = this.clone(c);\n r.push(clone);\n if (c === col) {\n clone.sortByMe();\n }\n });\n this.insertRanking(r);\n this.fireBusy(false);\n return r;\n }\n\n insertRanking(r: Ranking, index = this.rankings.length) {\n this.rankings.splice(index, 0, r);\n this.forward(r, ...ADataProvider.FORWARD_RANKING_EVENTS);\n //delayed reordering per ranking\n const that = this;\n r.on(`${Ranking.EVENT_DIRTY_ORDER}.provider`, debounce(function (this: IEventContext) {\n that.triggerReorder(r, toDirtyReason(this));\n }, 100, mergeDirtyOrderContext));\n this.fire([ADataProvider.EVENT_ADD_RANKING, ADataProvider.EVENT_DIRTY_HEADER, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], r, index);\n this.triggerReorder(r);\n }\n\n private triggerReorder(ranking: Ranking, dirtyReason?: EDirtyReason[]) {\n this.fireBusy(true);\n const reason = dirtyReason || [EDirtyReason.UNKNOWN];\n Promise.resolve(this.sort(ranking, reason)).then(({groups, index2pos}) => {\n if (ranking.getGroupSortCriteria().length === 0) {\n groups = unifyParents(groups);\n }\n this.initAggregateState(ranking, groups);\n ranking.setGroups(groups, index2pos, reason);\n this.fireBusy(false);\n });\n }\n\n /**\n * removes a ranking from this data provider\n * @param ranking\n * @returns {boolean}\n */\n removeRanking(ranking: Ranking) {\n const i = this.rankings.indexOf(ranking);\n if (i < 0) {\n return false;\n }\n this.unforward(ranking, ...ADataProvider.FORWARD_RANKING_EVENTS);\n this.rankings.splice(i, 1);\n ranking.on(`${Ranking.EVENT_DIRTY_ORDER}.provider`, null);\n this.cleanUpRanking(ranking);\n this.fire([ADataProvider.EVENT_REMOVE_RANKING, ADataProvider.EVENT_DIRTY_HEADER, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], ranking, i);\n return true;\n }\n\n /**\n * removes all rankings\n */\n clearRankings() {\n this.rankings.forEach((ranking) => {\n this.unforward(ranking, ...ADataProvider.FORWARD_RANKING_EVENTS);\n ranking.on(`${Ranking.EVENT_DIRTY_ORDER}.provider`, null);\n this.cleanUpRanking(ranking);\n });\n // clear\n this.rankings.splice(0, this.rankings.length);\n this.fire([ADataProvider.EVENT_REMOVE_RANKING, ADataProvider.EVENT_DIRTY_HEADER, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], null, -1);\n }\n\n clearFilters() {\n this.rankings.forEach((ranking) => ranking.clearFilters());\n }\n\n /**\n * returns a list of all current rankings\n * @returns {Ranking[]}\n */\n getRankings() {\n return this.rankings.slice();\n }\n\n /**\n * returns the last ranking for quicker access\n * @returns {Ranking}\n */\n getFirstRanking() {\n return this.rankings[0] || null;\n }\n\n /**\n * returns the last ranking for quicker access\n * @returns {Ranking}\n */\n getLastRanking() {\n return this.rankings[this.rankings.length - 1];\n }\n\n ensureOneRanking() {\n if (this.rankings.length === 0) {\n const r = this.pushRanking();\n this.push(r, createRankDesc());\n }\n }\n\n destroy() {\n // dummy\n }\n\n /**\n * hook method for cleaning up a ranking\n * @param _ranking\n */\n cleanUpRanking(_ranking: Ranking) {\n // dummy\n }\n\n /**\n * abstract method for cloning a ranking\n * @param existing\n * @returns {null}\n */\n abstract cloneRanking(existing?: Ranking): Ranking;\n\n /**\n * adds a column to a ranking described by its column description\n * @param ranking the ranking to add the column to\n * @param desc the description of the column\n * @return {Column} the newly created column or null\n */\n push(ranking: Ranking, desc: IColumnDesc): Column | null {\n const r = this.create(desc);\n if (r) {\n ranking.push(r);\n return r;\n }\n return null;\n }\n\n /**\n * adds a column to a ranking described by its column description\n * @param ranking the ranking to add the column to\n * @param index the position to insert the column\n * @param desc the description of the column\n * @return {Column} the newly created column or null\n */\n insert(ranking: Ranking, index: number, desc: IColumnDesc) {\n const r = this.create(desc);\n if (r) {\n ranking.insert(r, index);\n return r;\n }\n return null;\n }\n\n /**\n * creates a new unique id for a column\n * @returns {string}\n */\n private nextId() {\n return `col${this.uid++}`;\n }\n\n private fixDesc(desc: IColumnDesc) {\n //hacks for provider dependent descriptors\n if (desc.type === 'selection') {\n (<ISelectionColumnDesc>desc).accessor = (row: IDataRow) => this.isSelected(row.i);\n (<ISelectionColumnDesc>desc).setter = (index: number, value: boolean) => value ? this.select(index) : this.deselect(index);\n (<ISelectionColumnDesc>desc).setterAll = (indices: IndicesArray, value: boolean) => value ? this.selectAll(indices) : this.deselectAll(indices);\n } else if (desc.type === 'aggregate') {\n (<IAggregateGroupColumnDesc>desc).isAggregated = (ranking: Ranking, group: IGroup) => this.getAggregationState(ranking, group);\n (<IAggregateGroupColumnDesc>desc).setAggregated = (ranking: Ranking, group: IGroup, value: EAggregationState) => this.setAggregationState(ranking, group, value);\n }\n return desc;\n }\n\n protected cleanDesc(desc: IColumnDesc) {\n //hacks for provider dependent descriptors\n if (desc.type === 'selection') {\n delete (<ISelectionColumnDesc>desc).accessor;\n delete (<ISelectionColumnDesc>desc).setter;\n delete (<ISelectionColumnDesc>desc).setterAll;\n } else if (desc.type === 'aggregate') {\n delete (<IAggregateGroupColumnDesc>desc).isAggregated;\n delete (<IAggregateGroupColumnDesc>desc).setAggregated;\n }\n return desc;\n }\n\n /**\n * creates an internal column model out of the given column description\n * @param desc\n * @returns {Column} the new column or null if it can't be created\n */\n create(desc: IColumnDesc): Column | null {\n this.fixDesc(desc);\n //find by type and instantiate\n const type = this.columnTypes[desc.type];\n if (type) {\n return this.instantiateColumn(type, this.nextId(), desc, this.typeFactory);\n }\n return null;\n }\n\n protected instantiateColumn(type: IColumnConstructor, id: string, desc: IColumnDesc, typeFactory: ITypeFactory) {\n return new type(id, desc, typeFactory);\n }\n\n /**\n * clones a column by dumping and restoring\n * @param col\n * @returns {Column}\n */\n clone(col: Column) {\n const dump = this.dumpColumn(col);\n return this.restoreColumn(dump);\n }\n\n /**\n * restores a column from a dump\n * @param dump\n * @returns {Column}\n */\n restoreColumn(dump: any): Column {\n const c = this.typeFactory(dump);\n c.assignNewId(this.nextId.bind(this));\n return c;\n }\n\n /**\n * finds a column in all rankings returning the first match\n * @param idOrFilter by id or by a filter function\n * @returns {Column}\n */\n find(idOrFilter: string | ((col: Column) => boolean)): Column | null {\n //convert to function\n const filter = typeof (idOrFilter) === 'string' ? (col: Column) => col.id === idOrFilter : idOrFilter;\n\n for (const ranking of this.rankings) {\n const r = ranking.find(filter);\n if (r) {\n return r;\n }\n }\n return null;\n }\n\n\n /**\n * dumps this whole provider including selection and the rankings\n * @returns {{uid: number, selection: number[], rankings: *[]}}\n */\n dump(): IDataProviderDump {\n return {\n '$schema': SCHEMA_REF,\n uid: this.uid,\n selection: this.getSelection(),\n aggregations: map2Object(this.aggregations),\n rankings: this.rankings.map((r) => r.dump(this.toDescRef.bind(this))),\n showTopN: this.showTopN\n };\n }\n\n /**\n * dumps a specific column\n */\n dumpColumn(col: Column): IColumnDump {\n return col.dump(this.toDescRef.bind(this));\n }\n\n /**\n * for better dumping describe reference, by default just return the description\n */\n toDescRef(desc: any): any {\n return desc;\n }\n\n /**\n * inverse operation of toDescRef\n */\n fromDescRef(descRef: any): any {\n return descRef;\n }\n\n restoreRanking(dump: IRankingDump) {\n const ranking = this.cloneRanking();\n ranking.restore(dump, this.typeFactory);\n const idGenerator = this.nextId.bind(this);\n ranking.children.forEach((c) => c.assignNewId(idGenerator));\n return ranking;\n }\n\n restore(dump: IDataProviderDump) {\n //clean old\n this.clearRankings();\n\n //restore selection\n this.uid = dump.uid || 0;\n if (dump.selection) {\n dump.selection.forEach((s: number) => this.selection.add(s));\n }\n if (dump.showTopN != null) {\n this.showTopN = dump.showTopN;\n }\n if (dump.aggregations) {\n this.aggregations.clear();\n if (Array.isArray(dump.aggregations)) {\n dump.aggregations.forEach((a: string) => this.aggregations.set(a, 0));\n } else {\n object2Map(dump.aggregations).forEach((v, k) => this.aggregations.set(k, v));\n }\n }\n\n\n //restore rankings\n if (dump.rankings) {\n dump.rankings.forEach((r: any) => {\n const ranking = this.cloneRanking();\n ranking.restore(r, this.typeFactory);\n //if no rank column add one\n if (!ranking.children.some((d) => d instanceof RankColumn)) {\n ranking.insert(this.create(createRankDesc())!, 0);\n }\n this.insertRanking(ranking);\n });\n }\n\n //assign new ids\n const idGenerator = this.nextId.bind(this);\n this.rankings.forEach((r) => {\n r.children.forEach((c) => c.assignNewId(idGenerator));\n });\n }\n\n abstract findDesc(ref: string): IColumnDesc | null;\n\n /**\n * generates a default ranking by using all column descriptions ones\n */\n deriveDefault(addSupportType: boolean = true) {\n const r = this.pushRanking();\n if (addSupportType) {\n r.push(this.create(createAggregateDesc())!);\n r.push(this.create(createRankDesc())!);\n if (this.options.singleSelection !== false) {\n r.push(this.create(createSelectionDesc())!);\n }\n }\n this.getColumns().forEach((col) => {\n const c = this.create(col);\n if (!c || isSupportType(c)) {\n return;\n }\n r.push(c);\n });\n return r;\n }\n\n isAggregated(ranking: Ranking, group: IGroup) {\n return this.getTopNAggregated(ranking, group) >= 0;\n }\n\n getAggregationState(ranking: Ranking, group: IGroup) {\n const n = this.getTopNAggregated(ranking, group);\n return n < 0 ? EAggregationState.EXPAND : (n === 0 ? EAggregationState.COLLAPSE : EAggregationState.EXPAND_TOP_N);\n }\n\n setAggregated(ranking: Ranking, group: IGroup | IGroup[], value: boolean) {\n return this.setAggregationState(ranking, group, value ? EAggregationState.COLLAPSE : EAggregationState.EXPAND);\n }\n\n setAggregationState(ranking: Ranking, group: IGroup | IGroup[], value: EAggregationState) {\n this.setTopNAggregated(ranking, group, value === EAggregationState.COLLAPSE ? 0 : (value === EAggregationState.EXPAND_TOP_N ? this.showTopN : -1));\n }\n\n getTopNAggregated(ranking: Ranking, group: IGroup) {\n let g: IGroup | undefined | null = group;\n while (g) {\n const key = `${ranking.id}@${toGroupID(g)}`;\n if (this.aggregations.has(key)) {\n // propagate to leaf\n const v = this.aggregations.get(key)!;\n if (this.options.propagateAggregationState && group !== g) {\n this.aggregations.set(`${ranking.id}@${toGroupID(group)}`, v);\n }\n return v;\n }\n g = g.parent;\n }\n return -1;\n }\n\n private unaggregateParents(ranking: Ranking, group: IGroup) {\n let g: IGroup | undefined | null = group.parent;\n let changed = false;\n while (g) {\n changed = this.aggregations.delete(`${ranking.id}@${toGroupID(g)}`) || changed;\n g = g.parent;\n }\n return changed;\n }\n\n getAggregationStrategy() {\n return this.options.aggregationStrategy;\n }\n\n private initAggregateState(ranking: Ranking, groups: IGroup[]) {\n let initial = -1;\n switch (this.getAggregationStrategy()) {\n case 'group':\n initial = 0;\n break;\n case 'item':\n case 'group+item':\n case 'group+item+top':\n initial = -1;\n break;\n case 'group+top+item':\n initial = this.showTopN;\n break;\n }\n\n for (const group of groups) {\n const key = `${ranking.id}@${toGroupID(group)}`;\n if (!this.aggregations.has(key) && initial >= 0) {\n this.aggregations.set(key, initial);\n }\n }\n }\n\n setTopNAggregated(ranking: Ranking, group: IGroup | IGroup[], value: number | number[]) {\n const groups = Array.isArray(group) ? group : [group];\n const changed: IGroup[] = [];\n const previous: number[] = [];\n\n let changedParents = false;\n\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i];\n const target = typeof value === 'number' ? value : value[i];\n changedParents = this.unaggregateParents(ranking, group) || changedParents;\n const current = this.getTopNAggregated(ranking, group);\n if (current === target) {\n continue;\n }\n changed.push(group);\n previous.push(current);\n const key = `${ranking.id}@${toGroupID(group)}`;\n if (target >= 0) {\n this.aggregations.set(key, target);\n } else {\n this.aggregations.delete(key);\n }\n }\n if (!changedParents && changed.length === 0) {\n // no change\n return;\n }\n if (!Array.isArray(group)) {\n // single change\n this.fire([ADataProvider.EVENT_GROUP_AGGREGATION_CHANGED, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], ranking, group, previous.length === 0 ? value : previous[0], value);\n } else {\n this.fire([ADataProvider.EVENT_GROUP_AGGREGATION_CHANGED, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], ranking, group, previous, value);\n }\n }\n\n aggregateAllOf(ranking: Ranking, aggregateAll: boolean | number | EAggregationState, groups = ranking.getGroups()) {\n const value = convertAggregationState(aggregateAll, this.showTopN);\n this.setTopNAggregated(ranking, groups, value);\n }\n\n getShowTopN() {\n return this.showTopN;\n }\n\n setShowTopN(value: number) {\n if (this.showTopN === value) {\n return;\n }\n // update entries\n for (const [k, v] of Array.from(this.aggregations.entries())) {\n if (v === this.showTopN) {\n this.aggregations.set(k, value);\n }\n }\n this.fire([ADataProvider.EVENT_SHOWTOPN_CHANGED, ADataProvider.EVENT_DIRTY_VALUES, ADataProvider.EVENT_DIRTY], this.showTopN, this.showTopN = value);\n }\n\n /**\n * sorts the given ranking and eventually return a ordering of the data items\n * @param ranking\n * @return {Promise<any>}\n */\n abstract sort(ranking: Ranking, dirtyReason: EDirtyReason[]): Promise<{groups: IOrderedGroup[], index2pos: IndicesArray}> | {groups: IOrderedGroup[], index2pos: IndicesArray};\n\n /**\n * returns a view in the order of the given indices\n * @param indices\n * @return {Promise<any>}\n */\n abstract view(indices: ArrayLike<number>): Promise<any[]> | any[];\n\n\n abstract getRow(index: number): Promise<IDataRow> | IDataRow;\n\n /**\n * returns a data sample used for the mapping editor\n * @param col\n * @return {Promise<any>}\n */\n abstract mappingSample(col: Column): Promise<ISequence<number>> | ISequence<number>;\n\n /**\n * is the given row selected\n * @param index\n * @return {boolean}\n */\n isSelected(index: number) {\n return this.selection.has(index);\n }\n\n /**\n * also select the given row\n * @param index\n */\n select(index: number) {\n if (this.selection.has(index)) {\n return; //no change\n }\n if (this.options.singleSelection === true && this.selection.size > 0) {\n this.selection.clear();\n }\n this.selection.add(index);\n this.fire(ADataProvider.EVENT_SELECTION_CHANGED, this.getSelection());\n }\n\n /**\n * hook for selecting elements matching the given arguments\n * @param search\n * @param col\n */\n abstract searchAndJump(search: string | RegExp, col: Column): void;\n\n jumpToNearest(indices: number[]) {\n if (indices.length === 0) {\n return;\n }\n this.fire(ADataProvider.EVENT_JUMP_TO_NEAREST, indices);\n }\n\n /**\n * also select all the given rows\n * @param indices\n */\n selectAll(indices: IndicesArray) {\n if (everyIndices(indices, (i) => this.selection.has(i))) {\n return; //no change\n }\n if (this.options.singleSelection === true) {\n this.selection.clear();\n if (indices.length > 0) {\n this.selection.add(indices[0]);\n }\n } else {\n forEachIndices(indices, (index) => {\n this.selection.add(index);\n });\n }\n this.fire(ADataProvider.EVENT_SELECTION_CHANGED, this.getSelection());\n }\n\n selectAllOf(ranking: Ranking) {\n this.setSelection(Array.from(ranking.getOrder()));\n }\n\n /**\n * set the selection to the given rows\n * @param indices\n */\n setSelection(indices: number[]) {\n if (indices.length === 0) {\n return this.clearSelection();\n }\n if (this.selection.size === indices.length && indices.every((i) => this.selection.has(i))) {\n return; //no change\n }\n this.selection.clear();\n this.selectAll(indices);\n }\n\n /**\n * toggles the selection of the given data index\n * @param index\n * @param additional just this element or all\n * @returns {boolean} whether the index is currently selected\n */\n toggleSelection(index: number, additional = false) {\n if (this.isSelected(index)) {\n if (additional) {\n this.deselect(index);\n } else {\n this.clearSelection();\n }\n return false;\n }\n if (additional) {\n this.select(index);\n } else {\n this.setSelection([index]);\n }\n return true;\n }\n\n /**\n * deselect the given row\n * @param index\n */\n deselect(index: number) {\n if (!this.selection.has(index)) {\n return; //no change\n }\n this.selection.delete(index);\n this.fire(ADataProvider.EVENT_SELECTION_CHANGED, this.getSelection());\n }\n\n /**\n * also select all the given rows\n * @param indices\n */\n deselectAll(indices: IndicesArray) {\n if (everyIndices(indices, (i) => !this.selection.has(i))) {\n return; //no change\n }\n forEachIndices(indices, (index) => {\n this.selection.delete(index);\n });\n this.fire(ADataProvider.EVENT_SELECTION_CHANGED, this.getSelection());\n }\n\n /**\n * returns a promise containing the selected rows\n * @return {Promise<any[]>}\n */\n selectedRows(): Promise<any[]> | any[] {\n if (this.selection.size === 0) {\n return [];\n }\n return this.view(this.getSelection());\n }\n\n /**\n * returns the currently selected indices\n * @returns {Array}\n */\n getSelection() {\n return Array.from(this.selection);\n }\n\n /**\n * clears the selection\n */\n clearSelection() {\n if (this.selection.size === 0) {\n return; //no change\n }\n this.selection.clear();\n this.fire(ADataProvider.EVENT_SELECTION_CHANGED, [], false);\n }\n\n /**\n * utility to export a ranking to a table with the given separator\n * @param ranking\n * @param options\n * @returns {Promise<string>}\n */\n exportTable(ranking: Ranking, options: Partial<IExportOptions> = {}) {\n return Promise.resolve(this.view(ranking.getOrder())).then((data) => exportRanking(ranking, data, options));\n }\n}\n\nexport default ADataProvider;\n","import {ActionColumn, AggregateGroupColumn, AnnotateColumn, BooleanColumn, BooleansColumn, BoxPlotColumn, CategoricalColumn, CategoricalMapColumn, CategoricalsColumn, DateColumn, DatesColumn, DatesMapColumn, GroupColumn, HierarchyColumn, ImpositionBoxPlotColumn, ImpositionCompositeColumn, ImpositionCompositesColumn, LinkColumn, LinkMapColumn, LinksColumn, NestedColumn, NumberColumn, NumberMapColumn, NumbersColumn, OrdinalColumn, RankColumn, ReduceColumn, ScriptColumn, SelectionColumn, SetColumn, StackColumn, StringColumn, StringMapColumn, StringsColumn} from './';\n\n/**\n * a map of all known column types\n */\nexport function models() {\n return {\n actions: ActionColumn,\n aggregate: AggregateGroupColumn,\n annotate: AnnotateColumn,\n boolean: BooleanColumn,\n booleans: BooleansColumn,\n boxplot: BoxPlotColumn,\n categorical: CategoricalColumn,\n categoricalMap: CategoricalMapColumn,\n categoricals: CategoricalsColumn,\n date: DateColumn,\n dateMap: DatesMapColumn,\n dates: DatesColumn,\n group: GroupColumn,\n hierarchy: HierarchyColumn,\n imposition: ImpositionCompositeColumn,\n impositionBoxPlot: ImpositionBoxPlotColumn,\n impositions: ImpositionCompositesColumn,\n reduce: ReduceColumn,\n nested: NestedColumn,\n number: NumberColumn,\n numbers: NumbersColumn,\n numberMap: NumberMapColumn,\n ordinal: OrdinalColumn,\n rank: RankColumn,\n script: ScriptColumn,\n selection: SelectionColumn,\n set: SetColumn,\n stack: StackColumn,\n string: StringColumn,\n stringMap: StringMapColumn,\n strings: StringsColumn,\n link: LinkColumn,\n linkMap: LinkMapColumn,\n links: LinksColumn\n };\n}\n","import {IColumnDesc, Ranking} from '../model';\nimport ADataProvider from './ADataProvider';\nimport {IDataProviderDump, IDataProviderOptions} from './interfaces';\nimport {isComplexAccessor, rowGetter, rowComplexGetter, rowGuessGetter} from '../internal';\n\n\nfunction injectAccessor(d: any) {\n d.accessor = d.accessor || (d.column ? (isComplexAccessor(d.column) ? rowComplexGetter : rowGetter) : rowGuessGetter);\n d.label = d.label || d.column;\n return d;\n}\n\n/**\n * common base implementation of a DataProvider with a fixed list of column descriptions\n */\nabstract class ACommonDataProvider extends ADataProvider {\n\n private rankingIndex = 0;\n\n constructor(private columns: IColumnDesc[] = [], options: Partial<IDataProviderOptions> = {}) {\n super(options);\n //generate the accessor\n columns.forEach(injectAccessor);\n }\n\n cloneRanking(existing?: Ranking) {\n const id = this.nextRankingId();\n const clone = new Ranking(id);\n\n if (existing) { //copy the ranking of the other one\n //TODO better cloning\n existing.children.forEach((child) => {\n this.push(clone, child.desc);\n });\n }\n\n return clone;\n }\n\n /**\n * adds another column description to this data provider\n * @param column\n */\n pushDesc(column: IColumnDesc) {\n injectAccessor(column);\n this.columns.push(column);\n this.fire(ADataProvider.EVENT_ADD_DESC, column);\n }\n\n clearColumns() {\n this.clearRankings();\n this.columns.splice(0, this.columns.length);\n this.fire(ADataProvider.EVENT_CLEAR_DESC);\n }\n\n /**\n * Remove the given column description from the data provider.\n * Column descriptions that are in use (i.e., has column instances in a ranking) cannot be removed by default.\n * Skip the check by setting the `ignoreBeingUsed` parameter to `true`.\n *\n * @param column Column description\n * @param ignoreBeingUsed Flag whether to ignore the usage of the column descriptions in rankings\n */\n removeDesc(column: IColumnDesc, ignoreBeingUsed = false): boolean {\n const i = this.columns.indexOf(column);\n if (i < 0) {\n return false;\n }\n const isUsed = ignoreBeingUsed ? false : this.getRankings().some((d) => d.flatColumns.some((c) => c.desc === column));\n if (isUsed) {\n return false;\n }\n this.columns.splice(i, 1);\n this.fire(ADataProvider.EVENT_REMOVE_DESC, column);\n return true;\n }\n\n getColumns(): IColumnDesc[] {\n return this.columns.slice();\n }\n\n findDesc(ref: string) {\n return this.columns.filter((c) => (<any>c).column === ref)[0];\n }\n\n /**\n * identify by the tuple type@columnname\n * @param desc\n * @returns {string}\n */\n toDescRef(desc: any): any {\n return typeof desc.column !== 'undefined' ? `${desc.type}@${desc.column}` : this.cleanDesc(Object.assign({}, desc));\n }\n\n fromDescRef(descRef: any): any {\n if (typeof (descRef) === 'string') {\n return this.columns.find((d: any) => `${d.type}@${d.column}` === descRef || d.type === descRef);\n }\n const existing = this.columns.find((d) => descRef.column === (<any>d).column && descRef.label === d.label && descRef.type === d.type);\n if (existing) {\n return existing;\n }\n return descRef;\n }\n\n restore(dump: IDataProviderDump) {\n super.restore(dump);\n this.rankingIndex = 1 + Math.max(...this.getRankings().map((r) => +r.id.substring(4)));\n }\n\n nextRankingId() {\n return `rank${this.rankingIndex++}`;\n }\n}\n\nexport default ACommonDataProvider;\n","import {createIndexArray, ILookUpArray} from '../internal';\nimport {FIRST_IS_MISSING, FIRST_IS_NAN, ECompareValueType, ICompareValue, Column, UIntTypedArray, Ranking, IDataRow} from '../model';\n\n\nconst missingUInt8 = FIRST_IS_MISSING > 0 ? 255 : 0;\nconst missingBinary = missingUInt8;\nconst missingUInt16 = FIRST_IS_MISSING > 0 ? 65535 : 0; // max or 0\nconst missingUInt32 = FIRST_IS_MISSING > 0 ? 4294967295 : 0; // max or 0\nconst missingInt8 = FIRST_IS_MISSING > 0 ? 127 : -128; // max or min\nconst missingInt16 = FIRST_IS_MISSING > 0 ? 32767 : -32768; // max or min\nconst missingInt32 = FIRST_IS_MISSING > 0 ? 2147483647 : -2147483648; // max or min\nconst missingFloat = FIRST_IS_NAN > 0 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\nconst missingFloatAsc = FIRST_IS_MISSING > 0 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\nconst missingString = FIRST_IS_MISSING > 0 ? '\\uffff' : '\\u0000'; // first or last character\n\n\nfunction chooseMissingByLength(length: number) {\n if (length <= 255) {\n return missingBinary;\n }\n if (length <= 65535) {\n return missingUInt16;\n }\n return missingUInt32;\n}\n\n\nfunction toCompareLookUp(rawLength: number, type: ECompareValueType): ILookUpArray {\n switch (type) {\n case ECompareValueType.COUNT:\n return createIndexArray(rawLength + 1);\n case ECompareValueType.BINARY:\n case ECompareValueType.UINT8:\n return new Uint8Array(rawLength);\n case ECompareValueType.UINT16:\n return new Uint16Array(rawLength);\n case ECompareValueType.UINT32:\n return new Uint32Array(rawLength);\n case ECompareValueType.INT8:\n return new Int8Array(rawLength);\n case ECompareValueType.INT16:\n return new Int16Array(rawLength);\n case ECompareValueType.INT32:\n return new Int32Array(rawLength);\n case ECompareValueType.STRING:\n return <string[]>[];\n case ECompareValueType.FLOAT_ASC:\n case ECompareValueType.FLOAT:\n return new Float32Array(rawLength);\n case ECompareValueType.DOUBLE_ASC:\n case ECompareValueType.DOUBLE:\n return new Float64Array(rawLength);\n }\n}\n\nfunction createSetter(type: ECompareValueType, lookup: ILookUpArray, missingCount: number): ((index: number, v: ICompareValue) => void) {\n switch (type) {\n case ECompareValueType.BINARY: // just 0 or 1 -> convert to 0=-Ininity 1 2 255=+Infinity\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingBinary : (<number>v) + 1;\n case ECompareValueType.COUNT: // uint32\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingCount : (<number>v) + 1;\n case ECompareValueType.UINT8: // shift by one to have 0 for -Inf\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingInt8 : (<number>v) + 1;\n case ECompareValueType.UINT16: // shift by one to have 0 for -Inf\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingInt16 : (<number>v) + 1;\n case ECompareValueType.UINT32: // shift by one to have 0 for -Inf\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingInt32 : (<number>v) + 1;\n case ECompareValueType.INT8:\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingInt8 : (<number>v);\n case ECompareValueType.INT16:\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingInt16 : (<number>v);\n case ECompareValueType.INT32:\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingInt32 : (<number>v);\n case ECompareValueType.STRING:\n return (index, v) => lookup[index] = v == null || v === '' ? missingString : v;\n case ECompareValueType.FLOAT:\n case ECompareValueType.DOUBLE:\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingFloat : v;\n case ECompareValueType.FLOAT_ASC:\n case ECompareValueType.DOUBLE_ASC:\n return (index, v) => lookup[index] = v == null || isNaN(<number>v) ? missingFloatAsc : v;\n }\n}\n\nexport class CompareLookup {\n private readonly criteria: {col: Column, valueCache?(dataIndex: number): any}[] = [];\n private readonly data: {asc: boolean, v: ECompareValueType, lookup: ILookUpArray, setter: (dataIndex: number, value: ICompareValue) => void}[] = [];\n\n constructor(rawLength: number, isSorting: boolean, ranking: Ranking, valueCaches?: (col: Column) => (undefined | ((i: number) => any))) {\n const missingCount = chooseMissingByLength(rawLength + 1); // + 1 for the value shift to have 0 as start\n\n for (const c of (isSorting ? ranking.getSortCriteria() : ranking.getGroupSortCriteria())) {\n const v = (isSorting ? c.col.toCompareValueType() : c.col.toCompareGroupValueType());\n const valueCache = valueCaches ? valueCaches(c.col) : undefined;\n this.criteria.push({col: c.col, valueCache});\n if (!Array.isArray(v)) {\n const lookup = toCompareLookUp(rawLength, v);\n this.data.push({asc: c.asc, v, lookup, setter: createSetter(v, lookup, missingCount)});\n continue;\n }\n for (const vi of v) {\n const lookup = toCompareLookUp(rawLength, vi);\n this.data.push({asc: c.asc, v: vi, lookup, setter: createSetter(vi, lookup, missingCount)});\n }\n }\n\n if (isSorting) {\n return;\n }\n\n {\n const v = ECompareValueType.STRING;\n const lookup = toCompareLookUp(rawLength, v);\n this.data.push({asc: true, v, lookup, setter: createSetter(v, lookup, missingCount)});\n }\n }\n\n get sortOrders() {\n return this.data.map((d) => ({asc: d.asc, lookup: d.lookup}));\n }\n\n get transferAbles() {\n // so a typed array\n return this.data.map((d) => d.lookup).filter((d): d is UIntTypedArray | Float32Array => !Array.isArray(d)).map((d) => d.buffer);\n }\n\n push(row: IDataRow) {\n let i = 0;\n for (const c of this.criteria) {\n const r = c.col.toCompareValue(row, c.valueCache ? c.valueCache(row.i) : undefined);\n if (!Array.isArray(r)) {\n this.data[i++].setter(row.i, r);\n continue;\n }\n for (const ri of r) {\n this.data[i++].setter(row.i, ri);\n }\n }\n }\n\n pushValues(dataIndex: number, vs: ICompareValue[]) {\n for (let i = 0; i < vs.length; ++i) {\n this.data[i].setter(dataIndex, vs[i]);\n }\n }\n\n free() {\n // free up to save memory\n this.data.splice(0, this.data.length);\n }\n}\n","import {IAbortAblePromise, ABORTED, IAbortAblePromiseBase} from 'lineupengine';\nexport {ABORTED} from 'lineupengine';\n\n/**\n * @internal\n */\nexport interface IPoorManIdleDeadline {\n didTimeout: boolean;\n timeRemaining(): number;\n}\n\n/**\n * helper since not part of the typings\n * @internal\n */\nexport interface IPoorManIdleCallback {\n requestIdleCallback(callback: (deadline: IPoorManIdleDeadline) => void, options?: {timeout: number}): number;\n\n clearIdleCallback(callbackId: number): void;\n}\n\n/**\n * @internal\n */\nexport interface ITask<T> {\n /**\n * external task id\n */\n id: string;\n /**\n * iterator for the incremental task, return null for another round\n */\n it: Iterator<T | PromiseLike<T> | null>;\n /**\n * function to the resolve the resulting promise\n */\n resolve(r: T | PromiseLike<T> | symbol): void;\n /**\n * the resulting promise\n */\n result: PromiseLike<T | symbol>;\n\n /**\n * aborts this task\n */\n abort: () => void;\n\n isAborted: boolean;\n}\n\n/**\n * iterator result for another round\n * @internal\n */\nexport const ANOTHER_ROUND = {\n value: null,\n done: false\n};\n\n/**\n * iterator for just one entry\n * @internal\n */\nexport function oneShotIterator<T>(calc: () => T): Iterator<T> {\n return {\n next: () => ({done: true, value: calc()})\n };\n}\n\n\nfunction thenFactory<T>(wrappee: PromiseLike<T>, abort: () => void, isAborted: () => boolean) {\n function then<TResult1 = T | symbol, TResult2 = never>(onfulfilled?: ((value: T | symbol) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): IAbortAblePromiseBase<TResult1 | TResult2> {\n const r = wrappee.then(onfulfilled, onrejected);\n return {\n then: <any>thenFactory(r, abort, isAborted),\n abort,\n isAborted\n };\n }\n return then;\n}\n\n/**\n * task scheduler for running tasks in idle callbacks\n * @internal\n */\nexport default class TaskScheduler {\n private tasks: ITask<any>[] = [];\n // idle callback id\n private taskId: number = -1;\n\n private runTasks = (deadline: IPoorManIdleDeadline) => {\n // while more tasks and not timed out\n while (this.tasks.length > 0 && (deadline.didTimeout || deadline.timeRemaining() > 0)) {\n const task = this.tasks.shift()!;\n\n let r = task.it.next();\n // call next till done or ran out of time\n while (!r.done && (deadline.didTimeout || deadline.timeRemaining() > 0)) {\n r = task.it.next();\n }\n\n if (r.done) {\n // resolve async\n requestAnimationFrame(() => task.resolve(r.value));\n } else {\n // reschedule again\n this.tasks.unshift(task);\n }\n }\n\n this.taskId = -1;\n this.reSchedule();\n }\n\n private reSchedule() {\n if (this.tasks.length === 0 || this.taskId > -1) {\n return;\n }\n\n const ww = (<IPoorManIdleCallback><any>self);\n if (ww.requestIdleCallback) {\n this.taskId = ww.requestIdleCallback(this.runTasks);\n } else {\n this.taskId = self.setTimeout(this.runTasks, 1);\n }\n }\n\n /**\n * pushes a task with multi hops using an iterator\n * @param id task id\n * @param it iterator to execute\n */\n pushMulti<T>(id: string, it: Iterator<T | PromiseLike<T> | null>, abortAble = true): IAbortAblePromise<T> {\n // abort task with the same id\n const abort = () => {\n const index = this.tasks.findIndex((d) => d.id === id);\n if (index < 0) {\n return; // too late or none\n }\n const task = this.tasks[index];\n this.tasks.splice(index, 1);\n\n task.isAborted = true;\n task.resolve(ABORTED);\n };\n\n {\n // abort existing\n const index = this.tasks.findIndex((d) => d.id === id);\n if (index >= 0) {\n const task = this.tasks[index];\n task.abort();\n }\n }\n\n let resolve: (value: T | symbol) => void;\n\n const p = new Promise<T | symbol>((r) => {\n // called during constructor\n resolve = r;\n });\n\n const task: ITask<T> = {\n id,\n it,\n result: p,\n abort,\n isAborted: false,\n resolve: resolve!\n };\n const isAborted = () => task.isAborted;\n\n this.tasks.push(task);\n\n this.reSchedule();\n\n const abortOrDummy = abortAble ? abort : () => undefined;\n const isAbortedOrDummy = abortAble ? isAborted : () => false;\n\n return {\n then: thenFactory(p, abortOrDummy, isAbortedOrDummy),\n abort: abortOrDummy,\n isAborted: isAbortedOrDummy\n };\n }\n\n /**\n * pushes a simple task\n * @param id task id\n * @param calc task function\n */\n push<T>(id: string, calc: () => T | PromiseLike<T>): IAbortAblePromise<T> {\n return this.pushMulti(id, oneShotIterator(calc));\n }\n\n /**\n * abort a task with the given id\n * @param id task id\n */\n abort(id: string) {\n const index = this.tasks.findIndex((d) => d.id === id);\n if (index < 0) {\n return false; // too late or none\n }\n const task = this.tasks[index];\n task.abort();\n return true;\n }\n\n abortAll(filter: (task: ITask<any>) => boolean) {\n const abort = this.tasks.filter(filter);\n if (abort.length === 0) {\n return;\n }\n this.tasks = this.tasks.filter((d) => !filter(d));\n for (const task of abort) {\n task.resolve(ABORTED);\n task.abort();\n }\n }\n\n clear() {\n if (this.taskId === -1) {\n return;\n }\n const ww = (<IPoorManIdleCallback><any>self);\n if (ww.requestIdleCallback) {\n ww.clearIdleCallback(this.taskId);\n } else {\n self.clearTimeout(this.taskId);\n }\n this.taskId = -1;\n\n this.tasks.splice(0, this.tasks.length).forEach((d) => {\n d.resolve(ABORTED);\n d.abort();\n });\n }\n}\n","import {abortAbleAll, IAbortAblePromise} from 'lineupengine';\nimport {ANOTHER_ROUND} from '../internal/scheduler';\nimport {IForEachAble, lazySeq, boxplotBuilder, categoricalStatsBuilder, categoricalValueCacheBuilder, dateStatsBuilder, dateValueCacheBuilder, IAdvancedBoxPlotData, ICategoricalStatistics, IDateStatistics, IStatistics, normalizedStatsBuilder, dateValueCache2Value, categoricalValueCache2Value, joinIndexArrays, IBuilder, ISequence} from '../internal';\nimport {CategoricalColumn, Column, ICompareValue, DateColumn, ICategoricalLikeColumn, IDataRow, IDateColumn, IGroup, ImpositionCompositeColumn, IndicesArray, INumberColumn, NumberColumn, OrdinalColumn, Ranking, UIntTypedArray, ICategory} from '../model';\nimport {IRenderTask, IRenderTasks} from '../renderer';\nimport {CompareLookup} from './sort';\n\n\n/**\n * a render task that is already resolved\n */\nexport class TaskNow<T> implements IRenderTask<T> {\n constructor(public readonly v: T) {\n\n }\n\n then<U = void>(onfullfilled: (value: T) => U) {\n return onfullfilled(this.v);\n }\n}\n\n/**\n * factory function for\n */\nexport function taskNow<T>(v: T) {\n return new TaskNow(v);\n}\n\n/**\n * a render task based on an abortable promise\n */\nexport class TaskLater<T> implements IRenderTask<T> {\n constructor(public readonly v: IAbortAblePromise<T>) {\n\n }\n\n then<U = void>(onfullfilled: (value: T | symbol) => U): IAbortAblePromise<U> {\n return this.v.then(onfullfilled);\n }\n}\n\nexport function taskLater<T>(v: IAbortAblePromise<T>) {\n return new TaskLater(v);\n}\n\n/**\n * similar to Promise.all\n */\nexport function tasksAll<T>(tasks: IRenderTask<T>[]): IRenderTask<T[]> {\n if (tasks.every((t) => t instanceof TaskNow)) {\n return taskNow(tasks.map((d) => (<TaskNow<T>>d).v));\n }\n return taskLater(abortAbleAll((<(TaskNow<T> | TaskLater<T>)[]>tasks).map((d) => d.v)));\n}\n\n\n\nexport interface IRenderTaskExectutor extends IRenderTasks {\n setData(data: IDataRow[]): void;\n\n dirtyColumn(col: Column, type: 'data' | 'summary' | 'group'): void;\n dirtyRanking(ranking: Ranking, type: 'data' | 'summary' | 'group'): void;\n\n groupCompare(ranking: Ranking, group: IGroup, rows: IndicesArray): IRenderTask<ICompareValue[]>;\n\n preCompute(ranking: Ranking, groups: {rows: IndicesArray, group: IGroup}[], maxDataIndex: number): void;\n preComputeCol(col: Column): void;\n preComputeData(ranking: Ranking): void;\n copyData2Summary(ranking: Ranking): void;\n copyCache(col: Column, from: Column): void;\n\n sort(ranking: Ranking, group: IGroup, indices: IndicesArray, singleCall: boolean, maxDataIndex: number, lookups?: CompareLookup): Promise<IndicesArray>;\n\n terminate(): void;\n\n valueCache(col: Column): undefined | ((dataIndex: number) => any);\n}\n\nexport class MultiIndices {\n private _joined: IndicesArray | null = null;\n\n constructor(public readonly indices: IndicesArray[], private readonly maxDataIndex: number) {\n\n }\n\n get joined() {\n if (this.indices.length === 1) {\n return this.indices[0];\n }\n if (this.indices.length === 0) {\n return new Uint8Array(0);\n }\n if (this._joined) {\n return this._joined;\n }\n return this._joined = joinIndexArrays(this.indices, this.maxDataIndex);\n }\n}\n\n/**\n * number of data points to build per iteration / chunk\n */\nconst CHUNK_SIZE = 100;\n\n\nexport class ARenderTasks {\n protected readonly valueCacheData = new Map<string, Float32Array | UIntTypedArray | Int32Array | Float64Array>();\n\n protected readonly byIndex = (i: number) => this.data[i];\n\n constructor(protected data: IDataRow[] = []) {\n\n }\n\n\n protected byOrder(indices: IndicesArray): ISequence<IDataRow> {\n return lazySeq(indices).map(this.byIndex);\n }\n\n protected byOrderAcc<T>(indices: IndicesArray, acc: (row: IDataRow) => T) {\n return lazySeq(indices).map((i) => acc(this.data[i]));\n }\n\n /**\n * builder factory to create an iterator that can be used to schedule\n * @param builder the builder to use\n * @param order the order to iterate over\n * @param acc the accessor to get the value out of the data\n * @param build optional build mapper\n */\n private builder<T, BR, B extends {push: (v: T) => void, build: () => BR}, R = BR>(builder: B, order: IndicesArray | null | MultiIndices, acc: (dataIndex: number) => T, build?: (r: BR) => R): Iterator<R | null> {\n let i = 0;\n\n // no indices given over the whole data\n const nextData = (currentChunkSize: number = CHUNK_SIZE) => {\n let chunkCounter = currentChunkSize;\n const data = this.data;\n for (; i < data.length && chunkCounter > 0; ++i, --chunkCounter) {\n builder.push(acc(i));\n }\n if (i < data.length) { // need another round\n return ANOTHER_ROUND;\n }\n // done\n return {\n done: true,\n value: build ? build(builder.build()) : <R><any>builder.build()\n };\n };\n\n let o = 0;\n const orders = order instanceof MultiIndices ? order.indices : [order];\n\n const nextOrder = (currentChunkSize: number = CHUNK_SIZE) => {\n let chunkCounter = currentChunkSize;\n\n while (o < orders.length) {\n const actOrder = orders[o]!;\n for (; i < actOrder.length && chunkCounter > 0; ++i, --chunkCounter) {\n builder.push(acc(actOrder[i]));\n }\n if (i < actOrder.length) { // need another round\n return ANOTHER_ROUND;\n }\n // done with this order\n o++;\n i = 0;\n }\n return {\n done: true,\n value: build ? build(builder.build()) : <R><any>builder.build()\n };\n };\n return {next: order == null ? nextData : nextOrder};\n }\n\n private builderForEach<T, BR, B extends {pushAll: (v: IForEachAble<T>) => void, build: () => BR}, R = BR>(builder: B, order: IndicesArray | null | MultiIndices, acc: (dataIndex: number) => IForEachAble<T>, build?: (r: BR) => R): Iterator<R | null> {\n return this.builder({\n push: builder.pushAll,\n build: builder.build\n }, order, acc, build);\n }\n\n protected boxplotBuilder<R = IAdvancedBoxPlotData>(order: IndicesArray | null | MultiIndices, col: INumberColumn, raw?: boolean, build?: (stat: IAdvancedBoxPlotData) => R) {\n const b = boxplotBuilder();\n return this.numberStatsBuilder(b, order, col, raw, build);\n }\n\n protected normalizedStatsBuilder<R = IStatistics>(order: IndicesArray | null | MultiIndices, col: INumberColumn, numberOfBins: number, raw?: boolean, build?: (stat: IStatistics) => R) {\n const b = normalizedStatsBuilder(numberOfBins);\n return this.numberStatsBuilder(b, order, col, raw, build);\n }\n\n private numberStatsBuilder<R, B extends IBuilder<number, BR>, BR>(b: B, order: IndicesArray | null | MultiIndices, col: INumberColumn, raw?: boolean, build?: (stat: BR) => R) {\n if (col instanceof NumberColumn || col instanceof OrdinalColumn || col instanceof ImpositionCompositeColumn) {\n const key = raw ? `${col.id}:r` : col.id;\n const dacc: (i: number) => number = raw ? (i) => col.getRawNumber(this.data[i]) : (i) => col.getNumber(this.data[i]);\n\n if (order == null && !this.valueCacheData.has(key)) {\n // build and valueCache\n const vs = new Float32Array(this.data.length);\n let i = 0;\n return this.builder({\n push: (v) => {\n b.push(v);\n vs[i++] = v;\n },\n build: () => {\n this.setValueCacheData(key, vs);\n return b.build();\n }\n }, null, dacc, build);\n }\n\n const cache = this.valueCacheData.get(key);\n const acc: (i: number) => number = cache ? (i) => cache[i] : dacc;\n return this.builder(b, order, acc, build);\n }\n const acc: (i: number) => IForEachAble<number> = raw ? (i) => col.iterRawNumber(this.data[i]) : (i) => col.iterNumber(this.data[i]);\n return this.builderForEach(b, order, acc, build);\n }\n\n protected dateStatsBuilder<R = IDateStatistics>(order: IndicesArray | null | MultiIndices, col: IDateColumn, template?: IDateStatistics, build?: (stat: IDateStatistics) => R) {\n const b = dateStatsBuilder(template);\n if (col instanceof DateColumn) {\n if (order == null) {\n // build and valueCache\n const vs = dateValueCacheBuilder(this.data.length);\n return this.builder({\n push: (v) => {\n b.push(v);\n vs.push(v);\n },\n build: () => {\n this.setValueCacheData(col.id, vs.cache);\n return b.build();\n }\n }, null, (i: number) => col.getDate(this.data[i]), build);\n }\n const cache = this.valueCacheData.get(col.id);\n const acc: (i: number) => Date | null = cache ? (i) => dateValueCache2Value(cache[i]) : (i) => col.getDate(this.data[i]);\n return this.builder(b, order, acc, build);\n }\n return this.builderForEach(b, order, (i: number) => col.iterDate(this.data[i]), build);\n }\n\n protected categoricalStatsBuilder<R = ICategoricalStatistics>(order: IndicesArray | null | MultiIndices, col: ICategoricalLikeColumn, build?: (stat: ICategoricalStatistics) => R) {\n const b = categoricalStatsBuilder(col.categories);\n if (col instanceof CategoricalColumn || col instanceof OrdinalColumn) {\n if (order == null) {\n // build and valueCache\n const vs = categoricalValueCacheBuilder(this.data.length, col.categories);\n return this.builder({\n push: (v) => {\n b.push(v);\n vs.push(v);\n },\n build: () => {\n this.setValueCacheData(col.id, vs.cache);\n return b.build();\n }\n }, null, (i: number) => col.getCategory(this.data[i]), build);\n }\n const cache = this.valueCacheData.get(col.id);\n const acc: (i: number) => ICategory | null = cache ? (i) => categoricalValueCache2Value(cache[i], col.categories) : (i) => col.getCategory(this.data[i]);\n return this.builder(b, order, acc, build);\n }\n return this.builderForEach(b, order, (i: number) => col.iterCategory(this.data[i]), build);\n }\n\n dirtyColumn(col: Column, type: 'data' | 'summary' | 'group') {\n if (type !== 'data') {\n return;\n }\n this.valueCacheData.delete(col.id);\n this.valueCacheData.delete(`${col.id}:r`);\n }\n\n protected setValueCacheData(key: string, value: Float32Array | UIntTypedArray | Int32Array | Float64Array | null) {\n if (value == null) {\n this.valueCacheData.delete(key);\n } else {\n this.valueCacheData.set(key, value);\n }\n }\n\n valueCache(col: Column) {\n const v = this.valueCacheData.get(col.id);\n if (!v) {\n return undefined;\n }\n if (col instanceof DateColumn) {\n return (dataIndex: number) => dateValueCache2Value(v[dataIndex]);\n }\n if (col instanceof CategoricalColumn || col instanceof OrdinalColumn) {\n return (dataIndex: number) => categoricalValueCache2Value(v[dataIndex], col.categories);\n }\n return (dataIndex: number) => v[dataIndex];\n }\n}\n","import Column, {IDataRow, Ranking, IndicesArray, IGroup, IOrderedGroup, INumberColumn, IDateColumn, ICategoricalLikeColumn, ICompareValue} from '../model';\nimport {ARenderTasks, IRenderTaskExectutor, taskNow} from './tasks';\nimport {ISequence, toIndexArray, sortComplex, getNumberOfBins} from '../internal';\nimport {CompareLookup} from './sort';\nimport {IRenderTask} from '..';\n\n/**\n * @internal\n */\nexport function sortDirect(indices: IndicesArray, maxDataIndex: number, lookups?: CompareLookup) {\n const order = toIndexArray(indices, maxDataIndex);\n if (lookups) {\n sortComplex(order, lookups.sortOrders);\n }\n return order;\n}\n\n/**\n * @internal\n */\nexport class DirectRenderTasks extends ARenderTasks implements IRenderTaskExectutor {\n\n protected readonly cache = new Map<string, any>();\n\n setData(data: IDataRow[]) {\n this.data = data;\n this.cache.clear();\n this.valueCacheData.clear();\n }\n\n\n dirtyColumn(col: Column, type: 'data' | 'summary' | 'group') {\n super.dirtyColumn(col, type);\n\n if (type === 'group') {\n return; // not cached\n }\n this.cache.delete(`${col.id}:summary`);\n this.cache.delete(`${col.id}:summary:raw`);\n this.cache.delete(`${col.id}:summary:b`);\n this.cache.delete(`${col.id}:summary:braw`);\n\n if (type === 'summary') {\n return;\n }\n this.cache.delete(`${col.id}:data`);\n this.cache.delete(`${col.id}:data:raw`);\n this.cache.delete(`${col.id}:data:b`);\n this.cache.delete(`${col.id}:data:braw`);\n }\n\n dirtyRanking(ranking: Ranking, type: 'data' | 'summary' | 'group') {\n for (const col of ranking.flatColumns) {\n this.dirtyColumn(col, type);\n }\n }\n\n preCompute() {\n // dummy\n }\n\n preComputeData() {\n // dummy\n }\n\n preComputeCol() {\n // dummy\n }\n\n copyData2Summary() {\n // dummy\n }\n\n copyCache(col: Column, from: Column) {\n const fromPrefix = `${from.id}:`;\n\n for (const key of Array.from(this.cache.keys()).sort()) {\n if (!key.startsWith(fromPrefix)) {\n continue;\n }\n const tkey = `${col.id}:${key.slice(fromPrefix.length)}`;\n this.cache.set(tkey, this.cache.get(key)!);\n }\n }\n\n sort(_ranking: Ranking, _group: IGroup, indices: IndicesArray, _singleCall: boolean, maxDataIndex: number, lookups?: CompareLookup) {\n return Promise.resolve(sortDirect(indices, maxDataIndex, lookups));\n }\n\n groupCompare(ranking: Ranking, group: IGroup, rows: IndicesArray): IRenderTask<ICompareValue[]> {\n const rg = ranking.getGroupSortCriteria();\n if (rg.length === 0) {\n return taskNow([group.name.toLowerCase()]);\n }\n const o = this.byOrder(rows);\n const vs: ICompareValue[] = [];\n for (const s of rg) {\n const r = s.col.toCompareGroupValue(o, group);\n if (Array.isArray(r)) {\n vs.push(...r);\n } else {\n vs.push(r);\n }\n }\n vs.push(group.name.toLowerCase());\n return taskNow(vs);\n }\n\n groupRows<T>(_col: Column, group: IOrderedGroup, _key: string, compute: (rows: ISequence<IDataRow>) => T): IRenderTask<T> {\n return taskNow(compute(this.byOrder(group.order)));\n }\n\n groupExampleRows<T>(_col: Column, group: IOrderedGroup, _key: string, compute: (rows: ISequence<IDataRow>) => T): IRenderTask<T> {\n return taskNow(compute(this.byOrder(group.order.slice(0, 5))));\n }\n\n groupBoxPlotStats(col: Column & INumberColumn, group: IOrderedGroup, raw?: boolean) {\n const {summary, data} = this.summaryBoxPlotStatsD(col, raw);\n return taskNow({group: this.boxplotBuilder(group.order, col, raw).next(Infinity).value!, summary, data});\n }\n\n groupNumberStats(col: Column & INumberColumn, group: IOrderedGroup, raw?: boolean) {\n const {summary, data} = this.summaryNumberStatsD(col, raw);\n return taskNow({group: this.normalizedStatsBuilder(group.order, col, summary.hist.length, raw).next(Infinity).value!, summary, data});\n }\n\n groupCategoricalStats(col: Column & ICategoricalLikeColumn, group: IOrderedGroup) {\n const {summary, data} = this.summaryCategoricalStatsD(col);\n return taskNow({group: this.categoricalStatsBuilder(group.order, col).next(Infinity).value!, summary, data});\n }\n\n groupDateStats(col: Column & IDateColumn, group: IOrderedGroup) {\n const {summary, data} = this.summaryDateStatsD(col);\n return taskNow({group: this.dateStatsBuilder(group.order, col, summary).next(Infinity).value!, summary, data});\n }\n\n summaryBoxPlotStats(col: Column & INumberColumn, raw?: boolean) {\n return taskNow(this.summaryBoxPlotStatsD(col, raw));\n }\n\n summaryNumberStats(col: Column & INumberColumn, raw?: boolean) {\n return taskNow(this.summaryNumberStatsD(col, raw));\n }\n\n summaryCategoricalStats(col: Column & ICategoricalLikeColumn) {\n return taskNow(this.summaryCategoricalStatsD(col));\n }\n\n summaryDateStats(col: Column & IDateColumn) {\n return taskNow(this.summaryDateStatsD(col));\n }\n\n private summaryNumberStatsD(col: Column & INumberColumn, raw?: boolean) {\n return this.cached('summary', col, () => {\n const ranking = col.findMyRanker()!.getOrder();\n const data = this.dataNumberStats(col, raw);\n return {summary: this.normalizedStatsBuilder(ranking, col, data.hist.length, raw).next(Infinity).value!, data};\n }, raw ? ':raw' : '', col.findMyRanker()!.getOrderLength() === 0);\n }\n\n private summaryBoxPlotStatsD(col: Column & INumberColumn, raw?: boolean) {\n return this.cached('summary', col, () => {\n const ranking = col.findMyRanker()!.getOrder();\n const data = this.dataBoxPlotStats(col, raw);\n return {summary: this.boxplotBuilder(ranking, col, raw).next(Infinity).value!, data};\n }, raw ? ':braw' : ':b' , col.findMyRanker()!.getOrderLength() === 0);\n }\n\n private summaryCategoricalStatsD(col: Column & ICategoricalLikeColumn) {\n return this.cached('summary', col, () => {\n const ranking = col.findMyRanker()!.getOrder();\n const data = this.dataCategoricalStats(col);\n return {summary: this.categoricalStatsBuilder(ranking, col).next(Infinity).value!, data};\n }, '', col.findMyRanker()!.getOrderLength() === 0);\n }\n\n private summaryDateStatsD(col: Column & IDateColumn) {\n return this.cached('summary', col, () => {\n const ranking = col.findMyRanker()!.getOrder();\n const data = this.dataDateStats(col);\n return {summary: this.dateStatsBuilder(ranking, col, data).next(Infinity).value!, data};\n }, '', col.findMyRanker()!.getOrderLength() === 0);\n }\n\n private cached<T>(prefix: string, col: Column, creator: () => T, suffix: string = '', dontCache = false): T {\n const key = `${col.id}:${prefix}${suffix}`;\n if (this.cache.has(key)) {\n return this.cache.get(key)!;\n }\n const s = creator();\n if (!dontCache) {\n this.cache.set(key, s);\n }\n return s;\n }\n\n dataBoxPlotStats(col: Column & INumberColumn, raw?: boolean) {\n return this.cached('data', col, () => this.boxplotBuilder(null, col, raw).next(Infinity).value!, raw ? ':braw' : ':b');\n }\n\n dataNumberStats(col: Column & INumberColumn, raw?: boolean) {\n return this.cached('data', col, () => this.normalizedStatsBuilder(null, col, getNumberOfBins(this.data.length), raw).next(Infinity).value!, raw ? ':raw' : '');\n }\n\n dataCategoricalStats(col: Column & ICategoricalLikeColumn) {\n return this.cached('data', col, () => this.categoricalStatsBuilder(null, col).next(Infinity).value!);\n }\n\n dataDateStats(col: Column & IDateColumn) {\n return this.cached('data', col, () => this.dateStatsBuilder(null, col).next(Infinity).value!);\n }\n\n terminate() {\n this.cache.clear();\n }\n}\n\n\n","import Column from './Column';\nimport {IDataRow, IColumnDesc} from './interfaces';\n\n\nexport interface IArrayDesc {\n dataLength?: number;\n labels?: string[];\n}\n\nexport interface IKeyValue<T> {\n key: string;\n value: T;\n}\n\nexport interface IMapColumn<T> extends Column {\n getMap(row: IDataRow): IKeyValue<T>[];\n\n getMapLabel(row: IDataRow): IKeyValue<string>[];\n}\n\nexport function isMapColumn(col: Column): col is IMapColumn<any>;\nexport function isMapColumn(col: IColumnDesc): boolean;\nexport function isMapColumn(col: Column | IColumnDesc) {\n return (col instanceof Column && typeof (<IMapColumn<any>>col).getMap === 'function' && typeof (<IMapColumn<any>>col).getMapLabel === 'function') || (!(col instanceof Column) && (<IColumnDesc>col).type.endsWith('Map'));\n}\n\nexport interface IArrayColumn<T> extends IMapColumn<T> {\n readonly labels: string[];\n readonly dataLength: number | null;\n\n getLabels(row: IDataRow): string[];\n\n getValues(row: IDataRow): T[];\n}\n\nexport function isArrayColumn(col: Column): col is IArrayColumn<any>;\nexport function isArrayColumn(col: IColumnDesc): col is IArrayDesc & IColumnDesc;\nexport function isArrayColumn(col: Column | IColumnDesc) {\n return (col instanceof Column && typeof (<IArrayColumn<any>>col).getLabels === 'function' && typeof (<IArrayColumn<any>>col).getValues === 'function' && isMapColumn(col) || (!(col instanceof Column) && (<IColumnDesc>col).type.endsWith('s') && (<IColumnDesc>col).type !== 'actions'));\n}\n","import {IForEachAble} from '../internal';\nimport Column from './Column';\nimport {IArrayColumn, isArrayColumn} from './IArrayColumn';\nimport {IValueColumnDesc, IColumnDesc, IDataRow, ITypedDump} from './interfaces';\n\nexport interface ICategoricalDesc {\n categories: (string | Partial<ICategory>)[];\n}\n\nexport declare type ICategoricalColumnDesc = IValueColumnDesc<string> & ICategoricalDesc;\n\nexport interface ICategoricalColorMappingFunction {\n apply(v: ICategory): string;\n\n toJSON(): ITypedDump | null;\n\n clone(): ICategoricalColorMappingFunction;\n\n eq(other: ICategoricalColorMappingFunction): boolean;\n}\n\nexport interface ICategoricalColorMappingFunctionConstructor {\n new(dump: ITypedDump): ICategoricalColorMappingFunction;\n}\n\nexport interface ICategoricalLikeColumn extends Column {\n readonly categories: ICategory[];\n\n getColorMapping(): ICategoricalColorMappingFunction;\n setColorMapping(mapping: ICategoricalColorMappingFunction): void;\n\n iterCategory(row: IDataRow): IForEachAble<ICategory | null>;\n\n getCategories(row: IDataRow): (ICategory | null)[];\n}\n\nexport function isCategoricalLikeColumn(col: Column): col is ICategoricalLikeColumn {\n return typeof (<ICategoricalLikeColumn>col).categories !== 'undefined' && typeof (<ICategoricalLikeColumn>col).iterCategory === 'function';\n}\n\nexport interface ISetColumn extends IArrayColumn<boolean>, ICategoricalLikeColumn {\n getSet(row: IDataRow): Set<ICategory>;\n}\n\nexport function isSetColumn(col: Column): col is ISetColumn {\n return isCategoricalLikeColumn(col) && typeof (<ISetColumn>col).getSet === 'function';\n}\n\nexport interface ICategoricalColumn extends ISetColumn {\n getCategory(row: IDataRow): ICategory | null;\n}\n\nexport interface ICategory {\n readonly name: string;\n\n /**\n * optional label of this category (the one to render)\n */\n readonly label: string;\n /**\n * category color\n * @default next in d3 color 10 range\n */\n readonly color: string;\n\n value: number;\n}\n/**\n * checks whether the given column or description is a categorical column, i.e. the value is a list of categories\n * @param col\n * @returns {boolean}\n */\nexport function isCategoricalColumn(col: Column): col is ICategoricalColumn;\nexport function isCategoricalColumn(col: IColumnDesc): col is ICategoricalColumnDesc & IColumnDesc;\nexport function isCategoricalColumn(col: Column | IColumnDesc) {\n return (col instanceof Column && typeof (<ICategoricalColumn>col).getCategory === 'function' || (!(col instanceof Column) && (<IColumnDesc>col).type.match(/(categorical|ordinal|hierarchy)/) != null));\n}\n\nexport declare type ICategoricalsColumn = ICategoricalLikeColumn & IArrayColumn<string | null>;\n\nexport function isCategoricalsColumn(col: Column): col is ICategoricalsColumn {\n return isCategoricalLikeColumn(col) && isArrayColumn(col) && !isSetColumn(col);\n}\n\n\nexport interface ICategoricalFilter {\n filter: string[] | string | RegExp;\n filterMissing: boolean;\n}\n\nexport interface ISetCategoricalFilter extends ICategoricalFilter {\n mode?: 'every' | 'some';\n}\n\nexport function isCategory(v: any): v is ICategory {\n return typeof v.name === 'string' && typeof v.label === 'string' && typeof v.color === 'string' && typeof v.value === 'number';\n}\n","import {IForEachAble} from '../internal';\nimport Column from './Column';\nimport {IColumnDesc, IDataRow} from './interfaces';\nimport {INumberFilter} from './INumberColumn';\nimport {IArrayColumn} from './IArrayColumn';\n\nexport interface IDateColumn extends Column {\n getFormatter(): (v: Date | null) => string;\n\n getDate(row: IDataRow): Date | null;\n\n iterDate(row: IDataRow): IForEachAble<Date | null>;\n\n getFilter(): IDateFilter;\n setFilter(value: IDateFilter | null): void;\n}\n\nexport interface IDatesColumn extends IDateColumn, IArrayColumn<Date | null> {\n getDates(row: IDataRow): (Date | null)[];\n}\n\nexport interface IDateDesc {\n /**\n * d3 formatting option\n * @default %x\n */\n dateFormat?: string;\n\n /**\n * d3 formation option\n * @dfeault dateFormat\n */\n dateParse?: string;\n}\n\n\n/**\n * checks whether the given column or description is a date column, i.e. the value is a date\n * @param col\n * @returns {boolean}\n */\nexport function isDateColumn(col: Column): col is IDateColumn;\nexport function isDateColumn(col: IColumnDesc): col is IDateDesc & IColumnDesc;\nexport function isDateColumn(col: Column | IColumnDesc) {\n return (col instanceof Column && typeof (<IDateColumn>col).getDate === 'function' || (!(col instanceof Column) && (<IColumnDesc>col).type.startsWith('date')));\n}\n\nexport function isDatesColumn(col: Column): col is IDatesColumn {\n return typeof (<IDatesColumn>col).getDates === 'function';\n}\n\nexport declare type IDateFilter = INumberFilter;\n\nexport declare type IDateGranularity = 'century' | 'decade' | 'year' | 'month' | 'week' | 'day_of_week' | 'day_of_month' | 'day_of_year' | 'hour' | 'minute' | 'second';\n\nexport interface IDateGrouper {\n /**\n * granuality level for the grouping\n */\n granularity: IDateGranularity;\n /**\n * whether circular occurrences should be in the same bin\n * e.g. granularity = month\n * circular: 01.2018 == 01.2017\n * not circular: 01.2018 != 01.2017\n */\n circular: boolean;\n}\n","import {abortAble} from 'lineupengine';\nimport {getNumberOfBins, IAdvancedBoxPlotData, ICategoricalStatistics, IDateStatistics, ISequence, ISortMessageResponse, IStatistics, lazySeq, toIndexArray, WorkerTaskScheduler, createWorkerBlob} from '../internal';\nimport TaskScheduler, {ABORTED, oneShotIterator} from '../internal/scheduler';\nimport Column, {ICategoricalLikeColumn, ICompareValue, IDataRow, IDateColumn, IGroup, IndicesArray, INumberColumn, IOrderedGroup, isCategoricalLikeColumn, isDateColumn, isNumberColumn, Ranking, UIntTypedArray} from '../model';\nimport {IRenderTask} from '../renderer';\nimport {sortDirect} from './DirectRenderTasks';\nimport {CompareLookup} from './sort';\nimport {ARenderTasks, IRenderTaskExectutor, MultiIndices, taskLater, TaskLater, taskNow, TaskNow} from './tasks';\n\nexport class ScheduleRenderTasks extends ARenderTasks implements IRenderTaskExectutor {\n\n private readonly cache = new Map<string, IRenderTask<any>>();\n private readonly tasks = new TaskScheduler();\n private readonly workers = new WorkerTaskScheduler(createWorkerBlob());\n\n setData(data: IDataRow[]) {\n this.data = data;\n this.cache.clear();\n this.tasks.clear();\n this.valueCacheData.clear();\n this.workers.deleteRefs();\n }\n\n dirtyColumn(col: Column, type: 'data' | 'group' | 'summary') {\n super.dirtyColumn(col, type);\n // order designed such that first groups, then summaries, then data is deleted\n\n for (const key of Array.from(this.cache.keys()).sort()) {\n // data = all\n // summary = summary + group\n // group = group only\n if ((type === 'data' && key.startsWith(`${col.id}:`) ||\n (type === 'summary' && key.startsWith(`${col.id}:b:summary:`)) ||\n (key.startsWith(`${col.id}:a:group`)))) {\n this.cache.delete(key);\n this.tasks.abort(key);\n }\n }\n\n if (type !== 'data') {\n return;\n }\n\n this.valueCacheData.delete(col.id);\n this.workers.deleteRef(col.id);\n }\n\n dirtyRanking(ranking: Ranking, type: 'data' | 'group' | 'summary') {\n const cols = ranking.flatColumns;\n\n let checker: ((key: string) => boolean)[];\n switch (type) {\n case 'group':\n checker = cols.map((col) => (key: string) => key.startsWith(`${col.id}:a:group`));\n break;\n case 'summary':\n checker = cols.map((col) => (key: string) => key.startsWith(`${col.id}:b:summary`) || key.startsWith(`${col.id}:a:group`));\n break;\n case 'data':\n default:\n checker = cols.map((col) => (key: string) => key.startsWith(`${col.id}:`));\n break;\n }\n for (const key of Array.from(this.cache.keys()).sort()) {\n if (checker.some((f) => f(key))) {\n this.cache.delete(key);\n this.tasks.abort(key);\n }\n }\n // group compare tasks\n this.tasks.abortAll((t) => t.id.startsWith(`r${ranking.id}:`));\n\n // delete remote caches\n this.workers.deleteRef(ranking.id, true);\n\n if (type !== 'data') {\n return;\n }\n\n for (const col of cols) {\n super.dirtyColumn(col, type);\n this.workers.deleteRef(col.id);\n }\n }\n\n preCompute(ranking: Ranking, groups: {rows: IndicesArray, group: IGroup}[], maxDataIndex: number) {\n if (groups.length === 0) {\n return;\n }\n const cols = ranking.flatColumns;\n if (groups.length === 1) {\n const {group, rows} = groups[0];\n const multi = new MultiIndices([rows], maxDataIndex);\n for (const col of cols) {\n if (isCategoricalLikeColumn(col)) {\n this.summaryCategoricalStats(col, multi);\n } else if (isNumberColumn(col)) {\n this.summaryNumberStats(col, false, multi);\n this.summaryNumberStats(col, true, multi);\n } else if (isDateColumn(col)) {\n this.summaryDateStats(col, multi);\n } else {\n continue;\n }\n // copy from summary to group and create proper structure\n this.chainCopy(`${col.id}:a:group:${group.name}`, this.cache.get(`${col.id}:b:summary`)!, (v: {summary: any, data: any}) => ({group: v.summary, summary: v.summary, data: v.data}));\n if (isNumberColumn(col)) {\n this.chainCopy(`${col.id}:a:group:${group.name}:raw`, this.cache.get(`${col.id}:b:summary:raw`)!, (v: {summary: any, data: any}) => ({group: v.summary, summary: v.summary, data: v.data}));\n }\n }\n return;\n }\n\n const ogroups = groups.map(({rows, group}) => Object.assign({order: rows}, group));\n const full = new MultiIndices(groups.map((d) => d.rows), maxDataIndex);\n for (const col of cols) {\n if (isCategoricalLikeColumn(col)) {\n this.summaryCategoricalStats(col, full);\n for (const g of ogroups) {\n this.groupCategoricalStats(col, g);\n }\n } else if (isDateColumn(col)) {\n this.summaryDateStats(col, full);\n for (const g of ogroups) {\n this.groupDateStats(col, g);\n }\n } else if (isNumberColumn(col)) {\n this.summaryNumberStats(col, false, full);\n this.summaryNumberStats(col, true, full);\n for (const g of ogroups) {\n this.groupNumberStats(col, g, false);\n this.groupNumberStats(col, g, true);\n }\n }\n }\n }\n\n preComputeData(ranking: Ranking) {\n for (const col of ranking.flatColumns) {\n if (isCategoricalLikeColumn(col)) {\n this.dataCategoricalStats(col);\n } else if (isNumberColumn(col)) {\n this.dataNumberStats(col, false);\n this.dataNumberStats(col, true);\n } else if (isDateColumn(col)) {\n this.dataDateStats(col);\n }\n }\n }\n\n preComputeCol(col: Column) {\n const ranking = col.findMyRanker();\n\n if (isCategoricalLikeColumn(col)) {\n this.dataCategoricalStats(col);\n if (!ranking) {\n return;\n }\n this.summaryCategoricalStats(col);\n for (const group of ranking.getGroups()) {\n this.groupCategoricalStats(col, group);\n }\n return;\n }\n\n if (isNumberColumn(col)) {\n this.dataNumberStats(col, false);\n this.dataNumberStats(col, true);\n\n if (!ranking) {\n return;\n }\n this.summaryNumberStats(col, false);\n this.summaryNumberStats(col, true);\n for (const group of ranking.getGroups()) {\n this.groupNumberStats(col, group, false);\n this.groupNumberStats(col, group, true);\n }\n return;\n }\n\n if (!isDateColumn(col)) {\n return;\n }\n\n this.dataDateStats(col);\n\n if (!ranking) {\n return;\n }\n this.summaryDateStats(col);\n for (const group of ranking.getGroups()) {\n this.groupDateStats(col, group);\n }\n }\n\n copyData2Summary(ranking: Ranking) {\n for (const col of ranking.flatColumns) {\n if (isCategoricalLikeColumn(col)) {\n this.dataCategoricalStats(col);\n } else if (isNumberColumn(col)) {\n this.dataNumberStats(col, false);\n this.dataNumberStats(col, true);\n } else if (isDateColumn(col)) {\n this.dataDateStats(col);\n } else {\n continue;\n }\n // copy from data to summary and create proper structure\n this.chainCopy(`${col.id}:b:summary`, this.cache.get(`${col.id}:c:data`)!, (data: any) => ({summary: data, data}));\n if (isNumberColumn(col)) {\n this.chainCopy(`${col.id}:b:summary:raw`, this.cache.get(`${col.id}:c:data:raw`)!, (data: any) => ({summary: data, data}));\n }\n }\n }\n\n copyCache(col: Column, from: Column) {\n const fromPrefix = `${from.id}:`;\n\n for (const key of Array.from(this.cache.keys()).sort()) {\n if (!key.startsWith(fromPrefix)) {\n continue;\n }\n const tkey = `${col.id}:${key.slice(fromPrefix.length)}`;\n this.chainCopy(tkey, this.cache.get(key)!, (data: any) => data);\n }\n }\n\n groupCompare(ranking: Ranking, group: IGroup, rows: IndicesArray) {\n return taskLater(this.tasks.push(`r${ranking.id}:${group.name}`, () => {\n const rg = ranking.getGroupSortCriteria();\n if (rg.length === 0) {\n return [group.name.toLowerCase()];\n }\n const o = this.byOrder(rows);\n const vs: ICompareValue[] = [];\n for (const s of rg) {\n const cache = this.valueCache(s.col);\n const r = s.col.toCompareGroupValue(o, group, cache ? lazySeq(rows).map((d) => cache(d)) : undefined);\n if (Array.isArray(r)) {\n vs.push(...r);\n } else {\n vs.push(r);\n }\n }\n vs.push(group.name.toLowerCase());\n return vs;\n }));\n }\n\n groupRows<T>(col: Column, group: IOrderedGroup, key: string, compute: (rows: ISequence<IDataRow>) => T) {\n return this.cached(`${col.id}:a:group:${group.name}:${key}`, true, oneShotIterator(() => compute(this.byOrder(group.order))));\n }\n\n groupExampleRows<T>(_col: Column, group: IOrderedGroup, _key: string, compute: (rows: ISequence<IDataRow>) => T) {\n return taskNow(compute(this.byOrder(group.order.slice(0, 5))));\n }\n\n groupBoxPlotStats(col: Column & INumberColumn, group: IOrderedGroup, raw?: boolean) {\n return this.chain(`${col.id}:a:group:${group.name}${raw ? ':braw' : ':b'}`, this.summaryBoxPlotStats(col, raw), ({summary, data}) => {\n const ranking = col.findMyRanker()!;\n const key = raw ? `${col.id}:r` : col.id;\n if (this.valueCacheData.has(key) && group.order.length > 0) {\n // web worker version\n return () => this.workers.pushStats('boxplotStats', {}, key, <Float32Array>this.valueCacheData.get(key), `${ranking.id}:${group.name}`, group.order)\n .then((group) => ({group, summary, data}));\n }\n return this.boxplotBuilder(group.order, col, raw, (group) => ({group, summary, data}));\n });\n }\n\n groupNumberStats(col: Column & INumberColumn, group: IOrderedGroup, raw?: boolean) {\n return this.chain(`${col.id}:a:group:${group.name}${raw ? ':raw' : ''}`, this.summaryNumberStats(col, raw), ({summary, data}) => {\n const ranking = col.findMyRanker()!;\n const key = raw ? `${col.id}:r` : col.id;\n if (this.valueCacheData.has(key) && group.order.length > 0) {\n // web worker version\n return () => this.workers.pushStats('numberStats', {numberOfBins: summary.hist.length}, key, <Float32Array>this.valueCacheData.get(key), `${ranking.id}:${group.name}`, group.order)\n .then((group) => ({group, summary, data}));\n }\n return this.normalizedStatsBuilder(group.order, col, summary.hist.length, raw, (group) => ({group, summary, data}));\n });\n }\n\n groupCategoricalStats(col: Column & ICategoricalLikeColumn, group: IOrderedGroup) {\n return this.chain(`${col.id}:a:group:${group.name}`, this.summaryCategoricalStats(col), ({summary, data}) => {\n const ranking = col.findMyRanker()!;\n if (this.valueCacheData.has(col.id) && group.order.length > 0) {\n // web worker version\n return () => this.workers.pushStats('categoricalStats', {categories: col.categories.map((d) => d.name)}, col.id, <UIntTypedArray>this.valueCacheData.get(col.id), `${ranking.id}:${group.name}`, group.order)\n .then((group) => ({group, summary, data}));\n }\n return this.categoricalStatsBuilder(group.order, col, (group) => ({group, summary, data}));\n });\n }\n\n groupDateStats(col: Column & IDateColumn, group: IOrderedGroup) {\n const key = `${col.id}:a:group:${group.name}`;\n return this.chain(key, this.summaryDateStats(col), ({summary, data}) => {\n const ranking = col.findMyRanker()!;\n if (this.valueCacheData.has(col.id) && group.order.length > 0) {\n // web worker version\n return () => this.workers.pushStats('dateStats', {template: summary}, col.id, <Float64Array>this.valueCacheData.get(col.id), `${ranking.id}:${group.name}`, group.order)\n .then((group) => ({group, summary, data}));\n }\n return this.dateStatsBuilder(group.order, col, summary, (group) => ({group, summary, data}));\n });\n }\n\n summaryBoxPlotStats(col: Column & INumberColumn, raw?: boolean, order?: MultiIndices) {\n return this.chain(`${col.id}:b:summary${raw ? ':braw' : ':b'}`, this.dataBoxPlotStats(col, raw), (data) => {\n const ranking = col.findMyRanker()!;\n const key = raw ? `${col.id}:r` : col.id;\n if (this.valueCacheData.has(key)) {\n // web worker version\n return () => this.workers.pushStats('boxplotStats', {}, key, <Float32Array>this.valueCacheData.get(key), ranking.id, order ? order.joined : ranking.getOrder())\n .then((summary) => ({summary, data}));\n }\n return this.boxplotBuilder(order ? order : ranking.getOrder(), col, raw, (summary) => ({summary, data}));\n });\n }\n\n summaryNumberStats(col: Column & INumberColumn, raw?: boolean, order?: MultiIndices) {\n return this.chain(`${col.id}:b:summary${raw ? ':raw' : ''}`, this.dataNumberStats(col, raw), (data) => {\n const ranking = col.findMyRanker()!;\n const key = raw ? `${col.id}:r` : col.id;\n if (this.valueCacheData.has(key)) {\n // web worker version\n return () => this.workers.pushStats('numberStats', {numberOfBins: data.hist.length}, key, <Float32Array>this.valueCacheData.get(key), ranking.id, order ? order.joined : ranking.getOrder())\n .then((summary) => ({summary, data}));\n }\n return this.normalizedStatsBuilder(order ? order : ranking.getOrder(), col, data.hist.length, raw, (summary) => ({summary, data}));\n });\n }\n\n summaryCategoricalStats(col: Column & ICategoricalLikeColumn, order?: MultiIndices) {\n return this.chain(`${col.id}:b:summary`, this.dataCategoricalStats(col), (data) => {\n const ranking = col.findMyRanker()!;\n if (this.valueCacheData.has(col.id)) {\n // web worker version\n return () => this.workers.pushStats('categoricalStats', {categories: col.categories.map((d) => d.name)}, col.id, <UIntTypedArray>this.valueCacheData.get(col.id), ranking.id, order ? order.joined : ranking.getOrder())\n .then((summary) => ({summary, data}));\n }\n return this.categoricalStatsBuilder(order ? order : ranking.getOrder(), col, (summary) => ({summary, data}));\n });\n }\n\n summaryDateStats(col: Column & IDateColumn, order?: MultiIndices) {\n return this.chain(`${col.id}:b:summary`, this.dataDateStats(col), (data) => {\n const ranking = col.findMyRanker()!;\n if (this.valueCacheData.has(col.id)) {\n // web worker version\n return () => this.workers.pushStats('dateStats', {template: data}, col.id, <Float64Array>this.valueCacheData.get(col.id), ranking.id, order ? order.joined : ranking.getOrder())\n .then((summary) => ({summary, data}));\n }\n return this.dateStatsBuilder(order ? order : ranking.getOrder(), col, data, (summary) => ({summary, data}));\n });\n }\n\n private cached<T>(key: string, canAbort: boolean, it: Iterator<T | null> | (() => Promise<T>)): IRenderTask<T> {\n const dontCache = this.data.length === 0;\n\n if (this.isValidCacheEntry(key) && !dontCache) {\n return this.cache.get(key)!;\n }\n\n const task = typeof it === 'function' ? abortAble(it()) : this.tasks.pushMulti(key, it, canAbort);\n const s = taskLater(task);\n if (!dontCache) {\n this.cache.set(key, s);\n }\n task.then((r) => {\n if (this.cache.get(key) !== s) {\n return;\n }\n if (typeof r === 'symbol') {\n this.cache.delete(key);\n } else {\n this.cache.set(key, taskNow(r));\n }\n });\n return s;\n }\n\n private chain<T, U>(key: string, task: IRenderTask<T>, creator: (data: T) => Iterator<U | null> | (() => Promise<U>)): IRenderTask<U> {\n if (this.isValidCacheEntry(key)) {\n return this.cache.get(key)!;\n }\n if (task instanceof TaskNow) {\n if (typeof task.v === 'symbol') {\n // aborted\n return taskNow(ABORTED);\n }\n return this.cached(key, true, creator(task.v));\n }\n\n const v = (<TaskLater<T>>task).v;\n const subTask = v.then((data) => {\n if (typeof data === 'symbol') {\n return ABORTED;\n }\n const created = creator(data);\n if (typeof created === 'function') {\n // promise\n return created();\n }\n return this.tasks.pushMulti(key, created);\n });\n const s = taskLater(subTask);\n this.cache.set(key, s);\n subTask.then((r) => {\n if (this.cache.get(key) !== s) {\n return;\n }\n if (typeof r === 'symbol') {\n this.cache.delete(key);\n } else {\n this.cache.set(key, taskNow(r));\n }\n });\n return s;\n }\n\n private isValidCacheEntry(key: string) {\n if (!this.cache.has(key)) {\n return false;\n }\n const v = this.cache.get(key);\n // not an aborted task\n return !((v instanceof TaskNow) && typeof v.v === 'symbol') && !(v instanceof TaskLater && v.v.isAborted());\n }\n\n private chainCopy<T, U>(key: string, task: IRenderTask<T>, creator: (data: T) => U): IRenderTask<U> {\n if (this.isValidCacheEntry(key)) {\n return this.cache.get(key)!;\n }\n if (task instanceof TaskNow) {\n if (typeof task.v === 'symbol') {\n // aborted\n return taskNow(ABORTED);\n }\n const subTask = taskNow(creator(task.v));\n this.cache.set(key, subTask);\n return subTask;\n }\n\n const v = (<TaskLater<T>>task).v;\n const subTask = v.then((data) => {\n if (typeof data === 'symbol') {\n return ABORTED;\n }\n return creator(data);\n });\n const s = taskLater(subTask);\n this.cache.set(key, s);\n subTask.then((r) => {\n if (this.cache.get(key) !== s) {\n return;\n }\n if (typeof r === 'symbol') {\n this.cache.delete(key);\n } else {\n this.cache.set(key, taskNow(r));\n }\n });\n return s;\n }\n\n dataBoxPlotStats(col: Column & INumberColumn, raw?: boolean) {\n const key = `${col.id}:c:data${raw ? ':braw' : ':b'}`;\n const valueCacheKey = raw ? `${col.id}:r` : col.id;\n if (this.valueCacheData.has(valueCacheKey) && this.data.length > 0) {\n // use webworker\n return this.cached(key, false, () => this.workers.pushStats('boxplotStats', {}, valueCacheKey, <Float32Array>this.valueCacheData.get(valueCacheKey)!));\n }\n return this.cached(key, false, this.boxplotBuilder<IAdvancedBoxPlotData>(null, col, raw));\n }\n\n dataNumberStats(col: Column & INumberColumn, raw?: boolean) {\n return this.cached(`${col.id}:c:data${raw ? ':raw' : ''}`, false, this.normalizedStatsBuilder<IStatistics>(null, col, getNumberOfBins(this.data.length), raw));\n }\n\n dataCategoricalStats(col: Column & ICategoricalLikeColumn) {\n return this.cached(`${col.id}:c:data`, false, this.categoricalStatsBuilder<ICategoricalStatistics>(null, col));\n }\n\n dataDateStats(col: Column & IDateColumn) {\n return this.cached(`${col.id}:c:data`, false, this.dateStatsBuilder<IDateStatistics>(null, col));\n }\n\n sort(ranking: Ranking, group: IGroup, indices: IndicesArray, singleCall: boolean, maxDataIndex: number, lookups?: CompareLookup) {\n if (!lookups || indices.length < 1000) {\n // no thread needed\n const order = sortDirect(indices, maxDataIndex, lookups);\n return Promise.resolve(order);\n }\n\n const indexArray = toIndexArray(indices, maxDataIndex);\n const toTransfer = [indexArray.buffer];\n\n if (singleCall) {\n // can transfer otherwise need to copy\n toTransfer.push(...lookups.transferAbles);\n }\n\n return this.workers.push('sort', {\n ref: `${ranking.id}:${group.name}`,\n indices: indexArray,\n sortOrders: lookups.sortOrders\n }, toTransfer, (r: ISortMessageResponse) => r.order);\n }\n\n terminate() {\n this.workers.terminate();\n this.cache.clear();\n this.valueCacheData.clear();\n }\n}\n","import {IAbortAblePromise} from 'lineupengine';\nimport {Column, IDataRow, IOrderedGroup, INumberColumn, ICategoricalLikeColumn, IDateColumn} from '../model';\nimport {IDataProvider} from '../provider';\nimport DialogManager from '../ui/dialogs/DialogManager';\nimport {ISequence, IDateStatistics, ICategoricalStatistics, IAdvancedBoxPlotData, IStatistics} from '../internal';\n\n\nexport interface IImposer {\n color?(row: IDataRow | null, valueHint?: number): string | null;\n}\n\nexport declare type IRenderCallback = (ctx: CanvasRenderingContext2D) => void;\n\n/**\n * a cell renderer for rendering a cell of specific column\n */\nexport interface ICellRenderer {\n /**\n * template as a basis for the update\n */\n readonly template: string;\n\n /**\n * update a given node (create using the template) with the given data\n * @param node the node to update\n * @param d the data item\n * @param i the order relative index\n * @param group the group this row is part of\n */\n update(node: HTMLElement, d: IDataRow, i: number, group: IOrderedGroup): void | IAbortAblePromise<void> | null;\n\n /**\n * render a low detail canvas row\n * @return true if a dom element is needed\n */\n render?(ctx: CanvasRenderingContext2D, d: IDataRow, i: number, group: IOrderedGroup): void | IAbortAblePromise<IRenderCallback> | boolean | null;\n}\n\n/**\n * a cell renderer for rendering a cell of specific column\n */\nexport interface IGroupCellRenderer {\n /**\n * template as a basis for the update\n */\n readonly template: string;\n\n /**\n * update a given node (create using the template) with the given data\n * @param node the node to update\n * @param group the group to render\n */\n update(node: HTMLElement, group: IOrderedGroup): void | IAbortAblePromise<void> | null;\n}\n\nexport interface ISummaryRenderer {\n /**\n * template as a basis for the update\n */\n readonly template: string;\n\n update(node: HTMLElement): void | IAbortAblePromise<void> | null;\n}\n\n\nexport interface IRenderTask<T> {\n then<U = void>(onfullfilled: (value: T | symbol) => U): U | IAbortAblePromise<U>;\n}\n\nexport interface IRenderTasks {\n groupRows<T>(col: Column, group: IOrderedGroup, key: string, compute: (rows: ISequence<IDataRow>) => T): IRenderTask<T>;\n groupExampleRows<T>(col: Column, group: IOrderedGroup, key: string, compute: (rows: ISequence<IDataRow>) => T): IRenderTask<T>;\n\n groupBoxPlotStats(col: Column & INumberColumn, group: IOrderedGroup, raw?: boolean): IRenderTask<{group: IAdvancedBoxPlotData, summary: IAdvancedBoxPlotData, data: IAdvancedBoxPlotData}>;\n groupNumberStats(col: Column & INumberColumn, group: IOrderedGroup, raw?: boolean): IRenderTask<{group: IStatistics, summary: IStatistics, data: IStatistics}>;\n groupCategoricalStats(col: Column & ICategoricalLikeColumn, group: IOrderedGroup): IRenderTask<{group: ICategoricalStatistics, summary: ICategoricalStatistics, data: ICategoricalStatistics}>;\n groupDateStats(col: Column & IDateColumn, group: IOrderedGroup): IRenderTask<{group: IDateStatistics, summary: IDateStatistics, data: IDateStatistics}>;\n\n summaryBoxPlotStats(col: Column & INumberColumn, raw?: boolean): IRenderTask<{summary: IAdvancedBoxPlotData, data: IAdvancedBoxPlotData}>;\n summaryNumberStats(col: Column & INumberColumn, raw?: boolean): IRenderTask<{summary: IStatistics, data: IStatistics}>;\n summaryCategoricalStats(col: Column & ICategoricalLikeColumn): IRenderTask<{summary: ICategoricalStatistics, data: ICategoricalStatistics}>;\n summaryDateStats(col: Column & IDateColumn): IRenderTask<{summary: IDateStatistics, data: IDateStatistics}>;\n}\n\n/**\n * context for rendering, wrapped as an object for easy extensibility\n */\nexport interface IRenderContext {\n readonly tasks: IRenderTasks;\n /**\n * render a column\n * @param col\n */\n renderer(col: Column, imposer?: IImposer): ICellRenderer;\n\n /**\n * render a column\n * @param col\n */\n groupRenderer(col: Column, imposer?: IImposer): IGroupCellRenderer;\n\n summaryRenderer(co: Column, interactive: boolean, imposer?: IImposer): ISummaryRenderer;\n\n /**\n * prefix used for all generated id names\n */\n readonly idPrefix: string;\n\n asElement(html: string): HTMLElement;\n\n colWidth(col: Column): number;\n\n readonly provider: IDataProvider;\n readonly dialogManager: DialogManager;\n}\n\nexport enum ERenderMode {\n CELL, GROUP, SUMMARY\n}\n\n\nexport interface ICellRendererFactory {\n readonly title: string;\n readonly groupTitle?: string;\n readonly summaryTitle?: string;\n\n canRender(col: Column, mode: ERenderMode): boolean;\n\n create?(col: Column, context: IRenderContext, imposer?: IImposer): ICellRenderer;\n\n createGroup?(col: Column, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer;\n\n createSummary?(col: Column, context: IRenderContext, interactive: boolean, imposer?: IImposer): ISummaryRenderer;\n}\n","import {createIndexArray, sortComplex, ISequence, lazySeq, IEventContext} from '../internal';\nimport {Column, EDirtyReason, Ranking, defaultGroup, IColumnDesc, ICompareValue, IDataRow, IGroup, IndicesArray, INumberColumn, IOrderedGroup, CompositeColumn} from '../model';\nimport ACommonDataProvider from './ACommonDataProvider';\nimport ADataProvider from './ADataProvider';\nimport {IDataProviderOptions} from './interfaces';\nimport {CompareLookup} from './sort';\nimport {IRenderTaskExectutor} from './tasks';\nimport {DirectRenderTasks} from './DirectRenderTasks';\nimport {ScheduleRenderTasks} from './ScheduledTasks';\nimport {joinGroups, mapIndices, duplicateGroup} from '../model/internal';\n\n\nexport interface ILocalDataProviderOptions {\n /**\n * whether the filter should be applied to all rankings regardless where they are\n * default: false\n */\n filterGlobally: boolean;\n /**\n * jump to search results such that they are visible\n * default: false\n */\n jumpToSearchResult: boolean;\n\n /**\n * specify the task executor to use direct = no delay, scheduled = run when idle\n */\n taskExecutor: 'direct' | 'scheduled';\n}\n\ninterface ISortHelper {\n group: IGroup;\n rows: IndicesArray;\n}\n\n/**\n * a data provider based on an local array\n */\nexport default class LocalDataProvider extends ACommonDataProvider {\n private readonly ooptions: ILocalDataProviderOptions = {\n /**\n * whether the filter should be applied to all rankings regardless where they are\n */\n filterGlobally: false,\n\n jumpToSearchResult: false,\n\n taskExecutor: 'direct'\n };\n\n private readonly reorderAll: () => void;\n\n private _dataRows: IDataRow[];\n private filter: ((row: IDataRow) => boolean) | null = null;\n private readonly tasks: IRenderTaskExectutor;\n\n constructor(private _data: any[], columns: IColumnDesc[] = [], options: Partial<ILocalDataProviderOptions & IDataProviderOptions> = {}) {\n super(columns, options);\n Object.assign(this.ooptions, options);\n this._dataRows = toRows(_data);\n this.tasks = this.ooptions.taskExecutor === 'direct' ? new DirectRenderTasks() : new ScheduleRenderTasks();\n this.tasks.setData(this._dataRows);\n\n const that = this;\n this.reorderAll = function (this: {source?: Ranking, type: string}) {\n //fire for all other rankings a dirty order event, too\n const ranking = this.source;\n const type = this.type;\n for (const r of that.getRankings()) {\n if (r !== ranking) {\n r.dirtyOrder(type === Ranking.EVENT_FILTER_CHANGED ? [EDirtyReason.FILTER_CHANGED] : [EDirtyReason.UNKNOWN]);\n }\n }\n };\n }\n\n /**\n * set a globally applied filter to all data without changing the data source itself\n * @param {((row: IDataRow) => boolean) | null} filter\n */\n setFilter(filter: ((row: IDataRow) => boolean) | null) {\n this.filter = filter;\n this.reorderAll.call({type: Ranking.EVENT_FILTER_CHANGED});\n }\n\n getFilter() {\n return this.filter;\n }\n\n getTotalNumberOfRows() {\n return this.data.length;\n }\n\n getTaskExecutor() {\n return this.tasks;\n }\n\n get data() {\n return this._data;\n }\n\n destroy() {\n super.destroy();\n this.tasks.terminate();\n }\n\n /**\n * replaces the dataset rows with a new one\n * @param data\n */\n setData(data: any[]) {\n this._data = data;\n this._dataRows = toRows(data);\n this.dataChanged();\n }\n\n private dataChanged() {\n this.tasks.setData(this._dataRows);\n\n for (const ranking of this.getRankings()) {\n this.tasks.preComputeData(ranking);\n }\n\n this.fire(ADataProvider.EVENT_DATA_CHANGED, this._dataRows);\n this.reorderAll.call({type: Ranking.EVENT_FILTER_CHANGED});\n\n }\n\n clearData() {\n this.setData([]);\n }\n\n /**\n * append rows to the dataset\n * @param data\n */\n appendData(data: any[]) {\n for (const d of data) {\n this._data.push(d);\n this._dataRows.push({v: d, i: this._dataRows.length});\n }\n this.dataChanged();\n }\n\n cloneRanking(existing?: Ranking) {\n const ranking = super.cloneRanking(existing);\n\n if (this.ooptions.filterGlobally) {\n ranking.on(`${Ranking.EVENT_FILTER_CHANGED}.reorderAll`, this.reorderAll);\n }\n\n this.trackRanking(ranking, existing);\n return ranking;\n }\n\n private trackRanking(ranking: Ranking, existing?: Ranking) {\n\n const that = this;\n ranking.on(`${Column.EVENT_DIRTY_CACHES}.cache`, function (this: IEventContext) {\n let col: any = this.origin;\n while (col instanceof Column) {\n // console.log(col.label, 'dirty data');\n that.tasks.dirtyColumn(col, 'data');\n that.tasks.preComputeCol(col);\n col = col.parent;\n }\n });\n\n const cols = ranking.flatColumns;\n const addKey = `${Ranking.EVENT_ADD_COLUMN}.cache`;\n const removeKey = `${Ranking.EVENT_REMOVE_COLUMN}.cache`;\n\n const removeCol = (col: Column) => {\n this.tasks.dirtyColumn(col, 'data');\n if (col instanceof CompositeColumn) {\n col.on(addKey, null);\n col.on(removeKey, null);\n }\n };\n\n const addCol = (col: Column) => {\n this.tasks.preComputeCol(col);\n if (col instanceof CompositeColumn) {\n col.on(addKey, addCol);\n col.on(removeKey, removeCol);\n }\n };\n\n\n ranking.on(addKey, addCol);\n ranking.on(removeKey, removeCol);\n for (const col of cols) {\n if (col instanceof CompositeColumn) {\n col.on(addKey, addCol);\n col.on(removeKey, removeCol);\n }\n }\n\n if (existing) {\n const copy = existing.flatColumns;\n for (let i = 0; i < cols.length; ++i) {\n this.tasks.copyCache(cols[i], copy[i]);\n }\n }\n\n this.tasks.preComputeData(ranking);\n }\n\n cleanUpRanking(ranking: Ranking) {\n if (this.ooptions.filterGlobally) {\n ranking.on(`${Ranking.EVENT_FILTER_CHANGED}.reorderAll`, null);\n }\n\n\n const cols = ranking.flatColumns;\n const addKey = `${Ranking.EVENT_ADD_COLUMN}.cache`;\n const removeKey = `${Ranking.EVENT_REMOVE_COLUMN}.cache`;\n ranking.on(addKey, null);\n ranking.on(removeKey, null);\n for (const col of cols) {\n if (col instanceof CompositeColumn) {\n col.on(addKey, null);\n col.on(removeKey, null);\n }\n }\n\n this.tasks.dirtyRanking(ranking, 'data');\n\n super.cleanUpRanking(ranking);\n }\n\n private resolveFilter(ranking: Ranking) {\n //do the optional filtering step\n const filter: (Column | ((d: IDataRow) => boolean))[] = [];\n\n if (this.ooptions.filterGlobally) {\n for (const r of this.getRankings()) {\n if (r.isFiltered()) {\n filter.push(...r.flatColumns.filter((d) => d.isFiltered()));\n }\n }\n } else if (ranking.isFiltered()) {\n filter.push(...ranking.flatColumns.filter((d) => d.isFiltered()));\n }\n\n if (this.filter) {\n filter.push(this.filter);\n }\n return filter;\n }\n\n private noSorting(ranking: Ranking) {\n // initial no sorting required just index mapping\n const l = this._data.length;\n const order = createIndexArray(l, l - 1);\n const index2pos = order.slice();\n for (let i = 0; i < l; ++i) {\n order[i] = i;\n index2pos[i] = i + 1; // shift since default is 0\n }\n\n this.tasks.preCompute(ranking, [{rows: order, group: defaultGroup}], l - 1);\n return {groups: [Object.assign({order}, defaultGroup)], index2pos};\n }\n\n private createSorter(ranking: Ranking, filter: (Column | ((d: IDataRow) => boolean))[], needsFiltering: boolean, needsGrouping: boolean, needsSorting: boolean) {\n const groups = new Map<string, ISortHelper>();\n const groupOrder: ISortHelper[] = [];\n let maxDataIndex = -1;\n\n const groupCriteria = ranking.getGroupCriteria();\n const lookups = needsSorting ? new CompareLookup(this._data.length, true, ranking, this.tasks.valueCache.bind(this.tasks)) : undefined;\n\n const pushGroup = (group: IGroup, r: IDataRow) => {\n const groupKey = group.name.toLowerCase();\n if (groups.has(groupKey)) {\n (<number[]>groups.get(groupKey)!.rows).push(r.i);\n return;\n }\n const s = {group, rows: [r.i]};\n groups.set(groupKey, s);\n groupOrder.push(s);\n };\n\n const groupCaches = groupCriteria.map((c) => this.tasks.valueCache(c));\n const filterCaches = filter.map((c) => typeof c === 'function' ? undefined : this.tasks.valueCache(c));\n\n const toGroup = groupCriteria.length === 1 ?\n (r: IDataRow) => joinGroups([groupCriteria[0].group(r, groupCaches[0] ? groupCaches[0]!(r.i) : undefined)]) :\n (r: IDataRow) => joinGroups(groupCriteria.map((c, i) => c.group(r, groupCaches[i] ? groupCaches[i]!(r.i) : undefined)));\n\n if (needsFiltering) {\n // filter, group, sort\n outer: for (const r of this._dataRows) {\n for (let f = 0; f < filter.length; ++f) {\n const fc = filter[f];\n const c = filterCaches[f];\n if ((typeof fc === 'function' && !fc(r)) || (fc instanceof Column && !fc.filter(r, c ? c(r.i) : undefined))) {\n continue outer;\n }\n }\n if (maxDataIndex < r.i) {\n maxDataIndex = r.i;\n }\n if (lookups) {\n lookups.push(r);\n }\n pushGroup(toGroup(r), r);\n }\n\n // some default sorting\n groupOrder.sort((a, b) => a.group.name.toLowerCase().localeCompare(b.group.name.toLowerCase()));\n return {maxDataIndex, lookups, groupOrder};\n }\n\n // reuse the existing groups\n\n for (const before of ranking.getGroups()) {\n const order = before.order;\n if (!needsGrouping) {\n const clone = duplicateGroup(before);\n // reuse in full\n groupOrder.push({group: clone, rows: order});\n\n if (!lookups) {\n maxDataIndex = (<ReadonlyArray<number>>order).reduce((a, b) => Math.max(a, b), maxDataIndex);\n continue;\n }\n // sort\n // tslint:disable-next-line:prefer-for-of\n for (let o = 0; o < order.length; ++o) {\n const i = order[o];\n if (maxDataIndex < i) {\n maxDataIndex = i;\n }\n lookups.push(this._dataRows[i]);\n }\n continue;\n }\n\n // group, [sort]\n // tslint:disable-next-line:prefer-for-of\n for (let o = 0; o < order.length; ++o) {\n const i = order[o];\n if (maxDataIndex < i) {\n maxDataIndex = i;\n }\n const r = this._dataRows[i];\n if (lookups) {\n lookups.push(r);\n }\n pushGroup(toGroup(r), r);\n }\n }\n\n if (needsGrouping) {\n // some default sorting\n groupOrder.sort((a, b) => a.group.name.toLowerCase().localeCompare(b.group.name.toLowerCase()));\n }\n return {maxDataIndex, lookups, groupOrder};\n }\n\n private sortGroup(g: ISortHelper, i: number, ranking: Ranking, lookups: CompareLookup | undefined, groupLookup: CompareLookup | undefined, singleGroup: boolean, maxDataIndex: number): Promise<IOrderedGroup> {\n const group = g.group;\n\n const sortTask = this.tasks.sort(ranking, group, g.rows, singleGroup, maxDataIndex, lookups);\n\n // compute sort group value as task\n const groupSortTask = groupLookup ? this.tasks.groupCompare(ranking, group, g.rows).then((r) => r) : <ICompareValue[]>[];\n\n // trigger task for groups to compute for this group\n\n\n return Promise.all([sortTask, groupSortTask]).then(([order, groupC]) => {\n if (groupLookup && Array.isArray(groupC)) {\n groupLookup.pushValues(i, groupC);\n }\n return Object.assign(group, {order});\n });\n }\n\n private sortGroups(groups: IOrderedGroup[], groupLookup: CompareLookup | undefined, enforceSorting: boolean) {\n // sort groups\n if (groupLookup) {\n const groupIndices = groups.map((_, i) => i);\n sortComplex(groupIndices, groupLookup.sortOrders);\n return groupIndices.map((i) => groups[i]);\n }\n if (enforceSorting) {\n // create a default sorting\n return groups.sort((a, b) => a.name.localeCompare(b.name));\n }\n return groups;\n }\n\n private index2pos(groups: IOrderedGroup[], maxDataIndex: number) {\n const total = groups.reduce((a, b) => a + b.order.length, 1);\n const index2pos = createIndexArray(maxDataIndex + 1, total);\n let offset = 1;\n for (const g of groups) {\n // tslint:disable-next-line\n for (let i = 0; i < g.order.length; i++ , offset++) {\n index2pos[g.order[i]] = offset;\n }\n }\n\n return {groups, index2pos};\n }\n\n sort(ranking: Ranking, dirtyReason: EDirtyReason[]) {\n const reasons = new Set(dirtyReason);\n\n if (this._data.length === 0) {\n return {groups: [], index2pos: []};\n }\n\n // console.log(dirtyReason);\n\n const filter = this.resolveFilter(ranking);\n\n const needsFiltering = reasons.has(EDirtyReason.UNKNOWN) || reasons.has(EDirtyReason.FILTER_CHANGED);\n const needsGrouping = needsFiltering || reasons.has(EDirtyReason.GROUP_CRITERIA_CHANGED) || reasons.has(EDirtyReason.GROUP_CRITERIA_DIRTY);\n const needsSorting = needsGrouping || reasons.has(EDirtyReason.SORT_CRITERIA_CHANGED) || reasons.has(EDirtyReason.SORT_CRITERIA_DIRTY);\n const needsGroupSorting = needsGrouping || reasons.has(EDirtyReason.GROUP_SORT_CRITERIA_CHANGED) || reasons.has(EDirtyReason.GROUP_SORT_CRITERIA_DIRTY);\n\n if (needsFiltering) {\n this.tasks.dirtyRanking(ranking, 'summary');\n } else if (needsGrouping) {\n this.tasks.dirtyRanking(ranking, 'group');\n }\n // otherwise the summary and group summaries should still be valid\n\n if (filter.length === 0) {\n // all rows so summary = data\n this.tasks.copyData2Summary(ranking);\n }\n\n const isGroupedBy = ranking.getGroupCriteria().length > 0;\n const isSortedBy = ranking.getSortCriteria().length > 0;\n const isGroupedSortedBy = ranking.getGroupSortCriteria().length > 0;\n\n if (!isGroupedBy && !isSortedBy && filter.length === 0) {\n return this.noSorting(ranking);\n }\n\n const {maxDataIndex, lookups, groupOrder} = this.createSorter(ranking, filter, needsFiltering, needsGrouping, needsSorting);\n\n if (groupOrder.length === 0) {\n return {groups: [], index2pos: []};\n }\n\n this.tasks.preCompute(ranking, groupOrder, maxDataIndex);\n\n\n if (groupOrder.length === 1) {\n const g = groupOrder[0]!;\n\n // not required if: group sort criteria changed -> lookups will be none\n return this.sortGroup(g, 0, ranking, lookups, undefined, true, maxDataIndex).then((group) => {\n return this.index2pos([group], maxDataIndex);\n });\n }\n\n const groupLookup = isGroupedSortedBy && needsGroupSorting ? new CompareLookup(groupOrder.length, false, ranking) : undefined;\n\n return Promise.all(groupOrder.map((g, i) => {\n // not required if: group sort criteria changed -> lookups will be none\n return this.sortGroup(g, i, ranking, lookups, groupLookup, false, maxDataIndex);\n })).then((groups) => {\n // not required if: sort criteria changed -> groupLookup will be none\n const sortedGroups = this.sortGroups(groups, groupLookup, needsGroupSorting);\n return this.index2pos(sortedGroups, maxDataIndex);\n });\n }\n\n private readonly mapToDataRow = (i: number) => {\n if (i < 0 || i >= this._dataRows.length) {\n return {i, v: {}};\n }\n return this._dataRows[i];\n };\n\n viewRaw(indices: IndicesArray) {\n return mapIndices(indices, (i) => this._data[i] || {});\n }\n\n viewRawRows(indices: IndicesArray) {\n return mapIndices(indices, this.mapToDataRow);\n }\n\n getRow(index: number) {\n return this._dataRows[index];\n }\n\n seq(indices: IndicesArray) {\n return lazySeq(indices).map(this.mapToDataRow);\n }\n\n view(indices: IndicesArray) {\n return this.viewRaw(indices);\n }\n\n mappingSample(col: INumberColumn): ISequence<number> {\n const MAX_SAMPLE = 120; //at most 120 sample lines\n const l = this._dataRows.length;\n if (l <= MAX_SAMPLE) {\n return lazySeq(this._dataRows).map((v) => col.getRawNumber(v));\n }\n //randomly select 500 elements\n const indices = new Set<number>();\n\n for (let i = 0; i < MAX_SAMPLE; ++i) {\n let j = Math.floor(Math.random() * (l - 1));\n while (indices.has(j)) {\n j = Math.floor(Math.random() * (l - 1));\n }\n indices.add(j);\n }\n return lazySeq(Array.from(indices)).map((i) => col.getRawNumber(this._dataRows[i]));\n }\n\n searchAndJump(search: string | RegExp, col: Column) {\n //case insensitive search\n search = typeof search === 'string' ? search.toLowerCase() : search;\n const f = typeof search === 'string' ? (v: string) => v.toLowerCase().indexOf((<string>search)) >= 0 : (<RegExp>search).test.bind(search);\n const indices = <number[]>[];\n for (let i = 0; i < this._dataRows.length; ++i) {\n if (f(col.getLabel(this._dataRows[i]))) {\n indices.push(i);\n }\n }\n this.jumpToNearest(indices);\n }\n\n}\n\nfunction toRows(data: any[]) {\n return data.map((v, i) => ({v, i}));\n}\n","import {MIN_LABEL_WIDTH} from '../constants';\nimport {Column, IArrayColumn, IDataRow, ICategoricalLikeColumn, isMapAbleColumn, DEFAULT_COLOR} from '../model';\nimport {hsl} from 'd3-color';\nimport {cssClass} from '../styles';\nimport {IRenderContext} from '.';\nimport {ISequence} from '../internal';\n\n/** @internal */\nexport function noop() {\n // no op\n}\n\nexport const noRenderer = {\n template: `<div></div>`,\n update: <() => void>noop\n};\n\n/** @internal */\nexport function setText<T extends Node>(node: T, text?: string): T {\n if (text === undefined) {\n return node;\n }\n //no performance boost if setting the text node directly\n //const textNode = <Text>node.firstChild;\n //if (textNode == null) {\n // node.appendChild(node.ownerDocument!.createTextNode(text));\n //} else {\n // textNode.data = text;\n //}\n if (node.textContent !== text) {\n node.textContent = text;\n }\n return node;\n}\n\n/**\n * for each item matching the selector execute the callback\n * @param node\n * @param selector\n * @param callback\n * @internal\n */\nexport function forEach<T extends Element>(node: Element, selector: string, callback: (d: T, i: number) => void) {\n (<T[]>Array.from(node.querySelectorAll(selector))).forEach(callback);\n}\n\n/** @internal */\nexport function forEachChild<T extends Element>(node: Element, callback: (d: T, i: number) => void) {\n (<T[]>Array.from(node.children)).forEach(callback);\n}\n\n/**\n * matches the columns and the dom nodes representing them\n * @param {HTMLElement} node row\n * @param columns columns to check\n * @internal\n */\nexport function matchColumns(node: HTMLElement, columns: {column: Column, template: string, rendererId: string}[], ctx: IRenderContext) {\n if (node.childElementCount === 0) {\n // initial call fast method\n node.innerHTML = columns.map((c) => c.template).join('');\n const children = Array.from(node.children);\n columns.forEach((col, i) => {\n const cnode = <HTMLElement>children[i];\n // set attribute for finding again\n cnode.dataset.columnId = col.column.id;\n // store current renderer\n cnode.dataset.renderer = col.rendererId;\n cnode.classList.add(cssClass(`renderer-${col.rendererId}`));\n });\n return;\n }\n\n function matches(c: {column: Column, rendererId: string}, i: number) {\n //do both match?\n const n = <HTMLElement>node.children[i];\n return n != null && n.dataset.columnId === c.column.id && n.dataset.renderer === c.rendererId;\n }\n\n if (columns.every(matches)) {\n return; //nothing to do\n }\n\n const idsAndRenderer = new Set(columns.map((c) => `${c.column.id}@${c.rendererId}`));\n //remove all that are not existing anymore\n forEachChild(node, (n: HTMLElement) => {\n const id = n.dataset.columnId;\n const renderer = n.dataset.renderer;\n const idAndRenderer = `${id}@${renderer}`;\n if (!idsAndRenderer.has(idAndRenderer)) {\n node.removeChild(n);\n }\n });\n columns.forEach((col) => {\n let cnode = <HTMLElement>node.querySelector(`[data-column-id=\"${col.column.id}\"]`);\n if (!cnode) {\n cnode = ctx.asElement(col.template);\n cnode.dataset.columnId = col.column.id;\n cnode.dataset.renderer = col.rendererId;\n cnode.classList.add(cssClass(`renderer-${col.rendererId}`));\n }\n node.appendChild(cnode);\n });\n}\n\nexport function wideEnough(col: IArrayColumn<any>, length: number = col.labels.length) {\n const w = col.getWidth();\n return w / length > MIN_LABEL_WIDTH; // at least 30 pixel\n}\n\nexport function wideEnoughCat(col: ICategoricalLikeColumn) {\n const w = col.getWidth();\n return w / col.categories.length > MIN_LABEL_WIDTH; // at least 30 pixel\n}\n\n\n\n// side effect\nconst adaptColorCache: {[bg: string]: string} = {};\n/**\n * Adapts the text color for a given background color\n * @param {string} bgColor as `#ff0000`\n * @returns {string} returns `black` or `white` for best contrast\n */\nexport function adaptTextColorToBgColor(bgColor: string): string {\n const bak = adaptColorCache[bgColor];\n if (bak) {\n return bak;\n }\n return adaptColorCache[bgColor] = hsl(bgColor).l > 0.5 ? 'black' : 'white';\n}\n\n\n/**\n *\n * Adapts the text color for a given background color\n * @param {HTMLElement} node the node containing the text\n * @param {string} bgColor as `#ff0000`\n * @param {string} title the title to render\n * @param {number} width for which percentages of the cell this background applies (0..1)\n */\nexport function adaptDynamicColorToBgColor(node: HTMLElement, bgColor: string, title: string, width: number) {\n const adapt = adaptTextColorToBgColor(bgColor);\n if ((width <= 0.05 || adapt === 'black') || width > 0.9) { // almost empty or full\n node.style.color = adapt === 'black' || width <= 0.05 ? null : adapt; // null = black\n // node.classList.remove('lu-gradient-text');\n // node.style.backgroundImage = null;\n return;\n }\n\n node.style.color = null;\n node.innerText = title;\n\n const span = node.ownerDocument!.createElement('span');\n span.classList.add(cssClass('gradient-text'));\n span.style.color = adapt;\n span.innerText = title;\n node.appendChild(span);\n}\n\n\n/** @internal */\nexport const uniqueId: (prefix: string) => string = (function () {\n // side effect but just within the function itself, so good for the library\n let idCounter = 0;\n return (prefix: string) => `${prefix}${(idCounter++).toString(36)}`;\n})();\n\n\nconst NUM_EXAMPLE_VALUES = 5;\n\n/** @internal */\nexport function exampleText(col: Column, rows: ISequence<IDataRow>) {\n const examples = <string[]>[];\n rows.every((row) => {\n if (col.getValue(row) == null) {\n return true;\n }\n const v = col.getLabel(row);\n examples.push(v);\n return examples.length < NUM_EXAMPLE_VALUES;\n });\n if (examples.length === 0) {\n return '';\n }\n return `${examples.join(', ')}${examples.length < rows.length ? ', ...' : ''}`;\n}\n\n\n/** @internal */\nexport function multiLevelGridCSSClass(idPrefix: string, column: Column) {\n return cssClass(`stacked-${idPrefix}-${column.id}`);\n}\n\n\n/** @internal */\nexport function colorOf(col: Column) {\n if (isMapAbleColumn(col)) {\n return col.getColorMapping().apply(0);\n }\n return DEFAULT_COLOR;\n}\n","/**\n * number of bins before switching to dense mode\n * @internal\n */\nexport const DENSE_HISTOGRAM = 19;\n/**\n * minimal witdh of a column to show the label in the header\n * @internal\n */\nexport const MIN_LABEL_WIDTH = 30;\n/**\n * number of milliseconds to wait before a hovered canvas row will be replaced with a DOM one\n * @type {number}\n * @internal\n */\nexport const HOVER_DELAY_SHOW_DETAIL = 500;\n\nexport const GUESSED_ROW_HEIGHT = 18;\nexport const GUESSES_GROUP_HEIGHT = 40;\n","import {IDataRow, IOrderedGroup, ActionColumn, Column} from '../model';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {forEachChild, noRenderer} from './utils';\nimport {cssClass} from '../styles';\n\nexport default class ActionRenderer implements ICellRendererFactory {\n readonly title = 'Default';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return col instanceof ActionColumn && mode !== ERenderMode.SUMMARY;\n }\n\n create(col: ActionColumn): ICellRenderer {\n const actions = col.actions;\n return {\n template: `<div class=\"${cssClass('actions')} ${cssClass('hover-only')}\">${actions.map((a) => `<span title='${a.name}' class='${a.className || ''}'>${a.icon || ''}</span>`).join('')}</div>`,\n update: (n: HTMLElement, d: IDataRow) => {\n forEachChild(n, (ni: HTMLSpanElement, i: number) => {\n ni.onclick = function (event) {\n event.preventDefault();\n event.stopPropagation();\n setTimeout(() => actions[i].action(d), 1); // async\n };\n });\n }\n };\n }\n\n createGroup(col: ActionColumn, context: IRenderContext): IGroupCellRenderer {\n const actions = col.groupActions;\n return {\n template: `<div class=\"${cssClass('actions')} ${cssClass('hover-only')}\">${actions.map((a) => `<span title='${a.name}' class='${a.className || ''}'>${a.icon || ''}</span>`).join('')}</div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n forEachChild(n, (ni: HTMLSpanElement, i: number) => {\n ni.onclick = function (event) {\n event.preventDefault();\n event.stopPropagation();\n context.tasks.groupRows(col, group, 'identity', (r) => r).then((rows) => {\n if (typeof rows === 'symbol') {\n return;\n }\n setTimeout(() => actions[i].action(group, Array.from(rows)), 1); // async\n });\n };\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {IDataRow, Column, AggregateGroupColumn, EAggregationState, IOrderedGroup, IGroupParent, IGroup, defaultGroup} from '../model';\nimport {AGGREGATE, CANVAS_HEIGHT, cssClass} from '../styles';\nimport {IRenderContext, ICellRendererFactory, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {IDataProvider} from '../provider';\nimport {groupParents, toItemMeta, isAlwaysShowingGroupStrategy, hasTopNStrategy, isSummaryGroup} from '../provider/internal';\nimport {clear} from '../internal';\n\nfunction preventDefault(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nfunction matchNodes(node: HTMLElement, length: number, clazz = 'agg-level', addTopN = false) {\n const doc = node.ownerDocument!;\n const children = <HTMLElement[]>Array.from(node.children);\n if (addTopN) { // top N buttons\n length = length + 1;\n }\n\n // add missing\n for (let i = children.length; i < length; ++i) {\n const child = doc.createElement('div');\n child.classList.add(cssClass(clazz));\n children.push(child);\n node.appendChild(child);\n }\n // remove too many\n for (const r of children.splice(length, children.length - length)) {\n r.remove();\n }\n if (addTopN) {\n const last = children[children.length - 1];\n last.classList.remove(cssClass(clazz));\n last.classList.add(cssClass('agg-all'));\n }\n return children;\n}\n\nfunction renderGroups(node: HTMLElement, group: IOrderedGroup, relativeIndex: number, col: AggregateGroupColumn, provider: IDataProvider) {\n const strategy = provider.getAggregationStrategy();\n const ranking = col.findMyRanker()!;\n const topNGetter = (group: IGroup) => provider.getTopNAggregated(ranking, group);\n\n const isRow = relativeIndex >= 0;\n const isLeafGroup = !(<IGroupParent><any>group).subGroups || (<IGroupParent><any>group).subGroups.length === 0;\n\n const alwaysShowGroup = isAlwaysShowingGroupStrategy(strategy);\n const isSummary = !isRow && isSummaryGroup(group, strategy, topNGetter);\n const hasTopN = isSummary && isLeafGroup && hasTopNStrategy(strategy);\n\n const parents = groupParents(group, relativeIndex >= 0 ? toItemMeta(relativeIndex, group, provider.getTopNAggregated(ranking, group)) : 'first last');\n const children = matchNodes(node, parents.length, 'agg-level', hasTopN);\n\n const lastParent = parents.length - 1;\n\n for (let i = 0; i < parents.length; ++i) {\n const parent = parents[i];\n const child = children[i];\n const state = provider.getAggregationState(ranking, parent.group);\n const isLastGroup = i === lastParent;\n child.dataset.level = String(parents.length - 1 - i); // count backwards\n\n if (alwaysShowGroup && (isRow || i < lastParent)) {\n // inner or last\n if (!isSummary && (parent.meta === 'last' || parent.meta === 'first last')) {\n child.dataset.meta = 'last';\n } else {\n delete child.dataset.meta;\n }\n child.classList.toggle(cssClass('agg-inner'), isRow && isLastGroup);\n child.classList.remove(cssClass('agg-expand'), cssClass('agg-collapse'));\n child.title = '';\n delete child.onclick;\n continue;\n }\n\n const isCollapsed = state === EAggregationState.COLLAPSE;\n const isFirst = parent.meta === 'first' || parent.meta === 'first last';\n const isShowAll = state === EAggregationState.EXPAND;\n const childTopN = hasTopN && isLastGroup ? children[parents.length] : null;\n\n let meta = parent.meta;\n if (isSummary && parent.meta === 'first last') {\n meta = 'first';\n }\n\n if (meta) {\n child.dataset.meta = meta;\n } else {\n delete child.dataset.meta;\n }\n\n child.classList.toggle(cssClass('agg-expand'), isFirst);\n child.classList.toggle(cssClass('agg-collapse'), isCollapsed);\n child.title = isFirst ? (isCollapsed ? 'Expand Group' : 'Collapse Group') : '';\n\n if (!isFirst) {\n delete child.onclick;\n } else {\n child.onclick = (evt) => {\n preventDefault(evt);\n let nextState: EAggregationState;\n switch (strategy) {\n case 'group+top+item':\n nextState = state === EAggregationState.COLLAPSE ? EAggregationState.EXPAND_TOP_N : EAggregationState.COLLAPSE;\n break;\n case 'group':\n case 'item':\n case 'group+item':\n case 'group+item+top':\n default:\n nextState = state === EAggregationState.COLLAPSE ? EAggregationState.EXPAND : EAggregationState.COLLAPSE;\n break;\n }\n col.setAggregated(parent.group, nextState);\n };\n }\n\n if (!childTopN) {\n continue;\n }\n childTopN.dataset.level = String(i); // count upwards\n childTopN.classList.toggle(cssClass('agg-compress'), isShowAll);\n childTopN.title = isShowAll ? `Show Top ${provider.getShowTopN()} Only` : 'Show All';\n childTopN.onclick = (evt) => {\n preventDefault(evt);\n col.setAggregated(parent.group, state === EAggregationState.EXPAND ? EAggregationState.EXPAND_TOP_N : EAggregationState.EXPAND);\n };\n }\n}\n\nfunction isDummyGroup(group: IGroup) {\n return group.parent == null && group.name === defaultGroup.name;\n}\n\nexport default class AggregateGroupRenderer implements ICellRendererFactory {\n readonly title: string = 'Default';\n\n canRender(col: Column): boolean {\n return col instanceof AggregateGroupColumn;\n }\n\n create(col: AggregateGroupColumn, context: IRenderContext): ICellRenderer {\n return {\n template: `<div></div>`,\n update(node: HTMLElement, _row: IDataRow, i: number, group: IOrderedGroup) {\n if (isDummyGroup(group)) {\n clear(node);\n return;\n }\n renderGroups(node, group, i, col, context.provider);\n },\n render(ctx: CanvasRenderingContext2D, _row: IDataRow, i: number, group: IOrderedGroup) {\n if (isDummyGroup(group)) {\n return;\n }\n const parents = groupParents(group, toItemMeta(i, group, context.provider.getTopNAggregated(col.findMyRanker()!, group)));\n ctx.fillStyle = AGGREGATE.color;\n for (let i = 0; i < parents.length; ++i) {\n ctx.fillRect(AGGREGATE.levelWidth * i + AGGREGATE.levelOffset, 0, AGGREGATE.strokeWidth, CANVAS_HEIGHT);\n }\n return parents.some((d) => d.meta != null);\n }\n };\n }\n\n createGroup(col: AggregateGroupColumn, context: IRenderContext): IGroupCellRenderer {\n return {\n template: `<div><div class=\"${cssClass('agg-level')}\"></div></div>`,\n update(node: HTMLElement, group: IOrderedGroup) {\n renderGroups(node, group, -1, col, context.provider);\n }\n };\n }\n\n createSummary(col: AggregateGroupColumn, context: IRenderContext): ISummaryRenderer {\n return {\n template: `<div></div>`,\n update: (node: HTMLElement) => {\n const ranking = col.findMyRanker()!;\n const groups = ranking.getGroups();\n if (groups.length === 1 && groups[0].name === defaultGroup.name) {\n clear(node);\n return;\n }\n\n const gparents = groups.map((group) => groupParents(group, 'first last'));\n\n const max = gparents.reduce((a, b) => Math.max(a, b.length), Number.NEGATIVE_INFINITY);\n const children = matchNodes(node, max, 'agg-expand');\n\n for (let i = 0; i < max; ++i) {\n const child = children[i];\n const subGroups = <IOrderedGroup[]>gparents.map((d) => d[i] ? d[i].group : null).filter((d) => d != null);\n\n const isCollapsed = subGroups.every((d) => context.provider.getAggregationState(ranking, d) === EAggregationState.COLLAPSE);\n\n child.classList.toggle(cssClass('agg-collapse'), isCollapsed);\n child.title = isCollapsed ? 'Expand All Groups' : 'Collapse All Groups';\n\n child.onclick = (evt) => {\n preventDefault(evt);\n context.provider.aggregateAllOf(ranking, isCollapsed ? EAggregationState.EXPAND : EAggregationState.COLLAPSE, subGroups);\n };\n }\n }\n };\n }\n}\n","import {cssClass} from '../styles';\n\n/** @internal */\nexport const filterMissingText = 'Filter rows containing missing values';\n\n/** @internal */\nexport function filterMissingMarkup(bakMissing: boolean) {\n return `<label class=\"${cssClass('checkbox')}\">\n <input type=\"checkbox\" ${bakMissing ? 'checked=\"checked\"' : ''}>\n <span class=\"${cssClass('filter-missing')}\">${filterMissingText}</span>\n </label>`;\n}\n\n/** @internal */\nexport function filterMissingNumberMarkup(bakMissing: boolean, count: number) {\n return `<label class=\"${cssClass('checkbox')}\">\n <input type=\"checkbox\" ${bakMissing ? 'checked=\"checked\"' : ''} ${count === 0 ? 'disabled' : ''}>\n <span class=\"${cssClass('filter-missing')} ${count === 0 ? cssClass('disabled') : ''}\">Filter ${count} missing value rows</span>\n </label>`;\n}\n\n/** @internal */\nexport function findFilterMissing(node: HTMLElement) {\n return <HTMLInputElement>(<HTMLElement>node.getElementsByClassName(cssClass('filter-missing'))[0]!).previousElementSibling!;\n}\n\n/** @internal */\nexport function updateFilterMissingNumberMarkup(element: HTMLElement, count: number) {\n const checked = element.getElementsByTagName('input')![0];\n checked.disabled = count === 0;\n element.lastElementChild!.classList.toggle(cssClass('disabled'), count === 0);\n element.lastElementChild!.textContent = `Filter ${count} missing value rows`;\n}\n","import {Column, IDataRow, isMissingValue} from '../model';\nimport {CANVAS_HEIGHT, DASH, cssClass} from '../styles';\n\nexport function renderMissingValue(ctx: CanvasRenderingContext2D, width: number, height: number, x = 0, y = 0) {\n\n const dashX = Math.max(0, x + (width - DASH.width) / 2); // center horizontally\n const dashY = Math.max(0, y + (height - DASH.height) / 2); // center vertically\n ctx.fillStyle = DASH.color;\n ctx.fillRect(dashX, dashY, Math.min(width, DASH.width), Math.min(height, DASH.height));\n}\n\nexport function renderMissingDOM(node: HTMLElement, col: Column, d: IDataRow) {\n const missing = isMissingValue(col.getValue(d));\n node.classList.toggle(cssClass('missing'), missing);\n return missing;\n}\n\nexport function renderMissingCanvas(ctx: CanvasRenderingContext2D, col: Column, d: IDataRow, width: number, x = 0, y = 0) {\n const missing = isMissingValue(col.getValue(d));\n if (missing) {\n renderMissingValue(ctx, width, CANVAS_HEIGHT, x, y);\n }\n return missing;\n}\n","import {StringColumn, Column, IDataRow, IOrderedGroup, IStringFilter} from '../model';\nimport {filterMissingMarkup, findFilterMissing} from '../ui/missing';\nimport {IRenderContext, ICellRendererFactory, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {setText, exampleText} from './utils';\nimport {cssClass} from '../styles';\nimport {debounce} from '../internal';\n\n\n/**\n * renders a string with additional alignment behavior\n * one instance factory shared among strings\n */\nexport default class StringCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Default';\n\n canRender(col: Column): boolean {\n return col instanceof StringColumn;\n }\n\n create(col: StringColumn): ICellRenderer {\n const align = col.alignment || 'left';\n return {\n template: `<div${align !== 'left' ? ` class=\"${cssClass(align)}\"` : ''}> </div>`,\n update: (n: HTMLDivElement, d: IDataRow) => {\n renderMissingDOM(n, col, d);\n if (col.escape) {\n setText(n, col.getLabel(d));\n } else {\n n.innerHTML = col.getLabel(d);\n }\n n.title = n.textContent!;\n }\n };\n }\n\n\n createGroup(col: StringColumn, context: IRenderContext): IGroupCellRenderer {\n return {\n template: `<div> </div>`,\n update: (n: HTMLDivElement, group: IOrderedGroup) => {\n return context.tasks.groupExampleRows(col, group, 'string', (rows) => exampleText(col, rows)).then((text) => {\n if (typeof text === 'symbol') {\n return;\n }\n n.classList.toggle(cssClass('missing'), !text);\n if (col.escape) {\n setText(n, text);\n } else {\n n.innerHTML = text;\n n.title = text;\n }\n });\n }\n };\n }\n\n private static interactiveSummary(col: StringColumn, node: HTMLElement) {\n const form = <HTMLFormElement>node;\n const filterMissing = findFilterMissing(node);\n const input = <HTMLInputElement>node.querySelector('input[type=\"text\"]');\n const isRegex = <HTMLInputElement>node.querySelector('input[type=\"checkbox\"]');\n\n const update = () => {\n const valid = input.value.trim();\n if (valid.length <= 0) {\n const filter = filterMissing.checked ? {filter: null, filterMissing: filterMissing.checked} : null;\n col.setFilter(filter);\n return;\n }\n col.setFilter({\n filter: isRegex.checked ? new RegExp(input.value) : input.value,\n filterMissing: filterMissing.checked\n });\n };\n\n filterMissing.onchange = update;\n input.onchange = update;\n input.oninput = debounce(update, 100);\n isRegex.onchange = update;\n form.onsubmit = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n update();\n return false;\n };\n\n return (actCol: StringColumn) => {\n col = actCol;\n const f = col.getFilter() || {filter: null, filterMissing: false};\n const bak = f.filter;\n filterMissing.checked = f.filterMissing;\n input.value = bak instanceof RegExp ? bak.source : bak || '';\n isRegex.checked = bak instanceof RegExp;\n };\n }\n\n createSummary(col: StringColumn, _context: IRenderContext, interactive: boolean): ISummaryRenderer {\n if (!interactive) {\n return {\n template: `<div></div>`,\n update: (node: HTMLElement) => {\n const filter = col.getFilter();\n node.textContent = toString(filter);\n }\n };\n }\n const f = col.getFilter() || {filter: null, filterMissing: false};\n const bak = f.filter || '';\n let update: (col: StringColumn) => void;\n return {\n template: `<form><input type=\"text\" placeholder=\"Filter ${col.desc.label}...\" autofocus value=\"${(bak instanceof RegExp) ? bak.source : bak}\">\n <label class=\"${cssClass('checkbox')}\">\n <input type=\"checkbox\" ${(bak instanceof RegExp) ? 'checked=\"checked\"' : ''}>\n <span>Use regular expressions</span>\n </label>\n ${filterMissingMarkup(f.filterMissing)}</form>`,\n update: (node: HTMLElement) => {\n if (!update) {\n update = StringCellRenderer.interactiveSummary(col, node);\n }\n update(col);\n }\n };\n }\n}\n\nfunction toString(filter: IStringFilter | null) {\n if (filter == null || !filter.filter) {\n return '';\n }\n if (filter.filter instanceof RegExp) {\n return filter.filter.source;\n }\n return filter.filter;\n}\n","import {IDataRow, AnnotateColumn, Column} from '../model';\nimport StringCellRenderer from './StringCellRenderer';\nimport {cssClass} from '../styles';\nimport {ICellRenderer} from './interfaces';\n\nexport default class AnnotationRenderer extends StringCellRenderer {\n readonly title: string = 'Default';\n\n canRender(col: Column) {\n return super.canRender(col) && col instanceof AnnotateColumn;\n }\n\n create(col: AnnotateColumn): ICellRenderer {\n return {\n template: `<div>\n <span></span>\n <input class=\"${cssClass('hover-only')} ${cssClass('annotate-input')}\">\n </div>`,\n update: (n: HTMLElement, d: IDataRow) => {\n const label = <HTMLElement>n.firstElementChild!;\n const input = <HTMLInputElement>n.lastElementChild!;\n input.onchange = () => {\n label.textContent = input.value;\n col.setValue(d, input.value);\n };\n input.onclick = (event) => {\n event.stopPropagation();\n };\n label.textContent = input.value = col.getLabel(d);\n }\n };\n }\n}\n","import {Column, isMapAbleColumn, IDataRow, DEFAULT_COLOR} from '../model';\nimport {IImposer} from './interfaces';\n\nexport function colorOf(col: Column, row: IDataRow | null, imposer?: IImposer, valueHint?: number) {\n if (imposer && imposer.color) {\n return imposer.color(row, valueHint);\n }\n if (!row) {\n if (isMapAbleColumn(col)) {\n return col.getColorMapping().apply(valueHint != null ? valueHint : 0);\n }\n return DEFAULT_COLOR;\n }\n return col.getColor(row);\n}\n","import {round} from '../internal';\nimport {Column, isNumbersColumn, IDataRow, INumberColumn, isNumberColumn, DEFAULT_COLOR} from '../model';\nimport {setText, adaptDynamicColorToBgColor, noRenderer} from './utils';\nimport {CANVAS_HEIGHT, cssClass} from '../styles';\nimport {colorOf} from './impose';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, IImposer, IGroupCellRenderer, ISummaryRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\n\n\nexport default class BarCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Bar';\n\n /**\n * flag to always render the value\n * @type {boolean}\n */\n\n constructor(private readonly renderValue: boolean = false) {\n }\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return mode === ERenderMode.CELL && isNumberColumn(col) && !isNumbersColumn(col);\n }\n\n create(col: INumberColumn, context: IRenderContext, imposer?: IImposer): ICellRenderer {\n const width = context.colWidth(col);\n return {\n template: `<div title=\"\">\n <div class=\"${cssClass('bar-label')}\" style='background-color: ${DEFAULT_COLOR}'>\n <span ${this.renderValue ? '' : `class=\"${cssClass('hover-only')}\"`}></span>\n </div>\n </div>`,\n update: (n: HTMLDivElement, d: IDataRow) => {\n const value = col.getNumber(d);\n const missing = renderMissingDOM(n, col, d);\n const w = isNaN(value) ? 0 : round(value * 100, 2);\n const title = col.getLabel(d);\n n.title = title;\n\n const bar = <HTMLElement>n.firstElementChild!;\n bar.style.width = missing ? '100%' : `${w}%`;\n const color = colorOf(col, d, imposer, value);\n bar.style.backgroundColor = missing ? null : color;\n setText(bar.firstElementChild!, title);\n const item = <HTMLElement>bar.firstElementChild!;\n setText(item, title);\n adaptDynamicColorToBgColor(item, color || DEFAULT_COLOR, title, w / 100);\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n const value = col.getNumber(d);\n ctx.fillStyle = colorOf(col, d, imposer, value) || DEFAULT_COLOR;\n const w = width * value;\n ctx.fillRect(0, 0, isNaN(w) ? 0 : w, CANVAS_HEIGHT);\n\n }\n };\n }\n\n createGroup(): IGroupCellRenderer {\n return noRenderer;\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {Column, IDataRow} from '../model';\nimport {ERenderMode, ICellRendererFactory, IGroupCellRenderer, ISummaryRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {noRenderer, setText} from './utils';\n\n/**\n * default renderer instance rendering the value as a text\n */\nexport class DefaultCellRenderer implements ICellRendererFactory {\n title: string = 'String';\n groupTitle: string = 'None';\n summaryTitle: string = 'None';\n\n canRender(_col: Column, _mode: ERenderMode): boolean {\n return true;\n }\n\n create(col: Column): ICellRenderer {\n return {\n template: `<div> </div>`,\n update: (n: HTMLDivElement, d: IDataRow) => {\n renderMissingDOM(n, col, d);\n const l = col.getLabel(d);\n setText(n, l);\n n.title = l;\n }\n };\n }\n\n createGroup(_col: Column): IGroupCellRenderer {\n return noRenderer;\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {Column, BooleanColumn} from '../model';\nimport {DefaultCellRenderer} from './DefaultCellRenderer';\nimport {ERenderMode, ICellRenderer} from './interfaces';\nimport {cssClass} from '../styles';\n\nexport default class BooleanCellRenderer extends DefaultCellRenderer {\n readonly title: string = 'Default';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return col instanceof BooleanColumn && mode === ERenderMode.CELL;\n }\n\n create(col: Column): ICellRenderer {\n const r = super.create(col);\n (<any>r).template = `<div class=\"${cssClass('center')}\"> </div>`;\n return r;\n }\n}\n","import {IBoxPlotData, IAdvancedBoxPlotData, round} from '../internal';\nimport {NumberColumn, IBoxPlotColumn, INumberColumn, isBoxPlotColumn, Column, IDataRow, isNumberColumn, isMapAbleColumn, IOrderedGroup} from '../model';\nimport {BOX_PLOT, CANVAS_HEIGHT, DOT, cssClass} from '../styles';\nimport {colorOf} from './impose';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, IImposer, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingCanvas} from './missing';\nimport {tasksAll} from '../provider';\n\nconst BOXPLOT = `<div title=\"\">\n <div class=\"${cssClass('boxplot-whisker')}\">\n <div class=\"${cssClass('boxplot-box')}\"></div>\n <div class=\"${cssClass('boxplot-median')}\"></div>\n <div class=\"${cssClass('boxplot-mean')}\"></div>\n </div>\n</div>`;\n\nconst MAPPED_BOXPLOT = `<div title=\"\">\n <div class=\"${cssClass('boxplot-whisker')}\">\n <div class=\"${cssClass('boxplot-box')}\"></div>\n <div class=\"${cssClass('boxplot-median')}\"></div>\n <div class=\"${cssClass('boxplot-mean')}\"></div>\n </div>\n <span class=\"${cssClass('mapping-hint')}\"></span><span class=\"${cssClass('mapping-hint')}\"></span>\n</div>`;\n\n\n/** @internal */\nexport function computeLabel(col: INumberColumn, v: IBoxPlotData | IAdvancedBoxPlotData) {\n if (v == null) {\n return '';\n }\n const f = col.getNumberFormat();\n const mean = (<IAdvancedBoxPlotData>v).mean != null ? `mean = ${f((<IAdvancedBoxPlotData>v).mean)} (dashed line)\\n` : '';\n return `min = ${f(v.min)}\\nq1 = ${f(v.q1)}\\nmedian = ${f(v.median)}\\n${mean}q3 = ${f(v.q3)}\\nmax = ${f(v.max)}`;\n}\n\nexport default class BoxplotCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Box Plot';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return (isBoxPlotColumn(col) && mode === ERenderMode.CELL || (isNumberColumn(col) && mode !== ERenderMode.CELL));\n }\n\n create(col: IBoxPlotColumn, context: IRenderContext, imposer?: IImposer): ICellRenderer {\n const sortMethod = <keyof IBoxPlotData>col.getSortMethod();\n const sortedByMe = col.isSortedByMe().asc !== undefined;\n const width = context.colWidth(col);\n return {\n template: BOXPLOT,\n update: (n: HTMLElement, d: IDataRow) => {\n const data = col.getBoxPlotData(d);\n n.classList.toggle(cssClass('missing'), !data);\n if (!data) {\n return;\n }\n const label = col.getRawBoxPlotData(d)!;\n renderDOMBoxPlot(col, n, data!, label, sortedByMe ? sortMethod : '', colorOf(col, d, imposer));\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n\n // Rectangle\n const data = col.getBoxPlotData(d);\n if (!data) {\n return;\n }\n\n const scaled = {\n min: data.min * width,\n median: data.median * width,\n mean: (<IAdvancedBoxPlotData>data).mean != null ? (<IAdvancedBoxPlotData>data).mean * width : undefined,\n q1: data.q1 * width,\n q3: data.q3 * width,\n max: data.max * width,\n outlier: data.outlier ? data.outlier.map((d) => d * width) : undefined,\n whiskerLow: data.whiskerLow != null ? data.whiskerLow * width : undefined,\n whiskerHigh: data.whiskerHigh != null ? data.whiskerHigh * width : undefined\n };\n renderBoxPlot(ctx, scaled, sortedByMe ? sortMethod : '', colorOf(col, d, imposer), CANVAS_HEIGHT, 0);\n }\n };\n }\n\n createGroup(col: INumberColumn, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer {\n const sort = (col instanceof NumberColumn && col.isGroupSortedByMe().asc !== undefined) ? col.getSortMethod() : '';\n return {\n template: BOXPLOT,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return tasksAll([context.tasks.groupBoxPlotStats(col, group, false), context.tasks.groupBoxPlotStats(col, group, true)]).then((data) => {\n if (typeof data === 'symbol') {\n return;\n }\n // render\n const isMissing = data == null || data[0] == null || data[0].group.count === 0 || data[0].group.count === data[0].group.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n renderDOMBoxPlot(col, n, data[0].group, data[1].group, sort, colorOf(col, null, imposer));\n });\n }\n };\n }\n\n createSummary(col: INumberColumn, context: IRenderContext, _interactive: boolean, imposer?: IImposer): ISummaryRenderer {\n return {\n template: isMapAbleColumn(col) ? MAPPED_BOXPLOT : BOXPLOT,\n update: (n: HTMLElement) => {\n return tasksAll([context.tasks.summaryBoxPlotStats(col, false), context.tasks.summaryBoxPlotStats(col, true)]).then((data) => {\n if (typeof data === 'symbol') {\n return;\n }\n const isMissing = data == null || data[0] == null || data[0].summary.count === 0 || data[0].summary.count === data[0].summary.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n const mappedSummary = data[0].summary;\n const rawSummary = data[1].summary;\n const sort = (col instanceof NumberColumn && col.isGroupSortedByMe().asc !== undefined) ? col.getSortMethod() : '';\n\n if (isMapAbleColumn(col)) {\n const range = col.getRange();\n Array.from(n.getElementsByTagName('span')).forEach((d: HTMLElement, i) => d.textContent = range[i]);\n }\n\n renderDOMBoxPlot(col, n, mappedSummary, rawSummary, sort, colorOf(col, null, imposer), isMapAbleColumn(col));\n });\n }\n };\n }\n}\n\nfunction renderDOMBoxPlot(col: INumberColumn, n: HTMLElement, data: IBoxPlotData | IAdvancedBoxPlotData, label: IBoxPlotData | IAdvancedBoxPlotData, sort: string, color: string | null, hasRange: boolean = false) {\n n.title = computeLabel(col, label);\n\n const whiskers = <HTMLElement>n.firstElementChild;\n const box = <HTMLElement>whiskers.firstElementChild;\n const median = <HTMLElement>box.nextElementSibling;\n const mean = <HTMLElement>whiskers.lastElementChild;\n\n const leftWhisker = data.whiskerLow != null ? data.whiskerLow : Math.max(data.q1 - 1.5 * (data.q3 - data.q1), data.min);\n const rightWhisker = data.whiskerHigh != null ? data.whiskerHigh : Math.min(data.q3 + 1.5 * (data.q3 - data.q1), data.max);\n whiskers.style.left = `${round(leftWhisker * 100, 2)}%`;\n const range = rightWhisker - leftWhisker;\n whiskers.style.width = `${round(range * 100, 2)}%`;\n\n //relative within the whiskers\n box.style.left = `${round((data.q1 - leftWhisker) / range * 100, 2)}%`;\n box.style.width = `${round((data.q3 - data.q1) / range * 100, 2)}%`;\n box.style.backgroundColor = color;\n\n //relative within the whiskers\n median.style.left = `${round((data.median - leftWhisker) / range * 100, 2)}%`;\n if ((<IAdvancedBoxPlotData>data).mean != null) {\n mean.style.left = `${round(((<IAdvancedBoxPlotData>data).mean - leftWhisker) / range * 100, 2)}%`;\n mean.style.display = null;\n } else {\n mean.style.display = 'none';\n }\n\n // match lengths\n const outliers = <HTMLElement[]>Array.from(n.children).slice(1, hasRange ? -2 : undefined);\n const numOutliers = data.outlier ? data.outlier.length : 0;\n outliers.splice(numOutliers, outliers.length - numOutliers).forEach((v) => v.remove());\n\n whiskers.dataset.sort = sort;\n\n if (!data.outlier || numOutliers === 0) {\n return;\n }\n\n for (let i = outliers.length; i < numOutliers; ++i) {\n const p = n.ownerDocument!.createElement('div');\n p.classList.add(cssClass('boxplot-outlier'));\n outliers.unshift(p);\n whiskers.insertAdjacentElement('afterend', p);\n }\n data.outlier.forEach((v, i) => {\n delete outliers[i].dataset.sort;\n outliers[i].style.left = `${round(v * 100, 2)}%`;\n });\n\n if (sort === 'min' && data.outlier[0] <= leftWhisker) {\n // first outliers is the min\n whiskers.dataset.sort = '';\n outliers[0].dataset.sort = 'min';\n if (outliers.length > 1) {\n // append at the end of the DOM to be on top\n outliers[outliers.length - 1].insertAdjacentElement('afterend', outliers[0]);\n }\n } else if (sort === 'max' && data.outlier[outliers.length - 1] >= rightWhisker) {\n // last outlier is the max\n whiskers.dataset.sort = '';\n outliers[outliers.length - 1].dataset.sort = 'max';\n }\n}\n\nfunction renderBoxPlot(ctx: CanvasRenderingContext2D, box: IBoxPlotData, sort: string, color: string | null, height: number, topPadding: number) {\n const left = box.whiskerLow != null ? box.whiskerLow : Math.max((box.q1 - 1.5 * (box.q3 - box.q1)), box.min);\n const right = box.whiskerHigh != null ? box.whiskerHigh : Math.min((box.q3 + 1.5 * (box.q3 - box.q1)), box.max);\n\n ctx.fillStyle = color || BOX_PLOT.box;\n ctx.strokeStyle = BOX_PLOT.stroke;\n ctx.beginPath();\n ctx.rect(box.q1, 0, box.q3 - box.q1, height);\n ctx.fill();\n ctx.stroke();\n\n //Line\n const bottomPos = height - topPadding;\n const middlePos = height / 2;\n\n ctx.beginPath();\n ctx.moveTo(left, middlePos);\n ctx.lineTo(box.q1, middlePos);\n ctx.moveTo(left, topPadding);\n ctx.lineTo(left, bottomPos);\n ctx.moveTo(box.median, 0);\n ctx.lineTo(box.median, height);\n ctx.moveTo(box.q3, middlePos);\n ctx.lineTo(right, middlePos);\n ctx.moveTo(right, topPadding);\n ctx.lineTo(right, bottomPos);\n ctx.stroke();\n ctx.fill();\n\n if (sort !== '') {\n ctx.strokeStyle = BOX_PLOT.sort;\n ctx.beginPath();\n ctx.moveTo(<number>box[<keyof IBoxPlotData>sort], topPadding);\n ctx.lineTo(<number>box[<keyof IBoxPlotData>sort], height - topPadding);\n ctx.stroke();\n ctx.fill();\n }\n\n if (!box.outlier) {\n return;\n }\n ctx.fillStyle = BOX_PLOT.outlier;\n box.outlier.forEach((v) => {\n // currently dots with 3px\n ctx.fillRect(Math.max(v - DOT.size / 2, 0), middlePos - DOT.size / 2, DOT.size, DOT.size);\n });\n}\n","import {hsl} from 'd3-color';\nimport {Column, isNumbersColumn, IDataRow, INumberColumn, isNumberColumn, isMapAbleColumn, DEFAULT_COLOR, SolidColorFunction} from '../model';\nimport {CANVAS_HEIGHT, cssClass} from '../styles';\nimport {colorOf} from './impose';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, IImposer, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\nimport {noRenderer, setText} from './utils';\n\nexport function toHeatMapColor(v: number | null, row: IDataRow, col: INumberColumn, imposer?: IImposer) {\n if (v == null || isNaN(v)) {\n v = 1; // max = brightest\n }\n if (imposer || !isMapAbleColumn(col)) {\n //hsl space encoding, encode in lightness\n const color = hsl(colorOf(col, row, imposer, v) || DEFAULT_COLOR);\n color.l = 1 - v; // largest value = darkest color\n return color.toString();\n }\n const map = col.getColorMapping();\n const valueColor = map.apply(v);\n if (map instanceof SolidColorFunction) {\n //hsl space encoding, encode in lightness\n const color = hsl(valueColor);\n color.l = 1 - v; // largest value = darkest color\n return color.toString();\n }\n // some custom logic that maps to another value\n return valueColor;\n}\n\nexport default class BrightnessCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Brightness';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return isNumberColumn(col) && mode === ERenderMode.CELL && !isNumbersColumn(col);\n }\n\n create(col: INumberColumn, context: IRenderContext, imposer?: IImposer): ICellRenderer {\n const width = context.colWidth(col);\n return {\n template: `<div title=\"\">\n <div class=\"${cssClass('cat-color')}\" style=\"background-color: ${DEFAULT_COLOR}\"></div><div class=\"${cssClass('cat-label')}\"> </div>\n </div>`,\n update: (n: HTMLElement, d: IDataRow) => {\n const missing = renderMissingDOM(n, col, d);\n n.title = col.getLabel(d);\n (<HTMLDivElement>n.firstElementChild!).style.backgroundColor = missing ? null : toHeatMapColor(col.getNumber(d), d, col, imposer);\n setText(<HTMLSpanElement>n.lastElementChild!, n.title);\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n ctx.fillStyle = toHeatMapColor(col.getNumber(d), d, col, imposer);\n ctx.fillRect(0, 0, width, CANVAS_HEIGHT);\n }\n };\n }\n\n createGroup(): IGroupCellRenderer {\n return noRenderer;\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {DENSE_HISTOGRAM} from '../constants';\nimport {ICategoricalStatistics, round} from '../internal';\nimport {OrdinalColumn, isCategoricalColumn, isCategoricalLikeColumn, ICategoricalLikeColumn, ICategory, Column, CategoricalColumn, ICategoricalColumn, IDataRow, IOrderedGroup, SetColumn, BooleanColumn} from '../model';\nimport {CANVAS_HEIGHT, cssClass, FILTERED_OPACITY} from '../styles';\nimport {filterMissingNumberMarkup, updateFilterMissingNumberMarkup} from '../ui/missing';\nimport {IRenderContext, ICellRendererFactory, ERenderMode, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\nimport {setText, wideEnough, forEach} from './utils';\nimport {color} from 'd3-color';\n\n/** @internal */\nexport declare type HasCategoricalFilter = CategoricalColumn | OrdinalColumn | SetColumn | BooleanColumn;\n\nexport default class CategoricalCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Color';\n readonly groupTitle: string = 'Histogram';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return isCategoricalLikeColumn(col) && (mode !== ERenderMode.CELL || isCategoricalColumn(col));\n }\n\n create(col: ICategoricalColumn, context: IRenderContext): ICellRenderer {\n const width = context.colWidth(col);\n return {\n template: `<div>\n <div class=\"${cssClass('cat-color')}\"></div><div class=\"${cssClass('cat-label')}\"></div>\n </div>`,\n update: (n: HTMLElement, d: IDataRow) => {\n renderMissingDOM(n, col, d);\n const v = col.getCategory(d);\n (<HTMLDivElement>n.firstElementChild!).style.backgroundColor = v ? col.getColor(d) : null;\n setText(<HTMLSpanElement>n.lastElementChild!, col.getLabel(d));\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n const v = col.getCategory(d);\n ctx.fillStyle = v ? col.getColor(d) : '';\n ctx.fillRect(0, 0, width, CANVAS_HEIGHT);\n }\n };\n }\n\n createGroup(col: ICategoricalLikeColumn, context: IRenderContext): IGroupCellRenderer {\n const {template, update} = hist(col, false);\n return {\n template: `${template}</div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupCategoricalStats(col, group).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const isMissing = !r || r.group == null || r.group.count === 0 || r.group.count === r.group.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n update(n, r.group);\n });\n }\n };\n }\n\n createSummary(col: ICategoricalLikeColumn, context: IRenderContext, interactive: boolean): ISummaryRenderer {\n return (col instanceof CategoricalColumn || col instanceof OrdinalColumn || col instanceof SetColumn || col instanceof BooleanColumn) ? interactiveSummary(col, context, interactive) : staticSummary(col, context, interactive);\n }\n}\n\nfunction staticSummary(col: ICategoricalLikeColumn, context: IRenderContext, interactive: boolean) {\n const {template, update} = hist(col, interactive);\n return {\n template: `${template}</div>`,\n update: (n: HTMLElement) => {\n return context.tasks.summaryCategoricalStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const isMissing = !r || r.summary == null || r.summary.count === 0 || r.summary.count === r.summary.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n update(n, r.summary);\n });\n }\n };\n}\n\nfunction interactiveSummary(col: HasCategoricalFilter, context: IRenderContext, interactive: boolean) {\n const {template, update} = hist(col, interactive || wideEnough(col));\n let filterUpdate: (missing: number, col: HasCategoricalFilter) => void;\n return {\n template: `${template}${interactive ? filterMissingNumberMarkup(false, 0) : ''}</div>`,\n update: (n: HTMLElement) => {\n n.classList.toggle(cssClass('histogram-i'), interactive);\n\n if (!filterUpdate) {\n filterUpdate = interactiveHist(col, n);\n }\n return context.tasks.summaryCategoricalStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const {summary, data} = r;\n filterUpdate((interactive && data) ? data.missing : (summary ? summary.missing : 0), col);\n\n const isMissing = !r || r.summary == null || r.summary.count === 0 || r.summary.count === r.summary.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n update(n, summary, interactive ? data : undefined);\n });\n }\n };\n}\n\nfunction hist(col: ICategoricalLikeColumn, showLabels: boolean) {\n const mapping = col.getColorMapping();\n const bins = col.categories.map((c) => `<div class=\"${cssClass('histogram-bin')}\" title=\"${c.label}: 0\" data-cat=\"${c.name}\" ${showLabels ? `data-title=\"${c.label}\"` : ''}><div style=\"height: 0; background-color: ${mapping.apply(c)}\"></div></div>`).join('');\n const template = `<div class=\"${cssClass('histogram')} ${col.categories.length! > DENSE_HISTOGRAM ? cssClass('dense') : ''}\">${bins}`; // no closing div to be able to append things\n\n\n return {\n template,\n update: (n: HTMLElement, hist: ICategoricalStatistics, gHist?: ICategoricalStatistics) => {\n const mapping = col.getColorMapping();\n\n const selected = col.categories.map((d) => {\n const c = color(mapping.apply(d))!;\n c.opacity = FILTERED_OPACITY;\n return c.toString();\n });\n\n const maxBin = gHist ? gHist.maxBin : hist.maxBin;\n forEach(n, '[data-cat]', (d: HTMLElement, i) => {\n const cat = col.categories[i];\n const {count} = hist.hist[i];\n const inner = <HTMLElement>d.firstElementChild!;\n if (gHist) {\n const {count: gCount} = gHist.hist[i];\n d.title = `${cat.label}: ${count} of ${gCount}`;\n inner.style.height = `${round(gCount * 100 / maxBin, 2)}%`;\n const relY = 100 - round(count * 100 / gCount, 2);\n inner.style.background = relY === 0 ? mapping.apply(cat) : (relY === 100 ? selected[i] : `linear-gradient(${selected[i]} ${relY}%, ${mapping.apply(cat)} ${relY}%, ${mapping.apply(cat)} 100%)`);\n } else {\n d.title = `${col.categories[i].label}: ${count}`;\n const inner = <HTMLElement>d.firstElementChild!;\n inner.style.height = `${Math.round(count * 100 / maxBin)}%`;\n inner.style.background = mapping.apply(cat);\n }\n });\n }\n };\n}\n\nfunction setCategoricalFilter(col: HasCategoricalFilter, filter: string | RegExp | string[], filterMissing: boolean) {\n if (col instanceof SetColumn) {\n const f = col.getFilter();\n const mode = f ? f.mode : undefined;\n col.setFilter({\n filter, filterMissing, mode\n });\n } else {\n col.setFilter({\n filter, filterMissing\n });\n }\n}\n\n/** @internal */\nexport function interactiveHist(col: HasCategoricalFilter, node: HTMLElement) {\n const bins = <HTMLElement[]>Array.from(node.querySelectorAll('[data-cat]'));\n\n const markFilter = (bin: HTMLElement, cat: ICategory, value: boolean) => {\n // update filter highlight eagerly for better user feedback\n const inner = <HTMLElement>bin.firstElementChild!;\n const base = col.getColorMapping().apply(cat);\n if (value) {\n inner.style.background = base;\n return;\n }\n const c = color(base)!;\n c.opacity = FILTERED_OPACITY;\n inner.style.background = c.toString();\n };\n\n bins.forEach((bin, i) => {\n const cat = col.categories[i];\n\n bin.onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n\n // toggle filter\n const old = col.getFilter();\n if (old == null || !Array.isArray(old.filter)) {\n // deselect\n markFilter(bin, cat, false);\n const included = col.categories.slice();\n included.splice(i, 1);\n setCategoricalFilter(col, included.map((d) => d.name), old ? old.filterMissing : false);\n return;\n }\n const filter = old.filter.slice();\n const contained = filter.indexOf(cat.name);\n if (contained >= 0) {\n // remove\n filter.splice(contained, 1);\n markFilter(bin, cat, false);\n } else {\n // readd\n filter.push(cat.name);\n markFilter(bin, cat, true);\n }\n if (!old.filterMissing && filter.length === col.categories.length) {\n // dummy filter\n col.setFilter(null);\n return;\n }\n setCategoricalFilter(col, filter, old.filterMissing);\n };\n });\n\n\n const filterMissing = <HTMLInputElement>node.getElementsByTagName('input')[0]!;\n\n if (filterMissing) {\n filterMissing.onchange = () => {\n // toggle filter\n const v = filterMissing.checked;\n const old = col.getFilter();\n if (old == null) {\n if (v) {\n setCategoricalFilter(col, col.categories.map((d) => d.name), v);\n } else {\n col.setFilter(null);\n }\n } else if (!v && Array.isArray(old.filter) && old.filter.length === col.categories.length) {\n // dummy\n col.setFilter(null);\n } else {\n setCategoricalFilter(col, old.filter, v);\n }\n };\n }\n\n\n return (missing: number, actCol: HasCategoricalFilter) => {\n col = actCol;\n const f = col.getFilter();\n if (filterMissing) {\n filterMissing.checked = f != null && f.filterMissing;\n updateFilterMissingNumberMarkup(<HTMLElement>filterMissing.parentElement, missing);\n }\n };\n}\n","import {Column, ICategoricalsColumn, ICategory, IDataRow, IOrderedGroup, isCategoricalsColumn} from '../model';\nimport {toMostFrequentCategoricals} from '../model/internalCategorical';\nimport {CANVAS_HEIGHT, cssClass} from '../styles';\nimport {ICellRendererFactory, IRenderContext, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingDOM, renderMissingValue} from './missing';\nimport {noop, wideEnough} from './utils';\nimport {GUESSED_ROW_HEIGHT} from '../constants';\n\nexport default class CategoricalHeatmapCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Heatmap';\n\n canRender(col: Column): boolean {\n return isCategoricalsColumn(col) && Boolean(col.dataLength);\n }\n\n private createContext(col: ICategoricalsColumn, context: IRenderContext) {\n const width = context.colWidth(col);\n const cellDimension = width / col.dataLength!;\n const labels = col.labels;\n const render = (ctx: CanvasRenderingContext2D, data: (ICategory | null)[], height: number) => {\n data.forEach((d: ICategory | null, j: number) => {\n const x = j * cellDimension;\n if (d == null) {\n renderMissingValue(ctx, cellDimension, height, x, 0);\n return;\n }\n ctx.fillStyle = d.color;\n ctx.fillRect(x, 0, cellDimension, height);\n });\n };\n return {\n template: `<canvas height=\"${GUESSED_ROW_HEIGHT}\" title=\"\"></canvas>`,\n render,\n width,\n mover: (n: HTMLElement, values: string[]) => (evt: MouseEvent) => {\n const percent = evt.offsetX / width;\n const index = Math.max(0, Math.min(col.dataLength! - 1, Math.floor(percent * (col.dataLength! - 1) + 0.5)));\n n.title = `${labels[index]}: ${values[index]}`;\n }\n };\n }\n\n create(col: ICategoricalsColumn, context: IRenderContext): ICellRenderer {\n const {template, render, mover, width} = this.createContext(col, context);\n\n return {\n template,\n update: (n: HTMLElement, d: IDataRow) => {\n const ctx = (<HTMLCanvasElement>n).getContext('2d')!;\n ctx.canvas.width = width;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n if (renderMissingDOM(n, col, d)) {\n return;\n }\n n.onmousemove = mover(n, col.getLabels(d));\n n.onmouseleave = () => n.title = '';\n render(ctx, col.getCategories(d), GUESSED_ROW_HEIGHT);\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n render(ctx, col.getCategories(d), CANVAS_HEIGHT);\n }\n };\n }\n\n createGroup(col: ICategoricalsColumn, context: IRenderContext): IGroupCellRenderer {\n const {template, render, mover, width} = this.createContext(col, context);\n\n return {\n template,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupRows(col, group, this.title, (rows) => toMostFrequentCategoricals(rows, col)).then((data) => {\n if (typeof data === 'symbol') {\n return;\n }\n const ctx = (<HTMLCanvasElement>n).getContext('2d')!;\n ctx.canvas.width = width;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n const isMissing = !data || data.length === 0 || data.every((d) => d == null);\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n n.onmousemove = mover(n, data.map((d) => d ? d.label : 'missing'));\n n.onmouseleave = () => n.title = '';\n render(ctx, data, GUESSED_ROW_HEIGHT);\n });\n }\n };\n }\n\n createSummary(col: ICategoricalsColumn): ISummaryRenderer {\n let labels = col.labels.slice();\n while (labels.length > 0 && !wideEnough(col, labels.length)) {\n labels = labels.filter((_, i) => i % 2 === 0); // even\n }\n let templateRows = `<div class=\"${cssClass('heatmap')}\">`;\n for (const label of labels) {\n templateRows += `<div class=\"${cssClass('heatmap-cell')}\" title=\"${label}\" data-title=\"${label}\"></div>`;\n }\n templateRows += '</div>';\n return {\n template: templateRows,\n update: noop\n };\n }\n}\n","import {ICategoricalStatistics, round} from '../internal';\nimport {CategoricalColumn, Column, OrdinalColumn, ICategoricalColumn, isCategoricalColumn, IOrderedGroup, ISetColumn, DEFAULT_COLOR} from '../model';\nimport {filterMissingNumberMarkup} from '../ui/missing';\nimport {interactiveHist, HasCategoricalFilter} from './CategoricalCellRenderer';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {noRenderer, adaptTextColorToBgColor} from './utils';\nimport {cssClass, FILTERED_OPACITY} from '../styles';\nimport {color} from 'd3-color';\n\nexport default class CategoricalStackedDistributionlCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Distribution Bar';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return isCategoricalColumn(col) && mode !== ERenderMode.CELL;\n }\n\n create(): ICellRenderer {\n return noRenderer;\n }\n\n createGroup(col: ICategoricalColumn, context: IRenderContext): IGroupCellRenderer {\n const {template, update} = stackedBar(col);\n return {\n template: `${template}</div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupCategoricalStats(col, group).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const isMissing = !r || r.group == null || r.group.count === 0 || r.group.count === r.group.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n update(n, r.group);\n });\n }\n };\n }\n\n createSummary(col: ICategoricalColumn, context: IRenderContext, interactive: boolean): ISummaryRenderer {\n return (col instanceof CategoricalColumn || col instanceof OrdinalColumn) ? interactiveSummary(col, context, interactive) : staticSummary(col, context);\n }\n}\n\nfunction staticSummary(col: ICategoricalColumn, context: IRenderContext) {\n const {template, update} = stackedBar(col);\n return {\n template: `${template}</div>`,\n update: (n: HTMLElement) => {\n return context.tasks.summaryCategoricalStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const isMissing = !r || r.summary == null || r.summary.count === 0 || r.summary.count === r.summary.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n update(n, r.summary, r.data);\n });\n }\n };\n}\n\nfunction interactiveSummary(col: HasCategoricalFilter, context: IRenderContext, interactive: boolean) {\n const {template, update} = stackedBar(col);\n let filterUpdate: (missing: number, col: HasCategoricalFilter) => void;\n return {\n template: `${template}${interactive ? filterMissingNumberMarkup(false, 0) : ''}</div>`,\n update: (n: HTMLElement) => {\n if (!filterUpdate) {\n filterUpdate = interactiveHist(col, n);\n }\n return context.tasks.summaryCategoricalStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const {summary, data} = r;\n\n const missing = interactive && data ? data.missing : (summary ? summary.missing : 0);\n filterUpdate(missing, col);\n\n const isMissing = !r || r.summary == null || r.summary.count === 0 || r.summary.count === r.summary.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n update(n, summary, data);\n });\n }\n };\n}\n\nfunction selectedCol(value: string) {\n const c = color(value)!;\n c.opacity = FILTERED_OPACITY;\n return c.toString();\n}\n\nfunction stackedBar(col: ISetColumn) {\n const mapping = col.getColorMapping();\n const cats = col.categories.map((c) => ({\n label: c.label,\n name: c.name,\n color: mapping.apply(c),\n selected: selectedCol(mapping.apply(c))\n }));\n cats.push({label: 'Missing Values', name: 'missing', color: DEFAULT_COLOR, selected: 'transparent'});\n\n const bins = cats.map((c) => `<div class=\"${cssClass('distribution-bar')}\" style=\"background-color: ${c.color}; color: ${adaptTextColorToBgColor(c.color)}\" title=\"${c.label}: 0\" data-cat=\"${c.name}\"><span>${c.label}</span></div>`).join('');\n\n return {\n template: `<div>${bins}`, // no closing div to be able to append things\n update: (n: HTMLElement, hist: ICategoricalStatistics, gHist?: ICategoricalStatistics) => {\n const bins: {count: number}[] = hist.hist.slice();\n bins.push({count: hist.missing});\n const children = <HTMLElement[]>Array.from(n.children);\n\n if (!gHist) {\n const total = bins.reduce((acc, {count}) => acc + count, 0);\n\n for (let i = 0; i < cats.length; ++i) {\n const d = children[i];\n const count = bins[i].count;\n const label = cats[i].label;\n d.style.flexGrow = `${round(total === 0 ? 0 : count, 2)}`;\n d.title = `${label}: ${count}`;\n }\n return;\n }\n\n const gBins: {count: number}[] = gHist.hist.slice();\n gBins.push({count: gHist.missing});\n const total = gBins.reduce((acc, {count}) => acc + count, 9);\n\n for (let i = 0; i < cats.length; ++i) {\n const d = children[i];\n const count = bins[i].count;\n const label = cats[i].label;\n const gCount = gBins[i].count;\n\n d.style.flexGrow = `${round(total === 0 ? 0 : gCount, 2)}`;\n d.title = `${label}: ${count} of ${gCount}`;\n const relY = 100 - round(count * 100 / gCount, 2);\n d.style.background = relY === 0 ? cats[i].color : (relY === 100 ? cats[i].selected : `linear-gradient(${cats[i].selected} ${relY}%, ${cats[i].color} ${relY}%, ${cats[i].color} 100%)`);\n }\n }\n };\n}\n","import {Column, isNumbersColumn, IDataRow, INumberColumn, isNumberColumn} from '../model';\nimport {colorOf} from './impose';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, IImposer, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {noRenderer, setText} from './utils';\nimport {cssClass} from '../styles';\n\nexport default class CircleCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Proportional Symbol';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return isNumberColumn(col) && mode === ERenderMode.CELL && !isNumbersColumn(col);\n }\n\n create(col: INumberColumn, _context: IRenderContext, imposer?: IImposer): ICellRenderer {\n return {\n template: `<div style=\"background: radial-gradient(circle closest-side, red 100%, transparent 100%)\" title=\"\">\n <div class=\"${cssClass('hover-only')} ${cssClass('bar-label')}\"></div>\n </div>`,\n update: (n: HTMLElement, d: IDataRow) => {\n const v = col.getNumber(d);\n const p = Math.round(v * 100);\n const missing = renderMissingDOM(n, col, d);\n n.style.background = missing ? null : `radial-gradient(circle closest-side, ${colorOf(col, d, imposer)} ${p}%, transparent ${p}%)`;\n setText(n.firstElementChild!, col.getLabel(d));\n }\n };\n }\n\n createGroup(): IGroupCellRenderer {\n return noRenderer;\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {GUESSES_GROUP_HEIGHT} from '../constants';\nimport {concatSeq, ISequence, round} from '../internal';\nimport {Column, DEFAULT_COLOR, IDataRow, INumberColumn, IOrderedGroup, isNumberColumn, isNumbersColumn} from '../model';\nimport {CANVAS_HEIGHT, DOT, cssClass} from '../styles';\nimport {colorOf} from './impose';\nimport {ERenderMode, ICellRendererFactory, IImposer, IRenderContext, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\nimport {noRenderer} from './utils';\n\n\nexport default class DotCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Dot';\n readonly groupTitle: string = 'Dots';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return isNumberColumn(col) && mode !== ERenderMode.SUMMARY;\n }\n\n private static getCanvasRenderer(col: INumberColumn, context: IRenderContext) {\n const width = context.colWidth(col);\n const pi2 = Math.PI * 2;\n const radius = DOT.size / 2;\n const render = (ctx: CanvasRenderingContext2D, vs: {value: number, color: (string | null)}[], width: number) => {\n ctx.save();\n ctx.globalAlpha = DOT.opacity;\n for (const v of vs) {\n ctx.fillStyle = v.color || DOT.color;\n const x = Math.min(width - radius, Math.max(radius, v.value * width));\n const y = round(Math.random() * (GUESSES_GROUP_HEIGHT - DOT.size) + radius, 2);\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arc(x, y, radius, 0, pi2, true);\n ctx.fill();\n }\n ctx.restore();\n };\n return {\n template: `<canvas height=\"${GUESSES_GROUP_HEIGHT}\"></canvas>`,\n render,\n width\n };\n }\n\n private static getDOMRenderer(col: INumberColumn) {\n const dots = isNumbersColumn(col) ? col.dataLength! : 1;\n let tmp = '';\n for (let i = 0; i < dots; ++i) {\n tmp += `<div style='background-color: ${DEFAULT_COLOR}' title=''></div>`;\n }\n\n const update = (n: HTMLElement, data: ISequence<{value: number, label: string, color: string | null}>) => {\n //adapt the number of children\n const l = data.length;\n if (n.children.length !== l) {\n n.innerHTML = data.reduce((tmp, r) => {\n return `${tmp}<div style='background-color: ${r.color}' title='${r.label}'></div>`;\n }, '');\n }\n const children = n.children;\n data.forEach((v, i) => {\n const d = <HTMLElement>children[i];\n d.title = v.label;\n d.style.display = isNaN(v.value) ? 'none' : null;\n d.style.left = `${round(v.value * 100, 2)}%`;\n // jitter\n d.style.top = l > 1 ? `${round(Math.random() * 80 + 10, 2)}%` : null;\n d.style.backgroundColor = v.color;\n });\n };\n\n const render = (ctx: CanvasRenderingContext2D, vs: number[], colors: (string | null)[], width: number) => {\n ctx.save();\n ctx.globalAlpha = DOT.opacity;\n vs.forEach((v, i) => {\n ctx.fillStyle = colors[i] || DOT.color;\n ctx.fillRect(Math.max(0, v * width - DOT.size / 2), 0, DOT.size, CANVAS_HEIGHT);\n });\n ctx.restore();\n };\n\n return {template: `<div>${tmp}</div>`, update, render};\n }\n\n create(col: INumberColumn, context: IRenderContext, imposer?: IImposer): ICellRenderer {\n const {template, render, update} = DotCellRenderer.getDOMRenderer(col);\n const width = context.colWidth(col);\n const formatter = col.getNumberFormat();\n return {\n template,\n update: (n: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(n, col, d)) {\n return;\n }\n const color = colorOf(col, d, imposer);\n if (!isNumbersColumn(col)) {\n const v = col.getNumber(d);\n return update(n, [{value: v, label: col.getLabel(d), color}]);\n }\n const data = col.getNumbers(d).filter((vi: number) => !isNaN(vi)).map((value) => ({value, label: formatter(value), color}));\n return update(n, data);\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n const color = colorOf(col, d, imposer);\n if (!isNumbersColumn(col)) {\n const v = col.getNumber(d);\n return render(ctx, [v], [color], width);\n }\n const vs: number[] = col.getNumbers(d).filter((vi: number) => !isNaN(vi));\n return render(ctx, vs, vs.map((_: any) => color), width);\n }\n };\n }\n\n createGroup(col: INumberColumn, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer {\n const {template, render, width} = DotCellRenderer.getCanvasRenderer(col, context);\n\n return {\n template,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupRows(col, group, 'dot', (rows) => {\n //value, color, label,\n\n if (!isNumbersColumn(col)) {\n return Array.from(rows.map((r) => ({value: col.getNumber(r), color: colorOf(col, r, imposer)})));\n }\n // concatenate all columns\n const vs = rows.map((r) => {\n const color = colorOf(col, r, imposer);\n return col.getNumbers(r)\n .filter((vi: number) => !isNaN(vi))\n .map((value) => ({value, color}));\n });\n return Array.from(concatSeq(vs));\n }).then((data) => {\n if (typeof data === 'symbol') {\n return;\n }\n const isMissing = !data || data.length === 0 || data.every((v) => Number.isNaN(v.value));\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n const ctx = (<HTMLCanvasElement>n).getContext('2d')!;\n ctx.canvas.width = width;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n render(ctx, data, width);\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {Column, GroupColumn, IOrderedGroup, IGroup, defaultGroup, IDataRow} from '../model';\nimport {ICellRendererFactory, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {noRenderer} from './utils';\n\n\nfunction isDummyGroup(group: IGroup) {\n return group.parent == null && group.name === defaultGroup.name;\n}\n\nexport default class GroupCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Default';\n\n canRender(col: Column): boolean {\n return col instanceof GroupColumn;\n }\n\n create(): ICellRenderer {\n return {\n template: `<div><div></div></div>`,\n update(node: HTMLElement, _row: IDataRow, i: number, group: IOrderedGroup) {\n const text = isDummyGroup(group) || i > 0 ? '' : `${group.name} (${group.order.length})`;\n (<HTMLElement>node.firstElementChild!).textContent = text;\n node.title = text;\n },\n render(_ctx: CanvasRenderingContext2D, _row: IDataRow, i: number) {\n return i === 0;\n }\n };\n }\n\n createGroup(): IGroupCellRenderer {\n return {\n template: `<div><div></div></div>`,\n update(node: HTMLElement, group: IOrderedGroup) {\n const text = isDummyGroup(group) ? '' : `${group.name} (${group.order.length})`;\n (<HTMLElement>node.firstElementChild!).textContent = text;\n node.title = text;\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {IDataRow, INumbersColumn, EAdvancedSortMethod, IOrderedGroup} from '../model';\nimport {IRenderContext, IImposer, ICellRenderer, IGroupCellRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\nimport {ISequence, boxplotBuilder, getSortLabel} from '../internal';\n\nexport abstract class ANumbersCellRenderer {\n abstract readonly title: string;\n\n protected abstract createContext(col: INumbersColumn, context: IRenderContext, imposer?: IImposer): {\n clazz: string,\n templateRow: string,\n update: (row: HTMLElement, data: number[], raw: number[], d: IDataRow, tooltipPrefix?: string) => void,\n render: (ctx: CanvasRenderingContext2D, data: number[], d: IDataRow) => void,\n };\n\n static choose(col: INumbersColumn, rows: ISequence<IDataRow>) {\n let row: IDataRow | null = null;\n const data = rows.map((r, i) => {\n if (i === 0) {\n row = r;\n }\n return {n: col.getNumbers(r), raw: col.getRawNumbers(r)};\n });\n const cols = col.dataLength!;\n const normalized = <number[]>[];\n const raw = <number[]>[];\n // mean column)\n for (let i = 0; i < cols; ++i) {\n const vs = data.map((d) => ({n: d.n[i], raw: d.raw[i]})).filter((d) => !isNaN(d.n));\n if (vs.length === 0) {\n normalized.push(NaN);\n raw.push(NaN);\n } else {\n const bbn = boxplotBuilder();\n const bbr = boxplotBuilder();\n const s: EAdvancedSortMethod = <any>col.getSortMethod();\n vs.forEach((d) => {\n bbn.push(d.n);\n bbr.push(d.raw);\n });\n normalized.push(bbn.build()[s]!);\n raw.push(bbr.build()[s]!);\n }\n }\n return {normalized, raw, row};\n }\n\n create(col: INumbersColumn, context: IRenderContext, imposer?: IImposer): ICellRenderer {\n const width = context.colWidth(col);\n const {templateRow, render, update, clazz} = this.createContext(col, context, imposer);\n return {\n template: `<div class=\"${clazz}\">${templateRow}</div>`,\n update: (n: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(n, col, d)) {\n return;\n }\n update(n, col.getNumbers(d), col.getRawNumbers(d), d);\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n render(ctx, col.getNumbers(d), d);\n },\n };\n }\n\n createGroup(col: INumbersColumn, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer {\n const {templateRow, update, clazz} = this.createContext(col, context, imposer);\n return {\n template: `<div class=\"${clazz}\">${templateRow}</div>`,\n update: (n: HTMLDivElement, group: IOrderedGroup) => {\n // render a heatmap\n return context.tasks.groupRows(col, group, this.title, (rows) => ANumbersCellRenderer.choose(col, rows)).then((data) => {\n if (typeof data !== 'symbol') {\n update(n, data.normalized, data.raw, data.row!, `${getSortLabel(col.getSortMethod())} `);\n }\n });\n }\n };\n }\n}\n\n/** @internal */\nexport function matchRows(n: HTMLElement | SVGElement, length: number, template: string) {\n // first match the number of rows\n const children = <(HTMLElement | SVGElement)[]>Array.from(n.children);\n if (children.length > length) {\n children.slice(length).forEach((c) => c.remove());\n } else if (length > children.length) {\n n.insertAdjacentHTML('beforeend', template.repeat(length - children.length));\n }\n}\n","/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.15.0\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nvar timeoutDuration = 0;\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n timeoutDuration = 1;\n break;\n }\n}\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.right - result.left;\n var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop, 10);\n var marginLeft = parseFloat(styles.marginLeft, 10);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicity asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.<br />\n * It will read the variation of the `placement` property.<br />\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.<br />\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.<br />\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.<br />\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.<br />\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.<br />\n * By default, it is set to no-op.<br />\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexport default Popper;\n//# sourceMappingURL=popper.js.map\n","import {Column, INumbersColumn, isNumbersColumn, IDataRow, IOrderedGroup} from '../model';\nimport {CANVAS_HEIGHT, cssClass} from '../styles';\nimport {ANumbersCellRenderer} from './ANumbersCellRenderer';\nimport {toHeatMapColor} from './BrightnessCellRenderer';\nimport {IRenderContext, ICellRendererFactory, IImposer, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingValue, renderMissingDOM} from './missing';\nimport {noop, wideEnough} from './utils';\nimport {GUESSED_ROW_HEIGHT} from '../constants';\nimport {getSortLabel} from '../internal';\n\n\nexport default class HeatmapCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Heatmap';\n\n canRender(col: Column): boolean {\n return isNumbersColumn(col) && Boolean(col.dataLength);\n }\n\n private createContext(col: INumbersColumn, context: IRenderContext, imposer?: IImposer) {\n const width = context.colWidth(col);\n const cellDimension = width / col.dataLength!;\n const labels = col.labels;\n const render = (ctx: CanvasRenderingContext2D, data: number[], item: IDataRow, height: number) => {\n data.forEach((d: number, j: number) => {\n const x = j * cellDimension;\n if (isNaN(d)) {\n renderMissingValue(ctx, cellDimension, height, x, 0);\n return;\n }\n ctx.fillStyle = toHeatMapColor(d, item, col, imposer);\n ctx.fillRect(x, 0, cellDimension, height);\n });\n };\n return {\n template: `<canvas height=\"${GUESSED_ROW_HEIGHT}\" title=\"\"></canvas>`,\n render,\n width,\n mover: (n: HTMLElement, values: string[], prefix?: string) => (evt: MouseEvent) => {\n const percent = evt.offsetX / width;\n const index = Math.max(0, Math.min(col.dataLength! - 1, Math.floor(percent * (col.dataLength! - 1) + 0.5)));\n n.title = `${prefix || ''}${labels[index]}: ${values[index]}`;\n }\n };\n }\n\n create(col: INumbersColumn, context: IRenderContext, _hist: any, imposer?: IImposer): ICellRenderer {\n const {template, render, mover, width} = this.createContext(col, context, imposer);\n\n return {\n template,\n update: (n: HTMLElement, d: IDataRow) => {\n const ctx = (<HTMLCanvasElement>n).getContext('2d')!;\n ctx.canvas.width = width;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n if (renderMissingDOM(n, col, d)) {\n return;\n }\n n.onmousemove = mover(n, col.getLabels(d));\n n.onmouseleave = () => n.title = '';\n render(ctx, col.getNumbers(d), d, GUESSED_ROW_HEIGHT);\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n render(ctx, col.getNumbers(d), d, CANVAS_HEIGHT);\n }\n };\n }\n\n createGroup(col: INumbersColumn, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer {\n const {template, render, mover, width} = this.createContext(col, context, imposer);\n const formatter = col.getNumberFormat();\n\n return {\n template,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupRows(col, group, this.title, (rows) => ANumbersCellRenderer.choose(col, rows)).then((data) => {\n if (typeof data === 'symbol') {\n return;\n }\n const ctx = (<HTMLCanvasElement>n).getContext('2d')!;\n ctx.canvas.width = width;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n const isMissing = !data || data.normalized.length === 0 || data.normalized.every((v) => Number.isNaN(v));\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n\n n.onmousemove = mover(n, data.raw.map(formatter), `${getSortLabel(col.getSortMethod())} `);\n n.onmouseleave = () => n.title = '';\n render(ctx, data.normalized, data.row!, GUESSED_ROW_HEIGHT);\n });\n }\n };\n }\n\n createSummary(col: INumbersColumn): ISummaryRenderer {\n let labels = col.labels.slice();\n while (labels.length > 0 && !wideEnough(col, labels.length)) {\n labels = labels.filter((_, i) => i % 2 === 0); // even\n }\n let templateRows = `<div class=\"${cssClass('heatmap')}\">`;\n for (const label of labels) {\n templateRows += `<div class=\"${cssClass('heatmap-cell')}\" title=\"${label}\" data-title=\"${label}\"></div>`;\n }\n templateRows += '</div>';\n return {\n template: templateRows,\n update: noop\n };\n }\n}\n","const TYPE_OBJECT = '[object Object]';\n\n/**\n * deep merge the source object into the target object and return the target object.\n * will concatenate arrays instead of replacing them.\n * @internal\n */\nexport default function merge<T1, T2>(target: T1, source: T2): T1 | T2 {\n const result: any = target;\n\n if (!source) {\n return result;\n }\n\n const bKeys: (keyof T2)[] = <(keyof T2)[]>Object.keys(source);\n if (bKeys.length === 0) {\n return result;\n }\n\n for (const key of bKeys) {\n const value = source[key];\n\n //merge just POJOs\n if (Object.prototype.toString.call(value) === TYPE_OBJECT && (Object.getPrototypeOf(value) === Object.prototype)) { //pojo\n if (result[key] == null) {\n result[key] = {};\n }\n result[key] = merge(result[key], value);\n } else if (Array.isArray(value)) {\n if (result[key] == null) {\n result[key] = [];\n }\n result[key] = result[key].concat(value);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n","import Popper from 'popper.js';\nimport DialogManager from './DialogManager';\nimport {merge} from '../../internal';\nimport {cssClass} from '../../styles';\nimport {IRankingHeaderContext} from '../interfaces';\nimport {ILivePreviewOptions} from '../../config';\n\nexport interface IDialogOptions {\n title: string;\n livePreview: boolean | keyof ILivePreviewOptions;\n popup: boolean;\n // popper options\n placement?: Popper.Placement;\n eventsEnabled?: boolean;\n modifiers?: Popper.Modifiers;\n toggleDialog: boolean;\n cancelSubDialogs?: boolean;\n autoClose?: boolean;\n}\n\nexport interface IDialogContext {\n attachment: HTMLElement;\n level: number;\n manager: DialogManager;\n idPrefix: string;\n}\n\nexport function dialogContext(ctx: IRankingHeaderContext, level: number, attachment: HTMLElement | MouseEvent): IDialogContext {\n return {\n attachment: (<MouseEvent>attachment).currentTarget != null ? <HTMLElement>(<MouseEvent>attachment).currentTarget : <HTMLElement>attachment,\n level,\n manager: ctx.dialogManager,\n idPrefix: ctx.idPrefix\n };\n}\n\nabstract class ADialog {\n\n private readonly options: Readonly<IDialogOptions> = {\n title: '',\n livePreview: false,\n popup: false,\n placement: 'bottom-start',\n toggleDialog: true,\n cancelSubDialogs: false,\n autoClose: false,\n modifiers: {\n }\n };\n\n readonly node: HTMLFormElement;\n private popper: Popper | null = null;\n\n constructor(protected readonly dialog: Readonly<IDialogContext>, options: Partial<IDialogOptions> = {}) {\n Object.assign(this.options, options);\n this.node = dialog.attachment.ownerDocument!.createElement('form');\n this.node.classList.add(cssClass('dialog'));\n }\n\n get autoClose() {\n return this.options.autoClose;\n }\n\n get attachment() {\n return this.dialog.attachment;\n }\n\n get level() {\n return this.dialog.level;\n }\n\n protected abstract build(node: HTMLElement): boolean | void;\n\n protected showLivePreviews() {\n return this.options.livePreview === true || (typeof this.options.livePreview === 'string' && this.dialog.manager.livePreviews[this.options.livePreview] === true);\n }\n\n protected enableLivePreviews(selector: string | (HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement)[]) {\n if (!this.showLivePreviews()) {\n return;\n }\n const submitter = () => {\n this.submit();\n };\n if (typeof selector === 'string') {\n this.forEach(selector, (n: HTMLInputElement | HTMLSelectElement) => {\n n.addEventListener('change', submitter, {passive: true});\n });\n } else {\n selector.forEach((n) => {\n n.addEventListener('change', submitter, {passive: true});\n });\n }\n }\n\n equals(that: ADialog) {\n return this.dialog.level === that.dialog.level && this.dialog.attachment === that.dialog.attachment;\n }\n\n protected appendDialogButtons() {\n this.node.insertAdjacentHTML('beforeend', `<div class=\"${cssClass('dialog-buttons')}\">\n <button class=\"${cssClass('dialog-button')}\" type=\"submit\" title=\"Apply\"></button>\n <button class=\"${cssClass('dialog-button')}\" type=\"button\" title=\"Cancel\"></button>\n <button class=\"${cssClass('dialog-button')}\" type=\"reset\" title=\"Reset to default values\"></button>\n </div>`);\n }\n\n open() {\n if (this.options.toggleDialog && this.dialog.manager.removeLike(this)) {\n return;\n }\n if (this.build(this.node) === false) {\n return;\n }\n const parent = <HTMLElement>this.attachment.closest(`.${cssClass()}`)!;\n\n if (this.options.title) {\n this.node.insertAdjacentHTML('afterbegin', `<strong>${this.options.title}</strong>`);\n }\n if (!this.options.popup) {\n this.appendDialogButtons();\n }\n\n parent.appendChild(this.node);\n this.popper = new Popper(this.attachment, this.node, merge({\n modifiers: {\n preventOverflow: {\n boundariesElement: parent\n }\n }\n }, this.options));\n\n const auto = this.find<HTMLInputElement>('input[autofocus]');\n if (auto) {\n // delay such that it works\n self.setTimeout(() => auto.focus());\n }\n\n const reset = this.find<HTMLButtonElement>('button[type=reset]');\n if (reset) {\n reset.onclick = (evt) => {\n evt.stopPropagation();\n evt.preventDefault();\n this.reset();\n if (this.showLivePreviews()) {\n this.submit();\n }\n };\n }\n this.node.onsubmit = (evt) => {\n evt.stopPropagation();\n evt.preventDefault();\n return this.triggerSubmit();\n };\n const cancel = this.find<HTMLButtonElement>('button[title=Cancel]');\n if (cancel) {\n cancel.onclick = (evt) => {\n evt.stopPropagation();\n evt.preventDefault();\n this.cancel();\n this.destroy('cancel');\n };\n }\n\n if (this.options.cancelSubDialogs) {\n this.node.addEventListener('click', () => {\n this.dialog.manager.removeAboveLevel(this.dialog.level + 1);\n });\n }\n\n this.dialog.manager.push(this);\n }\n\n protected triggerSubmit() {\n if (!this.node.checkValidity()) {\n return false;\n }\n if (this.submit() !== false) {\n this.destroy('confirm');\n }\n return false;\n }\n\n protected find<T extends HTMLElement>(selector: string): T {\n return <T>this.node.querySelector(selector);\n }\n\n protected findInput(selector: string) {\n return this.find<HTMLInputElement>(selector);\n }\n\n protected forEach<M extends Element, T>(selector: string, callback: (d: M, i: number) => T): T[] {\n return (<M[]>Array.from(this.node.querySelectorAll(selector))).map(callback);\n }\n\n protected abstract reset(): void;\n\n protected abstract submit(): boolean | undefined;\n\n protected abstract cancel(): void;\n\n cleanUp(action: 'cancel' | 'confirm' | 'handled') {\n if (action === 'confirm') {\n this.submit(); // TODO what if submit wasn't successful?\n } else if (action === 'cancel') {\n this.cancel();\n }\n\n if (action !== 'handled') {\n this.dialog.manager.triggerDialogClosed(this, action);\n }\n\n if (this.popper) {\n this.popper.destroy();\n }\n this.node.remove();\n }\n\n protected destroy(action: 'cancel' | 'confirm' = 'cancel') {\n this.dialog.manager.triggerDialogClosed(this, action);\n this.dialog.manager.remove(this, true);\n }\n}\n\nexport default ADialog;\n","import ADialog, {IDialogContext, IDialogOptions} from './ADialog';\n\nabstract class APopup extends ADialog {\n constructor(dialog: Readonly<IDialogContext>, options: Partial<IDialogOptions> = {}) {\n super(dialog, Object.assign({\n popup: true\n }, options));\n }\n\n protected submit() {\n return true;\n }\n\n protected reset() {\n // dummy\n }\n\n protected cancel() {\n // dummy\n }\n}\n\nexport default APopup;\n","import {IDialogContext} from './ADialog';\nimport APopup from './APopup';\n\n/** @internal */\nexport interface IInputNumberOptions {\n min: number;\n max: number;\n step: number | 'any';\n value: number;\n label: string | null;\n}\n\n/** @internal */\nexport default class InputNumberDialog extends APopup {\n\n private readonly ioptions: Readonly<IInputNumberOptions> = {\n min: NaN,\n max: NaN,\n step: 'any',\n value: NaN,\n label: null\n };\n\n constructor(dialog: IDialogContext, private readonly callback: (value: number) => void, options: Partial<IInputNumberOptions> = {}) {\n super(dialog);\n Object.assign(this.ioptions, options);\n }\n\n protected build(node: HTMLElement) {\n const o = this.ioptions;\n node.insertAdjacentHTML('beforeend', `\n <input type=\"number\" value=\"${isNaN(o.value) ? '' : String(o.value)}\" required autofocus placeholder=\"${o.label ? o.label : 'enter number'}\" ${isNaN(o.min) ? '' : ` min=\"${o.min}\"`} ${isNaN(o.max) ? '' : ` max=\"${o.max}\"`} step=\"${o.step}\">\n `);\n this.enableLivePreviews('input');\n }\n\n submit() {\n this.callback(this.findInput('input[type=number]').valueAsNumber);\n return true;\n }\n}\n","import {cssClass} from '../styles';\n\n/** @internal */\nexport interface IDragHandleOptions {\n /**\n * drag base container\n * @default handle parentElement\n */\n container: HTMLElement | SVGElement;\n /**\n * filter to certain mouse events, e.g. shift only\n */\n filter(evt: MouseEvent): boolean;\n\n onStart(handle: HTMLElement | SVGElement, x: number, delta: number, evt: MouseEvent): void;\n\n onDrag(handle: HTMLElement | SVGElement, x: number, delta: number, evt: MouseEvent): void;\n\n onEnd(handle: HTMLElement | SVGElement, x: number, delta: number, evt: MouseEvent): void;\n\n /**\n * minimal pixel delta\n * @default 2\n */\n minDelta: number;\n}\n\n/**\n * allow to change the width of a column using dragging the handle\n * @internal\n */\nexport function dragHandle(handle: HTMLElement | SVGElement, options: Partial<IDragHandleOptions> = {}) {\n const o: Readonly<IDragHandleOptions> = Object.assign({\n container: handle.parentElement!,\n filter: () => true,\n onStart: () => undefined,\n onDrag: () => undefined,\n onEnd: () => undefined,\n minDelta: 2\n }, options);\n\n let ueberElement: HTMLElement | null = null;\n\n // converts the given x coordinate to be relative to the given element\n const toContainerRelative = (x: number, elem: HTMLElement | SVGElement) => {\n const rect = elem.getBoundingClientRect();\n return x - rect.left - elem.clientLeft;\n };\n\n let start = 0;\n let last = 0;\n let handleShift = 0;\n\n const mouseMove = (evt: MouseEvent) => {\n if (!o.filter(evt)) {\n return;\n }\n evt.stopPropagation();\n evt.preventDefault();\n\n const end = toContainerRelative(evt.clientX, o.container) - handleShift;\n if (Math.abs(last - end) < o.minDelta) {\n //ignore\n return;\n }\n\n last = end;\n o.onDrag(handle, end, last - end, evt);\n };\n\n const mouseUp = (evt: MouseEvent) => {\n if (!o.filter(evt)) {\n return;\n }\n evt.stopPropagation();\n evt.preventDefault();\n\n const end = toContainerRelative(evt.clientX, o.container) - handleShift;\n ueberElement!.removeEventListener('mousemove', <any>mouseMove);\n ueberElement!.removeEventListener('mouseup', <any>mouseUp);\n ueberElement!.removeEventListener('mouseleave', <any>mouseUp);\n ueberElement!.classList.remove(cssClass('dragging'));\n\n if (Math.abs(start - end) < 2) {\n //ignore\n return;\n }\n\n o.onEnd(handle, end, start - end, evt);\n };\n\n handle.onmousedown = (evt) => {\n if (!o.filter(evt)) {\n return;\n }\n evt.stopPropagation();\n evt.preventDefault();\n\n handleShift = toContainerRelative(evt.clientX, handle);\n start = last = toContainerRelative(evt.clientX, o.container) - handleShift;\n\n // register other event listeners\n ueberElement = <HTMLElement>handle.closest('body') || <HTMLElement>handle.closest(`.${cssClass()}`)!; // take the whole body or root lineup\n ueberElement.addEventListener('mousemove', <any>mouseMove);\n ueberElement.addEventListener('mouseup', <any>mouseUp);\n ueberElement.addEventListener('mouseleave', <any>mouseUp);\n ueberElement.classList.add(cssClass('dragging'));\n\n o.onStart(handle, start, 0, evt);\n };\n}\n","import {DENSE_HISTOGRAM} from '../constants';\nimport {IBin, round, IDragHandleOptions, dragHandle} from '../internal';\nimport {cssClass, FILTERED_OPACITY} from '../styles';\nimport {color} from 'd3-color';\nimport {filterMissingNumberMarkup, updateFilterMissingNumberMarkup} from '../ui/missing';\n\nfunction filteredColor(input: string) {\n const c = color(input)!;\n c.opacity = FILTERED_OPACITY;\n return c.toString();\n}\n\nexport function histogramTemplate(guessedBins: number) {\n let bins = '';\n for (let i = 0; i < guessedBins; ++i) {\n bins += `<div class=\"${cssClass('histogram-bin')}\" title=\"Bin ${i}: 0\" data-x=\"\"><div style=\"height: 0\" ></div></div>`;\n }\n // no closing div to be able to append things\n return `<div class=\"${cssClass('histogram')} ${guessedBins > DENSE_HISTOGRAM ? cssClass('dense') : ''}\">${bins}`;\n}\n\nfunction matchBins(n: HTMLElement, bins: number) {\n //adapt the number of children\n let nodes = <HTMLElement[]>Array.from(n.querySelectorAll('[data-x]'));\n if (nodes.length > bins) {\n nodes.splice(bins, nodes.length - bins).forEach((d) => d.remove());\n } else if (nodes.length < bins) {\n for (let i = nodes.length; i < bins; ++i) {\n n.insertAdjacentHTML('afterbegin', `<div class=\"${cssClass('histogram-bin')}\" title=\"Bin ${i}: 0\" data-x=\"\"><div style=\"height: 0\" ></div></div>`);\n }\n nodes = Array.from(n.querySelectorAll('[data-x]'));\n }\n n.classList.toggle(cssClass('dense'), bins > DENSE_HISTOGRAM);\n return nodes;\n}\n\nexport interface IHistogramLike<T> {\n readonly maxBin: number;\n readonly hist: ReadonlyArray<IBin<T>>;\n}\n\n/** @internal */\nexport function histogramUpdate<T>(n: HTMLElement, stats: IHistogramLike<T>, unfiltered: IHistogramLike<T> | null, formatter: (v: T) => string, colorOf: (bin: IBin<T>) => string) {\n const hist = stats.hist;\n const nodes = matchBins(n, hist.length);\n\n nodes.forEach((d: HTMLElement, i) => {\n const bin = hist[i];\n const inner = <HTMLElement>d.firstElementChild!;\n if (!bin) {\n inner.style.height = '0%';\n return;\n }\n\n const {x0, x1, count} = bin;\n const color = colorOf(bin);\n d.dataset.x = formatter(x0);\n\n if (unfiltered) {\n const gCount = (unfiltered.hist[i] || {count}).count;\n d.title = `${formatter(x0)} - ${formatter(x1)} (${count} of ${gCount})`;\n inner.style.height = `${round(gCount * 100 / unfiltered.maxBin, 2)}%`;\n const relY = 100 - round(count * 100 / gCount, 2);\n inner.style.background = relY === 0 ? color : (relY === 100 ? filteredColor(color) : `linear-gradient(${filteredColor(color)} ${relY}%, ${color} ${relY}%, ${color} 100%)`);\n } else {\n d.title = `${formatter(x0)} - ${formatter(x1)} (${count})`;\n inner.style.height = `${round(count * 100 / stats.maxBin, 2)}%`;\n inner.style.backgroundColor = color;\n }\n });\n}\n\n/**\n * @internal\n */\nexport function mappingHintTemplate(range: [string, string]) {\n return `<span class=\"${cssClass('mapping-hint')}\" title=\"${range[0]}\">${range[0]}</span><span class=\"${cssClass('mapping-hint')}\" title=\"${range[1]}\">${range[1]}</span>`;\n}\n\n/**\n * @internal\n */\nexport function mappingHintUpdate(n: HTMLElement, range: [string, string]) {\n Array.from(n.getElementsByTagName('span')).forEach((d: HTMLElement, i) => d.textContent = range[i]);\n}\n\n\nexport interface IFilterContext<T> {\n percent(v: T): number;\n unpercent(p: number): T;\n format(v: T): string;\n formatRaw(v: T): string;\n parseRaw(v: string): T;\n setFilter(filterMissing: boolean, min: T, max: T): void;\n edit(value: T, attachment: HTMLElement, type: 'min' | 'max'): Promise<T>;\n domain: [T, T];\n}\n\n/** @internal */\nexport interface IFilterInfo<T> {\n filterMissing: boolean;\n filterMin: T;\n filterMax: T;\n}\n\n\nexport function filteredHistTemplate<T>(c: IFilterContext<T>, f: IFilterInfo<T>) {\n return `\n <div class=\"${cssClass('histogram-min-hint')}\" style=\"width: ${c.percent(f.filterMin)}%\"></div>\n <div class=\"${cssClass('histogram-max-hint')}\" style=\"width: ${100 - c.percent(f.filterMax)}%\"></div>\n <div class=\"${cssClass('histogram-min')}\" data-value=\"${c.format(f.filterMin)}\" data-raw=\"${c.formatRaw(f.filterMin)}\" style=\"left: ${c.percent(f.filterMin)}%\" title=\"min filter, drag or double click to change\"></div>\n <div class=\"${cssClass('histogram-max')}\" data-value=\"${c.format(f.filterMax)}\" data-raw=\"${c.formatRaw(f.filterMax)}\" style=\"right: ${100 - c.percent(f.filterMax)}%\" title=\"max filter, drag or double click to change\"></div>\n ${filterMissingNumberMarkup(f.filterMissing, 0)}\n `;\n}\n\n\nexport function initFilter<T>(node: HTMLElement, context: IFilterContext<T>) {\n const min = <HTMLElement>node.getElementsByClassName(cssClass('histogram-min'))[0];\n const max = <HTMLElement>node.getElementsByClassName(cssClass('histogram-max'))[0];\n const minHint = <HTMLElement>node.getElementsByClassName(cssClass('histogram-min-hint'))[0];\n const maxHint = <HTMLElement>node.getElementsByClassName(cssClass('histogram-max-hint'))[0];\n const filterMissing = <HTMLInputElement>node.getElementsByTagName('input')[0];\n\n const setFilter = () => {\n const minValue = context.parseRaw(min.dataset.raw!);\n const maxValue = context.parseRaw(max.dataset.raw!);\n context.setFilter(filterMissing.checked, minValue, maxValue);\n };\n\n const minImpl = (evt: MouseEvent) => {\n evt.preventDefault();\n evt.stopPropagation();\n\n const value = context.parseRaw(min.dataset.raw!);\n\n context.edit(value, min, 'min').then((newValue) => {\n minHint.style.width = `${context.percent(newValue)}%`;\n min.dataset.value = context.format(newValue);\n min.dataset.raw = context.formatRaw(newValue);\n min.style.left = `${context.percent(newValue)}%`;\n min.classList.toggle(cssClass('swap-hint'), context.percent(newValue) > 15);\n setFilter();\n });\n };\n\n min.onclick = (evt) => {\n if (!evt.shiftKey && !evt.ctrlKey) {\n return;\n }\n minImpl(evt);\n };\n min.ondblclick = minImpl;\n\n const maxImpl = (evt: MouseEvent) => {\n evt.preventDefault();\n evt.stopPropagation();\n\n const value = context.parseRaw(max.dataset.raw!);\n\n context.edit(value, max, 'max').then((newValue) => {\n maxHint.style.width = `${100 - context.percent(newValue)}%`;\n max.dataset.value = context.format(newValue);\n max.dataset.raw = context.formatRaw(newValue);\n max.style.right = `${100 - context.percent(newValue)}%`;\n max.classList.toggle(cssClass('swap-hint'), context.percent(newValue) < 85);\n setFilter();\n });\n };\n\n max.onclick = (evt) => {\n if (!evt.shiftKey && !evt.ctrlKey) {\n return;\n }\n maxImpl(evt);\n };\n max.ondblclick = maxImpl;\n\n filterMissing.onchange = () => setFilter();\n\n const options: Partial<IDragHandleOptions> = {\n minDelta: 0,\n filter: (evt) => evt.button === 0 && !evt.shiftKey && !evt.ctrlKey,\n onStart: (handle) => handle.classList.add(cssClass('hist-dragging')),\n onDrag: (handle, x) => {\n const total = node.clientWidth;\n const px = Math.max(0, Math.min(x, total));\n const percent = Math.round(100 * px / total);\n (<HTMLElement>handle).dataset.value = context.format(context.unpercent(percent));\n (<HTMLElement>handle).dataset.raw = context.formatRaw(context.unpercent(percent));\n\n if ((<HTMLElement>handle).classList.contains(cssClass('histogram-min'))) {\n handle.style.left = `${percent}%`;\n handle.classList.toggle(cssClass('swap-hint'), percent > 15);\n minHint.style.width = `${percent}%`;\n return;\n }\n handle.style.right = `${100 - percent}%`;\n handle.classList.toggle(cssClass('swap-hint'), percent < 85);\n maxHint.style.width = `${100 - percent}%`;\n },\n onEnd: (handle) => {\n handle.classList.remove(cssClass('hist-dragging'));\n setFilter();\n }\n };\n dragHandle(min, options);\n dragHandle(max, options);\n\n return (missing: number, f: IFilterInfo<T>) => {\n minHint.style.width = `${context.percent(f.filterMin)}%`;\n maxHint.style.width = `${100 - context.percent(f.filterMax)}%`;\n min.dataset.value = context.format(f.filterMin);\n max.dataset.value = context.format(f.filterMax);\n min.dataset.raw = context.formatRaw(f.filterMin);\n max.dataset.raw = context.formatRaw(f.filterMax);\n min.style.left = `${context.percent(f.filterMin)}%`;\n max.style.right = `${100 - context.percent(f.filterMax)}%`;\n min.classList.toggle(cssClass('swap-hint'), context.percent(f.filterMin) > 15);\n max.classList.toggle(cssClass('swap-hint'), context.percent(f.filterMax) < 85);\n filterMissing.checked = f.filterMissing;\n updateFilterMissingNumberMarkup(<HTMLElement>filterMissing.parentElement, missing);\n };\n}\n","import {normalizedStatsBuilder, IStatistics, getNumberOfBins} from '../internal';\nimport {Column, IDataRow, IOrderedGroup, INumberColumn, INumbersColumn, isNumberColumn, isNumbersColumn, IMapAbleColumn, isMapAbleColumn, Ranking} from '../model';\nimport InputNumberDialog from '../ui/dialogs/InputNumberDialog';\nimport {colorOf} from './impose';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, IImposer, IRenderTasks, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {cssClass, engineCssClass} from '../styles';\nimport {histogramUpdate, histogramTemplate, IHistogramLike, mappingHintTemplate, mappingHintUpdate, IFilterInfo, filteredHistTemplate, IFilterContext, initFilter} from './histogram';\nimport {noNumberFilter} from '../model/internalNumber';\nimport DialogManager from '../ui/dialogs/DialogManager';\n\nexport default class HistogramCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Histogram';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return (isNumberColumn(col) && mode !== ERenderMode.CELL) || (isNumbersColumn(col) && mode === ERenderMode.CELL);\n }\n\n create(col: INumbersColumn, _context: IRenderContext, imposer?: IImposer): ICellRenderer {\n const {template, render, guessedBins} = getHistDOMRenderer(col, imposer);\n return {\n template: `${template}</div>`,\n update: (n: HTMLElement, row: IDataRow) => {\n if (renderMissingDOM(n, col, row)) {\n return;\n }\n const b = normalizedStatsBuilder(guessedBins);\n for (const n of col.getNumbers(row)) {\n b.push(n);\n }\n const hist = b.build();\n render(n, hist);\n }\n };\n }\n\n createGroup(col: INumberColumn, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer {\n const {template, render} = getHistDOMRenderer(col, imposer);\n return {\n template: `${template}</div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupNumberStats(col, group).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const isMissing = !r || r.group == null || r.group.count === 0 || r.group.count === r.group.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n\n const {summary, group} = r;\n render(n, group, summary);\n });\n }\n };\n }\n\n createSummary(col: INumberColumn, context: IRenderContext, interactive: boolean, imposer?: IImposer): ISummaryRenderer {\n const r = getHistDOMRenderer(col, imposer);\n\n const staticHist = !interactive || !isMapAbleColumn(col);\n return staticHist ? staticSummary(col, context, r.template, r.render) : interactiveSummary(<IMapAbleColumn>col, context, r.template, r.render);\n }\n}\n\n\nfunction staticSummary(col: INumberColumn, context: IRenderContext, template: string, render: (n: HTMLElement, stats: IStatistics, unfiltered?: IStatistics) => void) {\n if (isMapAbleColumn(col)) {\n template += mappingHintTemplate(col.getRange());\n }\n return {\n template: `${template}</div>`,\n update: (node: HTMLElement) => {\n if (isMapAbleColumn(col)) {\n mappingHintUpdate(node, col.getRange());\n }\n\n return context.tasks.summaryNumberStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const isMissing = !r || r.summary == null || r.summary.count === 0 || r.summary.count === r.summary.missing;\n node.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n render(node, r.summary);\n });\n }\n };\n}\n\nfunction interactiveSummary(col: IMapAbleColumn, context: IRenderContext, template: string, render: (n: HTMLElement, stats: IStatistics, unfiltered?: IStatistics) => void) {\n const fContext = createFilterContext(col, context);\n template += filteredHistTemplate(fContext, createFilterInfo(col));\n\n let updateFilter: (missing: number, f: IFilterInfo<number>) => void;\n\n return {\n template: `${template}</div>`,\n update: (node: HTMLElement) => {\n if (!updateFilter) {\n updateFilter = initFilter(node, fContext);\n }\n return context.tasks.summaryNumberStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const {summary, data} = r;\n\n updateFilter(data ? data.missing : (summary ? summary.missing : 0), createFilterInfo(col));\n\n node.classList.add(cssClass('histogram-i'));\n node.classList.toggle(cssClass('missing'), !summary);\n if (!summary) {\n return;\n }\n render(node, summary, data);\n });\n }\n };\n}\n\n/** @internal */\nexport function createNumberFilter(col: INumberColumn & IMapAbleColumn, parent: HTMLElement, context: {idPrefix: string, dialogManager: DialogManager, tasks: IRenderTasks}, livePreviews: boolean) {\n const renderer = getHistDOMRenderer(col);\n const fContext = createFilterContext(col, context);\n\n parent.innerHTML = `${renderer.template}${filteredHistTemplate(fContext, createFilterInfo(col))}</div>`;\n const summaryNode = <HTMLElement>parent.firstElementChild!;\n summaryNode.classList.add(cssClass('summary'), cssClass('renderer'));\n summaryNode.dataset.renderer = 'histogram';\n summaryNode.dataset.interactive = '';\n summaryNode.classList.add(cssClass('histogram-i'));\n\n const applyFilter = fContext.setFilter;\n let currentFilter = createFilterInfo(col);\n fContext.setFilter = (filterMissing, min, max) => {\n currentFilter = {filterMissing, filterMin: min, filterMax: max};\n if (livePreviews) {\n applyFilter(filterMissing, min, max);\n }\n };\n\n const updateFilter = initFilter(summaryNode, fContext);\n\n const rerender = () => {\n const ready = context.tasks.summaryNumberStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const {summary, data} = r;\n updateFilter(data ? data.missing : (summary ? summary.missing : 0), currentFilter);\n summaryNode.classList.toggle(cssClass('missing'), !summary);\n if (!summary) {\n return;\n }\n renderer.render(summaryNode, summary, data);\n });\n if (!ready) {\n return;\n }\n summaryNode.classList.add(engineCssClass('loading'));\n ready.then(() => {\n summaryNode.classList.remove(engineCssClass('loading'));\n });\n };\n\n const ranking = col.findMyRanker()!;\n\n if (ranking) {\n ranking.on(`${Ranking.EVENT_ORDER_CHANGED}.numberFilter`, () => rerender());\n }\n rerender();\n\n return {\n cleanUp() {\n if (ranking) {\n ranking.on(`${Ranking.EVENT_ORDER_CHANGED}.numberFilter`, null);\n }\n },\n reset() {\n currentFilter = createFilterInfo(col, noNumberFilter());\n rerender();\n },\n submit() {\n applyFilter(currentFilter.filterMissing, currentFilter.filterMin, currentFilter.filterMax);\n }\n };\n}\n\n/** @internal */\nexport function getHistDOMRenderer(col: INumberColumn, imposer?: IImposer) {\n const ranking = col.findMyRanker();\n const guessedBins = ranking ? getNumberOfBins(ranking.getOrderLength()) : 10;\n const formatter = col.getNumberFormat();\n\n const render = (n: HTMLElement, stats: IHistogramLike<number>, unfiltered?: IHistogramLike<number>) => {\n return histogramUpdate(n, stats, unfiltered || null, formatter, (bin) => colorOf(col, null, imposer, (bin.x1 + bin.x0) / 2)!);\n };\n return {\n template: histogramTemplate(guessedBins),\n render,\n guessedBins\n };\n}\n\nfunction createFilterInfo(col: IMapAbleColumn, filter = col.getFilter()): IFilterInfo<number> {\n const domain = col.getMapping().domain;\n const filterMin = isFinite(filter.min) ? filter.min : domain[0];\n const filterMax = isFinite(filter.max) ? filter.max : domain[1];\n return {\n filterMissing: filter.filterMissing,\n filterMin,\n filterMax\n };\n}\n\nfunction createFilterContext(col: IMapAbleColumn, context: {idPrefix: string, dialogManager: DialogManager}): IFilterContext<number> {\n const domain = col.getMapping().domain;\n const format = col.getNumberFormat();\n const clamp = (v: number) => Math.max(0, Math.min(100, v));\n const percent = (v: number) => clamp(Math.round(100 * (v - domain[0]) / (domain[1] - domain[0])));\n const unpercent = (v: number) => ((v / 100) * (domain[1] - domain[0]) + domain[0]);\n return {\n percent,\n unpercent,\n domain: <[number, number]>domain,\n format,\n formatRaw: String,\n parseRaw: Number.parseFloat,\n setFilter: (filterMissing, minValue, maxValue) => col.setFilter({\n filterMissing,\n min: minValue === domain[0] ? Number.NEGATIVE_INFINITY : minValue,\n max: maxValue === domain[1] ? Number.POSITIVE_INFINITY : maxValue\n }),\n edit: (value, attachment) => {\n return new Promise((resolve) => {\n const dialogCtx = {\n attachment,\n manager: context.dialogManager,\n level: context.dialogManager.maxLevel + 1,\n idPrefix: context.idPrefix\n };\n const dialog = new InputNumberDialog(dialogCtx, resolve, {\n value, min: domain[0], max: domain[1]\n });\n dialog.open();\n });\n }\n };\n}\n","import {Column, IDataRow, LinkColumn} from '../model';\nimport {ERenderMode, ICellRendererFactory, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {noRenderer} from './utils';\nimport {abortAble} from 'lineupengine';\n\nfunction loadImage(src: string) {\n return new Promise<HTMLImageElement>((resolve) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.src = src;\n });\n}\n\nexport default class ImageCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Image';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return col instanceof LinkColumn && mode === ERenderMode.CELL;\n }\n\n create(col: LinkColumn): ICellRenderer {\n return {\n template: `<div></div>`,\n update: (n: HTMLElement, d: IDataRow) => {\n const missing = renderMissingDOM(n, col, d);\n n.style.backgroundImage = null;\n if (missing) {\n n.title = '';\n return;\n }\n const v = col.getLink(d);\n n.title = v ? v.alt : '';\n if (!v) {\n return;\n }\n return abortAble(loadImage(v.href)).then((image) => {\n if (typeof image === 'symbol') {\n return;\n }\n n.style.backgroundImage = missing || !v ? null : `url('${image.src}')`;\n });\n }\n };\n }\n\n createGroup(): IGroupCellRenderer {\n return noRenderer;\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {ISequence} from '../internal';\nimport {Column, IDataRow, IOrderedGroup} from '../model';\nimport {ERenderMode, ICellRenderer, ICellRendererFactory, IGroupCellRenderer, IImposer, IRenderContext} from './interfaces';\nimport {noRenderer} from './utils';\nimport {ISummaryRenderer} from './interfaces';\n\n/**\n * helper class that renders a group renderer as a selected (e.g. median) single item\n */\nexport abstract class AAggregatedGroupRenderer<T extends Column> implements ICellRendererFactory {\n abstract readonly title: string;\n\n abstract canRender(col: Column, mode: ERenderMode): boolean;\n\n abstract create(col: T, context: IRenderContext, imposer?: IImposer): ICellRenderer;\n\n protected abstract aggregatedIndex(rows: ISequence<IDataRow>, col: T): {row: IDataRow, index: number};\n\n createGroup(col: T, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer {\n const single = this.create(col, context, imposer);\n return {\n template: single.template,\n update: (node: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupRows(col, group, 'aggregated', (rows) => this.aggregatedIndex(rows, col)).then((data) => {\n if (typeof data !== 'symbol') {\n single.update(node, data.row, data.index, group);\n }\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n\nexport default AAggregatedGroupRenderer;\n","import {ISequence, round} from '../internal';\nimport {Column, IDataRow, INumberColumn, isNumberColumn, IMultiLevelColumn, isMultiLevelColumn, IOrderedGroup} from '../model';\nimport {medianIndex} from '../model/internalNumber';\nimport {COLUMN_PADDING} from '../styles';\nimport {AAggregatedGroupRenderer} from './AAggregatedGroupRenderer';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, IImposer, IRenderCallback, IGroupCellRenderer, ICellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\nimport {matchColumns, multiLevelGridCSSClass} from './utils';\nimport {cssClass} from '../styles';\nimport {IAbortAblePromise, abortAbleAll} from 'lineupengine';\n\n/** @internal */\nexport interface ICols {\n column: Column;\n shift: number;\n width: number;\n template: string;\n rendererId: string;\n renderer: ICellRenderer | null;\n groupRenderer: IGroupCellRenderer | null;\n summaryRenderer: ISummaryRenderer | null;\n}\n\n/**\n * @internal\n * @param parent Parent column\n * @param context Render context\n * @param stacked Are the columns stacked?\n * @param mode Render mode\n * @param imposer Imposer object\n */\nexport function createData(parent: {children: Column[]} & Column, context: IRenderContext, stacked: boolean, mode: ERenderMode, imposer?: IImposer): {cols: ICols[], stacked: boolean, padding: number} {\n const padding = COLUMN_PADDING;\n let offset = 0;\n const cols = parent.children.map((column) => {\n const shift = offset;\n const width = column.getWidth();\n offset += width;\n offset += (!stacked ? padding : 0);\n\n const renderer = mode === ERenderMode.CELL ? context.renderer(column, imposer) : null;\n const groupRenderer = mode === ERenderMode.GROUP ? context.groupRenderer(column, imposer) : null;\n const summaryRenderer = mode === ERenderMode.GROUP ? context.summaryRenderer(column, false, imposer) : null;\n let template: string = '';\n let rendererId: string = '';\n switch (mode) {\n case ERenderMode.CELL:\n template = renderer!.template;\n rendererId = column.getRenderer();\n break;\n case ERenderMode.GROUP:\n template = groupRenderer!.template;\n rendererId = column.getGroupRenderer();\n break;\n case ERenderMode.SUMMARY:\n template = summaryRenderer!.template;\n rendererId = column.getSummaryRenderer();\n break;\n }\n // inject data attributes\n template = template.replace(/^<([^ >]+)([ >])/, `<$1 data-column-id=\"${column.id}\" data-renderer=\"${rendererId}\"$2`);\n // inject classes\n if (/^<([^>]+) class=\"([ >]*)/.test(template)) {\n // has class attribute\n template = template.replace(/^<([^>]+) class=\"([ >]*)/, `<$1 class=\"${cssClass(`renderer-${rendererId}`)} $2`);\n } else {\n // inject as the others\n template = template.replace(/^<([^ >]+)([ >])/, `<$1 class=\"${cssClass(`renderer-${rendererId}`)}\"$2`);\n }\n return {\n column,\n shift,\n width,\n template,\n rendererId,\n renderer,\n groupRenderer,\n summaryRenderer\n };\n });\n return {cols, stacked, padding};\n}\n\nexport default class MultiLevelCellRenderer extends AAggregatedGroupRenderer<IMultiLevelColumn & Column> implements ICellRendererFactory {\n readonly title: string;\n\n constructor(private readonly stacked: boolean = true) {\n super();\n this.title = this.stacked ? 'Stacked Bar' : 'Nested';\n }\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return isMultiLevelColumn(col) && mode !== ERenderMode.SUMMARY;\n }\n\n create(col: IMultiLevelColumn & Column, context: IRenderContext, imposer?: IImposer): ICellRenderer {\n const {cols, stacked} = createData(col, context, this.stacked, ERenderMode.CELL, imposer);\n const width = context.colWidth(col);\n return {\n template: `<div class='${multiLevelGridCSSClass(context.idPrefix, col)} ${!stacked ? cssClass('grid-space') : ''}'>${cols.map((d) => d.template).join('')}</div>`,\n update: (n: HTMLDivElement, d: IDataRow, i: number, group: IOrderedGroup) => {\n if (renderMissingDOM(n, col, d)) {\n return null;\n }\n matchColumns(n, cols, context);\n\n const toWait: IAbortAblePromise<void>[] = [];\n const children = <HTMLElement[]>Array.from(n.children);\n const total = col.getWidth();\n let missingWeight = 0;\n cols.forEach((col, ci) => {\n const weight = col.column.getWidth() / total;\n const cnode = children[ci];\n cnode.classList.add(cssClass(this.stacked ? 'stack-sub' : 'nested-sub'), cssClass('detail'));\n cnode.dataset.group = 'd';\n cnode.style.transform = stacked ? `translate(-${round((missingWeight / weight) * 100, 4)}%,0)` : null;\n (<any>cnode.style).gridColumnStart = (ci + 1).toString();\n const r = col.renderer!.update(cnode, d, i, group);\n if (stacked) {\n missingWeight += (1 - (<INumberColumn>col.column).getNumber(d)) * weight;\n if (ci < cols.length - 1) {\n const span = cnode.querySelector('span');\n if (span) {\n span.style.overflow = 'hidden';\n }\n }\n }\n if (r) {\n toWait.push(r);\n }\n });\n\n if (toWait.length > 0) {\n return <IAbortAblePromise<void>>abortAbleAll(toWait);\n }\n return null;\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow, i: number, group: IOrderedGroup) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return null;\n }\n const toWait: {shift: number, r: IAbortAblePromise<IRenderCallback>}[] = [];\n let stackShift = 0;\n for (const col of cols) {\n const cr = col.renderer!;\n if (cr.render) {\n const shift = col.shift - stackShift;\n ctx.translate(shift, 0);\n const r = cr.render(ctx, d, i, group);\n if (typeof r !== 'boolean' && r) {\n toWait.push({shift, r});\n }\n ctx.translate(-shift, 0);\n }\n if (stacked) {\n stackShift += col.width * (1 - (<INumberColumn>col.column).getNumber(d));\n }\n }\n\n if (toWait.length === 0) {\n return null;\n }\n\n return abortAbleAll(toWait.map((d) => d.r)).then((callbacks) => {\n return (ctx: CanvasRenderingContext2D) => {\n if (typeof callbacks === 'symbol') {\n return;\n }\n for (let i = 0; i < callbacks.length; ++i) {\n const callback = callbacks[i];\n if (typeof callback !== 'function') {\n continue;\n }\n const shift = toWait[i].shift;\n ctx.translate(shift, 0);\n callback(ctx);\n ctx.translate(-shift, 0);\n }\n };\n });\n }\n };\n }\n\n\n createGroup(col: IMultiLevelColumn & Column, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer {\n if (this.stacked && isNumberColumn(col)) {\n return super.createGroup(col, context, imposer);\n }\n\n const {cols} = createData(col, context, false, ERenderMode.GROUP, imposer);\n return {\n template: `<div class='${multiLevelGridCSSClass(context.idPrefix, col)} ${cssClass('grid-space')}'>${cols.map((d) => d.template).join('')}</div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n matchColumns(n, cols, context);\n\n const toWait: IAbortAblePromise<void>[] = [];\n const children = <HTMLElement[]>Array.from(n.children);\n cols.forEach((col, ci) => {\n const cnode = children[ci];\n cnode.classList.add(cssClass(this.stacked ? 'stack-sub' : 'nested-sub'), cssClass('group'));\n cnode.dataset.group = 'g';\n (<any>cnode.style).gridColumnStart = (ci + 1).toString();\n const r = col.groupRenderer!.update(cnode, group);\n if (r) {\n toWait.push(r);\n }\n });\n\n if (toWait.length > 0) {\n return <IAbortAblePromise<void>>abortAbleAll(toWait);\n }\n return null;\n }\n };\n }\n\n protected aggregatedIndex(rows: ISequence<IDataRow>, col: IMultiLevelColumn & Column) {\n console.assert(isNumberColumn(col));\n return medianIndex(rows, (<INumberColumn><any>col));\n }\n}\n","import {INumberBin, IStatistics} from '../internal';\nimport {Column, CompositeNumberColumn, IDataRow, IOrderedGroup, INumberColumn} from '../model';\nimport {CANVAS_HEIGHT, cssClass} from '../styles';\nimport {getHistDOMRenderer} from './HistogramCellRenderer';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\nimport {createData} from './MultiLevelCellRenderer';\nimport {colorOf, matchColumns, forEachChild} from './utils';\nimport {tasksAll} from '../provider';\nimport {IHistogramLike} from './histogram';\n\n\nexport default class InterleavingCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Interleaved';\n\n canRender(col: Column) {\n return col instanceof CompositeNumberColumn;\n }\n\n create(col: CompositeNumberColumn, context: IRenderContext): ICellRenderer {\n const {cols} = createData(col, context, false, ERenderMode.CELL);\n const width = context.colWidth(col);\n return {\n template: `<div>${cols.map((r) => r.template).join('')}</div>`,\n update: (n: HTMLDivElement, d: IDataRow, i: number, group: IOrderedGroup) => {\n const missing = renderMissingDOM(n, col, d);\n if (missing) {\n return;\n }\n matchColumns(n, cols, context);\n forEachChild(n, (ni: HTMLElement, j) => {\n cols[j].renderer!.update(ni, d, i, group);\n });\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow, _i: number, group: IOrderedGroup) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n\n ctx.save();\n ctx.scale(1, 1 / cols.length); // scale since internal use the height, too\n cols.forEach((r, i) => {\n const rr = r.renderer!;\n if (rr.render) {\n rr.render(ctx, d, i, group);\n }\n ctx.translate(0, CANVAS_HEIGHT);\n });\n ctx.restore();\n }\n };\n }\n\n createGroup(col: CompositeNumberColumn, context: IRenderContext): IGroupCellRenderer {\n const {cols} = createData(col, context, false, ERenderMode.GROUP);\n return {\n template: `<div>${cols.map((r) => r.template).join('')}</div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n matchColumns(n, cols, context);\n forEachChild(n, (ni: HTMLElement, j) => {\n cols[j].groupRenderer!.update(ni, group);\n });\n }\n };\n }\n\n createSummary(col: CompositeNumberColumn, context: IRenderContext, _interactive: boolean): ISummaryRenderer {\n const cols = col.children;\n let acc = 0;\n const {template, render} = getHistDOMRenderer(col, {\n color: () => colorOf(cols[(acc++) % cols.length])\n });\n return {\n template,\n update: (n: HTMLElement) => {\n const tasks = cols.map((col) => context.tasks.summaryNumberStats(<INumberColumn>col));\n\n return tasksAll(tasks).then((vs) => {\n if (typeof vs === 'symbol') {\n return;\n }\n const summaries = vs.map((d) => d.summary);\n if (!summaries.some(Boolean)) {\n n.classList.add(cssClass('missing'));\n return;\n }\n n.classList.remove(cssClass('missing'));\n const grouped = groupedHist(summaries)!;\n render(n, grouped);\n });\n }\n };\n }\n}\n\nconst dummyBin: INumberBin = {\n count: 0,\n x0: 0,\n x1: 0\n};\n\nfunction groupedHist(stats: (IStatistics | null)[]): IHistogramLike<number> | null {\n const sample = stats.find(Boolean)!;\n if (!sample) {\n return null;\n }\n\n const bins = sample.hist.length;\n // assert all have the same bin size\n const hist = <INumberBin[]>[];\n let maxBin = 0;\n for (let i = 0; i < bins; ++i) {\n stats.forEach((s) => {\n const bin = s ? s.hist[i] : null;\n if (!bin) {\n hist.push(dummyBin);\n return;\n }\n if (bin.count > maxBin) {\n maxBin = bin.count;\n }\n hist.push(bin);\n });\n }\n return {\n maxBin,\n hist\n };\n}\n","import {LinkColumn, Column, IDataRow, IOrderedGroup} from '../model';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {noRenderer, setText} from './utils';\nimport {cssClass} from '../styles';\nimport {ISequence} from '../internal';\n\nexport default class LinkCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Link';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return col instanceof LinkColumn && mode !== ERenderMode.SUMMARY;\n }\n\n create(col: LinkColumn): ICellRenderer {\n const align = col.alignment || 'left';\n return {\n template: `<a${align !== 'left' ? ` class=\"${cssClass(align)}\"` : ''} target=\"_blank\" rel=\"noopener\" href=\"\"></a>`,\n update: (n: HTMLAnchorElement, d: IDataRow) => {\n renderMissingDOM(n, col, d);\n const v = col.getLink(d);\n n.href = v ? v.href : '';\n if (col.escape) {\n setText(n, v ? v.alt : '');\n } else {\n n.innerHTML = v ? v.alt : '';\n }\n }\n };\n }\n\n private static exampleText(col: LinkColumn, rows: ISequence<IDataRow>) {\n const numExampleRows = 5;\n const examples = <string[]>[];\n rows.every((row) => {\n const v = col.getLink(row);\n if (!v) {\n return true;\n }\n examples.push(`<a target=\"_blank\" rel=\"noopener\" href=\"${v.href}\">${v.alt}</a>`);\n return examples.length < numExampleRows;\n });\n if (examples.length === 0) {\n return '';\n }\n return `${examples.join(', ')}${examples.length < rows.length ? ', &hellip;' : ''}`;\n }\n\n createGroup(col: LinkColumn, context: IRenderContext): IGroupCellRenderer {\n return {\n template: `<div> </div>`,\n update: (n: HTMLDivElement, group: IOrderedGroup) => {\n return context.tasks.groupExampleRows(col, group, 'link', (rows) => LinkCellRenderer.exampleText(col, rows)).then((text) => {\n if (typeof text === 'symbol') {\n return;\n }\n n.classList.toggle(cssClass('missing'), !text);\n n.innerHTML = text;\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {IArrayColumn, IKeyValue, IMapColumn, isArrayColumn, isMapColumn, Column, IDataRow, isMissingValue, IOrderedGroup} from '../model';\nimport {IRenderContext, ICellRendererFactory, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {forEach, noop} from './utils';\nimport {cssClass} from '../styles';\nimport {ISequence} from '../internal';\n\nexport default class TableCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Table';\n\n canRender(col: Column) {\n return isMapColumn(col);\n }\n\n create(col: IMapColumn<any>): ICellRenderer {\n if (isArrayColumn(col) && col.dataLength) {\n // fixed length optimized rendering\n return this.createFixed(col);\n }\n return {\n template: `<div class=\"${cssClass('rtable')}\"></div>`,\n update: (node: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(node, col, d)) {\n return;\n }\n node.innerHTML = col.getMapLabel(d).map(({key, value}) => `<div class=\"${cssClass('table-cell')}\">${key}</div><div class=\"${cssClass('table-cell')}\">${value}</div>`).join('');\n }\n };\n }\n\n private static template(col: IArrayColumn<any>) {\n const labels = col.labels;\n return `<div>${labels.map((l) => `<div class=\"${cssClass('table-cell')}\">${l}</div><div class=\"${cssClass('table-cell')}\" data-v></div>`).join('\\n')}</div>`;\n }\n\n private createFixed(col: IArrayColumn<any>) {\n return {\n template: TableCellRenderer.template(col),\n update: (node: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(node, col, d)) {\n return;\n }\n const value = col.getLabels(d);\n forEach(node, '[data-v]', (n: HTMLElement, i) => {\n n.innerHTML = value[i];\n });\n }\n };\n }\n\n private static example(arr: IKeyValue<string>[]) {\n const numExampleRows = 5;\n return `${arr.slice(0, numExampleRows).map((d) => d.value).join(', ')}${numExampleRows < arr.length ? ', &hellip;' : ''}`;\n }\n\n createGroup(col: IMapColumn<any>, context: IRenderContext): IGroupCellRenderer {\n if (isArrayColumn(col) && col.dataLength) {\n // fixed length optimized rendering\n return this.createFixedGroup(col, context);\n }\n return {\n template: `<div class=\"${cssClass('rtable')}\"></div>`,\n update: (node: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupRows(col, group, 'table', (rows) => groupByKey(rows.map((d) => col.getMapLabel(d)))).then((entries) => {\n if (typeof entries === 'symbol') {\n return;\n }\n node.innerHTML = entries.map(({key, values}) => `<div class=\"${cssClass('table-cell')}\">${key}</div><div class=\"${cssClass('table-cell')}\">${TableCellRenderer.example(values)}</div>`).join('');\n });\n }\n };\n }\n\n private createFixedGroup(col: IArrayColumn<any>, context: IRenderContext) {\n return {\n template: TableCellRenderer.template(col),\n update: (node: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupExampleRows(col, group, 'table', (rows) => {\n const values: string[][] = col.labels.map(() => []);\n rows.forEach((row) => {\n const labels = col.getLabels(row);\n for (let i = 0; i < Math.min(values.length, labels.length); ++i) {\n if (!isMissingValue(labels[i])) {\n values[i].push(labels[i]);\n }\n }\n });\n return values;\n }).then((values) => {\n if (typeof values === 'symbol') {\n return;\n }\n forEach(node, '[data-v]', (n: HTMLElement, i) => {\n n.innerHTML = `${values[i].join(', ')}&hellip;`;\n });\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return {\n template: `<div class=\"${cssClass('rtable')}\"><div>Key</div><div>Value</div></div>`,\n update: noop\n };\n }\n\n}\n\n/** @internal */\nexport function groupByKey<T extends {key: string}>(arr: ISequence<ISequence<T>>) {\n const m = new Map<string, T[]>();\n arr.forEach((a) => a.forEach((d) => {\n if (!m.has(d.key)) {\n m.set(d.key, [d]);\n } else {\n m.get(d.key)!.push(d);\n }\n }));\n return Array.from(m).sort((a, b) => a[0].localeCompare(b[0])).map(([key, values]) => ({key, values}));\n}\n","import {IDataRow, LinkMapColumn, Column, ILink, IKeyValue, IOrderedGroup} from '../model';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {groupByKey} from './TableCellRenderer';\nimport {noRenderer, noop} from './utils';\nimport {cssClass} from '../styles';\n\nexport default class LinkMapCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Table with Links';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return col instanceof LinkMapColumn && mode !== ERenderMode.SUMMARY;\n }\n\n create(col: LinkMapColumn): ICellRenderer {\n const align = col.alignment || 'left';\n return {\n template: `<div class=\"${cssClass('rtable')}\"></div>`,\n update: (node: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(node, col, d)) {\n return;\n }\n node.innerHTML = col.getLinkMap(d).map(({key, value}) => `\n <div class=\"${cssClass('table-cell')}\">${key}</div>\n <div class=\"${cssClass('table-cell')} ${align !== 'left' ? cssClass(align) : ''}\">\n <a href=\"${value.href}\" target=\"_blank\" rel=\"noopener\">${value.alt}</a>\n </div>`).join('');\n },\n render: noop\n };\n }\n\n private static example(arr: IKeyValue<ILink>[]) {\n const numExampleRows = 5;\n const examples = <string[]>[];\n for (const row of arr) {\n if (!row || !row.value.href) {\n continue;\n }\n examples.push(`<a target=\"_blank\" rel=\"noopener\" href=\"${row.value.href}\">${row.value.alt}</a>`);\n if (examples.length >= numExampleRows) {\n break;\n }\n }\n if (examples.length === 0) {\n return '';\n }\n return `${examples.join(', ')}${examples.length < arr.length} ? ', &hellip;': ''}`;\n }\n\n createGroup(col: LinkMapColumn, context: IRenderContext): IGroupCellRenderer {\n const align = col.alignment || 'left';\n return {\n template: `<div class=\"${cssClass('rtable')}\"></div>`,\n update: (node: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupRows(col, group, 'linkmap', (rows) => groupByKey(rows.map((d) => col.getLinkMap(d)))).then((entries) => {\n if (typeof entries === 'symbol') {\n return;\n }\n node.innerHTML = entries.map(({key, values}) => {\n const data = LinkMapCellRenderer.example(values);\n if (!data) {\n return `<div>${key}</div><div class=\"${cssClass('missing')}\"></div>`;\n }\n return `<div>${key}</div><div${align !== 'left' ? ` class=\"${cssClass(align)}\"` : ''}>${data}</div>`;\n }).join('');\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {ICellRendererFactory, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {noop} from './utils';\n\nexport default class LoadingCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Loading';\n\n canRender(): boolean {\n return false; // just direct selection\n }\n\n create() { // no typing because ICellRenderer would not be assignable to IGroupCellRenderer and ISummaryRenderer\n return {\n template: `<div>Loading &hellip;</div>`,\n update: <() => void>noop\n };\n }\n\n createGroup(): IGroupCellRenderer {\n return this.create();\n }\n\n createSummary(): ISummaryRenderer {\n return this.create();\n }\n}\n","import {round} from '../internal';\nimport {Column, IMapColumn, IMapAbleColumn, isMapAbleColumn, isMapColumn, IDataRow, isNumberColumn, INumberColumn} from '../model';\nimport {colorOf} from './impose';\nimport {ICellRendererFactory, IImposer, IRenderContext, ERenderMode, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {noRenderer} from './utils';\nimport {cssClass} from '../styles';\n\nexport default class MapBarCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Bar Table';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return isMapColumn(col) && isNumberColumn(col) && (mode === ERenderMode.CELL || (mode === ERenderMode.SUMMARY && isMapAbleColumn(col)));\n }\n\n create(col: IMapColumn<number> & INumberColumn, _context: IRenderContext, imposer?: IImposer): ICellRenderer {\n const formatter = col.getNumberFormat();\n\n return {\n template: `<div class=\"${cssClass('rtable')}\"></div>`,\n update: (node: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(node, col, d)) {\n return;\n }\n node.innerHTML = col.getMap(d).map(({key, value}) => {\n if (isNaN(value)) {\n return `<div class=\"${cssClass('table-cell')}\">${key}</div><div class=\"${cssClass('table-cell')} ${cssClass('missing')}\"></div>`;\n }\n const w = round(value * 100, 2);\n return `<div class=\"${cssClass('table-cell')}\">${key}</div>\n <div class=\"${cssClass('table-cell')}\" title=\"${formatter(value)}\">\n <div style=\"width: ${w}%; background-color: ${colorOf(col, d, imposer)}\">\n <span class=\"${cssClass('hover-only')}\">${value}</span>\n </div>\n </div>`;\n }).join('');\n }\n };\n }\n\n createGroup(): IGroupCellRenderer {\n return noRenderer;\n }\n\n createSummary(col: IMapColumn<number> & IMapAbleColumn): ISummaryRenderer {\n return {\n template: `<div class=\"${cssClass('rtable')}\"><div>Key</div><div><span></span><span></span>Value</div></div>`,\n update: (node: HTMLElement) => {\n const range = col.getRange();\n const value = <HTMLElement>node.lastElementChild!;\n value.firstElementChild!.textContent = range[0];\n value.children[1]!.textContent = range[1];\n }\n };\n }\n}\n","import {Column, RankColumn, IDataRow, IOrderedGroup} from '../model';\nimport {ICellRendererFactory, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {noRenderer, setText} from './utils';\nimport {cssClass} from '../styles';\n\nexport default class RankCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Default';\n\n canRender(col: Column) {\n return col instanceof RankColumn;\n }\n\n create(col: Column): ICellRenderer {\n return {\n template: `<div class=\"${cssClass('right')}\"> </div>`,\n update: (n: HTMLDivElement, d: IDataRow) => {\n renderMissingDOM(n, col, d);\n setText(n, col.getLabel(d));\n }\n };\n }\n\n createGroup(col: Column): IGroupCellRenderer {\n const ranking = col.findMyRanker()!;\n return {\n template: `<div><div></div><div></div></div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n const fromTSpan = <HTMLElement>n.firstElementChild!;\n const toTSpan = <HTMLElement>n.lastElementChild!;\n if (group.order.length === 0) {\n fromTSpan.textContent = '';\n toTSpan.textContent = '';\n return;\n }\n fromTSpan.textContent = ranking.getRank(group.order[0]).toString();\n toTSpan.textContent = ranking.getRank(group.order[group.order.length - 1]).toString();\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {Column, SelectionColumn, IDataRow, IOrderedGroup} from '../model';\nimport {IRenderContext, ICellRendererFactory, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {cssClass} from '../styles';\nimport {everyIndices} from '../model/internal';\nimport {rangeSelection} from '../provider/utils';\n\nexport default class SelectionRenderer implements ICellRendererFactory {\n readonly title: string = 'Default';\n\n canRender(col: Column) {\n return col instanceof SelectionColumn;\n }\n\n create(col: SelectionColumn, ctx: IRenderContext): ICellRenderer {\n return {\n template: `<div></div>`,\n update: (n: HTMLElement, d: IDataRow, i: number) => {\n n.onclick = function (event) {\n event.preventDefault();\n event.stopPropagation();\n if (event.shiftKey) {\n const ranking = col.findMyRanker()!.id;\n if (rangeSelection(ctx.provider, ranking, d.i, i, event.ctrlKey)) {\n return;\n }\n }\n\n col.toggleValue(d);\n };\n }\n };\n }\n\n createGroup(col: SelectionColumn, context: IRenderContext): IGroupCellRenderer {\n return {\n template: `<div></div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n let selected = 0;\n let unselected = 0;\n const total = group.order.length;\n everyIndices(group.order, (i) => {\n const s = context.provider.isSelected(i);\n if (s) {\n selected++;\n } else {\n unselected++;\n }\n if (selected * 2 > total || unselected * 2 > total) {\n // more than half already, can abort already decided\n return false;\n }\n return true;\n });\n\n n.classList.toggle(cssClass('group-selected'), selected * 2 > total);\n n.onclick = function (event) {\n event.preventDefault();\n event.stopPropagation();\n const value = n.classList.toggle(cssClass('group-selected'));\n col.setValues(group.order, value);\n };\n }\n };\n }\n\n createSummary(col: SelectionColumn, context: IRenderContext): ISummaryRenderer {\n const unchecked = cssClass('icon-unchecked');\n const checked = cssClass('icon-checked');\n return {\n template: `<div title=\"(Un)Select All\" class=\"${unchecked}\"></div>`,\n update: (node: HTMLElement) => {\n node.onclick = (evt) => {\n evt.stopPropagation();\n const isunchecked = node.classList.contains(unchecked);\n if (isunchecked) {\n context.provider.selectAllOf(col.findMyRanker()!);\n node.classList.remove(unchecked);\n node.classList.add(checked);\n } else {\n context.provider.setSelection([]);\n node.classList.remove(checked);\n node.classList.add(unchecked);\n }\n };\n }\n };\n }\n}\n","import {Column, ICategoricalLikeColumn, IDataRow, IOrderedGroup, ISetColumn, isSetColumn} from '../model';\nimport {CANVAS_HEIGHT, cssClass} from '../styles';\nimport {ICellRendererFactory, IRenderContext, ICellRenderer, IGroupCellRenderer, ISummaryRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\nimport {forEachChild, noop, wideEnoughCat} from './utils';\nimport {round} from '../internal';\n\nexport default class SetCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Matrix';\n\n canRender(col: Column): boolean {\n return isSetColumn(col);\n }\n\n private static createDOMContext(col: ICategoricalLikeColumn) {\n const categories = col.categories;\n const mapping = col.getColorMapping();\n let templateRows = '';\n for (const cat of categories) {\n templateRows += `<div class=\"${cssClass('heatmap-cell')}\" title=\"${cat.label}\" style=\"background-color: ${mapping.apply(cat)}\"></div>`;\n }\n return {\n templateRow: templateRows,\n render: (n: HTMLElement, value: (number | boolean)[]) => {\n forEachChild(n, (d: HTMLElement, i) => {\n const v = value[i];\n d.style.opacity = typeof v === 'boolean' ? (v ? '1' : '0') : round(v, 2).toString();\n });\n }\n };\n }\n\n create(col: ISetColumn, context: IRenderContext): ICellRenderer {\n const {templateRow, render} = SetCellRenderer.createDOMContext(col);\n const width = context.colWidth(col);\n const cellDimension = width / col.dataLength!;\n const cats = col.categories;\n const mapping = col.getColorMapping();\n\n return {\n template: `<div class=\"${cssClass('heatmap')}\">${templateRow}</div>`,\n update: (n: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(n, col, d)) {\n return;\n }\n render(n, col.getValues(d));\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n // Circle\n const data = col.getValues(d);\n\n ctx.save();\n cats.forEach((d, j) => {\n if (!data[j]) {\n return;\n }\n const posx = (j * cellDimension);\n ctx.fillStyle = mapping.apply(d);\n ctx.fillRect(posx, 0, cellDimension, CANVAS_HEIGHT);\n });\n\n ctx.restore();\n }\n };\n }\n\n createGroup(col: ISetColumn, context: IRenderContext): IGroupCellRenderer {\n const {templateRow, render} = SetCellRenderer.createDOMContext(col);\n return {\n template: `<div class=\"${cssClass('heatmap')}\">${templateRow}</div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupCategoricalStats(col, group).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const isMissing = !r || !r.group || r.group.count === 0 || r.group.count === r.group.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n render(n, r.group.hist.map((d) => d.count / r.group.maxBin));\n });\n }\n };\n }\n\n createSummary(col: ICategoricalLikeColumn): ISummaryRenderer {\n const categories = col.categories;\n const mapping = col.getColorMapping();\n let templateRows = `<div class=\"${cssClass('heatmap')}\">`;\n const labels = wideEnoughCat(col);\n for (const cat of categories) {\n templateRows += `<div class=\"${cssClass('heatmap-cell')}\" title=\"${cat.label}\"${labels ? ` data-title=\"${cat.label}\"` : ''} style=\"background-color: ${mapping.apply(cat)}\"></div>`;\n }\n templateRows += '</div>';\n return {\n template: templateRows,\n update: noop\n };\n }\n}\n","import {Column, INumbersColumn, NumbersColumn, isNumbersColumn, IDataRow, IOrderedGroup, isMissingValue} from '../model';\nimport {matchRows} from './ANumbersCellRenderer';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {forEachChild, noRenderer} from './utils';\nimport {ISequence} from '../internal';\nimport {cssClass} from '../styles';\n\n/** @internal */\nexport function line(data: ISequence<number>) {\n if (data.length === 0) {\n return '';\n }\n let p = '';\n let moveNext = true;\n\n data.forEach((d, i) => {\n if (isNaN(d)) {\n moveNext = true;\n } else if (moveNext) {\n p += `M${i},${1 - d} `;\n moveNext = false;\n } else {\n p += `L${i},${1 - d} `;\n }\n });\n return p;\n}\n\nexport default class SparklineCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Sparkline';\n\n canRender(col: Column, mode: ERenderMode) {\n return isNumbersColumn(col) && mode !== ERenderMode.SUMMARY;\n }\n\n create(col: INumbersColumn): ICellRenderer {\n const dataLength = col.dataLength!;\n const yPos = 1 - col.getMapping().apply(NumbersColumn.CENTER);\n return {\n template: `<svg viewBox=\"0 0 ${dataLength - 1} 1\" preserveAspectRatio=\"none meet\"><line x1=\"0\" x2=\"${dataLength - 1}\" y1=\"${yPos}\" y2=\"${yPos}\"></line><path></path></svg>`,\n update: (n: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(n, col, d)) {\n return;\n }\n const data = col.getNumbers(d);\n n.lastElementChild!.setAttribute('d', line(data));\n }\n };\n }\n\n createGroup(col: INumbersColumn, context: IRenderContext): IGroupCellRenderer {\n const dataLength = col.dataLength!;\n const yPos = 1 - col.getMapping().apply(NumbersColumn.CENTER);\n return {\n template: `<svg viewBox=\"0 0 ${dataLength} 1\" preserveAspectRatio=\"none meet\"><line x1=\"0\" x2=\"${dataLength - 1}\" y1=\"${yPos}\" y2=\"${yPos}\"></line><path></path></svg>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n //overlapping ones\n matchRows(n, group.order.length, `<path></path>`);\n return context.tasks.groupRows(col, group, 'numbers', (r) => Array.from(r.map((d) => col.getNumbers(d)))).then((vs) => {\n if (typeof vs === 'symbol') {\n return;\n }\n const isMissing = vs.length === 0 || vs.every((v) => v.every(isMissingValue));\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n forEachChild(n, ((row, i) => {\n row.setAttribute('d', line(vs[i]));\n }));\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n\n}\n","import {Column, IDataRow, IOrderedGroup, ISetColumn, isSetColumn} from '../model';\nimport {CANVAS_HEIGHT, cssClass, UPSET} from '../styles';\nimport {ICellRendererFactory, IRenderContext, ISummaryRenderer, IGroupCellRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingCanvas, renderMissingDOM} from './missing';\n\nexport default class UpSetCellRenderer implements ICellRendererFactory {\n readonly title: string = 'UpSet';\n\n canRender(col: Column) {\n return isSetColumn(col);\n }\n\n private static calculateSetPath(setData: boolean[], cellDimension: number) {\n const catindexes: number[] = [];\n setData.forEach((d: boolean, i: number) => (d) ? catindexes.push(i) : -1);\n\n const left = (catindexes[0] * cellDimension) + (cellDimension / 2);\n const right = (catindexes[catindexes.length - 1] * cellDimension) + (cellDimension / 2);\n\n return {left, right};\n }\n\n private static createDOMContext(col: ISetColumn) {\n const categories = col.categories;\n let templateRows = '';\n for (const cat of categories) {\n templateRows += `<div class=\"${cssClass('upset-dot')}\" title=\"${cat.label}\"></div>`;\n }\n return {\n template: `<div><div class=\"${cssClass('upset-line')}\"></div>${templateRows}</div>`,\n render: (n: HTMLElement, value: boolean[]) => {\n Array.from(n.children).slice(1).forEach((d, i) => {\n const v = value[i];\n d.classList.toggle(cssClass('enabled'), v);\n });\n\n const line = <HTMLElement>n.firstElementChild;\n const left = value.findIndex((d) => d);\n const right = (value.length - 1) - value.reverse().findIndex((d) => d);\n\n if (left < 0 || left === right) {\n line.style.display = 'none';\n return;\n }\n line.style.display = null;\n line.style.left = `${Math.round(100 * (left + 0.5) / value.length)}%`;\n line.style.width = `${Math.round(100 * (right - left) / value.length)}%`;\n }\n };\n }\n\n create(col: ISetColumn, context: IRenderContext): ICellRenderer {\n const {template, render} = UpSetCellRenderer.createDOMContext(col);\n const width = context.colWidth(col);\n const cellDimension = width / col.categories.length;\n\n return {\n template,\n update: (n: HTMLElement, d: IDataRow) => {\n if (renderMissingDOM(n, col, d)) {\n return;\n }\n render(n, col.getValues(d));\n },\n render: (ctx: CanvasRenderingContext2D, d: IDataRow) => {\n if (renderMissingCanvas(ctx, col, d, width)) {\n return;\n }\n // Circle\n const data = col.getValues(d);\n\n const hasTrueValues = data.some((d) => d); //some values are true?\n\n ctx.save();\n ctx.fillStyle = UPSET.color;\n ctx.strokeStyle = UPSET.color;\n if (hasTrueValues) {\n const {left, right} = UpSetCellRenderer.calculateSetPath(data, cellDimension);\n ctx.beginPath();\n ctx.moveTo(left, CANVAS_HEIGHT / 2);\n ctx.lineTo(right, CANVAS_HEIGHT / 2);\n ctx.stroke();\n }\n\n data.forEach((d, j) => {\n const posx = (j * cellDimension);\n ctx.beginPath();\n ctx.globalAlpha = d ? 1 : UPSET.inactive;\n ctx.fillRect(posx, 0, cellDimension, CANVAS_HEIGHT);\n ctx.fill();\n });\n\n ctx.restore();\n }\n };\n }\n\n createGroup(col: ISetColumn, context: IRenderContext): IGroupCellRenderer {\n const {template, render} = UpSetCellRenderer.createDOMContext(col);\n return {\n template,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupCategoricalStats(col, group).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n render(n, r.group.hist.map((d) => d.count > 0));\n });\n }\n };\n }\n\n createSummary(col: ISetColumn, context: IRenderContext): ISummaryRenderer {\n const {template, render} = UpSetCellRenderer.createDOMContext(col);\n return {\n template,\n update: (n: HTMLElement) => {\n return context.tasks.summaryCategoricalStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n render(n, r.summary.hist.map((d) => d.count > 0));\n });\n }\n };\n }\n}\n","import {Column, NumbersColumn, IDataRow, INumbersColumn, isNumbersColumn} from '../model';\nimport {CANVAS_HEIGHT, cssClass} from '../styles';\nimport {ANumbersCellRenderer} from './ANumbersCellRenderer';\nimport {toHeatMapColor} from './BrightnessCellRenderer';\nimport {IRenderContext, ERenderMode, ICellRendererFactory, IImposer, ISummaryRenderer} from './interfaces';\nimport {forEachChild, noRenderer} from './utils';\n\nexport default class VerticalBarCellRenderer extends ANumbersCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Bar Chart';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return isNumbersColumn(col) && Boolean(col.dataLength) && mode === ERenderMode.CELL;\n }\n\n private static compute(v: number, threshold: number, domain: number[]) {\n if (v < threshold) {\n //threshold to down\n return {height: (threshold - v), bottom: (v - domain[0])};\n }\n //from top to down\n return {height: (v - threshold), bottom: (threshold - domain[0])};\n }\n\n protected createContext(col: INumbersColumn, context: IRenderContext, imposer?: IImposer) {\n const cellDimension = context.colWidth(col) / col.dataLength!;\n const threshold = col.getMapping().apply(NumbersColumn.CENTER);\n const range = 1;\n let templateRows = '';\n for (let i = 0; i < col.dataLength!; ++i) {\n templateRows += `<div class=\"${cssClass('heatmap-cell')}\" style=\"background-color: white\" title=\"\"></div>`;\n }\n const formatter = col.getNumberFormat();\n\n return {\n clazz: cssClass('heatmap'),\n templateRow: templateRows,\n update: (row: HTMLElement, data: number[], raw: number[], item: IDataRow, tooltipPrefix?: string) => {\n const zero = toHeatMapColor(0, item, col, imposer);\n const one = toHeatMapColor(1, item, col, imposer);\n\n forEachChild(row, (d: HTMLElement, i) => {\n const v = data[i];\n const {bottom, height} = VerticalBarCellRenderer.compute(v, threshold, [0, 1]);\n d.title = `${tooltipPrefix || ''}${formatter(raw[i])}`;\n d.style.backgroundColor = v < threshold ? zero : one;\n d.style.bottom = `${Math.round((100 * bottom) / range)}%`;\n d.style.height = `${Math.round((100 * height) / range)}%`;\n });\n },\n render: (ctx: CanvasRenderingContext2D, data: number[], item: IDataRow) => {\n const zero = toHeatMapColor(0, item, col, imposer);\n const one = toHeatMapColor(1, item, col, imposer);\n const scale = CANVAS_HEIGHT / range;\n data.forEach((v, j) => {\n ctx.fillStyle = v < threshold ? zero : one;\n const xpos = (j * cellDimension);\n const {bottom, height} = VerticalBarCellRenderer.compute(v, threshold, [0, 1]);\n ctx.fillRect(xpos, (range - height - bottom) * scale, cellDimension, height * scale);\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {Column, IDataRow, DateColumn, IOrderedGroup} from '../model';\nimport {IRenderContext, ICellRendererFactory, IGroupCellRenderer, ISummaryRenderer, ICellRenderer} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {noop, noRenderer, setText, exampleText} from './utils';\nimport {chooseAggregatedDate} from '../model/internalDate';\nimport {cssClass} from '../styles';\n\nexport default class DateCellRenderer implements ICellRendererFactory {\n title: string = 'Date';\n groupTitle: string = 'Date';\n summaryTitle: string = 'Date';\n\n canRender(col: Column): boolean {\n return col instanceof DateColumn;\n }\n\n create(col: DateColumn): ICellRenderer {\n return {\n template: `<div> </div>`,\n update: (n: HTMLDivElement, d: IDataRow) => {\n renderMissingDOM(n, col, d);\n setText(n, col.getLabel(d));\n },\n render: noop\n };\n }\n\n createGroup(col: DateColumn, context: IRenderContext): IGroupCellRenderer {\n return {\n template: `<div> </div>`,\n update: (n: HTMLDivElement, group: IOrderedGroup) => {\n const isGrouped = col.isGroupedBy() >= 0;\n if (isGrouped) {\n return context.tasks.groupRows(col, group, 'date', (rows) => chooseAggregatedDate(rows, col.getDateGrouper(), col)).then((chosen) => {\n if (typeof chosen === 'symbol') {\n return;\n }\n n.classList.toggle(cssClass('missing'), !chosen);\n setText(n, chosen ? chosen.name : '');\n });\n }\n return context.tasks.groupExampleRows(col, group, 'date', (sample) => exampleText(col, sample)).then((text) => {\n if (typeof text === 'symbol') {\n return;\n }\n n.classList.toggle(cssClass('missing'), !text);\n setText(n, text);\n });\n }\n };\n }\n\n createSummary(): ISummaryRenderer {\n return noRenderer;\n }\n}\n","import {IDialogContext} from './ADialog';\nimport {timeFormat} from 'd3-time-format';\nimport APopup from './APopup';\n\n/** @internal */\nexport interface IInputDateOptions {\n value: Date | null;\n label: string | null;\n}\n\n/** @internal */\nexport default class InputDateDialog extends APopup {\n\n private readonly ioptions: Readonly<IInputDateOptions> = {\n value: null,\n label: null\n };\n\n constructor(dialog: IDialogContext, private readonly callback: (value: Date | null) => void, options: Partial<IInputDateOptions> = {}) {\n super(dialog);\n Object.assign(this.ioptions, options);\n }\n\n protected build(node: HTMLElement) {\n const o = this.ioptions;\n\n const f = timeFormat('%Y-%m-%d');\n\n node.insertAdjacentHTML('beforeend', `\n <input type=\"date\" value=\"${o.value ? f(o.value) : ''}\" required autofocus placeholder=\"${o.label ? o.label : 'enter date'}\">\n `);\n this.findInput('input[type=date]').addEventListener('keypress', (evt) => {\n if (evt.key === 'Enter') {\n this.triggerSubmit();\n }\n });\n this.enableLivePreviews('input');\n }\n\n submit() {\n this.callback(this.findInput('input[type=date]').valueAsDate);\n return true;\n }\n}\n","import {dateStatsBuilder, IDateStatistics} from '../internal';\nimport {Column, IDataRow, IDateColumn, IDatesColumn, IOrderedGroup, isDateColumn, isDatesColumn, Ranking} from '../model';\nimport {cssClass, engineCssClass} from '../styles';\nimport {ERenderMode, ICellRendererFactory, IRenderContext, ICellRenderer, IGroupCellRenderer, ISummaryRenderer, IRenderTasks} from './interfaces';\nimport {renderMissingDOM} from './missing';\nimport {colorOf} from './utils';\nimport {histogramUpdate, histogramTemplate, mappingHintTemplate, mappingHintUpdate, IFilterInfo, IFilterContext, filteredHistTemplate, initFilter} from './histogram';\nimport InputDateDialog from '../ui/dialogs/InputDateDialog';\nimport {shiftFilterDateDay, noDateFilter} from '../model/internalDate';\nimport DialogManager from '../ui/dialogs/DialogManager';\n\nexport default class DateHistogramCellRenderer implements ICellRendererFactory {\n readonly title: string = 'Histogram';\n\n canRender(col: Column, mode: ERenderMode): boolean {\n return (isDateColumn(col) && mode !== ERenderMode.CELL) || (isDatesColumn(col) && mode === ERenderMode.CELL);\n }\n\n create(col: IDatesColumn, _context: IRenderContext): ICellRenderer {\n const {template, render} = getHistDOMRenderer(col);\n return {\n template: `${template}</div>`,\n update: (n: HTMLElement, row: IDataRow) => {\n if (renderMissingDOM(n, col, row)) {\n return;\n }\n const b = dateStatsBuilder();\n for (const n of col.getDates(row)) {\n b.push(n);\n }\n const hist = b.build();\n render(n, hist);\n }\n };\n }\n\n createGroup(col: IDateColumn, context: IRenderContext): IGroupCellRenderer {\n const {template, render} = getHistDOMRenderer(col);\n return {\n template: `${template}</div>`,\n update: (n: HTMLElement, group: IOrderedGroup) => {\n return context.tasks.groupDateStats(col, group).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const isMissing = !r || r.group == null || r.group.count === 0 || r.group.count === r.group.missing;\n n.classList.toggle(cssClass('missing'), isMissing);\n if (isMissing) {\n return;\n }\n render(n, r.group);\n });\n }\n };\n }\n\n createSummary(col: IDateColumn, context: IRenderContext, interactive: boolean): ISummaryRenderer {\n const r = getHistDOMRenderer(col);\n return interactive ? interactiveSummary(col, context, r.template, r.render) : staticSummary(col, context, false, r.template, r.render);\n }\n}\n\n\nfunction staticSummary(col: IDateColumn, context: IRenderContext, interactive: boolean, template: string, render: (n: HTMLElement, stats: IDateStatistics, unfiltered?: IDateStatistics) => void) {\n template += mappingHintTemplate(['', '']);\n\n return {\n template: `${template}</div>`,\n update: (node: HTMLElement) => {\n return context.tasks.summaryDateStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const {summary, data} = r;\n\n node.classList.toggle(cssClass('missing'), !summary);\n if (!summary) {\n return;\n }\n const formatter = col.getFormatter();\n mappingHintUpdate(node, [formatter(summary.min), formatter(summary.max)]);\n\n render(node, summary, interactive ? data: undefined);\n });\n }\n };\n}\n\n\nfunction interactiveSummary(col: IDateColumn, context: IRenderContext, template: string, render: (n: HTMLElement, stats: IDateStatistics, unfiltered?: IDateStatistics) => void) {\n const filter = col.getFilter();\n const dummyDomain: [number, number] = [isFinite(filter.min) ? filter.min : 0, isFinite(filter.max) ? filter.max : 100];\n\n template += filteredHistTemplate(createFilterContext(col, context, dummyDomain), createFilterInfo(col, dummyDomain));\n\n let fContext: IFilterContext<number>;\n let updateFilter: (missing: number, f: IFilterInfo<number>) => void;\n\n return {\n template: `${template}</div>`,\n update: (node: HTMLElement) => {\n return context.tasks.summaryDateStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const {summary, data} = r;\n if (!updateFilter) {\n const domain: [number, number] = [data.min ? data.min.getTime() : Date.now(), data.max ? data.max.getTime() : Date.now()];\n fContext = createFilterContext(col, context, domain);\n updateFilter = initFilter(node, fContext);\n }\n\n updateFilter(data ? data.missing : (summary ? summary.missing : 0), createFilterInfo(col, fContext.domain));\n\n node.classList.add(cssClass('histogram-i'));\n node.classList.toggle(cssClass('missing'), !summary);\n if (!summary) {\n return;\n }\n render(node, summary, data);\n });\n }\n };\n}\n\n\n/** @internal */\nexport function createDateFilter(col: IDateColumn, parent: HTMLElement, context: {idPrefix: string, dialogManager: DialogManager, tasks: IRenderTasks}, livePreviews: boolean) {\n const renderer = getHistDOMRenderer(col);\n const filter = col.getFilter();\n\n let domain: [number, number] = [isFinite(filter.min) ? filter.min : 0, isFinite(filter.max) ? filter.max : 100];\n\n let fContext = createFilterContext(col, context, domain);\n let applyFilter = fContext.setFilter;\n let currentFilter = createFilterInfo(col, domain);\n fContext.setFilter = (filterMissing, min, max) => {\n currentFilter = {filterMissing, filterMin: min, filterMax: max};\n if (livePreviews) {\n applyFilter(filterMissing, min, max);\n }\n };\n parent.innerHTML = `${renderer.template}${filteredHistTemplate(fContext, createFilterInfo(col, domain))}</div>`;\n const summaryNode = <HTMLElement>parent.firstElementChild!;\n summaryNode.classList.add(cssClass('summary'), cssClass('renderer'));\n summaryNode.dataset.renderer = 'histogram';\n summaryNode.dataset.interactive = '';\n summaryNode.classList.add(cssClass('histogram-i'));\n\n\n let updateFilter: null | ((missing: number, filter: IFilterInfo<number>) => void) = null;\n const prepareRender = (min: Date | null, max: Date | null) => {\n // reinit with proper domain\n domain = [min ? min.getTime() : Date.now(), max ? max.getTime() : Date.now()];\n fContext = createFilterContext(col, context, domain);\n applyFilter = fContext.setFilter;\n currentFilter = createFilterInfo(col, domain);\n fContext.setFilter = (filterMissing, min, max) => {\n currentFilter = {filterMissing, filterMin: min, filterMax: max};\n if (livePreviews) {\n applyFilter(filterMissing, min, max);\n }\n };\n return initFilter(summaryNode, fContext);\n };\n\n const rerender = () => {\n const ready = context.tasks.summaryDateStats(col).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const {summary, data} = r;\n if (!updateFilter) {\n updateFilter = prepareRender(data.min, data.max);\n }\n updateFilter(data ? data.missing : (summary ? summary.missing : 0), currentFilter);\n summaryNode.classList.toggle(cssClass('missing'), !summary);\n if (!summary) {\n return;\n }\n renderer.render(summaryNode, summary, data);\n });\n if (!ready) {\n return;\n }\n summaryNode.classList.add(engineCssClass('loading'));\n ready.then(() => {\n summaryNode.classList.remove(engineCssClass('loading'));\n });\n };\n\n const ranking = col.findMyRanker()!;\n\n if (ranking) {\n ranking.on(`${Ranking.EVENT_ORDER_CHANGED}.numberFilter`, () => rerender());\n }\n rerender();\n\n return {\n cleanUp() {\n if (ranking) {\n ranking.on(`${Ranking.EVENT_ORDER_CHANGED}.numberFilter`, null);\n }\n },\n reset() {\n currentFilter = createFilterInfo(col, domain, noDateFilter());\n rerender();\n },\n submit() {\n applyFilter(currentFilter.filterMissing, currentFilter.filterMin, currentFilter.filterMax);\n }\n };\n}\n\n\nfunction getHistDOMRenderer(col: IDateColumn) {\n const guessedBins = 10;\n\n const formatter = col.getFormatter();\n const color = colorOf(col)!;\n\n const render = (n: HTMLElement, stats: IDateStatistics, unfiltered?: IDateStatistics) => {\n return histogramUpdate(n, stats, unfiltered || null, formatter, () => color);\n };\n return {\n template: histogramTemplate(guessedBins),\n render,\n guessedBins\n };\n}\n\nfunction createFilterInfo(col: IDateColumn, domain: [number, number], filter = col.getFilter()): IFilterInfo<number> {\n const filterMin = isFinite(filter.min) ? filter.min : domain[0];\n const filterMax = isFinite(filter.max) ? filter.max : domain[1];\n return {\n filterMissing: filter.filterMissing,\n filterMin,\n filterMax\n };\n}\n\nfunction createFilterContext(col: IDateColumn, context: {idPrefix: string, dialogManager: DialogManager}, domain: [number, number]): IFilterContext<number> {\n const clamp = (v: number) => Math.max(0, Math.min(100, v));\n const percent = (v: number) => clamp(Math.round(100 * (v - domain[0]) / (domain[1] - domain[0])));\n const unpercent = (v: number) => ((v / 100) * (domain[1] - domain[0]) + domain[0]);\n return {\n percent,\n unpercent,\n domain,\n format: (v) => isNaN(v) ? '' : col.getFormatter()(new Date(v)),\n formatRaw: String,\n parseRaw: (v) => Number.parseInt(v, 10),\n setFilter: (filterMissing, minValue, maxValue) => col.setFilter({\n filterMissing,\n min: Math.abs(minValue - domain[0]) < 0.001 ? Number.NEGATIVE_INFINITY : shiftFilterDateDay(minValue, 'min'),\n max: Math.abs(maxValue - domain[1]) < 0.001 ? Number.POSITIVE_INFINITY : shiftFilterDateDay(maxValue, 'max')\n }),\n edit: (value, attachment, type) => {\n return new Promise((resolve) => {\n const dialogCtx = {\n attachment,\n manager: context.dialogManager,\n level: context.dialogManager.maxLevel + 1,\n idPrefix: context.idPrefix\n };\n const dialog = new InputDateDialog(dialogCtx, (d) => resolve(d == null ? NaN : shiftFilterDateDay(d.getTime(), type)), {value: isNaN(value) ? null : new Date(value)});\n dialog.open();\n });\n }\n };\n}\n","import {Column} from '../model';\nimport ActionRenderer from './ActionRenderer';\nimport AggregateGroupRenderer from './AggregateGroupRenderer';\nimport AnnotationRenderer from './AnnotationRenderer';\nimport BarCellRenderer from './BarCellRenderer';\nimport BooleanCellRenderer from './BooleanCellRenderer';\nimport BoxplotCellRenderer from './BoxplotCellRenderer';\nimport BrightnessCellRenderer from './BrightnessCellRenderer';\nimport CategoricalCellRenderer from './CategoricalCellRenderer';\nimport CategoricalHeatmapCellRenderer from './CategoricalHeatmapCellRenderer';\nimport CategoricalStackedDistributionlCellRenderer from './CategoricalStackedDistributionlCellRenderer';\nimport CircleCellRenderer from './CircleCellRenderer';\nimport {DefaultCellRenderer} from './DefaultCellRenderer';\nimport DotCellRenderer from './DotCellRenderer';\nimport GroupCellRenderer from './GroupCellRenderer';\nimport HeatmapCellRenderer from './HeatmapCellRenderer';\nimport HistogramCellRenderer from './HistogramCellRenderer';\nimport ImageCellRenderer from './ImageCellRenderer';\nimport {ERenderMode, ICellRendererFactory} from './interfaces';\nimport InterleavingCellRenderer from './InterleavingCellRenderer';\nimport LinkCellRenderer from './LinkCellRenderer';\nimport LinkMapCellRenderer from './LinkMapCellRenderer';\nimport LoadingCellRenderer from './LoadingCellRenderer';\nimport MapBarCellRenderer from './MapBarCellRenderer';\nimport MultiLevelCellRenderer from './MultiLevelCellRenderer';\nimport RankCellRenderer from './RankCellRenderer';\nimport SelectionRenderer from './SelectionRenderer';\nimport SetCellRenderer from './SetCellRenderer';\nimport SparklineCellRenderer from './SparklineCellRenderer';\nimport StringCellRenderer from './StringCellRenderer';\nimport TableCellRenderer from './TableCellRenderer';\nimport UpSetCellRenderer from './UpSetCellRenderer';\nimport VerticalBarCellRenderer from './VerticalBarCellRenderer';\nimport DateCellRenderer from './DateCellRenderer';\nimport DateHistogramCellRenderer from './DateHistogramCellRenderer';\n\nconst defaultCellRenderer = new DefaultCellRenderer();\n/**\n * default render factories\n */\nexport const renderers: { [key: string]: ICellRendererFactory } = {\n actions: new ActionRenderer(),\n aggregate: new AggregateGroupRenderer(),\n annotate: new AnnotationRenderer(),\n boolean: new BooleanCellRenderer(),\n boxplot: new BoxplotCellRenderer(),\n brightness: new BrightnessCellRenderer(),\n catdistributionbar: new CategoricalStackedDistributionlCellRenderer(),\n categorical: new CategoricalCellRenderer(),\n circle: new CircleCellRenderer(),\n date: new DateCellRenderer(),\n default: defaultCellRenderer,\n dot: new DotCellRenderer(),\n group: new GroupCellRenderer(),\n heatmap: new HeatmapCellRenderer(),\n catheatmap: new CategoricalHeatmapCellRenderer(),\n histogram: new HistogramCellRenderer(),\n datehistogram: new DateHistogramCellRenderer(),\n image: new ImageCellRenderer(),\n interleaving: new InterleavingCellRenderer(),\n link: new LinkCellRenderer(),\n linkMap: new LinkMapCellRenderer(),\n loading: new LoadingCellRenderer(),\n nested: new MultiLevelCellRenderer(false),\n number: new BarCellRenderer(),\n mapbars: new MapBarCellRenderer(),\n rank: new RankCellRenderer(),\n selection: new SelectionRenderer(),\n set: new SetCellRenderer(),\n sparkline: new SparklineCellRenderer(),\n stack: new MultiLevelCellRenderer(),\n string: new StringCellRenderer(),\n table: new TableCellRenderer(),\n upset: new UpSetCellRenderer(),\n verticalbar: new VerticalBarCellRenderer()\n};\n\nexport function chooseRenderer(col: Column, renderers: { [key: string]: ICellRendererFactory }): ICellRendererFactory {\n const r = renderers[col.getRenderer()];\n return r && typeof r.create === 'function' ? r : defaultCellRenderer;\n}\n\nexport function chooseGroupRenderer(col: Column, renderers: { [key: string]: ICellRendererFactory }): ICellRendererFactory {\n const r = renderers[col.getGroupRenderer()];\n return r && typeof r.createGroup === 'function' ? r : defaultCellRenderer;\n}\n\nexport function chooseSummaryRenderer(col: Column, renderers: { [key: string]: ICellRendererFactory }): ICellRendererFactory {\n const r = renderers[col.getSummaryRenderer()];\n return r && typeof r.createSummary === 'function' ? r : defaultCellRenderer;\n}\n\n/**\n * determined the list of possible renderers for a given colum\n * @param col the column to resolve the renderers\n * @param renderers map of possible renderers\n * @param canRender optional custom canRender function\n */\nexport function getPossibleRenderer(col: Column, renderers: { [key: string]: ICellRendererFactory }, canRender?: (type: string, renderer: ICellRendererFactory, col: Column, mode: ERenderMode) => boolean) {\n const all = Object.keys(renderers).filter(Boolean).map((type) => ({type, factory: renderers[type]}));\n\n const item = all.filter(({type, factory}) => typeof factory.create === 'function' && factory.canRender(col, ERenderMode.CELL) && (!canRender || canRender(type, factory, col, ERenderMode.CELL)));\n const group = all.filter(({type, factory}) => typeof factory.createGroup === 'function' && factory.canRender(col, ERenderMode.GROUP) && (!canRender || canRender(type, factory, col, ERenderMode.GROUP)));\n const summary = all.filter(({type, factory}) => typeof factory.createSummary === 'function' && factory.canRender(col, ERenderMode.SUMMARY) && (!canRender || canRender(type, factory, col, ERenderMode.SUMMARY)));\n\n return {\n item: item.map(({type, factory}) => ({type, label: factory.title})),\n group: group.map(({type, factory}) => ({type, label: factory.groupTitle || factory.title})),\n summary: summary.map(({type, factory}) => ({type, label: factory.summaryTitle || factory.groupTitle || factory.title}))\n };\n}\n","import {ICategoricalColumn, CategoricalsColumn, CategoricalMapColumn, ICategory, ICategoricalColorMappingFunction} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {uniqueId} from './utils';\nimport {cssClass} from '../../styles';\nimport {color} from 'd3-color';\nimport {schemeCategory10, schemeAccent, schemeDark2, schemePastel1, schemePastel2, schemeSet1, schemeSet2, schemeSet3} from 'd3-scale-chromatic';\nimport {DEFAULT_CATEGORICAL_COLOR_FUNCTION, ReplacmentColorMappingFunction} from '../../model/CategoricalColorMappingFunction';\n\nconst sets: {[key: string]: ReadonlyArray<string>} = {schemeCategory10, schemeAccent, schemeDark2, schemePastel1, schemePastel2, schemeSet1, schemeSet2, schemeSet3};\n\n/** @internal */\nexport default class CategoricalColorMappingDialog extends ADialog {\n\n private readonly before: ICategoricalColorMappingFunction;\n\n constructor(private readonly column: ICategoricalColumn | CategoricalsColumn | CategoricalMapColumn, dialog: IDialogContext) {\n super(dialog, {\n livePreview: 'colorMapping'\n });\n\n this.before = column.getColorMapping().clone();\n }\n\n protected build(node: HTMLElement) {\n const id = uniqueId(this.dialog.idPrefix);\n const mapping = this.column.getColorMapping();\n node.insertAdjacentHTML('beforeend', `<div class=\"${cssClass('dialog-table')}\">\n <div class=\"${cssClass('dialog-color-table-entry')}\">\n <select id=\"${id}Chooser\">\n <option value=\"\">Apply Color Scheme...</option>\n <option value=\"schemeCategory10\">D3 Category 10 (${schemeCategory10.length})</option>\n <option value=\"schemeSet1\">Set 1 (${schemeSet1.length})</option>\n <option value=\"schemeSet2\">Set 2 (${schemeSet2.length})</option>\n <option value=\"schemeSet3\">Set 3 (${schemeSet3.length})</option>\n <option value=\"schemeAccent\">Accent (${schemeAccent.length})</option>\n <option value=\"schemeDark2\">Dark2 (${schemeDark2.length})</option>\n <option value=\"schemePastel1\">Pastel 1 (${schemePastel1.length})</option>\n <option value=\"schemePastel2\">Pastel 2 (${schemePastel2.length})</option>\n </select>\n </div>\n ${this.column.categories.map((d) => `\n <label class=\"${cssClass('checkbox')} ${cssClass('dialog-color-table-entry')}\">\n <input data-cat=\"${d.name}\" type=\"color\" value=\"${color(mapping.apply(d))!.hex()}\">\n <span>${d.label}</span>\n </label>`).join('')}\n </div>`);\n\n this.findInput('select').onchange = (evt) => {\n const scheme = sets[(<HTMLInputElement>evt.currentTarget).value];\n if (!scheme) {\n return;\n }\n this.forEach('[data-cat]', (n: HTMLInputElement, i) => {\n n.value = scheme[i % scheme.length];\n });\n if (this.showLivePreviews()) {\n this.submit();\n }\n };\n\n this.enableLivePreviews('input[type=color]');\n }\n\n reset() {\n const cats = this.column.categories;\n this.forEach('[data-cat]', (n: HTMLInputElement, i) => {\n n.value = color(cats[i]!.color)!.hex();\n });\n }\n\n submit() {\n const cats = this.column.categories;\n const map = new Map<ICategory, string>();\n this.forEach('input[data-cat]', (n: HTMLInputElement, i) => {\n const cat = cats[i];\n if (color(cat.color)!.hex() !== n.value) {\n map.set(cat, n.value);\n }\n });\n if (map.size === 0) {\n this.column.setColorMapping(DEFAULT_CATEGORICAL_COLOR_FUNCTION);\n } else {\n this.column.setColorMapping(new ReplacmentColorMappingFunction(map));\n }\n return true;\n }\n\n cancel() {\n this.column.setColorMapping(this.before);\n }\n}\n","import {SetColumn, CategoricalColumn, ICategoricalFilter, ISetCategoricalFilter, Ranking, BooleanColumn} from '../../model';\nimport {findFilterMissing, updateFilterMissingNumberMarkup, filterMissingNumberMarkup} from '../missing';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {forEach} from './utils';\nimport {cssClass, engineCssClass} from '../../styles';\nimport {isCategoryIncluded} from '../../model/internalCategorical';\nimport {IRankingHeaderContext} from '../interfaces';\n\n/** @internal */\nexport default class CategoricalFilterDialog extends ADialog {\n\n private readonly before: ICategoricalFilter;\n\n constructor(private readonly column: CategoricalColumn | SetColumn | BooleanColumn, dialog: IDialogContext, private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n livePreview: 'filter'\n });\n this.before = this.column.getFilter() || {filter: '', filterMissing: false};\n }\n\n protected build(node: HTMLElement) {\n node.insertAdjacentHTML('beforeend', `<div class=\"${cssClass('dialog-table')}\">\n <label class=\"${cssClass('checkbox')} ${cssClass('dialog-filter-table-entry')}\">\n <input type=\"checkbox\" checked>\n <span>\n <span class=\"${cssClass('dialog-filter-table-color')}\"></span>\n <div>Un/Select All</div>\n </span>\n </label>\n ${this.column.categories.map((c) => `<label class=\"${cssClass('checkbox')} ${cssClass('dialog-filter-table-entry')}\">\n <input data-cat=\"${c.name}\" type=\"checkbox\"${isCategoryIncluded(this.before, c) ? 'checked' : ''}>\n <span>\n <span class=\"${cssClass('dialog-filter-table-color')}\" style=\"background-color: ${c.color}\"></span>\n <div class=\"${cssClass('dialog-filter-table-entry-label')}\">${c.label}</div>\n <div class=\"${cssClass('dialog-filter-table-entry-stats')}\"></div>\n </span>\n </label>`).join('')}\n </div>`);\n // selectAll\n const selectAll = this.findInput('input:not([data-cat])');\n selectAll.onchange = () => {\n forEach(node, 'input[data-cat]', (n: HTMLInputElement) => n.checked = selectAll.checked);\n };\n if (this.column instanceof SetColumn) {\n const some = (<ISetCategoricalFilter>this.before).mode !== 'every';\n node.insertAdjacentHTML('beforeend', `<strong>Show rows where</strong>`);\n node.insertAdjacentHTML('beforeend', `<label class=\"${cssClass('checkbox')}\">\n <input type=\"radio\" ${!some ? 'checked=\"checked\"' : ''} name=\"mode\" value=\"every\">\n <span>all are selected</span>\n </label>`);\n node.insertAdjacentHTML('beforeend', `<label class=\"${cssClass('checkbox')}\" style=\"padding-bottom: 0.6em\">\n <input type=\"radio\" ${some ? 'checked=\"checked\"' : ''} name=\"mode\" value=\"some\">\n <span>some are selected</span>\n </label>`);\n }\n node.insertAdjacentHTML('beforeend', filterMissingNumberMarkup(this.before.filterMissing, 0));\n\n this.enableLivePreviews('input[type=checkbox],input[type=radio]');\n\n const ranking = this.column.findMyRanker()!;\n if (ranking) {\n ranking.on(`${Ranking.EVENT_ORDER_CHANGED}.catFilter`, () => this.updateStats());\n }\n this.updateStats();\n }\n\n private updateStats() {\n const ready = this.ctx.provider.getTaskExecutor().summaryCategoricalStats(this.column).then((r) => {\n if (typeof r === 'symbol') {\n return;\n }\n const {summary, data} = r;\n const missing = data ? data.missing : (summary ? summary.missing : 0);\n updateFilterMissingNumberMarkup(<HTMLElement>findFilterMissing(this.node).parentElement, missing);\n if (!summary || !data) {\n return;\n }\n this.forEach(`.${cssClass('dialog-filter-table-entry-stats')}`, (n: HTMLElement, i) => {\n const bin = summary.hist[i];\n const raw = data.hist[i];\n n.textContent = `${bin.count}/${raw.count}`;\n });\n });\n if (!ready) {\n return;\n }\n this.node.classList.add(engineCssClass('loading'));\n ready.then(() => {\n this.node.classList.remove(engineCssClass('loading'));\n });\n }\n\n private updateFilter(filter: string[] | null | RegExp | string, filterMissing: boolean, someMode = false) {\n const noFilter = filter == null && filterMissing === false;\n const f: ISetCategoricalFilter = {filter: filter!, filterMissing};\n if (this.column instanceof SetColumn) {\n f.mode = someMode ? 'some' : 'every';\n }\n this.column.setFilter(noFilter ? null : f);\n }\n\n protected reset() {\n this.forEach('input[data-cat]', (n: HTMLInputElement) => n.checked = true);\n findFilterMissing(this.node).checked = false;\n const mode = this.findInput('input[value=every]');\n if (mode) {\n mode.checked = true;\n }\n }\n\n protected cancel() {\n this.updateFilter(this.before.filter === '' ? null : this.before.filter, this.before.filterMissing, (<ISetCategoricalFilter>this.before).mode === 'some');\n }\n\n protected submit() {\n let f: string[] | null = this.forEach('input[data-cat]:checked', (n: HTMLInputElement) => n.dataset.cat!);\n if (f.length === this.column.categories.length) { // all checked = no filter\n f = null;\n }\n const filterMissing = findFilterMissing(this.node).checked;\n const mode = this.findInput('input[value=some]');\n this.updateFilter(f, filterMissing, mode != null && mode.checked);\n return true;\n }\n\n cleanUp(action: 'cancel' | 'confirm' | 'handled') {\n super.cleanUp(action);\n const ranking = this.column.findMyRanker()!;\n if (ranking) {\n ranking.on(`${Ranking.EVENT_ORDER_CHANGED}.catFilter`, null);\n }\n }\n}\n","import {round} from '../../internal';\nimport {OrdinalColumn, ICategoricalFilter} from '../../model';\nimport {isCategoryIncluded} from '../../model/internalCategorical';\nimport {filterMissingMarkup, findFilterMissing} from '../missing';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {forEach} from './utils';\nimport {cssClass} from '../../styles';\n\n/** @internal */\nexport default class CategoricalMappingFilterDialog extends ADialog {\n\n private readonly before: ICategoricalFilter;\n\n constructor(private readonly column: OrdinalColumn, dialog: IDialogContext) {\n super(dialog, {\n livePreview: 'filter'\n });\n this.before = this.column.getFilter() || {filter: this.column.categories.map((d) => d.name), filterMissing: false};\n }\n\n protected build(node: HTMLElement) {\n const joint = this.column.categories.map((d) => Object.assign({\n range: round(d.value * 100, 2)\n }, d));\n joint.sort((a, b) => a.label.localeCompare(b.label));\n\n node.insertAdjacentHTML('beforeend', `<div class=\"${cssClass('dialog-table')}\">\n <label class=\"${cssClass('checkbox')} ${cssClass('dialog-filter-table-entry')}\">\n <input type=\"checkbox\" checked>\n <span>\n <div>Un/Select All</div>\n </span>\n </label>\n ${joint.map((cat) => `\n <label class=\"${cssClass('checkbox')} ${cssClass('dialog-filter-table-entry')}\">\n <input data-cat=\"${cat.name}\" type=\"checkbox\"${isCategoryIncluded(this.before, cat) ? 'checked' : ''}>\n <span>\n <input type=\"number\" value=\"${cat.range}\" min=\"0\" max=\"100\" size=\"5\">\n <div class=\"${cssClass('dialog-filter-color-bar')}\">\n <span style=\"background-color: ${cat.color}; width: ${cat.range}%\"></span>\n </div>\n <div>${cat.label}</div>\n </span>\n </label>`).join('')}\n </div>`);\n // selectAll\n const selectAll = this.findInput('input[type=checkbox]:not([data-cat])');\n selectAll.onchange = () => {\n forEach(node, '[data-cat]', (n: HTMLInputElement) => n.checked = selectAll.checked);\n };\n this.forEach('input[type=number]', (d: HTMLInputElement) => {\n d.oninput = () => {\n (<HTMLElement>d.nextElementSibling!.firstElementChild).style.width = `${d.value}%`;\n };\n });\n node.insertAdjacentHTML('beforeend', filterMissingMarkup(this.before.filterMissing));\n\n this.enableLivePreviews('input[type=checkbox], input[type=number]');\n }\n\n private updateFilter(filter: string[] | null | string | RegExp, filterMissing: boolean) {\n const noFilter = filter == null && filterMissing === false;\n this.column.setFilter(noFilter ? null : {filter: filter!, filterMissing});\n }\n\n protected cancel() {\n this.updateFilter(this.before.filter, this.before.filterMissing);\n }\n\n protected reset() {\n this.forEach('[data-cat]', (n: HTMLInputElement) => {\n n.checked = false;\n (<HTMLInputElement>n.nextElementSibling!).value = '50';\n });\n }\n\n protected submit() {\n const items = this.forEach('input[data-cat]', (n: HTMLInputElement) => ({\n checked: n.checked,\n cat: n.dataset.cat!,\n range: (<HTMLInputElement>n.nextElementSibling)!.valueAsNumber\n }));\n let f: string[] | null = items.filter((d) => d.checked).map((d) => d.cat);\n if (f.length === this.column.categories.length) { // all checked = no filter\n f = null;\n }\n const filterMissing = findFilterMissing(this.node).checked;\n this.updateFilter(f, filterMissing);\n this.column.setMapping(items.map((d) => d.range / 100));\n return true;\n }\n}\n","import {Column} from '../../model';\nimport {IRankingHeaderContext, IRenderInfo} from '../interfaces';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\n\n/** @internal */\nexport default class ChangeRendererDialog extends ADialog {\n private readonly before: {renderer: string, group: string, summary: string};\n\n constructor(private readonly column: Column, dialog: IDialogContext, private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n livePreview: 'vis'\n });\n\n this.before = {\n renderer: column.getRenderer(),\n group: column.getGroupRenderer(),\n summary: column.getSummaryRenderer()\n };\n }\n\n protected build(node: HTMLElement) {\n const current = this.column.getRenderer();\n const currentGroup = this.column.getGroupRenderer();\n const currentSummary = this.column.getSummaryRenderer();\n const {item, group, summary} = this.ctx.getPossibleRenderer(this.column);\n\n console.assert(item.length > 1 || group.length > 1 || summary.length > 1); // otherwise no need to show this\n\n const byName = (a: IRenderInfo, b: IRenderInfo) => a.label.localeCompare(b.label);\n node.insertAdjacentHTML('beforeend', `\n <strong>Item Visualization</strong>\n ${item.sort(byName).map((d) => ` <label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"renderer\" value=\"${d.type}\" ${(current === d.type) ? 'checked' : ''}><span>${d.label}</span></label>`).join('')}\n <strong>Group Visualization</strong>\n ${group.sort(byName).map((d) => ` <label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"group\" value=\"${d.type}\" ${(currentGroup === d.type) ? 'checked' : ''}><span>${d.label}</span></label>`).join('')}\n <strong>Summary Visualization</strong>\n ${summary.sort(byName).map((d) => ` <label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"summary\" value=\"${d.type}\" ${(currentSummary === d.type) ? 'checked' : ''}><span>${d.label}</span></label>`).join('')}\n `);\n\n this.enableLivePreviews('input[type=radio]');\n }\n\n protected cancel() {\n this.column.setRenderer(this.before.renderer);\n this.column.setGroupRenderer(this.before.group);\n this.column.setSummaryRenderer(this.before.summary);\n }\n\n protected reset() {\n const desc = this.column.desc;\n const r = this.findInput(`input[name=renderer][value=\"${desc.renderer || desc.type}\"]`);\n if (r) {\n r.checked = true;\n }\n const g = this.findInput(`input[name=group][value=\"${desc.groupRenderer || desc.type}\"]`);\n if (g) {\n g.checked = true;\n }\n const s = this.findInput(`input[name=summary][value=\"${desc.summaryRenderer || desc.type}\"]`);\n if (s) {\n s.checked = true;\n }\n }\n\n protected submit() {\n const renderer = this.findInput('input[name=renderer]:checked').value;\n const group = this.findInput('input[name=group]:checked').value;\n const summary = this.findInput('input[name=summary]:checked').value;\n\n this.column.setRenderer(renderer);\n this.column.setGroupRenderer(group);\n this.column.setSummaryRenderer(summary);\n\n return true;\n }\n\n}\n","import ADialog, {IDialogContext} from './ADialog';\nimport {schemeCategory10, schemeSet1, schemeSet2, schemeSet3, schemeAccent, schemeDark2, schemePastel2, schemePastel1} from 'd3-scale-chromatic';\nimport {round} from '../../internal';\nimport {uniqueId} from '../../renderer/utils';\nimport {QuantizedColorFunction, CustomColorMappingFunction, SolidColorFunction, SequentialColorFunction, DivergentColorFunction} from '../../model/ColorMappingFunction';\nimport {IMapAbleColumn, DEFAULT_COLOR, IColorMappingFunction, IMapAbleDesc} from '../../model';\nimport {cssClass} from '../../styles';\nimport {IRankingHeaderContext} from '../interfaces';\n\nexport default class ColorMappingDialog extends ADialog {\n private readonly before: IColorMappingFunction;\n private readonly id = uniqueId('col');\n\n constructor(private readonly column: IMapAbleColumn, dialog: IDialogContext, private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n livePreview: 'colorMapping'\n });\n\n this.before = this.column.getColorMapping();\n }\n\n private createTemplate(id: string, wrapped: IColorMappingFunction) {\n const current = wrapped instanceof QuantizedColorFunction ? wrapped.base : wrapped;\n const entries = current instanceof CustomColorMappingFunction ? current.entries : [];\n\n let h = '';\n h += `<datalist id=\"${id}L\">${schemeCategory10.map((d) => `<option>${d}\"</option>`).join('')}</datalist>`;\n h += `<datalist id=\"${id}LW\"><option>#FFFFFF\"</option>${schemeCategory10.slice(0, -1).map((d) => `<option>${d}</option>`).join('')}</datalist>`;\n\n h += `<strong data-toggle=\"${current instanceof SolidColorFunction ? 'open' : ''}\">Solid Color</strong>`;\n h += `<div>`;\n {\n const refColor = current instanceof SolidColorFunction ? current.color : '';\n let has = refColor === DEFAULT_COLOR;\n const colorsets = [schemeCategory10, schemeAccent, schemeDark2, schemePastel1, schemePastel2, schemeSet1, schemeSet2, schemeSet3];\n const renderColor = (d: string) => `<label class=\"${cssClass('checkbox-color')}\">\n <input name=\"color\" type=\"radio\" value=\"${d}\" ${d === refColor ? 'checked=\"checked\"' : ''}>\n <span style=\"background: ${d}\"></span>\n </label>`;\n colorsets.forEach((colors, i) => {\n has = has || colors.includes(refColor);\n h += `<div class=\"${cssClass('color-line')}\">\n ${colors.map(renderColor).join('')}\n ${i === 0 ? renderColor(DEFAULT_COLOR) : ''}\n </div>`;\n });\n h += `<label class=\"${cssClass('checkbox')} ${cssClass('color-gradient')}\"><input name=\"color\" type=\"radio\" value=\"custom:solid\" ${refColor && !has ? 'checked=\"checked\"' : ''}>\n <span class=\"${cssClass('color-custom')}\"><input type=\"color\" name=\"solid\" list=\"${id}L\" value=\"${current instanceof SolidColorFunction ? current.color : DEFAULT_COLOR}\" ${refColor && !has ? '' : 'disabled'}></span>\n </label>`;\n }\n h += '</div>';\n\n h += `<strong data-toggle=\"${current instanceof SequentialColorFunction || (current instanceof CustomColorMappingFunction && entries.length === 2) ? 'open' : ''}\">Sequential Color</strong>`;\n h += '<div>';\n h += `<div><label class=\"${cssClass('checkbox')}\">\n <input name=\"kindS\" type=\"radio\" id=\"${id}KC_S\" value=\"continuous\" ${!(wrapped instanceof QuantizedColorFunction) ? 'checked' : ''}>\n <span>Continuous</span>\n </label>\n <label class=\"${cssClass('checkbox')}\">\n <input name=\"kindS\" type=\"radio\" id=\"${id}KQ_S\" value=\"quantized\" ${wrapped instanceof QuantizedColorFunction ? 'checked' : ''}>\n <span>Discrete&nbsp;<input type=\"number\" id=\"${id}KQS_S\" min=\"2\" step=\"1\" style=\"width: 3em\" value=\"${wrapped instanceof QuantizedColorFunction ? `${wrapped.steps}\"` : '5\" disabled'}>&nbsp; steps</span>\n </label></div>`;\n {\n const name = current instanceof SequentialColorFunction ? current.name : '';\n for (const colors of Object.keys(SequentialColorFunction.FUNCTIONS)) {\n h += `<label class=\"${cssClass('checkbox')} ${cssClass('color-gradient')}\"><input name=\"color\" type=\"radio\" value=\"${colors}\" ${colors === name ? 'checked=\"checked\"' : ''}>\n <span data-c=\"${colors}\" style=\"background: ${gradient(SequentialColorFunction.FUNCTIONS[colors], 9)}\"></span>\n </label>`;\n }\n const isCustom = entries.length === 2;\n h += `<label class=\"${cssClass('checkbox')} ${cssClass('color-gradient')}\">\n <input name=\"color\" type=\"radio\" value=\"custom:sequential\" ${isCustom ? 'checked' : ''}>\n <span class=\"${cssClass('color-custom')}\">\n <input type=\"color\" name=\"interpolate0\" list=\"${id}LW\" ${!isCustom ? 'disabled' : `value=\"${entries[0].color}\"`}>\n <input type=\"color\" name=\"interpolate1\" list=\"${id}LW\" ${!isCustom ? 'disabled' : `value=\"${entries[entries.length - 1].color}\"`}>\n </span>\n </label>`;\n }\n h += '</div>';\n h += `<strong data-toggle=\"${current instanceof DivergentColorFunction || (current instanceof CustomColorMappingFunction && entries.length === 3) ? 'open' : ''}\">Diverging Color</strong>`;\n h += '<div>';\n h += `<div><label class=\"${cssClass('checkbox')}\">\n <input name=\"kindD\" type=\"radio\" id=\"${id}KC_D\" value=\"continuous\" ${!(wrapped instanceof QuantizedColorFunction) ? 'checked' : ''}>\n <span>Continuous</span>\n </label>\n <label class=\"${cssClass('checkbox')}\">\n <input name=\"kindD\" type=\"radio\" id=\"${id}KQ_D\" value=\"quantized\" ${wrapped instanceof QuantizedColorFunction ? 'checked' : ''}>\n <span>Discrete&nbsp;<input type=\"number\" id=\"${id}KQS_D\" min=\"2\" step=\"1\" style=\"width: 3em\" value=\"${wrapped instanceof QuantizedColorFunction ? `${wrapped.steps}\"` : '5\" disabled'}>&nbsp; steps</span>\n </label></div>`;\n\n {\n const name = current instanceof DivergentColorFunction ? current.name : '';\n for (const colors of Object.keys(DivergentColorFunction.FUNCTIONS)) {\n h += `<label class=\"${cssClass('checkbox')} ${cssClass('color-gradient')}\"><input name=\"color\" type=\"radio\" value=\"${colors}\" ${colors === name ? 'checked=\"checked\"' : ''}>\n <span data-c=\"${colors}\" style=\"background: ${gradient(DivergentColorFunction.FUNCTIONS[colors], 11)}\"></span>\n </label>`;\n }\n const isCustom = entries.length === 3;\n h += `<label class=\"${cssClass('checkbox')} ${cssClass('color-gradient')}\">\n <input name=\"color\" type=\"radio\" value=\"custom:divergent\" ${isCustom ? 'checked' : ''}>\n <span class=\"${cssClass('color-custom')}\">\n <input type=\"color\" name=\"divergingm1\" list=\"${id}L\" ${!isCustom ? 'disabled' : `value=\"${entries[0].color}\"`}>\n <input type=\"color\" name=\"diverging0\" list=\"${id}LW\" ${!isCustom ? 'disabled' : `value=\"${entries[1].color}\"`}>\n <input type=\"color\" name=\"diverging1\" list=\"${id}L\" ${!isCustom ? 'disabled' : `value=\"${entries[2].color}\"`}>\n </span>\n </label>`;\n }\n h += '</div>';\n\n return h;\n }\n\n private applyColor() {\n const selected = this.findInput(`input[name=color]:checked`);\n if (!selected) {\n return;\n }\n const quantized = this.findInput(`#${this.id}KQ_S`);\n const steps = this.findInput(`#${this.id}KQS_S`);\n\n const base = toColor(selected, this.node);\n if (quantized.checked && !(base instanceof SolidColorFunction)) {\n this.column.setColorMapping(new QuantizedColorFunction(base, Number.parseInt(steps.value, 10)));\n } else {\n this.column.setColorMapping(base);\n }\n }\n\n protected build(node: HTMLElement) {\n const content = node.ownerDocument!.createElement('div');\n content.classList.add(cssClass('dialog-color'));\n node.appendChild(content);\n this.render(content, this.column.getColorMapping());\n }\n\n private render(node: HTMLElement, value: IColorMappingFunction) {\n const id = this.id;\n node.innerHTML = this.createTemplate(id, value);\n\n const toggles = <HTMLElement[]>Array.from(node.querySelectorAll('strong[data-toggle]'));\n\n for (const toggle of toggles) {\n toggle.onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n for (const t2 of toggles) {\n t2.dataset.toggle = t2.dataset.toggle === 'open' || toggle !== t2 ? '' : 'open';\n }\n };\n }\n\n const customs: HTMLElement[] = [];\n const updateColor = (d: HTMLInputElement) => {\n if (!d.checked) {\n return;\n }\n // disable customs\n for (const custom of customs) {\n Array.from(custom.nextElementSibling!.getElementsByTagName('input')).forEach((s) => s.disabled = custom !== d);\n }\n if (this.showLivePreviews()) {\n this.applyColor();\n }\n };\n\n const updateSelectedColor = () => {\n const selected = this.findInput(`input[name=color]:checked`);\n if (selected) {\n updateColor(selected);\n }\n };\n\n this.forEach('input[name=color]', (d: HTMLInputElement) => {\n if (d.value.startsWith('custom:')) {\n customs.push(d);\n }\n d.onchange = () => updateColor(d);\n });\n\n // upon changing custom parameter trigger an update\n this.forEach(`.${cssClass('color-custom')} input[type=color]`, (d: HTMLInputElement) => {\n d.onchange = () => {\n const item = (<HTMLInputElement>d.parentElement!.previousElementSibling!);\n updateColor(item);\n };\n });\n\n // sync and apply\n const continuouos = this.findInput(`#${id}KC_S`);\n const quantized = this.findInput(`#${id}KQ_S`);\n const steps = this.findInput(`#${id}KQS_S`);\n const continuouos2 = this.findInput(`#${id}KC_D`);\n const quantized2 = this.findInput(`#${id}KQ_D`);\n const steps2 = this.findInput(`#${id}KQS_D`);\n\n continuouos.onchange = continuouos2.onchange = (evt) => {\n continuouos.checked = continuouos2.checked = (<HTMLInputElement>evt.currentTarget).checked;\n steps.disabled = steps2.disabled = !quantized.checked;\n if (continuouos.checked) {\n this.updateGradients(-1);\n updateSelectedColor();\n }\n };\n steps.onchange = steps2.onchange = (evt) => {\n steps.value = steps2.value = (<HTMLInputElement>evt.currentTarget).value;\n this.updateGradients(Number.parseInt(steps.value, 10));\n updateSelectedColor();\n };\n quantized.onchange = quantized2.onchange = (evt) => {\n quantized.checked = quantized2.checked = (<HTMLInputElement>evt.currentTarget).checked;\n steps.disabled = steps2.disabled = !quantized.checked;\n if (quantized.checked) {\n this.updateGradients(Number.parseInt(steps.value, 10));\n updateSelectedColor();\n }\n };\n }\n\n protected reset() {\n const desc = <IMapAbleDesc>this.column.desc;\n const colorMapping = this.ctx.provider.getTypeFactory().colorMappingFunction(desc.colorMapping || desc.color);\n this.render(this.node.querySelector<HTMLElement>(`.${cssClass('dialog-color')}`)!, colorMapping);\n }\n\n protected submit() {\n this.applyColor();\n return true;\n }\n\n protected cancel() {\n this.column.setColorMapping(this.before);\n }\n\n private updateGradients(steps: number) {\n this.forEach(`span[data-c]`, (d: HTMLElement) => {\n const key = d.dataset.c!;\n const s = SequentialColorFunction.FUNCTIONS[key];\n if (s) {\n d.style.background = steps < 0 ? gradient(s, 9) : steppedGradient(s, steps);\n return;\n }\n const di = DivergentColorFunction.FUNCTIONS[key];\n if (di) {\n d.style.background = steps < 0 ? gradient(di, 11) : steppedGradient(di, steps);\n return;\n }\n });\n }\n}\n\nfunction toColor(input: HTMLInputElement, node: HTMLElement) {\n switch (input.value) {\n case 'custom:solid':\n return new SolidColorFunction((<HTMLInputElement>node.querySelector('input[name=solid]')!).value);\n case 'custom:sequential':\n const s0 = (<HTMLInputElement>node.querySelector('input[name=interpolate0]')!).value;\n const s1 = (<HTMLInputElement>node.querySelector('input[name=interpolate1]')!).value;\n return new CustomColorMappingFunction([{color: s0, value: 0}, {color: s1, value: 1}]);\n case 'custom:diverging':\n const dm1 = (<HTMLInputElement>node.querySelector('input[name=divergentm1]')!).value;\n const d0 = (<HTMLInputElement>node.querySelector('input[name=divergent0]')!).value;\n const d1 = (<HTMLInputElement>node.querySelector('input[name=divergent1]')!).value;\n return new CustomColorMappingFunction([{color: dm1, value: 0}, {color: d0, value: 0.5}, {color: d1, value: 1}]);\n }\n if (input.value in SequentialColorFunction.FUNCTIONS) {\n return new SequentialColorFunction(input.value);\n }\n if (input.value in DivergentColorFunction.FUNCTIONS) {\n return new DivergentColorFunction(input.value);\n }\n return new SolidColorFunction(input.value);\n}\n\nfunction gradient(interpolate: (v: number)=>string, steps = 2) {\n if (steps <= 1) {\n return `${interpolate(0)}`;\n }\n const stepSize = 1 / (steps - 1);\n let r = `linear-gradient(to right`;\n for (let i = 0; i < steps; ++i) {\n r += `, ${interpolate(i * stepSize)} ${round((i * stepSize) * 100, 2)}%`;\n }\n r += ')';\n return r;\n}\n\nfunction steppedGradient(color: (v: number)=>string, count = 2) {\n if (count === 1) {\n return `${color(0)}`;\n }\n let r = `linear-gradient(to right`;\n const stepSize = 1 / count;\n const half = stepSize / 2;\n for (let i = 0; i < count; ++i) {\n // stepped\n // first and last at border else center\n const shift = i === 0 ? 0 : (i === (count - 1) ? stepSize : half);\n const c = color(i * stepSize + shift);\n r += `, ${c} ${round((i * stepSize) * 100, 2)}%, ${c} ${round(((i + 1) * stepSize) * 100, 2)}%`;\n }\n r += ')';\n return r;\n}\n","import {cssClass} from '../styles';\n\n/** @internal */\nexport function hasDnDType(e: DragEvent, ...typesToCheck: string[]) {\n const available: any = e.dataTransfer!.types;\n\n /*\n * In Chrome datatransfer.types is an Array,\n * while in Firefox it is a DOMStringList\n * that only implements a contains-method!\n */\n if (typeof available.indexOf === 'function') {\n return typesToCheck.some((type) => available.indexOf(type) >= 0);\n }\n if (typeof available.includes === 'function') {\n return typesToCheck.some((type) => available.includes(type));\n }\n if (typeof available.contains === 'function') {\n return typesToCheck.some((type) => available.contains(type));\n }\n return false;\n}\n\n\n/**\n * helper storage for dnd in edge since edge doesn't support custom mime-types\n * @type {Map<number, {[p: string]: string}>}\n */\nconst dndTransferStorage = new Map<number, {[key: string]: string}>();\n\nfunction isEdgeDnD(e: DragEvent) {\n return dndTransferStorage.size > 0 && hasDnDType(e, 'text/plain');\n}\n\n/**\n * checks whether it is a copy operation\n * @param e\n * @returns {boolean|RegExpMatchArray}\n * @internal\n */\nexport function copyDnD(e: DragEvent) {\n const dT = e.dataTransfer!;\n return Boolean((e.ctrlKey && dT.effectAllowed.match(/copy/gi)) || (!dT.effectAllowed.match(/move/gi)));\n}\n\n/**\n * updates the drop effect accoriding to the current copyDnD state\n * @param e\n * @internal\n */\nexport function updateDropEffect(e: DragEvent) {\n const dT = e.dataTransfer!;\n if (copyDnD(e)) {\n dT.dropEffect = 'copy';\n } else {\n dT.dropEffect = 'move';\n }\n}\n\n/** @internal */\nexport type IDragEffect = 'none' | 'copy' | 'copyLink' | 'copyMove' | 'link' | 'linkMove' | 'move' | 'all';\n\n/** @internal */\nexport interface IDragStartResult {\n effectAllowed: IDragEffect;\n data: {[mimeType: string]: string};\n}\n\n/** @internal */\nexport interface IDropResult {\n effect: IDragEffect;\n data: {[mimeType: string]: string};\n}\n\nlet idCounter = 0;\n\n/**\n * add drag support for the given element\n * @param {HTMLElement} node\n * @param {() => IDragStartResult} onDragStart callback to compute the payload an object of mime types\n * @param {boolean} stopPropagation whether to stop propagation in case of success\n * @internal\n */\nexport function dragAble(node: HTMLElement, onDragStart: () => IDragStartResult, stopPropagation: boolean = false) {\n const id = ++idCounter;\n\n node.classList.add(cssClass('dragable'));\n node.draggable = true;\n\n node.addEventListener('dragstart', (e) => {\n node.classList.add(cssClass('dragging'));\n const payload = onDragStart();\n e.dataTransfer!.effectAllowed = payload.effectAllowed;\n\n if (stopPropagation) {\n e.stopPropagation();\n }\n\n // copy all data transfer objects\n const keys = Object.keys(payload.data);\n const allSucceded = keys.every((k) => {\n try {\n e.dataTransfer!.setData(k, payload.data[k]);\n return true;\n } catch (e) {\n return false;\n }\n });\n if (allSucceded) {\n return;\n }\n //compatibility mode for edge\n const text = payload.data['text/plain'] || '';\n e.dataTransfer!.setData('text/plain', `${id}${text ? `: ${text}` : ''}`);\n dndTransferStorage.set(id, payload.data);\n });\n\n node.addEventListener('dragend', (e) => {\n node.classList.remove(cssClass('dragging'));\n\n if (stopPropagation) {\n e.stopPropagation();\n }\n\n if (dndTransferStorage.size > 0) {\n //clear the id\n dndTransferStorage.delete(id);\n }\n\n // remove all\n const over = <HTMLElement>node.ownerDocument!.getElementsByClassName(cssClass('dragover'))[0];\n if (over) {\n over.classList.remove(cssClass('dragover'));\n }\n });\n}\n\n/**\n * add dropable support for the given node\n * @param {HTMLElement} node\n * @param {string[]} mimeTypes mimeTypes to look for\n * @param {(result: IDropResult, e: DragEvent) => boolean} onDrop callback when dropped, returns true if the drop was successful\n * @param {(e: DragEvent) => void} onDragOver optional drag over handler, e.g. for special effects\n * @param {boolean} stopPropagation flag if the event propagation should be stopped in case of success\n * @param {() => boolean} optional whether to enable dropping at all\n * @internal\n */\nexport function dropAble(node: HTMLElement, mimeTypes: string[], onDrop: (result: IDropResult, e: DragEvent) => boolean, onDragOver: null | ((e: DragEvent) => void) = null, stopPropagation: boolean = false, canDrop: () => boolean = (() => true)) {\n node.addEventListener('dragenter', (e) => {\n //var xy = mouse($node.node());\n if (node.classList.contains(cssClass('dragging')) || !(hasDnDType(e, ...mimeTypes) || isEdgeDnD(e)) || !canDrop()) {\n // not a valid mime type\n node.classList.remove(cssClass('dragover'));\n return;\n }\n node.classList.add(cssClass('dragover'));\n if (stopPropagation) {\n e.stopPropagation();\n }\n //sounds good\n return false;\n });\n\n node.addEventListener('dragover', (e) => {\n if (node.classList.contains(cssClass('dragging')) || !(hasDnDType(e, ...mimeTypes) || isEdgeDnD(e)) || !canDrop()) {\n // not a valid mime type\n return;\n }\n\n e.preventDefault();\n updateDropEffect(e);\n node.classList.add(cssClass('dragover'));\n\n if (stopPropagation) {\n e.stopPropagation();\n }\n if (onDragOver) {\n onDragOver(e);\n }\n //sound good\n return false;\n });\n\n node.addEventListener('dragleave', (evt) => {\n // same fix as in phovea\n (<HTMLElement>evt.target).classList.remove(cssClass('dragover'));\n });\n\n node.addEventListener('drop', (e) => {\n e.preventDefault();\n if (stopPropagation) {\n e.stopPropagation();\n }\n updateDropEffect(e);\n\n const effect = <IDragEffect>e.dataTransfer!.dropEffect;\n\n node.classList.remove(cssClass('dragover'));\n\n if (isEdgeDnD(e)) {\n // retrieve from helper\n const base = e.dataTransfer!.getData('text/plain');\n const id = parseInt(base.indexOf(':') >= 0 ? base.substring(0, base.indexOf(':')) : base, 10);\n if (dndTransferStorage.has(id)) {\n const data = dndTransferStorage.get(id)!;\n dndTransferStorage.delete(id);\n return !onDrop({effect, data}, e);\n }\n return;\n }\n\n if (!hasDnDType(e, ...mimeTypes)) {\n return;\n }\n\n // copy sub mime types\n const data: any = {};\n //selects the data contained in the data transfer\n mimeTypes.forEach((mime) => {\n const value = e.dataTransfer!.getData(mime);\n if (value !== '') {\n data[mime] = value;\n }\n });\n return !onDrop({effect, data}, e);\n });\n}\n","import {Column} from '../../model';\nimport {createToolbarMenuItems, updateIconState} from '../header';\nimport {IRankingHeaderContext} from '../interfaces';\nimport {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\nimport APopup from './APopup';\n\n/** @internal */\nexport default class MoreColumnOptionsDialog extends APopup {\n\n constructor(private readonly column: Column, dialog: IDialogContext, private readonly mode: 'header' | 'sidePanel', private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n autoClose: true\n });\n }\n\n protected build(node: HTMLElement) {\n node.classList.add(cssClass('more-options'));\n node.dataset.colId = this.column.id;\n createToolbarMenuItems(node, this.dialog.level + 1, this.column, this.ctx, this.mode);\n\n updateIconState(node, this.column);\n }\n}\n","import {MIN_LABEL_WIDTH} from '../constants';\nimport {equalArrays, dragAble, dropAble, hasDnDType, IDropResult} from '../internal';\nimport {categoryOf, getSortType} from '../model';\nimport {createNestedDesc, createReduceDesc, createStackDesc, IColumnDesc, isArrayColumn, isBoxPlotColumn, isCategoricalColumn, isMapColumn, isNumberColumn, isNumbersColumn, Column, ImpositionCompositeColumn, ImpositionCompositesColumn, createImpositionDesc, createImpositionsDesc, ImpositionBoxPlotColumn, createImpositionBoxPlotDesc, CompositeColumn, IMultiLevelColumn, isMultiLevelColumn} from '../model';\nimport {aria, cssClass, engineCssClass, RESIZE_ANIMATION_DURATION, RESIZE_SPACE} from '../styles';\nimport MoreColumnOptionsDialog from './dialogs/MoreColumnOptionsDialog';\nimport {IRankingHeaderContext, IToolbarAction, IOnClickHandler} from './interfaces';\nimport {getToolbar} from './toolbar';\nimport {dialogContext} from './dialogs';\n\n/** @internal */\nexport interface IHeaderOptions {\n dragAble: boolean;\n mergeDropAble: boolean;\n rearrangeAble: boolean;\n resizeable: boolean;\n level: number;\n extraPrefix: string;\n}\n\n/** @internal */\nexport function createHeader(col: Column, ctx: IRankingHeaderContext, options: Partial<IHeaderOptions> = {}) {\n options = Object.assign({\n dragAble: true,\n mergeDropAble: true,\n rearrangeAble: true,\n resizeable: true,\n level: 0,\n extraPrefix: ''\n }, options);\n const node = ctx.document.createElement('section');\n\n const extra = options.extraPrefix ? (name: string) => `${cssClass(name)} ${cssClass(`${options.extraPrefix}-${name}`)}` : cssClass;\n const summary = col.getMetaData().summary;\n node.innerHTML = `\n <div class=\"${extra('label')} ${cssClass('typed-icon')}\">${col.getWidth() < MIN_LABEL_WIDTH ? '&nbsp;' : col.label}</div>\n <div class=\"${extra('sublabel')}\">${col.getWidth() < MIN_LABEL_WIDTH || !summary ? '&nbsp;' : summary}</div>\n <div class=\"${extra('toolbar')}\"></div>\n <div class=\"${extra('spacing')}\"></div>\n <div class=\"${extra('handle')} ${cssClass('feature-advanced')} ${cssClass('feature-ui')}\"></div>\n `;\n\n // addTooltip(node, col);\n\n createShortcutMenuItems(<HTMLElement>node.getElementsByClassName(cssClass('toolbar'))[0]!, options.level!, col, ctx, 'header');\n\n toggleToolbarIcons(node, col);\n\n if (options.dragAble) {\n dragAbleColumn(node, col, ctx);\n }\n if (options.mergeDropAble) {\n mergeDropAble(node, col, ctx);\n }\n if (options.rearrangeAble) {\n rearrangeDropAble(<HTMLElement>node.getElementsByClassName(cssClass('handle'))[0]!, col, ctx);\n }\n if (options.resizeable) {\n dragWidth(col, node);\n }\n return node;\n}\n\n\n/** @internal */\nexport function updateHeader(node: HTMLElement, col: Column, minWidth = MIN_LABEL_WIDTH) {\n const label = <HTMLElement>node.getElementsByClassName(cssClass('label'))[0]!;\n label.innerHTML = col.getWidth() < minWidth ? '&nbsp;' : col.label;\n const summary = col.getMetaData().summary;\n const sublabel = <HTMLElement>node.getElementsByClassName(cssClass('sublabel'))[0];\n if (sublabel) {\n sublabel.innerHTML = col.getWidth() < minWidth || !summary ? '&nbsp;' : summary;\n }\n\n let title = col.label;\n if (summary) {\n title = `${title}\\n${summary}`;\n }\n if (col.description) {\n title = `${title}\\n${col.description}`;\n }\n node.title = title;\n node.dataset.colId = col.id;\n node.dataset.type = col.desc.type;\n label.dataset.typeCat = categoryOf(col).name;\n\n updateIconState(node, col);\n\n updateMoreDialogIcons(node, col);\n}\n\nfunction updateMoreDialogIcons(node: HTMLElement, col: Column) {\n const root = node.closest(`.${cssClass()}`);\n if (!root) {\n return;\n }\n const dialog = root.querySelector<HTMLElement>(`.${cssClass('more-options')}[data-col-id=\"${col.id}\"]`);\n if (!dialog) {\n return;\n }\n updateIconState(dialog, col);\n}\n\n\n/** @internal */\nexport function updateIconState(node: HTMLElement, col: Column) {\n const sort = <HTMLElement>node.getElementsByClassName(cssClass('action-sort'))[0]!;\n if (sort) {\n const {asc, priority} = col.isSortedByMe();\n sort.dataset.sort = asc !== undefined ? asc : '';\n sort.dataset.type = getSortType(col);\n if (priority !== undefined) {\n sort.dataset.priority = (priority + 1).toString();\n } else {\n delete sort.dataset.priority;\n }\n }\n\n const sortGroups = <HTMLElement>node.getElementsByClassName(cssClass('action-sort-groups'))[0]!;\n if (sortGroups) {\n const {asc, priority} = col.isGroupSortedByMe();\n sortGroups.dataset.sort = asc !== undefined ? asc : '';\n sortGroups.dataset.type = getSortType(col);\n if (priority !== undefined) {\n sortGroups.dataset.priority = (priority + 1).toString();\n } else {\n delete sortGroups.dataset.priority;\n }\n }\n\n const group = <HTMLElement>node.getElementsByClassName(cssClass('action-group'))[0]!;\n if (group) {\n const groupedBy = col.isGroupedBy();\n group.dataset.group = groupedBy >= 0 ? 'true' : 'false';\n if (groupedBy >= 0) {\n group.dataset.priority = (groupedBy + 1).toString();\n } else {\n delete group.dataset.priority;\n }\n }\n\n const filter = <HTMLElement>node.getElementsByClassName(cssClass('action-filter'))[0]!;\n if (!filter) {\n return;\n }\n if (col.isFiltered()) {\n filter.dataset.active = '';\n } else {\n delete filter.dataset.active;\n }\n}\n\n/** @internal */\nexport function actionCSSClass(title: string) {\n if (title.endsWith('&hellip;')) {\n title = title.slice(0, -'&hellip;'.length - 1);\n }\n if (title.endsWith('By')) {\n title = title.slice(0, -3);\n }\n const clean = title.toLowerCase().replace(/[ +-]/mg, '-');\n return `${cssClass('action')} ${cssClass(`action-${clean}`)}`;\n}\n\nfunction addIconDOM(node: HTMLElement, col: Column, ctx: IRankingHeaderContext, level: number, showLabel: boolean, mode: 'header' | 'sidePanel') {\n return (action: IToolbarAction) => {\n const m = isActionMode(col, action, mode, 'shortcut') ? 'o' : isActionMode(col, action, mode, 'menu+shortcut') ? 's' : 'r';\n node.insertAdjacentHTML('beforeend', `<i data-a=\"${m}\" title=\"${action.title}\" class=\"${actionCSSClass(action.title.toString())} ${cssClass(`feature-${action.options.featureLevel || 'basic'}`)} ${cssClass(`feature-${action.options.featureCategory || 'others'}`)}\"><span${!showLabel ? ` class=\"${cssClass('aria')}\" aria-hidden=\"true\"` : ''}>${action.title}</span> </i>`);\n const i = <HTMLElement>node.lastElementChild;\n i.onclick = (evt) => {\n evt.stopPropagation();\n ctx.dialogManager.setHighlightColumn(col);\n action.onClick(col, <any>evt, ctx, level, !showLabel);\n };\n return i;\n };\n}\n\n/** @internal */\nexport interface IAddIcon {\n (title: string, onClick: IOnClickHandler): void;\n}\n\nfunction isActionMode(col: Column, d: IToolbarAction, mode: 'header' | 'sidePanel', value: 'menu' | 'menu+shortcut' | 'shortcut') {\n const s = d.options.mode === undefined ? 'menu' : d.options.mode;\n if (s === value) {\n return true;\n }\n if (typeof s === 'function') {\n return s(col, mode) === value;\n }\n return false;\n}\n\n/** @internal */\nexport function createShortcutMenuItems(node: HTMLElement, level: number, col: Column, ctx: IRankingHeaderContext, mode: 'header' | 'sidePanel', willAutoHide: boolean = true) {\n const addIcon = addIconDOM(node, col, ctx, level, false, mode);\n const toolbar = getToolbar(col, ctx);\n const shortcuts = toolbar.filter((d) => !isActionMode(col, d, mode, 'menu'));\n const hybrids = shortcuts.reduce((a, b) => a + (isActionMode(col, b, mode, 'menu+shortcut') ? 1 : 0), 0);\n\n shortcuts.forEach(addIcon);\n const moreEntries = toolbar.length - shortcuts.length + hybrids;\n\n if (shortcuts.length === toolbar.length || (moreEntries === hybrids && !willAutoHide)) {\n // all visible or just hybrids that will always be visible\n return;\n }\n\n // need a more entry\n node.insertAdjacentHTML('beforeend', `<i data-a=\"m\" data-m=\"${moreEntries}\" title=\"More &hellip;\" class=\"${actionCSSClass('More')}\">${aria('More &hellip;')}</i>`);\n const i = <HTMLElement>node.lastElementChild;\n i.onclick = (evt) => {\n evt.stopPropagation();\n ctx.dialogManager.setHighlightColumn(col);\n const dialog = new MoreColumnOptionsDialog(col, dialogContext(ctx, level, <any>evt), mode, ctx);\n dialog.open();\n };\n}\n\n/** @internal */\nexport function createToolbarMenuItems(node: HTMLElement, level: number, col: Column, ctx: IRankingHeaderContext, mode: 'header' | 'sidePanel') {\n const addIcon = addIconDOM(node, col, ctx, level, true, mode);\n getToolbar(col, ctx).filter((d) => !isActionMode(col, d, mode, 'shortcut')).forEach(addIcon);\n}\n\n/** @internal */\nfunction toggleRotatedHeader(node: HTMLElement, col: Column, defaultVisibleClientWidth: number) {\n // rotate header flag if needed\n const label = <HTMLElement>node.getElementsByClassName(cssClass('label'))[0];\n if (col.getWidth() < MIN_LABEL_WIDTH) {\n label.classList.remove(`.${cssClass('rotated')}`);\n return;\n }\n const width = label.clientWidth;\n const rotated = width <= 0 ? (col.label.length * defaultVisibleClientWidth / 3 * 0.6 > col.getWidth()) : (label.scrollWidth * 0.6 > label.clientWidth);\n label.classList.toggle(`.${cssClass('rotated')}`, rotated);\n}\n\n/** @internal */\nfunction toggleToolbarIcons(node: HTMLElement, col: Column, defaultVisibleClientWidth = 22.5) {\n toggleRotatedHeader(node, col, defaultVisibleClientWidth);\n\n const toolbar = <HTMLElement>node.getElementsByClassName(cssClass('toolbar'))[0];\n if (toolbar.childElementCount === 0) {\n return;\n }\n const availableWidth = col.getWidth();\n const actions = Array.from(toolbar.children).map((d) => ({node: <HTMLElement>d, width: d.clientWidth > 0 ? d.clientWidth : defaultVisibleClientWidth}));\n\n const shortCuts = actions.filter((d) => d.node.dataset.a === 'o');\n const hybrids = actions.filter((d) => d.node.dataset.a === 's');\n const moreIcon = actions.find((d) => d.node.dataset.a === 'm');\n const moreEntries = moreIcon ? parseInt(moreIcon.node.dataset.m!, 10) : 0;\n const needMore = moreEntries > hybrids.length;\n\n let total = actions.reduce((a, b) => a + b.width, 0);\n\n for (const action of actions) {\n // maybe hide not needed \"more\"\n action.node.classList.remove(cssClass('hidden'));\n }\n\n // all visible\n if (total < availableWidth) {\n return;\n }\n if (moreIcon && !needMore && (total - moreIcon.width) < availableWidth) {\n // available space is enougth we can skip the \"more\" and then it fits\n moreIcon.node.classList.add(cssClass('hidden'));\n return;\n }\n\n for (const action of hybrids.reverse().concat(shortCuts.reverse())) { // back to forth and hybrids earlier than pure shortcuts\n // hide and check if enough\n action.node.classList.add(cssClass('hidden'));\n total -= action.width;\n if (total < availableWidth) {\n return;\n }\n }\n}\n\n\n/**\n * allow to change the width of a column using dragging the handle\n * @internal\n */\nexport function dragWidth(col: Column, node: HTMLElement) {\n let ueberElement: HTMLElement;\n let sizeHelper: HTMLElement;\n let currentFooterTransformation = '';\n const handle = <HTMLElement>node.getElementsByClassName(cssClass('handle'))[0];\n\n\n let start = 0;\n let originalWidth = 0;\n const mouseMove = (evt: MouseEvent) => {\n evt.stopPropagation();\n evt.preventDefault();\n const end = evt.clientX;\n const delta = end - start;\n\n if (Math.abs(start - end) < 2) {\n //ignore\n return;\n }\n start = end;\n const width = Math.max(0, col.getWidth() + delta);\n\n sizeHelper.classList.toggle(cssClass('resize-animated'), width < originalWidth);\n // no idea why shifted by the size compared to the other footer element\n sizeHelper.style.transform = `${currentFooterTransformation} translate(${width - originalWidth - RESIZE_SPACE}px, 0px)`;\n\n node.style.width = `${width}px`;\n col.setWidth(width);\n toggleToolbarIcons(node, col);\n };\n\n const mouseUp = (evt: MouseEvent) => {\n evt.stopPropagation();\n evt.preventDefault();\n const end = evt.clientX;\n node.classList.remove(cssClass('change-width'));\n\n ueberElement.removeEventListener('mousemove', mouseMove);\n ueberElement.removeEventListener('mouseup', mouseUp);\n ueberElement.removeEventListener('mouseleave', mouseUp);\n ueberElement.classList.remove(cssClass('resizing'));\n node.style.width = null;\n setTimeout(() => {\n sizeHelper.classList.remove(cssClass('resizing'), cssClass('resize-animated'));\n }, RESIZE_ANIMATION_DURATION * 1.2); // after animation ended\n\n if (Math.abs(start - end) < 2) {\n //ignore\n return;\n }\n const delta = end - start;\n const width = Math.max(0, col.getWidth() + delta);\n col.setWidth(width);\n toggleToolbarIcons(node, col);\n };\n handle.onmousedown = (evt) => {\n evt.stopPropagation();\n evt.preventDefault();\n node.classList.add(cssClass('change-width'));\n\n originalWidth = col.getWidth();\n start = evt.clientX;\n ueberElement = <HTMLElement>node.closest('body') || <HTMLElement>node.closest(`.${cssClass()}`)!; // take the whole body or root lineup\n ueberElement.addEventListener('mousemove', mouseMove);\n ueberElement.addEventListener('mouseup', mouseUp);\n ueberElement.addEventListener('mouseleave', mouseUp);\n ueberElement.classList.add(cssClass('resizing'));\n\n sizeHelper = <HTMLElement>node.closest(`.${engineCssClass()}`)!.querySelector<HTMLElement>(`.${cssClass('resize-helper')}`);\n currentFooterTransformation = (<HTMLElement>sizeHelper.previousElementSibling!).style.transform!;\n sizeHelper.style.transform = `${currentFooterTransformation} translate(${-RESIZE_SPACE}px, 0px)`;\n sizeHelper.classList.add(cssClass('resizing'));\n };\n handle.onclick = (evt) => {\n // avoid resorting\n evt.stopPropagation();\n evt.preventDefault();\n };\n}\n\n/** @internal */\nexport const MIMETYPE_PREFIX = 'text/x-caleydo-lineup-column';\n\n/**\n * allow to drag the column away\n * @internal\n */\nexport function dragAbleColumn(node: HTMLElement, column: Column, ctx: IRankingHeaderContext) {\n dragAble(node, () => {\n const ref = JSON.stringify(ctx.provider.toDescRef(column.desc));\n const data: any = {\n 'text/plain': column.label,\n [`${MIMETYPE_PREFIX}-ref`]: column.id,\n [MIMETYPE_PREFIX]: ref\n };\n if (isNumberColumn(column)) {\n data[`${MIMETYPE_PREFIX}-number`] = ref;\n data[`${MIMETYPE_PREFIX}-number-ref`] = column.id;\n }\n if (isCategoricalColumn(column)) {\n data[`${MIMETYPE_PREFIX}-categorical`] = ref;\n data[`${MIMETYPE_PREFIX}-categorical-ref`] = column.id;\n }\n if (isBoxPlotColumn(column)) {\n data[`${MIMETYPE_PREFIX}-boxplot`] = ref;\n data[`${MIMETYPE_PREFIX}-boxplot-ref`] = column.id;\n }\n if (isMapColumn(column)) {\n data[`${MIMETYPE_PREFIX}-map`] = ref;\n data[`${MIMETYPE_PREFIX}-map-ref`] = column.id;\n }\n if (isArrayColumn(column)) {\n data[`${MIMETYPE_PREFIX}-array`] = ref;\n data[`${MIMETYPE_PREFIX}-array-ref`] = column.id;\n }\n if (isNumbersColumn(column)) {\n data[`${MIMETYPE_PREFIX}-numbers`] = ref;\n data[`${MIMETYPE_PREFIX}-numbers-ref`] = column.id;\n }\n return {\n effectAllowed: 'copyMove',\n data\n };\n }, true);\n}\n\n/**\n * dropper for allowing to rearrange (move, copy) columns\n * @internal\n */\nexport function rearrangeDropAble(node: HTMLElement, column: Column, ctx: IRankingHeaderContext) {\n dropAble(node, [`${MIMETYPE_PREFIX}-ref`, MIMETYPE_PREFIX], (result) => {\n let col: Column | null = null;\n const data = result.data;\n if (!(`${MIMETYPE_PREFIX}-ref` in data)) {\n const desc = JSON.parse(data[MIMETYPE_PREFIX]);\n col = ctx.provider.create(ctx.provider.fromDescRef(desc));\n return col != null && column.insertAfterMe(col) != null;\n }\n\n // find by reference\n const id = data[`${MIMETYPE_PREFIX}-ref`];\n col = ctx.provider.find(id);\n if (!col || (col === column && !result.effect.startsWith('copy'))) {\n return false;\n }\n if (result.effect.startsWith('copy')) {\n col = ctx.provider.clone(col!);\n return col != null && column.insertAfterMe(col) != null;\n }\n // detect whether it is an internal move operation or an real remove/insert operation\n const toInsertParent = col.parent;\n if (!toInsertParent) { // no parent will always be a move\n return column.insertAfterMe(col) != null;\n }\n if (toInsertParent === column.parent) {\n // move operation\n return toInsertParent.moveAfter(col, column) != null;\n }\n col.removeMe();\n return column.insertAfterMe(col) != null;\n }, null, true);\n}\n\n/**\n * dropper for allowing to change the order by dropping it at a certain position\n * @internal\n */\nexport function resortDropAble(node: HTMLElement, column: Column, ctx: IRankingHeaderContext, where: 'before' | 'after', autoGroup: boolean) {\n dropAble(node, [`${MIMETYPE_PREFIX}-ref`, MIMETYPE_PREFIX], (result) => {\n let col: Column | null = null;\n const data = result.data;\n if (`${MIMETYPE_PREFIX}-ref` in data) {\n const id = data[`${MIMETYPE_PREFIX}-ref`];\n col = ctx.provider.find(id);\n if (!col || col === column) {\n return false;\n }\n } else {\n const desc = JSON.parse(data[MIMETYPE_PREFIX]);\n col = ctx.provider.create(ctx.provider.fromDescRef(desc));\n if (col) {\n column.findMyRanker()!.push(col);\n }\n }\n const ranking = column.findMyRanker()!;\n if (!col || col === column || !ranking) {\n return false;\n }\n\n const criteria = ranking.getSortCriteria();\n const groups = ranking.getGroupCriteria();\n\n const removeFromSort = (col: Column) => {\n const existing = criteria.findIndex((d) => d.col === col);\n if (existing >= 0) { // remove existing column but keep asc state\n return criteria.splice(existing, 1)[0].asc;\n }\n return false;\n };\n\n // remove the one to add\n const asc = removeFromSort(col);\n\n const groupIndex = groups.indexOf(column);\n const index = criteria.findIndex((d) => d.col === column);\n\n if (autoGroup && groupIndex >= 0) {\n // before the grouping, so either ungroup or regroup\n removeFromSort(column);\n if (isCategoricalColumn(col)) { // we can group by it\n groups.splice(groupIndex + (where === 'after' ? 1 : 0), 0, col);\n } else {\n // remove all before and shift to sorting + sorting\n const removed = groups.splice(0, groups.length - groupIndex);\n criteria.unshift(...removed.reverse().map((d) => ({asc: false, col: d}))); // now a first sorting criteria\n criteria.unshift({asc, col});\n }\n } else if (index < 0) {\n criteria.push({asc, col});\n } else if (index === 0 && autoGroup && isCategoricalColumn(col)) {\n // make group criteria\n groups.push(col);\n } else {\n criteria.splice(index + (where === 'after' ? 1 : 0), 0, {asc, col});\n }\n\n if (!equalArrays(groups, ranking.getGroupCriteria())) {\n ranking.setGroupCriteria(groups);\n }\n ranking.setSortCriteria(criteria);\n return true;\n }, null, true);\n}\n\n/**\n * dropper for merging columns\n * @internal\n */\nexport function mergeDropAble(node: HTMLElement, column: Column, ctx: IRankingHeaderContext) {\n const resolveDrop = (result: IDropResult) => {\n const data = result.data;\n const copy = result.effect === 'copy';\n const prefix = MIMETYPE_PREFIX;\n const key = Object.keys(data).find((d) => d.startsWith(prefix) && d.endsWith('-ref'));\n if (key) {\n const id = data[key];\n let col: Column = ctx.provider.find(id)!;\n if (copy) {\n col = ctx.provider.clone(col);\n } else if (col === column) {\n return null;\n } else {\n col.removeMe();\n }\n return col;\n }\n const alternative = Object.keys(data).find((d) => d.startsWith(prefix));\n if (!alternative) {\n return null;\n }\n const desc = JSON.parse(alternative);\n return ctx.provider.create(ctx.provider.fromDescRef(desc))!;\n };\n\n const pushChild = (result: IDropResult) => {\n const col: Column | null = resolveDrop(result);\n return col != null && (<CompositeColumn>column).push(col) != null;\n };\n\n const mergeImpl = (col: Column | null, desc: IColumnDesc) => {\n if (col == null) {\n return false;\n }\n const ranking = column.findMyRanker()!;\n const index = ranking.indexOf(column);\n const parent = <CompositeColumn>ctx.provider.create(desc);\n column.removeMe();\n parent.push(column);\n parent.push(col);\n return ranking.insert(parent, index) != null;\n };\n\n const mergeWith = (desc: IColumnDesc) => (result: IDropResult) => {\n const col: Column | null = resolveDrop(result);\n return mergeImpl(col, desc);\n };\n\n const all = [`${MIMETYPE_PREFIX}-ref`, MIMETYPE_PREFIX];\n const numberish = [`${MIMETYPE_PREFIX}-number-ref`, `${MIMETYPE_PREFIX}-number`];\n const categorical = [`${MIMETYPE_PREFIX}-categorical-ref`, `${MIMETYPE_PREFIX}-categorical`];\n const boxplot = [`${MIMETYPE_PREFIX}-boxplot-ref`, `${MIMETYPE_PREFIX}-boxplot`];\n const numbers = [`${MIMETYPE_PREFIX}-numbers-ref`, `${MIMETYPE_PREFIX}-numbers`];\n\n node.dataset.draginfo = '+';\n if (column instanceof ImpositionCompositeColumn) {\n return dropAble(node, categorical.concat(numberish), pushChild, (e) => {\n if (hasDnDType(e, ...categorical)) {\n node.dataset.draginfo = 'Color by';\n return;\n }\n if (hasDnDType(e, ...numberish)) {\n node.dataset.draginfo = 'Wrap';\n }\n }, false, () => column.children.length < 2);\n }\n if (column instanceof ImpositionBoxPlotColumn) {\n return dropAble(node, categorical.concat(boxplot), pushChild, (e) => {\n if (hasDnDType(e, ...categorical)) {\n node.dataset.draginfo = 'Color by';\n return;\n }\n if (hasDnDType(e, ...boxplot)) {\n node.dataset.draginfo = 'Wrap';\n }\n }, false, () => column.children.length < 2);\n }\n if (column instanceof ImpositionCompositesColumn) {\n return dropAble(node, categorical.concat(numbers), pushChild, (e) => {\n if (hasDnDType(e, ...categorical)) {\n node.dataset.draginfo = 'Color by';\n return;\n }\n if (hasDnDType(e, ...numbers)) {\n node.dataset.draginfo = 'Wrap';\n }\n }, false, () => column.children.length < 2);\n }\n if (isMultiLevelColumn(column)) {\n // stack column or nested\n return dropAble(node, (<IMultiLevelColumn>column).canJustAddNumbers ? numberish : all, pushChild);\n }\n if (column instanceof CompositeColumn) {\n return dropAble(node, (<CompositeColumn>column).canJustAddNumbers ? numberish : all, pushChild);\n }\n if (isNumbersColumn(column)) {\n node.dataset.draginfo = 'Color by';\n return dropAble(node, categorical, mergeWith(createImpositionsDesc()));\n }\n if (isBoxPlotColumn(column)) {\n node.dataset.draginfo = 'Color by';\n return dropAble(node, categorical, mergeWith(createImpositionBoxPlotDesc()));\n }\n if (isNumberColumn(column)) {\n node.dataset.draginfo = 'Merge';\n return dropAble(node, categorical.concat(numberish), (result: IDropResult, evt: DragEvent) => {\n const col: Column | null = resolveDrop(result);\n if (col == null) {\n return false;\n }\n if (isCategoricalColumn(col)) {\n return mergeImpl(col, createImpositionDesc());\n }\n if (isNumberColumn(col)) {\n return mergeImpl(col, evt.shiftKey ? createReduceDesc() : createStackDesc());\n }\n return false;\n }, (e) => {\n if (hasDnDType(e, ...categorical)) {\n node.dataset.draginfo = 'Color by';\n return;\n }\n if (hasDnDType(e, ...numberish)) {\n node.dataset.draginfo = e.shiftKey ? 'Min/Max' : 'Sum';\n }\n });\n }\n node.dataset.draginfo = 'Group';\n return dropAble(node, all, mergeWith(createNestedDesc()));\n}\n","import {debounce, clear, suffix} from '../../internal';\nimport {CompositeColumn} from '../../model';\nimport {createHeader, updateHeader} from '../header';\nimport {IRankingHeaderContext} from '../interfaces';\nimport {IDialogContext} from './ADialog';\nimport {cssClass, engineCssClass} from '../../styles';\nimport APopup from './APopup';\n\n/** @internal */\nexport default class CompositeChildrenDialog extends APopup {\n\n private readonly id: string;\n\n constructor(private readonly column: CompositeColumn, dialog: IDialogContext, private ctx: IRankingHeaderContext) {\n super(dialog);\n this.id = `.dialog${Math.random().toString(36).slice(-8).substr(0, 3)}`;\n }\n\n cleanUp(action: 'cancel' | 'confirm' | 'handled') {\n super.cleanUp(action);\n this.column.on(suffix(this.id, CompositeColumn.EVENT_ADD_COLUMN, CompositeColumn.EVENT_REMOVE_COLUMN), null);\n }\n\n protected build(node: HTMLElement) {\n node.classList.add(cssClass('dialog-sub-nested'));\n const createChildren = () => {\n this.column.children.forEach((c) => {\n const n = createHeader(c, this.ctx, {\n mergeDropAble: false,\n resizeable: false,\n level: this.dialog.level + 1,\n extraPrefix: 'sub'\n });\n n.className = cssClass('header');\n updateHeader(n, c);\n const summary = this.ctx.summaryRenderer(c, false);\n const summaryNode = this.ctx.asElement(summary.template);\n summaryNode.dataset.renderer = c.getSummaryRenderer();\n summaryNode.classList.add(cssClass('summary'), cssClass('renderer'), cssClass('th-summary'));\n\n const r = summary.update(summaryNode);\n if (r) {\n summaryNode.classList.add(engineCssClass('loading'));\n r.then(() => {\n summaryNode.classList.remove(engineCssClass('loading'));\n });\n }\n n.appendChild(summaryNode);\n node.appendChild(n);\n });\n };\n createChildren();\n\n this.column.on(suffix(this.id, CompositeColumn.EVENT_ADD_COLUMN, CompositeColumn.EVENT_REMOVE_COLUMN), debounce(() => {\n if (!node.parentElement) {\n // already closed\n this.destroy();\n return;\n }\n clear(node);\n createChildren();\n }));\n }\n}\n","import {HierarchyColumn, ICategoryInternalNode, ICutOffNode, resolveInnerNodes} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\n\n/** @internal */\nexport default class CutOffHierarchyDialog extends ADialog {\n\n private readonly innerNodes: ICategoryInternalNode[];\n private readonly innerNodePaths: string[];\n\n private readonly before: ICutOffNode;\n\n\n constructor(private readonly column: HierarchyColumn, dialog: IDialogContext, private readonly idPrefix: string) {\n super(dialog, {\n livePreview: 'cutOff'\n });\n\n this.innerNodes = resolveInnerNodes(this.column.hierarchy);\n this.innerNodePaths = this.innerNodes.map((n) => n.path);\n this.before = column.getCutOff();\n }\n\n protected build(node: HTMLElement) {\n node.insertAdjacentHTML('beforeend', `\n <input type=\"text\" value=\"${this.before.node.label}\" required=\"required\" autofocus=\"autofocus\" list=\"ui${this.idPrefix}lineupHierarchyList\" placeholder=\"cut off node\">\n <input type=\"number\" value=\"${isFinite(this.before.maxDepth) ? this.before.maxDepth : ''}\" placeholder=\"max depth (&infin;)\">\n <datalist id=\"ui${this.idPrefix}lineupHierarchyList\">${this.innerNodes.map((node) => `<option value=\"${node.path}\">${node.label}</option>`)}</datalist>`);\n\n //custom validation\n const innerNodePaths = this.innerNodePaths;\n this.findInput('input[type=\"text\"]').addEventListener('change', function (this: HTMLInputElement) {\n const value = this.value;\n if (innerNodePaths.indexOf(value) < 0) {\n this.setCustomValidity('invalid node');\n } else {\n this.setCustomValidity('');\n }\n }, {\n passive: true\n });\n\n this.enableLivePreviews('input[type=text],input[type=number]');\n }\n\n protected reset() {\n this.findInput('input[type=\"text\"]').value = this.column.hierarchy.path;\n this.findInput('input[type=\"number\"]').value = '';\n }\n\n protected cancel() {\n this.column.setCutOff(this.before);\n }\n\n protected submit() {\n const newNode = this.findInput('input[type=\"text\"]').value;\n const newNodeIndex = this.innerNodePaths.indexOf(newNode);\n const node = this.innerNodes[newNodeIndex];\n const maxDepthText = this.findInput('input[type=\"number\"]').value;\n const maxDepth = maxDepthText === '' ? Infinity : parseInt(maxDepthText, 10);\n this.column.setCutOff({node, maxDepth});\n return true;\n }\n}\n","import {DateColumn, IDateFilter} from '../../model';\nimport {noDateFilter} from '../../model/internalDate';\nimport {createDateFilter} from '../../renderer/DateHistogramCellRenderer';\nimport {cssClass} from '../../styles';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {IRankingHeaderContext} from '../interfaces';\n\n/** @internal */\nexport default class DateFilterDialog extends ADialog {\n private readonly before: IDateFilter;\n private handler: {reset: () => void, submit: () => void, cleanUp: () => void} | null = null;\n\n\n constructor(private readonly column: DateColumn, dialog: IDialogContext, private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n livePreview: 'filter',\n cancelSubDialogs: true,\n });\n this.before = this.column.getFilter() || noDateFilter();\n }\n\n protected build(node: HTMLElement) {\n node.classList.add(cssClass('dialog-mapper'));\n\n this.handler = createDateFilter(this.column, node, {\n dialogManager: this.ctx.dialogManager,\n idPrefix: this.ctx.idPrefix,\n tasks: this.ctx.provider.getTaskExecutor(),\n }, this.showLivePreviews());\n }\n\n\n cleanUp(action: 'cancel' | 'confirm' | 'handled') {\n super.cleanUp(action);\n this.handler!.cleanUp();\n }\n\n protected reset() {\n this.handler!.reset();\n }\n\n protected submit() {\n this.handler!.submit();\n return true;\n }\n\n protected cancel() {\n this.column.setFilter(this.before);\n }\n}\n","import {LinkColumn, LinkMapColumn, LinksColumn} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\n\n/** @internal */\nexport default class EditPatternDialog extends ADialog {\n\n private readonly before: string;\n\n constructor(private readonly column: LinkColumn | LinksColumn | LinkMapColumn, dialog: IDialogContext, private readonly idPrefix: string) {\n super(dialog);\n\n this.before = this.column.getPattern();\n }\n\n protected build(node: HTMLElement) {\n const templates = this.column.patternTemplates;\n node.insertAdjacentHTML('beforeend', `<strong>Edit Pattern (access via $\\{value}, $\\{item})</strong><input\n type=\"text\"\n size=\"30\"\n value=\"${this.before}\"\n required\n autofocus\n placeholder=\"pattern (access via $\\{value}, $\\{item})\"\n ${templates.length > 0 ? `list=\"ui${this.idPrefix}lineupPatternList\"` : ''}\n >`);\n if (templates.length > 0) {\n node.insertAdjacentHTML('beforeend', `<datalist id=\"ui${this.idPrefix}lineupPatternList\">${templates.map((t) => `<option value=\"${t}\">`)}</datalist>`);\n }\n\n this.enableLivePreviews('input');\n }\n\n protected cancel() {\n this.column.setPattern(this.before);\n }\n\n protected reset() {\n this.node.querySelector('input')!.value = '';\n }\n\n protected submit() {\n const newValue = this.node.querySelector('input')!.value;\n this.column.setPattern(newValue);\n return true;\n }\n}\n","import {Column} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {uniqueId, forEach} from './utils';\nimport {getToolbarDialogAddons} from '../toolbar';\nimport {IRankingHeaderContext, IToolbarDialogAddonHandler} from '../interfaces';\nimport {cssClass} from '../../styles';\n\n/** @internal */\nexport default class GroupDialog extends ADialog {\n private readonly handlers: IToolbarDialogAddonHandler[] = [];\n\n constructor(private readonly column: Column, dialog: IDialogContext, private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n livePreview: 'group'\n });\n }\n\n protected build(node: HTMLElement) {\n const addons = getToolbarDialogAddons(this.column, 'group', this.ctx);\n for(const addon of addons) {\n this.node.insertAdjacentHTML('beforeend', `<strong>${addon.title}</strong>`);\n this.handlers.push(addon.append(this.column, this.node, this.dialog, this.ctx));\n }\n\n this.handlers.push(sortOrder(node, this.column, this.dialog.idPrefix));\n\n for (const handler of this.handlers) {\n this.enableLivePreviews(handler.elems);\n }\n }\n\n protected submit() {\n for (const handler of this.handlers) {\n if (handler.submit() === false) {\n return false;\n }\n }\n return true;\n }\n\n protected cancel() {\n for (const handler of this.handlers) {\n handler.cancel();\n }\n }\n\n protected reset() {\n for (const handler of this.handlers) {\n handler.reset();\n }\n }\n}\n\nfunction sortOrder(node: HTMLElement, column: Column, idPrefix: string): IToolbarDialogAddonHandler {\n const ranking = column.findMyRanker()!;\n const current = ranking.getGroupCriteria();\n let order = current.indexOf(column);\n const enabled = order >= 0;\n\n if (order < 0) {\n order = current.length;\n }\n\n const id = uniqueId(idPrefix);\n node.insertAdjacentHTML('afterbegin', `\n <strong>Group By</strong>\n <label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"grouped\" value=\"true\" ${enabled ? 'checked' : ''} ><span>Enabled</span></label>\n <label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"grouped\" value=\"false\" ${!enabled ? 'checked' : ''} ><span>Disabled</span></label>\n <strong>Group Priority</strong>\n <input type=\"number\" id=\"${id}P\" step=\"1\" min=\"1\" max=\"${current.length + 1}\" value=\"${order + 1}\">\n `);\n\n const updateDisabled = (disable: boolean) => {\n forEach(node, 'input:not([name=grouped]), select, textarea', (d: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) => {\n d.disabled = disable;\n });\n };\n updateDisabled(!enabled);\n\n forEach(node, 'input[name=grouped]', (n: HTMLInputElement) => {\n n.addEventListener('change', () => {\n const enabled = n.value === 'true';\n updateDisabled(!enabled);\n }, {\n passive: true\n });\n });\n\n return {\n elems: `input[name=grouped], #${id}P`,\n submit() {\n const enabled = node.querySelector<HTMLInputElement>('input[name=grouped]:checked')!.value === 'true';\n const order = Number.parseInt(node.querySelector<HTMLInputElement>(`#${id}P`)!.value, 10) - 1;\n ranking.groupBy(column, !enabled ? -1 : order);\n return true;\n },\n reset() {\n node.querySelector<HTMLInputElement>('input[name=grouped][value=false]')!.checked = true;\n node.querySelector<HTMLInputElement>(`#${id}P`)!.value = (current.length + (!enabled ? 1 : 0)).toString();\n updateDisabled(true);\n },\n cancel() {\n ranking.groupBy(column, current.indexOf(column));\n }\n };\n}\n","import {round, similar, dragHandle, IDragHandleOptions} from '../../internal';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\n\nfunction clamp(v: number) {\n return Math.max(Math.min(v, 100), 0);\n}\n\n/** @internal */\nexport interface IMappingAdapter {\n destroyed(self: MappingLine): void;\n\n updated(self: MappingLine): void;\n\n domain(): number[];\n\n normalizeRaw(v: number): number;\n\n unnormalizeRaw(v: number): number;\n\n dialog: IDialogContext;\n\n formatter(v: number): string;\n}\n\n/** @internal */\nexport default class MappingLineDialog extends ADialog {\n private readonly before: {domain: number, range: number};\n\n constructor(private readonly line: {destroy(): void, domain: number, range: number, frozen: boolean, update(domain: number, range: number, trigger: boolean): void}, dialog: IDialogContext, private readonly adapter: IMappingAdapter) {\n super(dialog, {\n livePreview: 'dataMapping'\n });\n this.dialog.attachment.classList.add(cssClass('mapping-line-selected'));\n this.before = {\n domain: this.line.domain,\n range: this.line.range\n };\n }\n\n build(node: HTMLElement) {\n const domain = this.adapter.domain();\n node.insertAdjacentHTML('beforeend', `\n <button class=\"${cssClass('dialog-button')} lu-action-remove\" title=\"Remove\" type=\"button\" ${this.line.frozen ? 'style=\"display: none\"' : ''} ><span style=\"margin-left: 3px\">Remove Mapping Line</span></button>\n <strong>Input Domain Value (min ... max)</strong>\n <input type=\"number\" value=\"${this.adapter.formatter(this.adapter.unnormalizeRaw(this.line.domain))}\" ${this.line.frozen ? 'readonly disabled' : ''} autofocus required min=\"${domain[0]}\" max=\"${domain[1]}\" step=\"any\">\n <strong>Output Normalized Value (0 ... 1)</strong>\n <input type=\"number\" value=\"${round(this.line.range / 100, 3)}\" required min=\"0\" max=\"1\" step=\"any\">\n `);\n this.find('button').addEventListener('click', () => {\n this.destroy('confirm');\n this.line.destroy();\n }, {\n passive: true\n });\n this.enableLivePreviews('input');\n }\n\n cleanUp(action: 'cancel' | 'confirm' | 'handled') {\n super.cleanUp(action);\n\n this.dialog.attachment.classList.remove(cssClass('mapping-line-selected'));\n }\n\n protected cancel() {\n this.line.update(this.before.domain, this.before.range, true);\n }\n\n protected reset() {\n this.findInput('input[type=number]').value = round(this.adapter.unnormalizeRaw(this.before.domain), 3).toString();\n this.findInput('input[type=number]:last-of-type').value = round(this.before.range / 100, 3).toString();\n }\n\n protected submit() {\n if (!this.node.checkValidity()) {\n return false;\n }\n const domain = this.adapter.normalizeRaw(this.findInput('input[type=number]').valueAsNumber);\n const range = this.findInput('input[type=number]:last-of-type').valueAsNumber * 100;\n this.line.update(domain, range, true);\n return true;\n }\n}\n\n/** @internal */\nexport class MappingLine {\n readonly node: SVGGElement;\n\n constructor(g: SVGGElement, public domain: number, public range: number, private readonly adapter: IMappingAdapter) {\n const h = 52;\n g.insertAdjacentHTML('beforeend', `<g class=\"${cssClass('dialog-mapper-mapping')}\" transform=\"translate(${domain},0)\">\n <line x1=\"0\" x2=\"${range - domain}\" y2=\"${h}\"></line>\n <line x1=\"0\" x2=\"${range - domain}\" y2=\"${h}\"></line>\n <circle r=\"2\"></circle>\n <circle cx=\"${range - domain}\" cy=\"${h}\" r=\"2\"></circle>\n <text class=\"${cssClass('dialog-mapper-mapping-domain')} ${domain > 25 && domain < 75 ? cssClass('dialog-mapper-mapping-middle') : ''}${domain > 75 ? cssClass('dialog-mapper-mapping-right') : ''}\" dy=\"-3\">\n ${this.adapter.formatter(this.adapter.unnormalizeRaw(domain))}\n </text>\n <text class=\"${cssClass('dialog-mapper-mapping-range')} ${range > 25 && range < 75 ? cssClass('dialog-mapper-mapping-middle') : ''}${range > 50 ? cssClass('dialog-mapper-mapping-right') : ''}\" dy=\"3\" x=\"${range - domain}\" y=\"${h}\">\n ${round(range / 100, 3)}\n </text>\n <title>Drag the anchor circle to change the mapping, double click to edit</title>\n </g>`);\n this.node = <SVGGElement>g.lastElementChild!;\n\n // freeze 0 and 100 domain = raw domain ones\n this.node.classList.toggle(cssClass('frozen'), similar(0, domain) || similar(domain, 100));\n {\n let beforeDomain: number;\n let beforeRange: number;\n let shiftDomain: number;\n let shiftRange: number;\n\n const normalize = (x: number) => x * 100 / g.getBoundingClientRect().width;\n\n const common: Partial<IDragHandleOptions> = {\n container: g.parentElement!,\n filter: (evt) => evt.button === 0 && !evt.shiftKey,\n onStart: (_, x) => {\n beforeDomain = this.domain;\n beforeRange = this.range;\n const normalized = normalize(x);\n shiftDomain = this.domain - normalized;\n shiftRange = this.range - normalized;\n } ,\n onEnd: () => {\n if (!similar(beforeDomain, this.domain) || !similar(beforeRange, this.range)) {\n this.adapter.updated(this);\n }\n }\n };\n\n const line = this.node.querySelector<SVGLineElement>('line:first-of-type')!;\n dragHandle(line, { // line\n ...common,\n onDrag: (_, x) => {\n const normalized = normalize(x);\n this.update(clamp(normalized + shiftDomain), clamp(normalized + shiftRange));\n },\n });\n\n const domainCircle = this.node.querySelector<SVGLineElement>('circle:first-of-type')!;\n dragHandle(domainCircle, {\n ...common,\n onDrag: (_, x) => {\n const normalized = normalize(x);\n this.update(clamp(normalized), this.range);\n },\n });\n const rangeCircle = this.node.querySelector<SVGLineElement>('circle:last-of-type')!;\n dragHandle(rangeCircle, {\n ...common,\n onDrag: (_, x) => {\n const normalized = normalize(x);\n this.update(this.domain, clamp(normalized));\n },\n });\n }\n\n this.node.onclick = (evt) => {\n if (!evt.shiftKey) {\n return;\n }\n this.openDialog();\n };\n\n this.node.ondblclick = () => {\n this.openDialog();\n };\n }\n\n private openDialog() {\n const ctx = {\n manager: this.adapter.dialog.manager,\n level: this.adapter.dialog.level + 1,\n attachment: <any>this.node,\n idPrefix: this.adapter.dialog.idPrefix\n };\n const dialog = new MappingLineDialog(this, ctx, this.adapter);\n dialog.open();\n }\n\n get frozen() {\n return this.node.classList.contains(cssClass('frozen'));\n }\n\n destroy(handled = false) {\n this.node.remove();\n if (!handled) {\n this.adapter.destroyed(this);\n }\n }\n\n update(domain: number, range: number, trigger = false) {\n if (similar(domain, 100)) {\n domain = 100;\n }\n if (similar(domain, 0)) {\n domain = 0;\n }\n if (similar(range, 100)) {\n range = 100;\n }\n if (similar(range, 0)) {\n range = 0;\n }\n\n if (similar(domain, this.domain) && similar(range, this.range)) {\n return;\n }\n if (this.frozen) {\n domain = this.domain;\n }\n this.domain = domain;\n this.range = range;\n this.node.setAttribute('transform', `translate(${domain},0)`);\n const shift = range - domain;\n Array.from(this.node.querySelectorAll<SVGLineElement>('line')).forEach((d) => d.setAttribute('x2', String(shift)));\n this.node.querySelector<SVGCircleElement>('circle[cx]')!.setAttribute('cx', String(shift));\n\n const t1 = this.node.querySelector<SVGTextElement>('text')!;\n t1.textContent = this.adapter.formatter(this.adapter.unnormalizeRaw(domain));\n t1.classList.toggle(cssClass('dialog-mapper-mapping-right'), domain > 75);\n t1.classList.toggle(cssClass('dialog-mapper-mapping-middle'), domain >= 25 && domain <= 75);\n\n const t2 = this.node.querySelector<SVGTextElement>('text[x]')!;\n t2.textContent = round(range / 100, 3).toString();\n t2.classList.toggle(cssClass('dialog-mapper-mapping-right'), range > 75);\n t2.classList.toggle(cssClass('dialog-mapper-mapping-middle'), range >= 25 && range <= 75);\n t2.setAttribute('x', String(shift));\n\n if (trigger) {\n this.adapter.updated(this);\n }\n }\n}\n","import {ISequence, round} from '../../internal';\nimport {IMapAbleColumn, IMappingFunction, isMissingValue, isMapAbleColumn} from '../../model';\nimport {IRankingHeaderContext} from '../interfaces';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {IMappingAdapter, MappingLine} from './MappingLineDialog';\nimport {cssClass} from '../../styles';\nimport {ScaleMappingFunction, ScriptMappingFunction} from '../../model/MappingFunction';\n\n/** @internal */\nexport default class MappingDialog extends ADialog {\n\n private scale: IMappingFunction;\n\n private readonly mappingLines: MappingLine[] = [];\n private rawDomain: [number, number];\n\n private readonly data: Promise<ISequence<number>>;\n private readonly idPrefix: string;\n\n private readonly before: IMappingFunction;\n\n private readonly mappingAdapter: IMappingAdapter = {\n destroyed: (self: MappingLine) => {\n this.mappingLines.splice(this.mappingLines.indexOf(self), 1);\n this.updateLines(this.computeScale());\n },\n updated: () => this.updateLines(this.computeScale()),\n domain: () => this.rawDomain,\n normalizeRaw: this.normalizeRaw.bind(this),\n unnormalizeRaw: this.unnormalizeRaw.bind(this),\n dialog: this.dialog,\n formatter: this.column.getNumberFormat()\n };\n\n constructor(private readonly column: IMapAbleColumn, dialog: IDialogContext, ctx: IRankingHeaderContext) {\n super(dialog, {\n livePreview: 'dataMapping',\n cancelSubDialogs: true,\n });\n\n this.idPrefix = `me${ctx.idPrefix}`;\n this.before = this.column.getMapping().clone();\n this.scale = this.column.getMapping().clone();\n const domain = this.scale.domain;\n this.rawDomain = [domain[0], domain[domain.length - 1]];\n\n this.data = Promise.resolve(ctx.provider.mappingSample(column));\n }\n\n private get scaleType() {\n if ((this.scale instanceof ScriptMappingFunction)) {\n return 'script';\n }\n if (this.scale instanceof ScaleMappingFunction) {\n const base = this.scale.scaleType;\n if (base !== 'linear') {\n return base;\n }\n // check if invert or absolute\n const r = this.scale.range;\n if (r.length === 2 && r[0] === 1 && r[1] === 0) {\n return 'linear_invert';\n }\n if (r.length === 3 && r[0] === 1 && r[1] === 0 && r[2] === 1) {\n return 'linear_abs';\n }\n return 'linear';\n }\n return 'unknown';\n }\n\n build(node: HTMLElement) {\n node.classList.add(cssClass('dialog-mapper'));\n\n const r = this.column.findMyRanker();\n const others = !r ? [] : r.flatColumns.filter((d) => isMapAbleColumn(d) && d !== this.column);\n\n node.insertAdjacentHTML('beforeend', `\n <div><label for=\"${this.idPrefix}mapping_type\"><strong>Normalization Scaling:</strong></label><select id=\"${this.idPrefix}mapping_type\" class=\"browser-default\">\n <option value=\"linear\">Linear</option>\n <option value=\"linear_invert\">Invert</option>\n <option value=\"linear_abs\">Absolute</option>\n <option value=\"log\">Log</option>\n <option value=\"pow1.1\">Pow 1.1</option>\n <option value=\"pow2\">Pow 2</option>\n <option value=\"pow3\">Pow 3</option>\n <option value=\"sqrt\">Sqrt</option>\n <option value=\"script\">Custom Script</option>\n <option value=\"unknown\">Unknown</option>\n ${others.length > 0 ? `<optgroup label=\"Copy From\">${others.map((d) => `<option value=\"copy_${d.id}\">${d.label}</option>`).join('')}</optgroup>`: ''}\n </select>\n </div>\n <div class=${cssClass('dialog-mapper-domain')}>\n <input id=\"${this.idPrefix}min\" required type=\"number\" value=\"${round(this.rawDomain[0], 3)}\" step=\"any\">\n <span>Input Domain (min - max)</span>\n <input id=\"${this.idPrefix}max\" required type=\"number\" value=\"${round(this.rawDomain[1], 3)}\" step=\"any\">\n </div>\n <svg class=\"${cssClass('dialog-mapper-details')}\" viewBox=\"0 0 106 66\">\n <g transform=\"translate(3,7)\">\n <rect y=\"-3\" width=\"100\" height=\"10\">\n <title>Click to create a new mapping line</title>\n </rect>\n <rect y=\"49\" width=\"100\" height=\"10\">\n <title>Click to create a new mapping line</title>\n </rect>\n </g>\n </svg>\n <div class=${cssClass('dialog-mapper-range')}>\n <span>Output Normalized Domain (0 - 1)</span>\n </div>\n <div class=\"${cssClass('dialog-mapper-script')}\">\n <strong>Custom Normalization Script</strong>\n <textarea class=\"${cssClass('textarea')}\"></textarea>\n </div>`);\n\n const g = <SVGGElement>node.querySelector(`.${cssClass('dialog-mapper-details')} > g`);\n\n this.forEach(`.${cssClass('dialog-mapper-details')} rect`, (d: SVGRectElement) => d.onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n const bb = d.getBoundingClientRect();\n const x = round((evt.x - bb.left) * 100 / bb.width, 2);\n const m = new MappingLine(g, x, x, this.mappingAdapter);\n this.mappingLines.push(m);\n });\n\n {\n\n const select = <HTMLSelectElement>this.find('select');\n const textarea = <HTMLTextAreaElement>this.find('textarea');\n select.onchange = (evt) => {\n const select = <HTMLSelectElement>evt.currentTarget;\n switch (select.value) {\n case 'linear_invert':\n this.scale = new ScaleMappingFunction(this.rawDomain.slice(), 'linear', [1, 0]);\n break;\n case 'linear_abs':\n this.scale = new ScaleMappingFunction([this.rawDomain[0], (this.rawDomain[1] - this.rawDomain[0]) / 2, this.rawDomain[1]], 'linear', [1, 0, 1]);\n break;\n case 'script':\n const s = new ScriptMappingFunction(this.rawDomain.slice());\n this.scale = s;\n textarea.value = s.code;\n break;\n case 'unknown':\n // clone original again\n this.scale = this.column.getOriginalMapping().clone();\n break;\n default:\n if (select.value.startsWith('copy_')) {\n this.copyMapping(select.value.slice('copy_'.length));\n return;\n }\n this.scale = new ScaleMappingFunction(this.rawDomain.slice(), select.value, [0, 1]);\n break;\n }\n this.createMappings();\n node.dataset.scale = select.value;\n this.updateLines();\n };\n const scaleType = node.dataset.scale = this.scaleType;\n select.selectedIndex = Array.from(select.options).findIndex((d) => d.value === scaleType);\n\n if (scaleType === 'script') {\n textarea.value = (<ScriptMappingFunction>this.scale).code;\n }\n this.createMappings();\n }\n\n {\n this.forEach(`#${this.idPrefix}min, #${this.idPrefix}max`, (d: HTMLInputElement, i) => d.onchange = () => {\n const v = d.valueAsNumber;\n if (v === this.rawDomain[i]) {\n d.setCustomValidity('');\n return;\n }\n const other = this.rawDomain[1 - i];\n if (isNaN(v) || (i === 0 && v >= other) || (i === 1 && v <= other)) {\n d.setCustomValidity(`value has to be ${i === 0 ? '<= max' : '>= min'}`);\n return;\n }\n d.setCustomValidity('');\n this.rawDomain[i] = v;\n this.scale = this.computeScale();\n const patchedDomain = this.scale.domain.slice();\n patchedDomain[0] = this.rawDomain[0];\n patchedDomain[patchedDomain.length - 1] = this.rawDomain[1];\n this.scale.domain = patchedDomain;\n this.createMappings();\n this.updateLines();\n if (this.showLivePreviews()) {\n this.column.setMapping(this.scale);\n }\n });\n }\n\n this.data.then((values) => {\n values.forEach((v) => {\n if (!isMissingValue(v)) {\n g.insertAdjacentHTML('afterbegin', `<line data-v=\"${v}\" x1=\"${round(this.normalizeRaw(v), 2)}\" x2=\"${round(this.scale.apply(v) * 100, 2)}\" y2=\"52\"></line>`);\n }\n });\n });\n }\n\n private createMappings() {\n this.mappingLines.splice(0, this.mappingLines.length).forEach((d) => d.destroy(true));\n if (!(this.scale instanceof ScaleMappingFunction)) {\n return;\n }\n const g = <SVGGElement>this.node.querySelector(`.${cssClass('dialog-mapper-details')} > g`);\n const domain = this.scale.domain;\n const range = this.scale.range;\n for (let i = 0; i < domain.length; ++i) {\n this.mappingLines.push(new MappingLine(g, this.normalizeRaw(domain[i]), range[i] * 100, this.mappingAdapter));\n }\n }\n\n private update() {\n const scaleType = this.node.dataset.scale = this.scaleType;\n const select = <HTMLSelectElement>this.find('select');\n select.selectedIndex = Array.from(select.options).findIndex((d) => d.value === scaleType);\n if (scaleType === 'script') {\n (<HTMLTextAreaElement>this.find('textarea')).value = (<ScriptMappingFunction>this.scale).code;\n }\n this.forEach(`input[type=number]`, (d: HTMLInputElement, i) => {\n d.value = round(this.rawDomain[i], 3).toString();\n });\n }\n\n private updateLines(scale = this.scale) {\n this.forEach(`.${cssClass('dialog-mapper-details')} > g > line[x1]`, (d: SVGLineElement) => {\n const v = parseFloat(d.getAttribute('data-v')!);\n d.setAttribute('x1', round(this.normalizeRaw(v), 2).toString());\n d.setAttribute('x2', round(scale.apply(v) * 100, 2).toString());\n });\n }\n\n protected reset() {\n this.scale = this.column.getOriginalMapping().clone();\n const domain = this.scale.domain;\n this.rawDomain = [domain[0], domain[domain.length - 1]];\n this.update();\n this.createMappings();\n this.updateLines();\n }\n\n private copyMapping(columnId: string) {\n const r = this.column.findMyRanker();\n if (!r) {\n return;\n }\n const ref = <IMapAbleColumn>r.find(columnId)!;\n this.scale = ref.getMapping().clone();\n this.rawDomain = <[number, number]>this.scale.domain.slice();\n this.update();\n this.createMappings();\n this.updateLines();\n }\n\n private normalizeRaw(d: number) {\n const v = (d - this.rawDomain[0]) * 100 / (this.rawDomain[1] - this.rawDomain[0]);\n return Math.max(Math.min(v, 100), 0); // clamp\n }\n\n private unnormalizeRaw(d: number) {\n return (d) * (this.rawDomain[1] - this.rawDomain[0]) / 100 + this.rawDomain[0];\n }\n\n private computeScale() {\n const type = this.scaleType;\n if (type === 'script') {\n return new ScriptMappingFunction(this.rawDomain.slice(), this.node.querySelector('textarea')!.value);\n }\n this.mappingLines.sort((a, b) => a.domain - b.domain);\n const domain = this.mappingLines.map((d) => this.unnormalizeRaw(d.domain));\n const range = this.mappingLines.map((d) => d.range / 100);\n return new ScaleMappingFunction(domain, type, range);\n }\n\n protected submit() {\n if (!this.node.checkValidity()) {\n return false;\n }\n const scale = this.computeScale();\n this.column.setMapping(scale);\n return true;\n }\n\n protected cancel() {\n this.column.setMapping(this.before);\n }\n}\n","import {IMapAbleColumn, INumberFilter} from '../../model';\nimport {createNumberFilter} from '../../renderer/HistogramCellRenderer';\nimport {cssClass} from '../../styles';\nimport {IRankingHeaderContext} from '../interfaces';\nimport ADialog, {IDialogContext} from './ADialog';\n\n/** @internal */\nexport default class NumberFilterDialog extends ADialog {\n private readonly before: INumberFilter;\n private handler: {reset: () => void, submit: () => void, cleanUp: () => void} | null = null;\n\n constructor(private readonly column: IMapAbleColumn, dialog: IDialogContext, private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n livePreview: 'filter',\n cancelSubDialogs: true,\n });\n\n this.before = column.getFilter();\n }\n\n build(node: HTMLElement) {\n node.classList.add(cssClass('dialog-mapper'));\n\n this.handler = createNumberFilter(this.column, node, {\n dialogManager: this.ctx.dialogManager,\n idPrefix: this.ctx.idPrefix,\n tasks: this.ctx.provider.getTaskExecutor(),\n }, this.showLivePreviews());\n }\n\n cleanUp(action: 'cancel' | 'confirm' | 'handled') {\n super.cleanUp(action);\n this.handler!.cleanUp();\n }\n\n protected reset() {\n this.handler!.reset();\n }\n\n protected submit() {\n this.handler!.submit();\n return true;\n }\n\n protected cancel() {\n this.column.setFilter(this.before);\n }\n}\n","import {forEach} from '../../renderer/utils';\nimport {cssClass} from '../../styles';\nimport {getSortLabel} from '../../internal';\nimport {IToolbarDialogAddonHandler} from '../interfaces';\n\n/** @internal */\nexport function sortMethods(node: HTMLElement, column: {setSortMethod(v: string): void, getSortMethod(): string}, methods: string[]): IToolbarDialogAddonHandler {\n const bak = column.getSortMethod();\n methods.forEach((d) => node.insertAdjacentHTML('beforeend', `<label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"multivaluesort\" value=\"${d}\" ${(bak === d) ? 'checked' : ''} ><span>${getSortLabel(d)}</span></label>`));\n\n forEach(node, 'input[name=multivaluesort]', (n: HTMLInputElement) => {\n n.addEventListener('change', () => column.setSortMethod(n.value), {\n passive: true\n });\n });\n\n return {\n elems: 'input[name=multivaluesort]',\n submit() {\n const selected = node.querySelector<HTMLInputElement>('input[name=multivaluesort]:checked')!.value;\n column.setSortMethod(selected);\n return true;\n },\n cancel() {\n column.setSortMethod(bak);\n },\n reset() {\n node.querySelector<HTMLInputElement>(`input[name=multivaluesort][value=\"${bak}\"]`)!.checked = true;\n }\n };\n}\n\n\n/** @internal */\nexport {uniqueId, forEach, forEachChild, colorOf} from '../../renderer/utils';\n","import {EAdvancedSortMethod, ReduceColumn} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {sortMethods} from './utils';\nimport {IToolbarDialogAddonHandler} from '../interfaces';\n\n/** @internal */\nexport default class ReduceDialog extends ADialog {\n private handler: IToolbarDialogAddonHandler | null = null;\n\n constructor(private readonly column: ReduceColumn, dialog: IDialogContext) {\n super(dialog, {\n livePreview: 'reduce'\n });\n }\n\n protected build(node: HTMLElement) {\n const wrapper = {\n getSortMethod: () => this.column.getReduce(),\n setSortMethod: (s: EAdvancedSortMethod) => this.column.setReduce(s)\n };\n this.handler = sortMethods(node, wrapper, Object.keys(EAdvancedSortMethod));\n\n this.enableLivePreviews(this.handler.elems);\n }\n\n protected submit() {\n return this.handler!.submit();\n }\n\n protected reset() {\n this.handler!.reset();\n }\n\n protected cancel() {\n this.handler!.cancel();\n }\n}\n","import {Column, IColumnMetaData} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\n\n/** @internal */\nexport default class RenameDialog extends ADialog {\n\n private readonly before: IColumnMetaData;\n\n constructor(private readonly column: Column, dialog: IDialogContext) {\n super(dialog);\n this.before = column.getMetaData();\n }\n\n protected build(node: HTMLElement) {\n node.classList.add(cssClass('dialog-rename'));\n node.insertAdjacentHTML('beforeend', `\n <input type=\"text\" value=\"${this.column.label}\" required autofocus placeholder=\"name\">\n <input type=\"text\" value=\"${this.column.getMetaData().summary}\" placeholder=\"summary\" name=\"summary\">\n <textarea class=\"${cssClass('textarea')}\" rows=\"5\" placeholder=\"description\">${this.column.description}</textarea>`);\n }\n\n protected reset() {\n const desc = this.column.desc;\n const meta = {\n label: desc.label || this.column.id,\n summary: desc.summary || '',\n description: desc.description || ''\n };\n this.findInput('input[type=\"text\"]').value = meta.label;\n this.findInput('input[name=\"summary\"]').value = meta.summary;\n this.node.querySelector('textarea')!.value = meta.description;\n }\n\n protected submit() {\n const label = this.findInput('input[type=\"text\"]').value;\n const summary = this.findInput('input[name=\"summary\"]').value.trim();\n const description = this.node.querySelector('textarea')!.value;\n this.column.setMetaData({label, description, summary});\n return true;\n }\n\n protected cancel() {\n this.column.setMetaData(this.before);\n }\n}\n","import {ScriptColumn} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\n\n/** @internal */\nexport default class ScriptEditDialog extends ADialog {\n private readonly before: string;\n\n constructor(private readonly column: ScriptColumn, dialog: IDialogContext) {\n super(dialog);\n this.before = column.getScript();\n }\n\n protected build(node: HTMLElement) {\n node.insertAdjacentHTML('beforeend', `<textarea class=\"${cssClass('textarea')}\" autofocus=\"true\" rows=\"5\" autofocus=\"autofocus\" style=\"width: 95%;\">${this.column.getScript()}</textarea>`);\n }\n\n protected cancel() {\n this.column.setScript(this.before);\n }\n\n protected reset() {\n this.node.querySelector('textarea')!.value = (<any>this.column.desc).script || ScriptColumn.DEFAULT_SCRIPT;\n }\n\n protected submit() {\n this.column.setScript(this.node.querySelector('textarea')!.value);\n return true;\n }\n}\n","import {Column} from '../../model';\nimport {IDataProvider} from '../../provider';\nimport ADialog, { IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\nimport {debounce} from '../../internal';\n\n/** @internal */\nexport default class SearchDialog extends ADialog {\n\n constructor(private readonly column: Column, dialog: IDialogContext, private readonly provider: IDataProvider) {\n super(dialog, {\n livePreview: 'search'\n });\n }\n\n protected build(node: HTMLElement) {\n node.insertAdjacentHTML('beforeend', `<input type=\"text\" size=\"20\" value=\"\" required autofocus placeholder=\"search... (>= 3 chars)\">\n <label class=\"${cssClass('checkbox')}\">\n <input type=\"checkbox\">\n <span>Use regular expressions</span>\n </label>\n `);\n\n const input = <HTMLInputElement>node.querySelector('input[type=\"text\"]')!;\n const checkbox = <HTMLInputElement>node.querySelector('input[type=\"checkbox\"]')!;\n const update = () => {\n const search: any = input.value;\n if (search.length < 3) {\n input.setCustomValidity('at least 3 characters');\n return;\n }\n input.setCustomValidity('');\n };\n input.addEventListener('input', update, {\n passive: true\n });\n checkbox.addEventListener('change', update, {\n passive: true\n });\n this.enableLivePreviews([input, checkbox]);\n\n if (!this.showLivePreviews()) {\n return;\n }\n input.addEventListener('input', debounce(() => this.submit(), 100), {\n passive: true\n });\n }\n\n protected submit() {\n const input = this.findInput('input[type=\"text\"]')!;\n const checkbox = this.findInput('input[type=\"checkbox\"]')!;\n\n let search: any = input.value;\n const isRegex = checkbox.checked;\n if (isRegex) {\n search = new RegExp(search);\n }\n this.provider.searchAndJump(search, this.column);\n return true;\n }\n\n protected reset() {\n const input = this.findInput('input[type=\"text\"]')!;\n const checkbox = this.findInput('input[type=\"checkbox\"]')!;\n input.value = '';\n checkbox.checked = false;\n }\n\n protected cancel() {\n // nothing to do\n }\n}\n","import ADialog, {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\nimport {IDataProvider} from '../../provider';\n\n/** @internal */\nexport default class ShowTopNDialog extends ADialog {\n\n private readonly before: number;\n\n constructor(private readonly provider: IDataProvider, dialog: IDialogContext) {\n super(dialog);\n\n this.before = this.provider.getShowTopN();\n }\n\n protected build(node: HTMLElement) {\n node.classList.add(cssClass('dialog-rename'));\n node.insertAdjacentHTML('beforeend', `\n <input type=\"number\" min=\"0\" step=\"1\" value=\"${this.before}\">`);\n\n this.enableLivePreviews('input');\n }\n\n protected cancel() {\n this.provider.setShowTopN(this.before);\n }\n\n protected submit() {\n const value = this.findInput('input').valueAsNumber;\n this.provider.setShowTopN(value);\n return true;\n }\n\n protected reset() {\n const defaultValue = 10;\n this.findInput('input').value = defaultValue.toString();\n }\n}\n","import {Column} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {uniqueId, forEach} from './utils';\nimport {getToolbarDialogAddons} from '../toolbar';\nimport {IRankingHeaderContext, IToolbarDialogAddonHandler} from '../interfaces';\nimport {cssClass} from '../../styles';\n\n/** @internal */\nexport default class SortDialog extends ADialog {\n private readonly handlers: IToolbarDialogAddonHandler[] = [];\n\n constructor(private readonly column: Column, private readonly groupSortBy: boolean, dialog: IDialogContext, private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n livePreview: groupSortBy ? 'groupSort' : 'sort'\n });\n }\n\n protected build(node: HTMLElement) {\n const addons = getToolbarDialogAddons(this.column, this.groupSortBy ? 'sortGroup' : 'sort', this.ctx);\n for(const addon of addons) {\n this.node.insertAdjacentHTML('beforeend', `<strong>${addon.title}</strong>`);\n this.handlers.push(addon.append(this.column, this.node, this.dialog, this.ctx));\n }\n\n this.handlers.push(sortOrder(node, this.column, this.dialog.idPrefix, this.groupSortBy));\n\n for (const handler of this.handlers) {\n this.enableLivePreviews(handler.elems);\n }\n }\n\n protected submit() {\n for (const handler of this.handlers) {\n if (handler.submit() === false) {\n return false;\n }\n }\n return true;\n }\n\n protected cancel() {\n for (const handler of this.handlers) {\n handler.cancel();\n }\n }\n\n protected reset() {\n for (const handler of this.handlers) {\n handler.reset();\n }\n }\n}\n\nfunction sortOrder(node: HTMLElement, column: Column, idPrefix: string, groupSortBy: boolean = false): IToolbarDialogAddonHandler {\n const ranking = column.findMyRanker()!;\n const current = groupSortBy ? ranking.getGroupSortCriteria() : ranking.getSortCriteria();\n const order = Object.assign({}, groupSortBy ? column.isGroupSortedByMe() : column.isSortedByMe());\n\n const priority = order.priority === undefined ? current.length : order.priority;\n\n const id = uniqueId(idPrefix);\n node.insertAdjacentHTML('afterbegin', `\n <strong>Sort Order</strong>\n <label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"sortorder\" value=\"asc\" ${(order.asc === 'asc') ? 'checked' : ''} ><span>Ascending</span></label>\n <label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"sortorder\" value=\"desc\" ${(order.asc === 'desc') ? 'checked' : ''} ><span>Decending</span></label>\n <label class=\"${cssClass('checkbox')}\"><input type=\"radio\" name=\"sortorder\" value=\"none\" ${(order.asc === undefined) ? 'checked' : ''} ><span>Unsorted</span></label>\n <strong>Sort Priority</strong>\n <input type=\"number\" id=\"${id}P\" step=\"1\" min=\"1\" max=\"${current.length + 1}\" value=\"${priority + 1}\">\n `);\n\n const updateDisabled = (disable: boolean) => {\n forEach(node, 'input:not([name=sortorder]), select, textarea', (d: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) => {\n d.disabled = disable;\n });\n };\n updateDisabled(order.asc === undefined);\n\n forEach(node, 'input[name=sortorder]', (n: HTMLInputElement) => {\n n.addEventListener('change', () => {\n updateDisabled(n.value === 'none');\n }, {\n passive: true\n });\n });\n\n return {\n elems: `input[name=sortorder], #${id}P`,\n submit() {\n const asc = node.querySelector<HTMLInputElement>('input[name=sortorder]:checked')!.value;\n const priority = Number.parseInt(node.querySelector<HTMLInputElement>(`#${id}P`)!.value, 10) - 1;\n\n if (groupSortBy) {\n ranking.groupSortBy(column, asc === 'asc', asc === 'none' ? -1 : priority);\n } else {\n ranking.sortBy(column, asc === 'asc', asc === 'none' ? -1 : priority);\n }\n return true;\n },\n reset() {\n node.querySelector<HTMLInputElement>('input[name=sortorder][value=none]')!.checked = true;\n node.querySelector<HTMLInputElement>(`#${id}P`)!.value = (current.length + (order.priority === undefined ? 1 : 0)).toString();\n updateDisabled(true);\n },\n cancel() {\n if (groupSortBy) {\n ranking.groupSortBy(column, order.asc === 'asc', order.asc === undefined ? -1 : order.priority);\n } else {\n ranking.sortBy(column, order.asc === 'asc', order.asc === undefined ? -1 : order.priority);\n }\n }\n };\n}\n","import {StringColumn, IStringFilter} from '../../model';\nimport {filterMissingMarkup, findFilterMissing} from '../missing';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\nimport {debounce} from '../../internal';\n\n\nfunction toInput(text: string, isRegex: boolean) {\n const v = text.trim();\n if (v === '') {\n return null;\n }\n return isRegex ? new RegExp(v, 'm') : v;\n}\n\n\n/** @internal */\nexport default class StringFilterDialog extends ADialog {\n\n private readonly before: IStringFilter | null;\n\n constructor(private readonly column: StringColumn, dialog: IDialogContext) {\n super(dialog, {\n livePreview: 'filter'\n });\n\n this.before = this.column.getFilter();\n }\n\n private updateFilter(filter: string | RegExp | null, filterMissing: boolean) {\n if (filter == null && !filterMissing) {\n this.column.setFilter(null);\n } else {\n this.column.setFilter({filter, filterMissing});\n }\n }\n\n protected reset() {\n this.findInput('input[type=\"text\"]').value = '';\n this.forEach('input[type=checkbox]', (n: HTMLInputElement) => n.checked = false);\n }\n\n protected cancel() {\n if (this.before) {\n this.updateFilter(this.before.filter === '' ? null : this.before.filter, this.before.filterMissing);\n } else {\n this.updateFilter(null, false);\n }\n }\n\n protected submit() {\n const filterMissing = findFilterMissing(this.node).checked;\n const input = this.findInput('input[type=\"text\"]').value;\n const isRegex = this.findInput('input[type=\"checkbox\"]').checked;\n this.updateFilter(toInput(input, isRegex), filterMissing);\n return true;\n }\n\n protected build(node: HTMLElement) {\n const bak = this.column.getFilter() || {filter: '', filterMissing: false};\n node.insertAdjacentHTML('beforeend', `<input type=\"text\" placeholder=\"Filter ${this.column.desc.label}...\" autofocus value=\"${(bak.filter instanceof RegExp) ? bak.filter.source : bak.filter || ''}\" style=\"width: 100%\">\n <label class=\"${cssClass('checkbox')}\">\n <input type=\"checkbox\" ${(bak.filter instanceof RegExp) ? 'checked=\"checked\"' : ''}>\n <span>Use regular expressions</span>\n </label>\n ${filterMissingMarkup(bak.filterMissing)}`);\n\n const filterMissing = findFilterMissing(node);\n const input = <HTMLInputElement>node.querySelector('input[type=\"text\"]');\n const isRegex = <HTMLInputElement>node.querySelector('input[type=\"checkbox\"]');\n\n this.enableLivePreviews([filterMissing, input, isRegex]);\n\n if (!this.showLivePreviews()) {\n return;\n }\n input.addEventListener('input', debounce(() => this.submit(), 100), {\n passive: true\n });\n }\n}\n","import {round} from '../../internal';\nimport {StackColumn} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {forEach, colorOf} from './utils';\nimport {cssClass} from '../../styles';\n\n/** @internal */\nexport default class WeightsEditDialog extends ADialog {\n\n private readonly weights: number[];\n\n constructor(private readonly column: StackColumn, dialog: IDialogContext) {\n super(dialog);\n\n this.weights = this.column.getWeights();\n }\n\n protected cancel() {\n this.column.setWeights(this.weights.slice());\n }\n\n protected reset() {\n const weight = 100 / this.weights.length;\n forEach(this.node, 'input[type=number]', (n: HTMLInputElement) => {\n const v = round(weight, 2);\n n.value = String(v);\n (<HTMLElement>n.nextElementSibling!.firstElementChild!).style.width = `${v}%`;\n });\n }\n\n protected build(node: HTMLElement) {\n\n const children = this.column.children;\n node.insertAdjacentHTML('beforeend', `<div class=\"${cssClass('dialog-table')}\">\n ${this.weights.map((weight, i) => `<div class=\"${cssClass('dialog-weights-table-entry')}\">\n <input type=\"number\" value=\"${round(weight * 100, 2)}\" min=\"0\" max=\"100\" step=\"any\" required>\n <span class=\"${cssClass('dialog-filter-color-bar')}\">\n <span style=\"background-color: ${colorOf(children[i])}; width: ${round(weight * 100, 2)}%\"></span>\n </span>\n ${children[i].label}\n </div>`).join('')}\n </div>`);\n const inputs = Array.from(this.node.querySelectorAll<HTMLInputElement>('input[type=number]'));\n inputs.forEach((d, i) => {\n d.oninput = () => {\n const weight = d.valueAsNumber;\n if (weight <= 0) {\n d.setCustomValidity('weight cannot be zero');\n } else {\n d.setCustomValidity('');\n }\n this.updateBar(d);\n\n if (inputs.length !== 2) {\n return;\n }\n\n // corner case auto decrease the other\n const rest = 100 - weight;\n\n if (rest <= 0) {\n d.setCustomValidity('weight cannot be 100 in case of two elements');\n } else {\n d.setCustomValidity('');\n }\n\n const other = inputs[1 - i]!;\n other.value = round(rest, 2).toString();\n this.updateBar(other);\n };\n });\n }\n\n private updateBar(input: HTMLInputElement) {\n (<HTMLElement>input.nextElementSibling!.firstElementChild!).style.width = `${input.value}%`;\n }\n\n private distributeWeights() {\n const inputs = Array.from(this.node.querySelectorAll<HTMLInputElement>('input[type=number]')).map((d) => ({input: d, weight: d.value ? d.valueAsNumber : NaN}));\n const hasMissing = inputs.some((d) => isNaN(d.weight));\n if (hasMissing) {\n // compute missing ones\n const missingIndices = inputs.filter((d) => isNaN(d.weight));\n const correct = inputs.filter((d) => !isNaN(d.weight));\n const sum = correct.reduce((a, b) => a + b.weight, 0);\n\n if (sum < 100) {\n // compute rest\n const rest = (100 - sum) / missingIndices.length;\n for (const input of missingIndices) {\n input.input.value = round(rest, 2).toString();\n this.updateBar(input.input);\n }\n return;\n }\n // already above 100, set missing to 0 and do a regular normalization (user has to deal with it)\n for (const input of missingIndices) {\n input.input.value = '0';\n this.updateBar(input.input);\n }\n }\n\n const weights = inputs.map((d) => d.weight);\n if (validWeights(weights)) {\n return; // nothing to do\n }\n\n // pure distribute the sum\n const sum = weights.reduce((a, b) => a + b, 0);\n for (const input of inputs) {\n input.input.value = round(input.weight * 100 / sum, 2).toString();\n this.updateBar(input.input);\n }\n }\n\n protected appendDialogButtons() {\n super.appendDialogButtons();\n const buttons = this.node.querySelector<HTMLElement>(`.${cssClass('dialog-buttons')}`)!;\n buttons.insertAdjacentHTML('beforeend', `<button class=\"${cssClass('dialog-button')} ${cssClass('dialog-weights-distribute-button')}\" type=\"button\" title=\"distribute weights\"></button>`);\n\n const last = <HTMLElement>buttons.lastElementChild!;\n last.onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n this.distributeWeights();\n };\n }\n\n submit() {\n const inputs = Array.from(this.node.querySelectorAll<HTMLInputElement>('input[type=number]')).map((d) => ({input: d, weight: d.valueAsNumber}));\n let invalid = false;\n for (const input of inputs) {\n if (input.weight <= 0) {\n input.input.setCustomValidity('weight cannot be zero');\n invalid = true;\n } else {\n input.input.setCustomValidity('');\n }\n }\n const weights = inputs.map((d) => d.weight);\n if (!invalid && !validWeights(weights)) {\n inputs[inputs.length - 1].input.setCustomValidity('sum of weights has to be 100, change weights or use the redistribute button to fix');\n invalid = true;\n }\n if (invalid) {\n if (typeof (<any>this.node).reportValidity === 'function') {\n (<any>this.node).reportValidity();\n }\n return false;\n }\n\n this.column.setWeights(weights.map((d) => d / 100));\n return true;\n }\n}\n\nfunction validWeights(weights: number[]) {\n return Math.abs(weights.reduce((a, b) => a + b, 0) - 100) < 3;\n}\n","import {getAllToolbarActions, getAllToolbarDialogAddons} from '../model/internal';\nimport {Column, EDateSort, EAdvancedSortMethod, ESortMethod, isSupportType, CompositeColumn, IMultiLevelColumn, isSortingAscByDefault} from '../model';\nimport {cssClass} from '../styles';\nimport ADialog, {IDialogContext, dialogContext} from './dialogs/ADialog';\nimport CategoricalColorMappingDialog from './dialogs/CategoricalColorMappingDialog';\nimport CategoricalFilterDialog from './dialogs/CategoricalFilterDialog';\nimport CategoricalMappingFilterDialog from './dialogs/CategoricalMappingFilterDialog';\nimport ChangeRendererDialog from './dialogs/ChangeRendererDialog';\nimport ColorMappingDialog from './dialogs/ColorMappingDialog';\nimport CompositeChildrenDialog from './dialogs/CompositeChildrenDialog';\nimport CutOffHierarchyDialog from './dialogs/CutOffHierarchyDialog';\nimport DateFilterDialog from './dialogs/DateFilterDialog';\nimport EditPatternDialog from './dialogs/EditPatternDialog';\nimport appendDate from './dialogs/groupDate';\nimport GroupDialog from './dialogs/GroupDialog';\nimport appendNumber from './dialogs/groupNumber';\nimport appendString from './dialogs/groupString';\nimport MappingDialog from './dialogs/MappingDialog';\nimport NumberFilterDialog from './dialogs/NumberFilterDialog';\nimport ReduceDialog from './dialogs/ReduceDialog';\nimport RenameDialog from './dialogs/RenameDialog';\nimport ScriptEditDialog from './dialogs/ScriptEditDialog';\nimport SearchDialog from './dialogs/SearchDialog';\nimport ShowTopNDialog from './dialogs/ShowTopNDialog';\nimport SortDialog from './dialogs/SortDialog';\nimport StringFilterDialog from './dialogs/StringFilterDialog';\nimport {sortMethods} from './dialogs/utils';\nimport WeightsEditDialog from './dialogs/WeightsEditDialog';\nimport {IRankingHeaderContext, IOnClickHandler, IUIOptions, IToolbarAction, IToolbarDialogAddon} from './interfaces';\n\ninterface IDialogClass {\n new(col: any, dialog: IDialogContext, ...args: any[]): ADialog;\n}\n\nfunction ui(title: string, onClick: IOnClickHandler, options: Partial<IUIOptions> = {}): IToolbarAction {\n return {title, onClick, options};\n}\n\nfunction uiDialog(title: string, dialogClass: IDialogClass, extraArgs: ((ctx: IRankingHeaderContext) => any[]) = () => [], options: Partial<IUIOptions> = {}): IToolbarAction {\n return {\n title,\n onClick: (col, evt, ctx, level) => {\n const dialog = new dialogClass(col, dialogContext(ctx, level, evt), ...extraArgs(ctx));\n dialog.open();\n }, options\n };\n}\n\nfunction uiSortMethod(methods: string[]): IToolbarDialogAddon {\n methods = methods.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n return {\n title: 'Sort By',\n order: 2,\n append(col, node) {\n return sortMethods(node, <any>col, methods);\n }\n };\n}\n\nconst sort: IToolbarAction = {\n title: 'Sort', // basic ranking\n onClick: (col, evt, ctx, level) => {\n ctx.dialogManager.removeAboveLevel(level);\n if (!evt.ctrlKey) {\n col.toggleMySorting();\n return;\n }\n const ranking = col.findMyRanker()!;\n const current = ranking.getSortCriteria();\n const order = col.isSortedByMe();\n\n const isAscByDefault = isSortingAscByDefault(col);\n\n if (order.priority === undefined) {\n ranking.sortBy(col, isAscByDefault, current.length);\n return;\n }\n let next: string | undefined = undefined;\n if (isAscByDefault) {\n next = order.asc ? 'desc' : undefined;\n } else {\n next = !order.asc ? 'asc' : undefined;\n }\n ranking.sortBy(col, next === 'asc', next ? order.priority : -1);\n },\n options: {\n mode: 'shortcut',\n order: 1,\n featureCategory: 'ranking',\n featureLevel: 'basic'\n }\n};\n\nconst sortBy: IToolbarAction = {\n title: 'Sort By &hellip;', // advanced ranking\n onClick: (col, evt, ctx, level) => {\n const dialog = new SortDialog(col, false, dialogContext(ctx, level, evt), ctx);\n dialog.open();\n },\n options: {\n mode: 'menu',\n order: 1,\n featureCategory: 'ranking',\n featureLevel: 'advanced'\n }\n};\n\nconst sortGroupBy: IToolbarAction = {\n title: 'Sort Groups By &hellip;', // advanced ranking\n onClick: (col, evt, ctx, level) => {\n const dialog = new SortDialog(col, true, dialogContext(ctx, level, evt), ctx);\n dialog.open();\n },\n options: {\n mode: 'menu',\n order: 3,\n featureCategory: 'ranking',\n featureLevel: 'advanced'\n }\n};\n\nconst rename: IToolbarAction = {\n title: 'Rename &hellip;', // advanced\n onClick: (col, evt, ctx, level) => {\n const dialog = new RenameDialog(col, dialogContext(ctx, level, evt));\n dialog.open();\n },\n options: {\n order: 5,\n featureCategory: 'ui',\n featureLevel: 'advanced'\n }\n};\n\nconst vis: IToolbarAction = {\n title: 'Visualization &hellip;', // advanced view\n onClick: (col, evt, ctx, level) => {\n const dialog = new ChangeRendererDialog(col, dialogContext(ctx, level, evt), ctx);\n dialog.open();\n },\n options: {\n featureCategory: 'ui',\n featureLevel: 'advanced'\n }\n};\n\nconst clone: IToolbarAction = {\n title: 'Clone', // advanced model\n onClick: (col, _evt, ctx) => {\n ctx.dialogManager.removeAll(); // since the column will be removed\n ctx.provider.takeSnapshot(col);\n },\n options: {\n order: 80,\n featureCategory: 'model',\n featureLevel: 'advanced'\n }\n};\n\nconst remove: IToolbarAction = {\n title: 'Remove', // advanced model\n onClick: (col, _evt, ctx) => {\n ctx.dialogManager.removeAll(); // since the column will be removed\n const ranking = col.findMyRanker()!;\n const last = ranking.children.every((d) => isSupportType(d) || d.fixed || d === col);\n if (!last) {\n col.removeMe();\n return;\n }\n ctx.provider.removeRanking(ranking);\n ctx.provider.ensureOneRanking();\n },\n options: {\n order: 90,\n featureCategory: 'model',\n featureLevel: 'advanced'\n }\n};\n\n// basic ranking\nconst group = ui('Group', (col, evt, ctx, level) => {\n ctx.dialogManager.removeAboveLevel(level);\n\n if (!evt.ctrlKey) {\n col.groupByMe();\n return;\n }\n const ranking = col.findMyRanker()!;\n const current = ranking.getGroupCriteria();\n const order = current.indexOf(col);\n\n ranking.groupBy(col, order >= 0 ? -1 : current.length);\n}, {mode: 'shortcut', order: 2, featureCategory: 'ranking', featureLevel: 'basic'});\n\n// advanced ranking\nconst groupBy = ui('Group By &hellip;', (col, evt, ctx, level) => {\n const dialog = new GroupDialog(col, dialogContext(ctx, level, evt), ctx);\n dialog.open();\n}, {mode: 'menu', order: 2, featureCategory: 'ranking', featureLevel: 'advanced'});\n\nfunction toggleCompressExpand(col: Column, evt: MouseEvent, ctx: IRankingHeaderContext, level: number) {\n ctx.dialogManager.removeAboveLevel(level);\n const mcol = <IMultiLevelColumn>col;\n mcol.setCollapsed(!mcol.getCollapsed());\n\n const collapsed = mcol.getCollapsed();\n const i = <HTMLElement>evt.currentTarget;\n i.title = collapsed ? 'Expand' : 'Compress';\n i.classList.toggle(cssClass('action-compress'), !collapsed);\n i.classList.toggle(cssClass('action-expand'), collapsed);\n const inner = i.getElementsByTagName('span')[0]!;\n if (inner) {\n inner.textContent = i.title;\n }\n}\n\nconst compress: IToolbarAction = {\n title: 'Compress',\n enabled: (col: IMultiLevelColumn) => !col.getCollapsed(),\n onClick: toggleCompressExpand,\n options: {featureCategory: 'model', featureLevel: 'advanced'}\n};\n\nconst expand: IToolbarAction = {\n title: 'Expand',\n enabled: (col: IMultiLevelColumn) => col.getCollapsed(),\n onClick: toggleCompressExpand,\n options: {featureCategory: 'model', featureLevel: 'advanced'}\n};\n\nconst setShowTopN: IToolbarAction = {\n title: 'Change Show Top N',\n onClick: (_col, evt, ctx, level) => {\n const dialog = new ShowTopNDialog(ctx.provider, dialogContext(ctx, level, evt));\n dialog.open();\n },\n options: {\n featureCategory: 'ui',\n featureLevel: 'advanced'\n }\n};\n\nexport const toolbarDialogAddons: {[key: string]: IToolbarDialogAddon} = {\n sortNumber: uiSortMethod(Object.keys(EAdvancedSortMethod)),\n sortNumbers: uiSortMethod(Object.keys(EAdvancedSortMethod)),\n sortBoxPlot: uiSortMethod(Object.keys(ESortMethod)),\n sortDates: uiSortMethod(Object.keys(EDateSort)),\n sortGroups: uiSortMethod(['count', 'name']),\n groupNumber: <IToolbarDialogAddon>{\n title: 'Split',\n order: 2,\n append: appendNumber\n },\n groupString: <IToolbarDialogAddon>{\n title: 'Groups',\n order: 2,\n append: appendString\n },\n groupDate: <IToolbarDialogAddon>{\n title: 'Granularity',\n order: 2,\n append: appendDate\n },\n};\n\nexport const toolbarActions: {[key: string]: IToolbarAction} = {\n vis,\n group,\n groupBy,\n compress,\n expand,\n sort,\n sortBy,\n sortGroupBy,\n clone,\n remove,\n rename,\n setShowTopN,\n search: uiDialog('Search &hellip;', SearchDialog, (ctx) => [ctx.provider], {mode: 'menu+shortcut', order: 4, featureCategory: 'ranking', featureLevel: 'basic'}),\n filterNumber: uiDialog('Filter &hellip;', NumberFilterDialog, (ctx) => [ctx], {mode: 'menu+shortcut', featureCategory: 'ranking', featureLevel: 'basic'}),\n filterDate: uiDialog('Filter &hellip;', DateFilterDialog, (ctx) => [ctx], {mode: 'menu+shortcut', featureCategory: 'ranking', featureLevel: 'basic'}),\n filterString: uiDialog('Filter &hellip;', StringFilterDialog, () => [], {mode: 'menu+shortcut', featureCategory: 'ranking', featureLevel: 'basic'}),\n filterCategorical: uiDialog('Filter &hellip;', CategoricalFilterDialog, (ctx) => [ctx], {mode: 'menu+shortcut', featureCategory: 'ranking', featureLevel: 'basic'}),\n filterOrdinal: uiDialog('Filter &hellip;', CategoricalMappingFilterDialog, () => [], {mode: 'menu+shortcut', featureCategory: 'ranking', featureLevel: 'basic'}),\n colorMapped: uiDialog('Color Mapping &hellip;', ColorMappingDialog, (ctx) => [ctx], {mode: 'menu', featureCategory: 'ui', featureLevel: 'advanced'}),\n colorMappedCategorical: uiDialog('Color Mapping &hellip;', CategoricalColorMappingDialog, () => [], {mode: 'menu', featureCategory: 'ui', featureLevel: 'advanced'}),\n script: uiDialog('Edit Combine Script &hellip;', ScriptEditDialog, () => [], {mode: 'menu+shortcut', featureCategory: 'model', featureLevel: 'advanced'}),\n reduce: uiDialog('Reduce by &hellip;', ReduceDialog, () => [], {featureCategory: 'model', featureLevel: 'advanced'}),\n cutoff: uiDialog('Set Cut Off &hellip;', CutOffHierarchyDialog, (ctx) => [ctx.idPrefix], {featureCategory: 'model', featureLevel: 'advanced'}),\n editMapping: uiDialog('Data Mapping &hellip;', MappingDialog, (ctx) => [ctx], {featureCategory: 'model', featureLevel: 'advanced'}),\n editPattern: uiDialog('Edit Pattern &hellip;', EditPatternDialog, (ctx) => [ctx.idPrefix], {featureCategory: 'model', featureLevel: 'advanced'}),\n editWeights: uiDialog('Edit Weights &hellip;', WeightsEditDialog, () => [], {mode: 'menu+shortcut', featureCategory: 'model', featureLevel: 'advanced'}),\n compositeContained: uiDialog('Contained Columns &hellip;', CompositeChildrenDialog, (ctx) => [ctx], {featureCategory: 'model', featureLevel: 'advanced'}),\n splitCombined: ui('Split Combined Column', (col, _evt, ctx, level) => {\n ctx.dialogManager.removeAboveLevel(level - 1); // close itself\n // split the combined column into its children\n (<CompositeColumn>col).children.reverse().forEach((c) => col.insertAfterMe(c));\n col.removeMe();\n }, {featureCategory: 'model', featureLevel: 'advanced'}),\n invertSelection: ui('Invert Selection', (col, _evt, ctx, level) => {\n ctx.dialogManager.removeAboveLevel(level - 1); // close itself\n const s = ctx.provider.getSelection();\n const order = Array.from(col.findMyRanker()!.getOrder());\n if (s.length === 0) {\n ctx.provider.setSelection(order);\n return;\n }\n const ss = new Set(s);\n const others = order.filter((d) => !ss.has(d));\n ctx.provider.setSelection(others);\n }, {featureCategory: 'model', featureLevel: 'advanced'})\n};\n\nfunction sortActions(a: IToolbarAction, b: IToolbarAction) {\n if (a.options.order === b.options.order) {\n return a.title.toString().localeCompare(b.title.toString());\n }\n return (a.options.order || 50) - (b.options.order || 50);\n}\n\nfunction getFullToolbar(col: Column, ctx: IRankingHeaderContext) {\n const cache = ctx.caches.toolbar;\n if (cache.has(col.desc.type)) {\n return cache.get(col.desc.type)!;\n }\n\n const keys = getAllToolbarActions(col);\n\n if (!col.fixed) {\n keys.push('remove');\n }\n {\n const possible = ctx.getPossibleRenderer(col);\n if (possible.item.length > 2 || possible.group.length > 2 || possible.summary.length > 2) { // default always possible\n keys.push('vis');\n }\n }\n\n const actions = ctx.resolveToolbarActions(col, keys);\n\n const r = Array.from(new Set(actions)).sort(sortActions);\n cache.set(col.desc.type, r);\n return r;\n}\n\n/** @internal */\nexport function getToolbar(col: Column, ctx: IRankingHeaderContext) {\n const toolbar = getFullToolbar(col, ctx);\n const flags = ctx.flags;\n\n return toolbar.filter((a) => {\n if (a.enabled && !a.enabled(col)) {\n return false;\n }\n // level is basic or not one of disabled features\n return a.options.featureLevel === 'basic' || !((flags.advancedModelFeatures === false && a.options.featureCategory === 'model') || (flags.advancedRankingFeatures === false && a.options.featureCategory === 'ranking') || (flags.advancedUIFeatures === false && a.options.featureCategory === 'ui'));\n });\n}\n\n/** @internal */\nexport function getToolbarDialogAddons(col: Column, key: string, ctx: IRankingHeaderContext) {\n const cacheKey = `${col.desc.type}@${key}`;\n const cacheAddon = ctx.caches.toolbarAddons;\n if (cacheAddon.has(cacheKey)) {\n return cacheAddon.get(cacheKey)!;\n }\n\n const keys = getAllToolbarDialogAddons(col, key);\n const actions = ctx.resolveToolbarDialogAddons(col, keys);\n\n const r = Array.from(new Set(actions)).sort((a, b) => {\n if (a.order === b.order) {\n return a.title.localeCompare(b.title);\n }\n return (a.order || 50) - (b.order || 50);\n });\n cacheAddon.set(cacheKey, r);\n return r;\n}\n\n/** @internal */\nexport function isSortAble(col: Column, ctx: IRankingHeaderContext) {\n const toolbar = getFullToolbar(col, ctx);\n return toolbar.find((d) => d === sort || d === sortBy || d.title === sort.title || d.title.startsWith('Sort By')) != null;\n}\n\n/** @internal */\nexport function isGroupAble(col: Column, ctx: IRankingHeaderContext) {\n const toolbar = getFullToolbar(col, ctx);\n return toolbar.find((d) => d === group || d === groupBy || d.title === group.title || d.title.startsWith('Group By')) != null;\n}\n\n/** @internal */\nexport function isGroupSortAble(col: Column, ctx: IRankingHeaderContext) {\n const toolbar = getFullToolbar(col, ctx);\n return toolbar.find((d) => d === sortGroupBy || d.title === sortGroupBy.title || d.title.startsWith('Sort Groups By')) != null;\n}\n","import {NumberColumn} from '../../model';\nimport {IDialogContext} from './ADialog';\nimport {round, getNumberOfBins} from '../../internal';\nimport {forEach} from '../../renderer/utils';\nimport {cssClass} from '../../styles';\nimport {IToolbarDialogAddonHandler} from '../interfaces';\n\n\n/** @internal */\nexport default function groupNumber(col: NumberColumn, node: HTMLElement, dialog: IDialogContext): IToolbarDialogAddonHandler {\n const domain = col.getMapping().domain;\n const before = col.getGroupThresholds();\n const isThreshold = before.length <= 1;\n const ranking = col.findMyRanker()!;\n node.insertAdjacentHTML('beforeend', `\n <label class=\"${cssClass('checkbox')}\">\n <input type=\"radio\" name=\"threshold\" value=\"threshold\" ${isThreshold ? 'checked' : ''}>\n <span>at&nbsp;<input type=\"number\" size=\"10\" id=\"${dialog.idPrefix}N1\" value=\"${before.length > 0 ? before[0] : round((domain[1] - domain[0]) / 2, 2)}\"\n required min=\"${domain[0]}\" max=\"${domain[1]}\" step=\"any\" ${!isThreshold ? 'disabled': ''}>\n </span>\n </label>\n <label class=\"${cssClass('checkbox')}\">\n <input type=\"radio\" name=\"threshold\" value=\"bins\" ${!isThreshold ? 'checked' : ''}>\n <span> in&nbsp;<input type=\"number\" size=\"5\" id=\"${dialog.idPrefix}N2\" value=\"${before.length > 1 ? before.length : getNumberOfBins(ranking.getOrderLength())}\"\n required min=\"2\" step=\"1\" ${isThreshold ? 'disabled': ''}>&nbsp;bins\n </span>\n </label>\n `);\n\n const threshold = <HTMLInputElement>node.querySelector(`#${dialog.idPrefix}N1`);\n const bins = <HTMLInputElement>node.querySelector(`#${dialog.idPrefix}N2`);\n\n forEach(node, 'input[name=threshold]', (d: HTMLInputElement) => {\n d.addEventListener('change', () => {\n const isThreshold = d.value === 'threshold';\n threshold.disabled = !isThreshold;\n bins.disabled = isThreshold;\n }, { passive: true });\n });\n\n return {\n elems: `input[name=threshold], #${dialog.idPrefix}N1, #${dialog.idPrefix}N2`,\n submit() {\n const isThreshold = node.querySelector<HTMLInputElement>('input[name=threshold]:checked')!.value === 'threshold';\n if (isThreshold) {\n col.setGroupThresholds([threshold.valueAsNumber]);\n return true;\n }\n const count = parseInt(bins.value, 10);\n const delta = (domain[1] - domain[0]) / count;\n let act = domain[0] + delta;\n const thresholds = [act];\n for (let i = 1; i < count - 1; ++i) {\n act += delta;\n thresholds.push(act);\n }\n col.setGroupThresholds(thresholds);\n return true;\n },\n cancel() {\n col.setGroupThresholds(before);\n },\n reset() {\n const value = round((domain[1] - domain[0]) / 2, 2);\n threshold.value = value.toString();\n threshold.disabled = false;\n bins.value = getNumberOfBins(ranking.getOrderLength()).toString();\n bins.disabled = true;\n node.querySelector<HTMLInputElement>('input[name=threshold][value=threshold]')!.checked = true;\n }\n };\n}\n","import {IDialogContext} from './ADialog';\nimport {StringColumn, EStringGroupCriteriaType} from '../../model';\nimport {cssClass} from '../../styles';\nimport {IToolbarDialogAddonHandler} from '../interfaces';\n\n/** @internal */\nexport default function groupString(col: StringColumn, node: HTMLElement, dialog: IDialogContext): IToolbarDialogAddonHandler {\n const current = col.getGroupCriteria();\n const {type, values} = current;\n\n node.insertAdjacentHTML('beforeend', `\n <label class=\"${cssClass('checkbox')}\">\n <input type=\"radio\" name=\"${dialog.idPrefix}groupString\" value=\"${EStringGroupCriteriaType.value}\" id=\"${dialog.idPrefix}VAL\" ${type === EStringGroupCriteriaType.value ? 'checked' : ''}>\n <span>Use text value</span>\n </label>\n <label class=\"${cssClass('checkbox')}\">\n <input type=\"radio\" name=\"${dialog.idPrefix}groupString\" value=\"${EStringGroupCriteriaType.startsWith}\" id=\"${dialog.idPrefix}RW\" ${type === EStringGroupCriteriaType.startsWith ? 'checked' : ''}>\n <span>Text starts with &hellip;</span>\n </label>\n <label class=\"${cssClass('checkbox')}\">\n <input type=\"radio\" name=\"${dialog.idPrefix}groupString\" value=\"${EStringGroupCriteriaType.regex}\" id=\"${dialog.idPrefix}RE\" ${type === EStringGroupCriteriaType.regex ? 'checked' : ''}>\n <span>Use regular expressions</span>\n </label>\n <textarea rows=\"5\" placeholder=\"one value per row, e.g., \\nA\\nB\" id=\"${dialog.idPrefix}T\">${values.map((value) => value instanceof RegExp ? value.source : value).join('\\n')}</textarea>\n `);\n\n const valueRadioButton = node.querySelector<HTMLInputElement>(`#${dialog.idPrefix}VAL`)!;\n const startsWithRadioButton = node.querySelector<HTMLInputElement>(`#${dialog.idPrefix}RW`)!;\n const regexRadioButton = node.querySelector<HTMLInputElement>(`#${dialog.idPrefix}RE`)!;\n const text = node.querySelector<HTMLTextAreaElement>(`#${dialog.idPrefix}T`)!;\n\n const showOrHideTextarea = (show: boolean) => {\n text.style.display = show ? null : 'none';\n };\n\n showOrHideTextarea(type !== EStringGroupCriteriaType.value);\n valueRadioButton.onchange = () => showOrHideTextarea(!valueRadioButton.checked);\n startsWithRadioButton.onchange = () => showOrHideTextarea(startsWithRadioButton.checked);\n regexRadioButton.onchange = () => showOrHideTextarea(regexRadioButton.checked);\n\n return {\n elems: [text, valueRadioButton, startsWithRadioButton, regexRadioButton],\n submit() {\n const checkedNode = node.querySelector<HTMLInputElement>(`input[name=\"${dialog.idPrefix}groupString\"]:checked`)!;\n const newType = <EStringGroupCriteriaType>checkedNode.value;\n let items: (string | RegExp)[] = text.value.trim().split('\\n').map((d) => d.trim()).filter((d) => d.length > 0);\n\n if (newType === EStringGroupCriteriaType.regex) {\n items = items.map((d) => new RegExp(d.toString(), 'm'));\n }\n col.setGroupCriteria({\n type: newType,\n values: items\n });\n return true;\n },\n cancel() {\n col.setGroupCriteria(current);\n },\n reset() {\n text.value = '';\n startsWithRadioButton.checked = true;\n }\n };\n}\n","import {DateColumn, IDateGranularity} from '../../model';\nimport {cssClass} from '../../styles';\nimport {IToolbarDialogAddonHandler} from '../interfaces';\nimport {defaultDateGrouper} from '../../model/internalDate';\n\n\n/** @internal */\nexport default function appendDate(col: DateColumn, node: HTMLElement): IToolbarDialogAddonHandler {\n const before = col.getDateGrouper();\n\n let html = '';\n for (const g of ['century', 'decade', 'year', 'month', 'week', 'day_of_week', 'day_of_month', 'day_of_year', 'hour', 'minute', 'second']) {\n html += `<label class=\"${cssClass('checkbox')}\">\n <input type=\"radio\" name=\"granularity\" value=\"${g}\" ${before.granularity === g ? 'checked' : ''}>\n <span> by ${g} </span>\n </label>`;\n }\n html += `<label class=\"${cssClass('checkbox')}\">\n <input type=\"checkbox\" name=\"circular\" ${before.circular ? 'checked' : ''}>\n <span> Circular </span>\n </label>`;\n\n node.insertAdjacentHTML('beforeend', html);\n const circular = node.querySelector<HTMLInputElement>('input[name=circular]')!;\n\n return {\n elems: 'input[name=granularity],input[name=circular]',\n submit() {\n const granularity = <IDateGranularity> node.querySelector<HTMLInputElement>('input[name=granularity]:checked')!.value;\n col.setDateGrouper({\n granularity,\n circular: circular.checked\n });\n return true;\n },\n cancel() {\n col.setDateGrouper(before);\n },\n reset() {\n const r = defaultDateGrouper();\n circular.checked = r.circular;\n const g = node.querySelector<HTMLInputElement>(`input[name=granularity][value=\"${r.granularity}\"]`)!;\n g.checked = true;\n }\n };\n}\n","import {renderers} from './renderer/renderers';\nimport {toolbarActions, toolbarDialogAddons} from './ui/toolbar';\nimport {Column, Ranking, IGroupData, IGroupItem} from './model';\nimport {IDataProvider} from './provider';\nimport {ICellRendererFactory, ERenderMode} from './renderer';\nimport {IToolbarAction, IToolbarDialogAddon} from './ui';\n\n/**\n * custom height implementation logic\n */\nexport interface IDynamicHeight {\n /**\n * default height for a row for optimized styling\n */\n defaultHeight: number;\n\n /**\n * returns the height in pixel for the given row\n * @param {IGroupItem | IGroupData} item the item to show\n * @returns {number} its height in pixel\n */\n height(item: IGroupItem | IGroupData): number;\n\n /**\n * returns the padding in pixel after the given row\n * @param {IGroupItem | IGroupData | null} item item to show\n * @returns {number} its padding in pixel\n */\n padding(item: IGroupItem | IGroupData | null): number;\n}\n\nexport interface ILineUpFlags {\n /**\n * optimization flag to disable frozen columns for optimizing rendering performance\n * @default true\n */\n disableFrozenColumns: boolean;\n /**\n * flag whether advanced ranking features are enabled\n * @default true\n */\n advancedRankingFeatures: boolean;\n /**\n * flag whether advanced model features are enabled\n * @default true\n */\n advancedModelFeatures: boolean;\n /**\n * flag whether advanced UI features are enabled\n * @default true\n */\n advancedUIFeatures: boolean;\n}\n\nexport interface IToolbarLookup<T> {\n [key: string]: T;\n}\n\nexport interface ILivePreviewOptions {\n search: boolean;\n filter: boolean;\n vis: boolean;\n sort: boolean;\n group: boolean;\n groupSort: boolean;\n colorMapping: boolean;\n dataMapping: boolean;\n reduce: boolean;\n rename: boolean;\n cutOff: boolean;\n}\n\nexport interface ILineUpOptions {\n /**\n * option to enable/disable showing a summary (histogram, ...) in the header\n * @default true\n */\n summaryHeader: boolean;\n /**\n * option to enable/disable animated transitions\n * @default true\n */\n animated: boolean;\n /**\n * option to enforce that the whole row is shown upon hover without overflow hidden\n * @default false\n */\n expandLineOnHover: boolean;\n /**\n * option to enable/disable the panel\n * @default true\n */\n sidePanel: boolean;\n /**\n * option to specify whether the panel should be collapsed by default\n * @default false\n */\n sidePanelCollapsed: boolean;\n /**\n * show the sorting and grouping hierarchy indicators in the side panel\n * @default true\n */\n hierarchyIndicator: boolean;\n\n /**\n * flag whether dialogs should confirm or cancel on clicking the background\n * @default cancel\n */\n onDialogBackgroundClick: 'cancel' | 'confirm';\n\n /**\n * flag whether to shows filter previews as soon as the user changes the filter in the dialog\n * @default {search: true,filter: true, vis: true,sort: true, group: true, groupSort: true, colorMapping: true}\n */\n livePreviews: Partial<ILivePreviewOptions>;\n\n /**\n * option to specify the default slope graph mode\n * @default 'item'\n */\n defaultSlopeGraphMode: 'item' | 'band';\n\n /**\n * how many degrees should a label be rotated in case of narrow columns\n * @default 0 no rotation\n */\n labelRotation: number;\n\n /**\n * height of a row\n * @default 18\n */\n rowHeight: number;\n /**\n * padding between two rows\n * @default 2\n */\n rowPadding: number;\n /**\n * height of an aggregated group in pixel\n * @default 40\n */\n groupHeight: number;\n /**\n * padding between two groups in pixel\n * @default 5\n */\n groupPadding: number;\n\n /**\n * custom function to compute the level of detail for a row\n * @param {number} rowIndex the current row index to be rendered\n * @returns {\"high\" | \"low\"}\n */\n levelOfDetail: (rowIndex: number) => 'high' | 'low';\n /**\n * custom function to compute the height of a row (group or item)\n * @param {(IGroupItem | IGroupData)[]} data the data to render\n * @param {Ranking} ranking the ranking of the data\n * @returns {IDynamicHeight | null} the height compute function or null to use the default\n */\n dynamicHeight: (data: (IGroupItem | IGroupData)[], ranking: Ranking) => IDynamicHeight | null;\n /**\n * custom function to be called when updating a HTML row\n * @param {HTMLElement} row node element to be updated\n * @param {number} rowIndex row index to be rendered in the row\n */\n customRowUpdate: (row: HTMLElement, rowIndex: number) => void;\n\n /**\n * register custom toolbar actions and dialog addons\n */\n toolbarActions: IToolbarLookup<IToolbarAction>;\n toolbarDialogAddons: IToolbarLookup<IToolbarDialogAddon>;\n\n /**\n * hook for postprocess the toolbar actions for a column\n */\n resolveToolbarActions: (col: Column, keys: string[], lookup: IToolbarLookup<IToolbarAction>) => IToolbarAction[];\n /**\n * hook for postprocess the toolbar dialog addons for a column\n */\n resolveToolbarDialogAddons: (col: Column, keys: string[], lookup: IToolbarLookup<IToolbarDialogAddon>) => IToolbarDialogAddon[];\n\n /**\n * register custom renderer factories\n */\n renderers: {[type: string]: ICellRendererFactory};\n\n /**\n * custom check whether a given renderer can render the given column in the given mode\n */\n canRender: (type: string, renderer: ICellRendererFactory, col: Column, mode: ERenderMode) => boolean;\n\n /**\n * custom flags for optimization\n */\n flags: Partial<ILineUpFlags>;\n\n /**\n * ignore incompatible browser and always show (on own risk)\n * @default false\n */\n ignoreUnsupportedBrowser: boolean;\n}\n\nexport interface ITaggleOptions extends ILineUpOptions {\n /**\n * whether the overview mode is enabled by default\n * @default false\n */\n overviewMode: boolean;\n}\n\nexport interface ILineUpLike {\n readonly node: HTMLElement;\n readonly data: IDataProvider;\n\n dump(): any;\n\n destroy(): void;\n}\n\nfunction resolveToolbarActions(col: Column, keys: string[], lookup: IToolbarLookup<IToolbarAction>) {\n const actions: IToolbarAction[] = [];\n\n keys.forEach((key) => {\n if (lookup.hasOwnProperty(key)) {\n actions.push(lookup[key]);\n } else {\n console.warn(`cannot find toolbar action of type: \"${col.desc.type}\" with key \"${key}\"`);\n }\n });\n return actions;\n}\n\nfunction resolveToolbarDialogAddons(col: Column, keys: string[], lookup: IToolbarLookup<IToolbarDialogAddon>) {\n const actions: IToolbarDialogAddon[] = [];\n\n keys.forEach((key) => {\n if (lookup.hasOwnProperty(key)) {\n actions.push(lookup[key]);\n } else {\n console.warn(`cannot find toolbar dialog addon of type: \"${col.desc.type}\" with key \"${key}\"`);\n }\n });\n return actions;\n}\n\n\nexport function defaultOptions(): ITaggleOptions {\n return {\n toolbarActions,\n toolbarDialogAddons,\n resolveToolbarActions,\n resolveToolbarDialogAddons,\n renderers: Object.assign({}, renderers),\n canRender: () => true,\n\n labelRotation: 0,\n summaryHeader: true,\n animated: true,\n expandLineOnHover: false,\n sidePanel: true,\n sidePanelCollapsed: false,\n hierarchyIndicator: true,\n defaultSlopeGraphMode: 'item',\n overviewMode: false,\n\n livePreviews: {\n search: true,\n filter: true,\n vis: true,\n sort: true,\n group: true,\n groupSort: true,\n colorMapping: true\n },\n onDialogBackgroundClick: 'cancel',\n\n rowHeight: 18,\n groupHeight: 40,\n groupPadding: 5,\n rowPadding: 2,\n\n levelOfDetail: () => 'high',\n customRowUpdate: () => undefined,\n dynamicHeight: () => null,\n\n flags: {\n disableFrozenColumns: true, //disable by default for speed navigator.userAgent.includes('Firefox/52') // disable by default in Firefox ESR 52\n advancedRankingFeatures: true,\n advancedModelFeatures: true,\n advancedUIFeatures: true,\n },\n\n ignoreUnsupportedBrowser: false\n };\n}\n","import {detect} from 'detect-browser';\n\nexport const SUPPORTED_FIREFOX_VERSION = 57;\nexport const SUPPORTED_CHROME_VERSION = 64;\nexport const SUPPORTED_EDGE_VERSION = 16;\n\n/**\n * @internal\n */\nexport function getUnsupportedBrowserError() {\n const info = detect();\n if (!info || !info.version) {\n return 'browser cannot be detected';\n }\n const prefix = `unsupported browser detected:`;\n switch (info.name) {\n case 'firefox':\n const fVersion = parseInt(info.version.slice(0, info.version.indexOf('.')), 10);\n if (fVersion <= SUPPORTED_FIREFOX_VERSION && fVersion !== 52) { // ESR\n return `${prefix} Firefox ${info.version} (&lt; ${SUPPORTED_FIREFOX_VERSION})`;\n }\n return null;\n case 'edge':\n const eVersion = parseInt(info.version.slice(0, info.version.indexOf('.')), 10);\n if (eVersion <= SUPPORTED_EDGE_VERSION) {\n return `${prefix} Edge ${info.version} (&lt; ${SUPPORTED_EDGE_VERSION})`;\n }\n return null;\n case 'chrome':\n const cVersion = parseInt(info.version.slice(0, info.version.indexOf('.')), 10);\n if (cVersion <= SUPPORTED_CHROME_VERSION) {\n return `${prefix} Chrome ${info.version} (&lt; ${SUPPORTED_CHROME_VERSION})`;\n }\n return null;\n case 'ie':\n return `${prefix} Internet Explorer`;\n }\n console.warn('unknown browser detected', info, 'assuming fine...');\n return null;\n}\n/**\n * checks whether the current browser is compatible with lineupjs\n * @return boolean\n */\nexport function isBrowserSupported() {\n return getUnsupportedBrowserError() == null;\n}\n\n","import ADialog from './ADialog';\nimport Column from '../../model';\nimport {cssClass} from '../../styles';\nimport {ILivePreviewOptions} from '../../config';\nimport {AEventDispatcher, IEventListener} from '../../internal';\n\n/**\n * emitted a dialog is opened\n * @asMemberOf DialogManager\n * @param dialog the opened dialog\n * @event\n */\nexport declare function dialogOpened(dialog: ADialog): void;\n\n/**\n * emitted a dialog is closed\n * @asMemberOf DialogManager\n * @param dialog the closed dialog\n * @param action the action how the dialog was closed\n * @event\n */\nexport declare function dialogClosed(dialog: ADialog, action: 'cancel' | 'confirm'): void;\n\n\nexport default class DialogManager extends AEventDispatcher {\n static readonly EVENT_DIALOG_OPENED = 'dialogOpened';\n static readonly EVENT_DIALOG_CLOSED = 'dialogClosed';\n\n private readonly escKeyListener = (evt: KeyboardEvent) => {\n if (evt.which === 27) {\n this.removeLast();\n }\n }\n\n private readonly openDialogs: ADialog[] = [];\n readonly node: HTMLElement;\n readonly livePreviews: Partial<ILivePreviewOptions>;\n readonly onDialogBackgroundClick: 'cancel' | 'confirm';\n\n constructor(options: {doc: Document, livePreviews: Partial<ILivePreviewOptions>, onDialogBackgroundClick: 'cancel' | 'confirm'}) {\n super();\n const doc = options.doc;\n this.livePreviews = options.livePreviews;\n this.onDialogBackgroundClick = options.onDialogBackgroundClick;\n this.node = doc.createElement('div');\n this.node.classList.add(cssClass('backdrop'));\n this.node.innerHTML = `<div class=\"${cssClass('backdrop-bg')}\"></div>`;\n this.node.onclick = () => {\n this.removeAll();\n };\n }\n\n protected createEventList() {\n return super.createEventList().concat([DialogManager.EVENT_DIALOG_CLOSED, DialogManager.EVENT_DIALOG_OPENED]);\n }\n\n on(type: typeof DialogManager.EVENT_DIALOG_OPENED, listener: typeof dialogOpened | null): this;\n on(type: typeof DialogManager.EVENT_DIALOG_CLOSED, listener: typeof dialogClosed | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n get maxLevel() {\n return this.openDialogs.reduce((acc, a) => Math.max(acc, a.level), 0);\n }\n\n\n setHighlight(mask: {left: number, top: number, width: number, height: number}) {\n const area = <HTMLElement>this.node.firstElementChild;\n // @see http://bennettfeely.com/clippy/ -> select `Frame` example\n // use webkit prefix for safari\n area.style.clipPath = (<any>area.style).webkitClipPath = `polygon(\n 0% 0%,\n 0% 100%,\n ${mask.left}px 100%,\n ${mask.left}px ${mask.top}px,\n ${mask.left + mask.width}px ${mask.top}px,\n ${mask.left + mask.width}px ${mask.top + mask.height}px,\n ${mask.left}px ${mask.top + mask.height}px,\n ${mask.left}px 100%,\n 100% 100%,\n 100% 0%\n )`;\n }\n\n setHighlightColumn(column: Column) {\n const root = <HTMLElement>this.node.parentElement!;\n if (!root) {\n this.clearHighlight();\n return;\n }\n const header = <HTMLElement>root.querySelector(`.${cssClass('header')}[data-col-id=\"${column.id}\"]`);\n if (!header) {\n this.clearHighlight();\n return;\n }\n const base = header.getBoundingClientRect();\n const offset = root.getBoundingClientRect();\n this.setHighlight({\n left: base.left - offset.left,\n top: base.top - offset.top,\n width: base.width,\n height: offset.height\n });\n }\n\n clearHighlight() {\n const area = <HTMLElement>this.node.firstElementChild;\n area.style.clipPath = null;\n }\n\n private removeLast() {\n if (this.openDialogs.length === 0) {\n return;\n }\n this.remove(this.openDialogs[this.openDialogs.length - 1]);\n }\n\n removeAll() {\n if (this.openDialogs.length === 0) {\n return;\n }\n const all = this.openDialogs.splice(0, this.openDialogs.length);\n all.reverse().forEach((d) => d.cleanUp(this.onDialogBackgroundClick));\n this.takeDown();\n }\n\n triggerDialogClosed(dialog: ADialog, action: 'cancel' | 'confirm') {\n this.fire(DialogManager.EVENT_DIALOG_CLOSED, dialog, action);\n }\n\n remove(dialog: ADialog, handled = false) {\n const index = this.openDialogs.indexOf(dialog);\n if (index < 0) {\n return false;\n }\n // destroy self and all levels below that = after that\n const destroyed = this.openDialogs.splice(index, this.openDialogs.length - index);\n destroyed.reverse().forEach((d) => d.cleanUp(handled ? 'handled' : this.onDialogBackgroundClick));\n while (handled && this.openDialogs.length > 0 && this.openDialogs[this.openDialogs.length - 1].autoClose) {\n const dialog = this.openDialogs.pop()!;\n dialog.cleanUp(this.onDialogBackgroundClick);\n }\n\n if (this.openDialogs.length === 0) {\n this.takeDown();\n }\n return true;\n }\n\n removeAboveLevel(level: number) {\n // hide all dialogs which have a higher or equal level to the newly opened one\n this.openDialogs.filter((d) => d.level >= level).reverse().forEach((d) => this.remove(d));\n }\n\n removeLike(dialog: ADialog) {\n const similar = this.openDialogs.find((d) => dialog.equals(d));\n if (!similar) {\n return false;\n }\n this.remove(similar);\n return true;\n }\n\n private setUp() {\n this.node.ownerDocument!.addEventListener('keyup', this.escKeyListener, {\n passive: true\n });\n this.node.style.display = 'block';\n }\n\n private takeDown() {\n this.clearHighlight();\n this.node.ownerDocument!.removeEventListener('keyup', this.escKeyListener);\n this.node.style.display = null;\n }\n\n push(dialog: ADialog) {\n this.removeAboveLevel(dialog.level);\n\n if (this.openDialogs.length === 0) {\n this.setUp();\n }\n\n this.openDialogs.push(dialog);\n this.fire(DialogManager.EVENT_DIALOG_OPENED, dialog);\n }\n}\n","export { default as KeyFinder } from './KeyFinder';\r\n/**\r\n * different row animation modes\r\n */\r\nexport var EAnimationMode;\r\n(function (EAnimationMode) {\r\n /**\r\n * plain update existed both before and after\r\n */\r\n EAnimationMode[EAnimationMode[\"UPDATE\"] = 0] = \"UPDATE\";\r\n /**\r\n * exists both before and after but wasn't visible yet thus waas created\r\n */\r\n EAnimationMode[EAnimationMode[\"UPDATE_CREATE\"] = 1] = \"UPDATE_CREATE\";\r\n /**\r\n * exists both before and after is visible but not needed anymore and thus removed\r\n */\r\n EAnimationMode[EAnimationMode[\"UPDATE_REMOVE\"] = 2] = \"UPDATE_REMOVE\";\r\n /**\r\n * row appears\r\n */\r\n EAnimationMode[EAnimationMode[\"SHOW\"] = 3] = \"SHOW\";\r\n /**\r\n * row disappears\r\n */\r\n EAnimationMode[EAnimationMode[\"HIDE\"] = 4] = \"HIDE\";\r\n})(EAnimationMode || (EAnimationMode = {}));\r\nvar NO_CHANGE_DELTA = 1;\r\nexport function noAnimationChange(_a, previousHeight, currentHeight) {\r\n var previous = _a.previous, mode = _a.mode, nodeY = _a.nodeY, current = _a.current;\r\n // sounds like the same\r\n var prev = previous.height == null ? previousHeight : previous.height;\r\n var curr = current.height == null ? currentHeight : current.height;\r\n return mode === EAnimationMode.UPDATE && (Math.abs(previous.y - nodeY) <= NO_CHANGE_DELTA) && (Math.abs(prev - curr) <= NO_CHANGE_DELTA);\r\n}\r\n/**\r\n * maximal duration of all animations + extra waiting before e.g. rows are really removed\r\n * @type {number}\r\n */\r\nvar MAX_ANIMATION_TIME = 1100;\r\nexport var defaultPhases = [\r\n {\r\n delay: 0,\r\n apply: function (_a) {\r\n var mode = _a.mode, previous = _a.previous, nodeY = _a.nodeY, current = _a.current, node = _a.node;\r\n node.dataset.animation = EAnimationMode[mode].toLowerCase();\r\n node.style.transform = \"translate(0, \" + (previous.y - nodeY) + \"px)\";\r\n if (mode === EAnimationMode.SHOW) {\r\n // already target height\r\n node.style.height = current.height !== null ? current.height + \"px\" : null;\r\n }\r\n else { // always set previous height for default height changes\r\n node.style.height = previous.height + \"px\";\r\n }\r\n node.style.opacity = mode === EAnimationMode.SHOW ? '0' : (mode === EAnimationMode.HIDE ? '1' : null);\r\n }\r\n },\r\n {\r\n delay: 10,\r\n apply: function (_a) {\r\n var mode = _a.mode, current = _a.current, nodeY = _a.nodeY, node = _a.node;\r\n // null for added/update since already at the right position\r\n node.style.transform = (mode === EAnimationMode.HIDE || mode === EAnimationMode.UPDATE_REMOVE) ? \"translate(0, \" + (current.y - nodeY) + \"px)\" : null;\r\n if (mode !== EAnimationMode.HIDE) { // keep height for removal\r\n node.style.height = current.height !== null ? current.height + \"px\" : null;\r\n }\r\n node.style.opacity = mode === EAnimationMode.SHOW ? '1' : (mode === EAnimationMode.HIDE ? '0' : null);\r\n }\r\n },\r\n {\r\n delay: MAX_ANIMATION_TIME,\r\n apply: function (_a) {\r\n var node = _a.node;\r\n delete node.dataset.animation;\r\n node.style.opacity = null;\r\n node.style.transform = null;\r\n }\r\n }\r\n];\r\n//# sourceMappingURL=index.js.map","import {getUnsupportedBrowserError, SUPPORTED_CHROME_VERSION, SUPPORTED_EDGE_VERSION, SUPPORTED_FIREFOX_VERSION} from '../browser';\nimport {ILineUpLike} from '../config';\nimport {AEventDispatcher, IEventListener, clear} from '../internal';\nimport {Column} from '../model';\nimport {DataProvider, IDataProviderDump} from '../provider';\nimport {cssClass} from '../styles';\nimport DialogManager from './dialogs/DialogManager';\nimport {ADialog} from './dialogs';\n\n\n/**\n * emitted when the highlight changes\n * @asMemberOf ALineUp\n * @param dataIndex the highlghted data index or -1 for none\n * @event\n */\nexport declare function highlightChanged(dataIndex: number): void;\n\n/**\n * emitted when the selection changes\n * @asMemberOf ALineUp\n * @param dataIndices the selected data indices\n * @event\n */\nexport declare function selectionChanged(dataIndices: number[]): void;\n/**\n * emitted a dialog is opened\n * @asMemberOf ALineUp\n * @param dialog the opened dialog\n * @event\n */\nexport declare function dialogOpened(dialog: ADialog): void;\n/**\n * emitted a dialog is closed\n * @asMemberOf ALineUp\n * @param dialog the closed dialog\n * @param action the action how the dialog was closed\n * @event\n */\nexport declare function dialogClosed(dialog: ADialog, action: 'cancel' | 'confirm'): void;\n\nexport abstract class ALineUp extends AEventDispatcher implements ILineUpLike {\n static readonly EVENT_SELECTION_CHANGED = DataProvider.EVENT_SELECTION_CHANGED;\n static readonly EVENT_DIALOG_OPENED = DialogManager.EVENT_DIALOG_OPENED;\n static readonly EVENT_DIALOG_CLOSED = DialogManager.EVENT_DIALOG_CLOSED;\n static readonly EVENT_HIGHLIGHT_CHANGED = 'highlightChanged';\n\n private highlightListeners = 0;\n\n readonly isBrowserSupported: boolean;\n\n constructor(public readonly node: HTMLElement, private _data: DataProvider, ignoreIncompatibleBrowser: boolean) {\n super();\n\n const error = getUnsupportedBrowserError();\n this.isBrowserSupported = ignoreIncompatibleBrowser || !error;\n\n if (!this.isBrowserSupported) {\n this.node.classList.add(cssClass('unsupported-browser'));\n this.node.innerHTML = `<span>${error}</span>\n <div class=\"${cssClass('unsupported-browser')}\">\n <a href=\"https://www.mozilla.org/en-US/firefox/\" rel=\"noopener\" target=\"_blank\" data-browser=\"firefox\" data-version=\"${SUPPORTED_FIREFOX_VERSION}\"></a>\n <a href=\"https://www.google.com/chrome/index.html\" rel=\"noopener\" target=\"_blank\" data-browser=\"chrome\" data-version=\"${SUPPORTED_CHROME_VERSION}\" title=\"best support\"></a>\n <a href=\"https://www.microsoft.com/en-us/windows/microsoft-edge\" rel=\"noopener\" target=\"_blank\" data-browser=\"edge\" data-version=\"${SUPPORTED_EDGE_VERSION}\"></a>\n </div><span>use the <code>ignoreUnsupportedBrowser=true</code> option to ignore this error at your own risk</span>`;\n }\n\n this.forward(_data, `${DataProvider.EVENT_SELECTION_CHANGED}.main`);\n _data.on(`${DataProvider.EVENT_BUSY}.busy`, (busy) => this.node.classList.toggle(cssClass('busy'), busy));\n }\n\n protected createEventList() {\n return super.createEventList().concat([ALineUp.EVENT_HIGHLIGHT_CHANGED, ALineUp.EVENT_SELECTION_CHANGED, ALineUp.EVENT_DIALOG_OPENED, ALineUp.EVENT_DIALOG_CLOSED]);\n }\n\n on(type: typeof ALineUp.EVENT_HIGHLIGHT_CHANGED, listener: typeof highlightChanged | null): this;\n on(type: typeof ALineUp.EVENT_SELECTION_CHANGED, listener: typeof selectionChanged | null): this;\n on(type: typeof ALineUp.EVENT_DIALOG_OPENED, listener: typeof dialogOpened | null): this;\n on(type: typeof ALineUp.EVENT_DIALOG_CLOSED, listener: typeof dialogClosed | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n get data() {\n return this._data;\n }\n\n destroy() {\n // just clear since we hand in the node itself\n clear(this.node);\n this._data.destroy();\n }\n\n dump() {\n return this.data.dump();\n }\n\n restore(dump: IDataProviderDump) {\n this._data.restore(dump);\n }\n\n abstract update(): void;\n\n setDataProvider(data: DataProvider, dump?: IDataProviderDump) {\n if (this._data) {\n this.unforward(this._data, `${DataProvider.EVENT_SELECTION_CHANGED}.taggle`);\n this._data.on(`${DataProvider.EVENT_BUSY}.busy`, null);\n }\n this._data = data;\n if (dump) {\n data.restore(dump);\n }\n this.forward(data, `${DataProvider.EVENT_SELECTION_CHANGED}.taggle`);\n\n data.on(`${DataProvider.EVENT_BUSY}.busy`, (busy) => this.node.classList.toggle(cssClass('busy'), busy));\n }\n\n getSelection() {\n return this._data.getSelection();\n }\n\n setSelection(dataIndices: number[]) {\n this._data.setSelection(dataIndices);\n }\n\n /**\n * sorts LineUp by he given column\n * @param column callback function finding the column to sort\n * @param ascending\n * @returns {boolean}\n */\n sortBy(column: string | ((col: Column) => boolean), ascending = false) {\n const col = this.data.find(column);\n if (col) {\n col.sortByMe(ascending);\n }\n return col != null;\n }\n\n abstract setHighlight(dataIndex: number, scrollIntoView: boolean): boolean;\n\n abstract getHighlight(): number;\n\n protected listenersChanged(type: string, enabled: boolean) {\n super.listenersChanged(type, enabled);\n if (!type.startsWith(ALineUp.EVENT_HIGHLIGHT_CHANGED)) {\n return;\n }\n if (enabled) {\n this.highlightListeners++;\n if (this.highlightListeners === 1) { // first\n this.enableHighlightListening(true);\n }\n } else {\n this.highlightListeners -= 1;\n if (this.highlightListeners === 0) { // last\n this.enableHighlightListening(false);\n }\n }\n }\n\n protected enableHighlightListening(_enable: boolean) {\n // hook\n }\n}\n\nexport default ALineUp;\n","/**\r\n * utility class for optimized row context access\r\n */\r\nvar KeyFinder = /** @class */ (function () {\r\n /**\r\n * constructor for fast key based row access\r\n * @param {IExceptionContext} context context to use\r\n * @param {(rowIndex: number) => string} key key function\r\n */\r\n function KeyFinder(context, key) {\r\n var _this = this;\r\n this.context = context;\r\n this.key = key;\r\n this.cache = [];\r\n this.lastFilled = 0;\r\n this.key2index = new Map();\r\n this.context.exceptions.forEach(function (e) {\r\n _this.cache[e.index] = e.y;\r\n _this.key2index.set(key(e.index), e.index);\r\n });\r\n }\r\n KeyFinder.prototype.findValidStart = function (before) {\r\n for (var i = before - 1; i >= 0; --i) {\r\n if (this.cache[i] !== undefined) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n /**\r\n * returns the position of the given given or -1 if not found\r\n * @param {string} key\r\n * @return {number} -1 if not found\r\n */\r\n KeyFinder.prototype.posByKey = function (key) {\r\n if (this.key2index.has(key)) {\r\n var index = this.key2index.get(key);\r\n return { index: index, pos: this.pos(index) };\r\n }\r\n return this.fillCacheTillKey(key);\r\n };\r\n /**\r\n * returns the position of the tthe given index\r\n * @param {number} index index to look for\r\n * @returns {number}\r\n */\r\n KeyFinder.prototype.pos = function (index) {\r\n if (this.context.exceptions.length === 0) {\r\n // fast pass\r\n return index * this.context.defaultRowHeight;\r\n }\r\n var cached = this.cache[index];\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n //need to compute it\r\n // find the starting point where to start counting\r\n var start = this.findValidStart(index);\r\n if (start < 0) {\r\n this.fillCache(0, index, 0);\r\n }\r\n else {\r\n this.fillCache(start + 1, index, this.cache[start] + this.heightOf(start));\r\n }\r\n return this.cache[index];\r\n };\r\n KeyFinder.prototype.fillCache = function (first, last, offset, callback) {\r\n if (last <= this.lastFilled) {\r\n //everything already there\r\n if (!callback) {\r\n return;\r\n }\r\n for (var i = first; i <= last; ++i) {\r\n callback(i, this.key(i), this.cache[i]);\r\n }\r\n return;\r\n }\r\n var pos = offset;\r\n for (var i = first; i <= last; ++i) {\r\n this.cache[i] = pos;\r\n var key = this.key(i);\r\n this.key2index.set(key, i);\r\n if (callback) {\r\n callback(i, key, pos);\r\n }\r\n pos += this.heightOf(i);\r\n }\r\n };\r\n /**\r\n * returns the height of the row identified by index\r\n * @param {number} index\r\n * @returns {number}\r\n */\r\n KeyFinder.prototype.heightOf = function (index) {\r\n var lookup = this.context.exceptionsLookup;\r\n return lookup.has(index) ? lookup.get(index) : this.context.defaultRowHeight;\r\n };\r\n /**\r\n * see heightOf but ignores padding and optional null in case of default height\r\n * @param {number} index row index\r\n * @param {boolean} returnDefault return null if default height\r\n * @returns {number}\r\n */\r\n KeyFinder.prototype.exceptionHeightOf = function (index, returnDefault) {\r\n if (returnDefault === void 0) { returnDefault = false; }\r\n var padding = this.context.padding(index);\r\n var lookup = this.context.exceptionsLookup;\r\n if (lookup.has(index)) {\r\n return lookup.get(index) - padding;\r\n }\r\n return returnDefault ? this.context.defaultRowHeight - padding : null;\r\n };\r\n /**\r\n * padding of the given index\r\n * @param {number} index\r\n * @returns {number}\r\n */\r\n KeyFinder.prototype.padding = function (index) {\r\n return this.context.padding(index);\r\n };\r\n KeyFinder.prototype.fillCacheTillKey = function (target) {\r\n var pos = 0;\r\n for (var i = this.lastFilled; i < this.context.numberOfRows; ++i, ++this.lastFilled) {\r\n var c = this.cache[i];\r\n if (c !== undefined) {\r\n pos = c + this.heightOf(i);\r\n continue;\r\n }\r\n // new one fill up\r\n var key = this.key(i);\r\n this.cache[i] = pos;\r\n this.key2index.set(key, i);\r\n if (key === target) {\r\n return { index: i, pos: pos };\r\n }\r\n pos += this.heightOf(i);\r\n }\r\n return { index: -1, pos: -1 };\r\n };\r\n /**\r\n * computes the positions and keys for a range of given indices\r\n * @param {number} first first row index\r\n * @param {number} last last row index\r\n * @param {number} offset pos offset for the first row index\r\n * @param {(index: number, key: string, pos: number) => void} callback callack for each identified index\r\n */\r\n KeyFinder.prototype.positions = function (first, last, offset, callback) {\r\n this.fillCache(first, last, offset, callback);\r\n };\r\n return KeyFinder;\r\n}());\r\nexport default KeyFinder;\r\n//# sourceMappingURL=KeyFinder.js.map","export var defaultMode = 'animation'; // Boolean((<any>window).chrome) ? 'animation' : 0, // animation frame on chrome;\r\nfunction dummy() {\r\n return {\r\n handler: [],\r\n prev: null,\r\n timer: -1\r\n };\r\n}\r\nvar ScrollHandler = /** @class */ (function () {\r\n function ScrollHandler(node) {\r\n // this.current = this.asInfo();\r\n var _this = this;\r\n this.node = node;\r\n this.sync = dummy();\r\n this.animation = dummy();\r\n this.numbers = new Map();\r\n this.handleAnimationImpl = function () {\r\n if (_this.animation.timer !== 1) {\r\n return;\r\n }\r\n _this.handle(_this.animation);\r\n _this.animation.timer = -1;\r\n };\r\n node.addEventListener('scroll', function () {\r\n // this.current = this.asInfo();\r\n // if (this.prev && (Math.abs(this.current.left - this.prev.left) + Math.abs(this.current.top - this.prev.top)) < 4) {\r\n // return;\r\n // }\r\n // this.prev = this.current;\r\n if (_this.sync.handler.length > 0) {\r\n _this.handle(_this.sync);\r\n }\r\n _this.handleAnimation();\r\n _this.handleTimeouts();\r\n }, {\r\n passive: true\r\n });\r\n }\r\n Object.defineProperty(ScrollHandler.prototype, \"current\", {\r\n // current: IScrollInfo;\r\n // private prev: IScrollInfo | null = null;\r\n get: function () {\r\n return this.asInfo();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ScrollHandler.prototype.handle = function (handler) {\r\n var info = this.current;\r\n if (handler.prev && (Math.abs(info.left - handler.prev.left) + Math.abs(info.top - handler.prev.top)) < 4) {\r\n return;\r\n }\r\n handler.prev = info;\r\n for (var _i = 0, _a = handler.handler; _i < _a.length; _i++) {\r\n var s = _a[_i];\r\n s(info);\r\n }\r\n };\r\n ScrollHandler.prototype.handleAnimation = function () {\r\n if (this.animation.timer !== -1 || this.animation.handler.length === 0) {\r\n return;\r\n }\r\n this.animation.timer = 1;\r\n requestAnimationFrame(this.handleAnimationImpl);\r\n };\r\n ScrollHandler.prototype.handleTimeouts = function () {\r\n var _this = this;\r\n if (this.numbers.size === 0) {\r\n return;\r\n }\r\n this.numbers.forEach(function (handler, n) {\r\n if (handler.handler.length === 0) {\r\n return;\r\n }\r\n handler.timer = self.setTimeout(function () {\r\n _this.handle(handler);\r\n handler.timer = -1;\r\n }, n);\r\n });\r\n };\r\n ScrollHandler.prototype.asInfo = function () {\r\n return {\r\n left: this.node.scrollLeft,\r\n top: this.node.scrollTop,\r\n width: this.node.clientWidth,\r\n height: this.node.clientHeight\r\n };\r\n };\r\n ScrollHandler.prototype.push = function (mode, handler) {\r\n if (typeof mode === 'number') {\r\n if (!this.numbers.has(mode)) {\r\n this.numbers.set(mode, dummy());\r\n }\r\n this.numbers.get(mode).handler.push(handler);\r\n }\r\n switch (mode) {\r\n case 'sync':\r\n this.sync.handler.push(handler);\r\n break;\r\n case 'animation':\r\n this.animation.handler.push(handler);\r\n break;\r\n }\r\n };\r\n ScrollHandler.prototype.remove = function (handler) {\r\n var test = [this.sync, this.animation].concat(Array.from(this.numbers.values()));\r\n return test.some(function (d) {\r\n var index = d.handler.indexOf(handler);\r\n if (index >= 0) {\r\n d.handler.splice(index, 1);\r\n }\r\n return index >= 0;\r\n });\r\n };\r\n ScrollHandler.prototype.isWaiting = function (mode) {\r\n switch (mode) {\r\n case 'animation':\r\n return this.animation.timer >= 0;\r\n case 'sync':\r\n return false;\r\n default:\r\n return this.numbers.has(mode) && this.numbers.get(mode).timer >= 0;\r\n }\r\n };\r\n return ScrollHandler;\r\n}());\r\n/**\r\n * @internal\r\n */\r\nexport function addScroll(scroller, mode, handler) {\r\n // hide in element to have just one real listener\r\n if (!scroller.__le_scroller__) {\r\n scroller.__le_scroller__ = new ScrollHandler(scroller);\r\n }\r\n var s = scroller.__le_scroller__;\r\n s.push(mode, handler);\r\n return s.asInfo();\r\n}\r\n/**\r\n * @internal\r\n */\r\nexport function isScrollEventWaiting(scroller, mode) {\r\n if (!scroller.__le_scroller__) {\r\n return false;\r\n }\r\n var s = scroller.__le_scroller__;\r\n return s.isWaiting(mode);\r\n}\r\n/**\r\n * @internal\r\n */\r\nexport function removeScroll(scroller, handler) {\r\n if (scroller.__le_scroller__) {\r\n scroller.__le_scroller__.remove(handler);\r\n }\r\n}\r\n//# sourceMappingURL=scroll.js.map","export * from './scroll';\r\n/**\r\n * clear node clearing\r\n * @param node\r\n * @internal\r\n */\r\nexport function clear(node) {\r\n while (node.lastChild) {\r\n node.removeChild(node.lastChild);\r\n }\r\n return node;\r\n}\r\n//# sourceMappingURL=index.js.map","var RowHeightException = /** @class */ (function () {\r\n function RowHeightException(index, y, height) {\r\n this.index = index;\r\n this.y = y;\r\n this.height = height;\r\n }\r\n Object.defineProperty(RowHeightException.prototype, \"y2\", {\r\n get: function () {\r\n return this.y + this.height;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return RowHeightException;\r\n}());\r\n/**\r\n * creates a uniform exception context, i.e no exceptions all rows are of the same height\r\n * @param {number} numberOfRows\r\n * @param {number} rowHeight\r\n * @param {number} rowPadding padding between rows\r\n * @return {IExceptionContext}\r\n */\r\nexport function uniformContext(numberOfRows, rowHeight, rowPadding) {\r\n if (rowPadding === void 0) { rowPadding = 0; }\r\n rowHeight += rowPadding;\r\n var exceptionsLookup = {\r\n keys: function () { return [].values(); },\r\n get: function () { return rowHeight; },\r\n has: function () { return false; },\r\n size: 0\r\n };\r\n return {\r\n exceptions: [],\r\n exceptionsLookup: exceptionsLookup,\r\n totalHeight: numberOfRows * rowHeight,\r\n numberOfRows: numberOfRows,\r\n defaultRowHeight: rowHeight,\r\n padding: function () { return rowPadding; }\r\n };\r\n}\r\n/**\r\n * computes the most frequent value in a given array like\r\n * @param {} values\r\n * @return {number}\r\n */\r\nfunction mostFrequentValue(values) {\r\n var lookup = new Map();\r\n values.forEach(function (value) {\r\n lookup.set(value, (lookup.get(value) || 0) + 1);\r\n });\r\n if (lookup.size === 0) {\r\n return 20; // default value since it doesn't matter\r\n }\r\n // sort desc take first key and asc by the second in case of tie, it is optimized to have exceptions for higher rows less for big rows\r\n var sorted = Array.from(lookup).sort(function (a, b) {\r\n if (a[1] !== b[1]) {\r\n return b[1] - a[1];\r\n }\r\n return a[0] - b[0];\r\n });\r\n var mostFrequent = sorted[0][0];\r\n if (mostFrequent === 0) { // cornercase\r\n return sorted.length > 1 ? sorted[1][0] : 20; // all empty\r\n }\r\n return mostFrequent;\r\n}\r\n/**\r\n * creates a non uniform context based on the given array like heights\r\n * @param rowHeights arrayish to get the heights\r\n * @param {number} defaultRowHeight if not given the most frequent value will be used\r\n * @param {number} rowPadding padding between rows\r\n * @return {IExceptionContext}\r\n */\r\nexport function nonUniformContext(rowHeights, defaultRowHeight, rowPadding) {\r\n if (defaultRowHeight === void 0) { defaultRowHeight = NaN; }\r\n if (rowPadding === void 0) { rowPadding = 0; }\r\n var exceptionsLookup = new Map();\r\n var exceptions = [];\r\n var padding = typeof rowPadding === 'function' ? rowPadding : function () { return rowPadding; };\r\n if (isNaN(defaultRowHeight)) {\r\n defaultRowHeight = mostFrequentValue(rowHeights);\r\n }\r\n defaultRowHeight += padding(-1);\r\n var prev = -1, acc = 0, totalHeight = 0, numberOfRows = 0;\r\n rowHeights.forEach(function (height, index) {\r\n height += padding(index);\r\n totalHeight += height;\r\n numberOfRows++;\r\n if (height === defaultRowHeight) {\r\n //regular\r\n return;\r\n }\r\n exceptionsLookup.set(index, height);\r\n var between = (index - prev - 1) * defaultRowHeight;\r\n prev = index;\r\n var y = acc + between;\r\n acc = y + height;\r\n exceptions.push(new RowHeightException(index, y, height));\r\n });\r\n return { exceptionsLookup: exceptionsLookup, exceptions: exceptions, totalHeight: totalHeight, defaultRowHeight: defaultRowHeight, numberOfRows: numberOfRows, padding: padding };\r\n}\r\n/**\r\n * creates a random context with the given constraints\r\n * @param {number} numberOfRows\r\n * @param {number} defaultRowHeight\r\n * @param {number} minRowHeight\r\n * @param {number} maxRowHeight\r\n * @param {number} ratio around ratio percent will get a non uniform height\r\n * @param {number} seed random seed\r\n * @return {IExceptionContext}\r\n */\r\nexport function randomContext(numberOfRows, defaultRowHeight, minRowHeight, maxRowHeight, ratio, seed) {\r\n if (minRowHeight === void 0) { minRowHeight = 2; }\r\n if (maxRowHeight === void 0) { maxRowHeight = defaultRowHeight * 10; }\r\n if (ratio === void 0) { ratio = 0.2; }\r\n if (seed === void 0) { seed = Date.now(); }\r\n var actSeed = seed;\r\n var random = function () {\r\n var x = Math.sin(actSeed++) * 10000;\r\n return x - Math.floor(x);\r\n };\r\n var getter = function () {\r\n var coin = random();\r\n if (coin < ratio) {\r\n //non uniform\r\n return minRowHeight + Math.round(random() * (maxRowHeight - minRowHeight));\r\n }\r\n return defaultRowHeight;\r\n };\r\n var forEach = function (callback) {\r\n for (var index = 0; index < numberOfRows; ++index) {\r\n callback(getter(), index);\r\n }\r\n };\r\n return nonUniformContext({ forEach: forEach }, defaultRowHeight);\r\n}\r\n/**\r\n * computes the visible range\r\n * @param {number} scrollTop top scrolling\r\n * @param {number} clientHeight visible height\r\n * @param {number} rowHeight height of a row by default\r\n * @param {IRowHeightException[]} heightExceptions exceptions of this default height\r\n * @param {number} numberOfRows the number of rows\r\n * @return {IVisibleRange} the computed visible range\r\n */\r\nexport function range(scrollTop, clientHeight, rowHeight, heightExceptions, numberOfRows) {\r\n if (numberOfRows === 0) {\r\n return { first: 0, last: -1, firstRowPos: 0, endPos: 0 };\r\n }\r\n if (numberOfRows === 1) {\r\n return {\r\n first: 0,\r\n last: 0,\r\n firstRowPos: 0,\r\n endPos: heightExceptions.length === 0 ? rowHeight : heightExceptions[0].y2\r\n };\r\n }\r\n var offset = scrollTop;\r\n var offset2 = offset + clientHeight;\r\n function indexOf(pos, indexShift) {\r\n return Math.min(numberOfRows - 1, indexShift + Math.max(0, Math.floor(pos / rowHeight)));\r\n }\r\n function calc(offsetShift, indexShift, isGuess) {\r\n if (isGuess === void 0) { isGuess = false; }\r\n var shifted = offset - offsetShift;\r\n var shifted2 = offset2 - offsetShift;\r\n var first = indexOf(shifted, indexShift);\r\n var last = indexOf(shifted2, indexShift);\r\n var firstRowPos = offsetShift + (first - indexShift) * rowHeight;\r\n var endPos = offsetShift + (last + 1 - indexShift) * rowHeight;\r\n //if (!isGuess) {\r\n // console.log(first, '@', firstRowPos, last, '#', end, offset, offset2, firstRowPos <= offset, offset2 <= end);\r\n //}\r\n console.assert(!isGuess || !(firstRowPos > offset || (endPos < offset2 && last < numberOfRows - 1)), 'error', isGuess, firstRowPos, endPos, offset, offset2, indexShift, offsetShift);\r\n return { first: first, last: last, firstRowPos: firstRowPos, endPos: endPos };\r\n }\r\n var r = calc(0, 0, true);\r\n if (heightExceptions.length === 0) {\r\n //uniform\r\n return r;\r\n }\r\n if (r.last < heightExceptions[0].index) {\r\n //console.log('before the first exception = uniform with no shift');\r\n //console.log(r.first, '@', r.firstRowPos, r.last, '#', r.end, offset, offset2, r.firstRowPos <= offset, offset2 <= r.end);\r\n return r;\r\n }\r\n if (r.last === heightExceptions[0].index && heightExceptions[0].height > rowHeight) {\r\n return Object.assign(r, { endPos: heightExceptions[0].y2 });\r\n }\r\n //the position where the exceptions ends\r\n var lastPos = heightExceptions[heightExceptions.length - 1];\r\n if (offset >= lastPos.y) {\r\n var rest = calc(lastPos.y2, lastPos.index + 1);\r\n if (offset < lastPos.y2) {\r\n // include me\r\n return Object.assign(rest, { first: lastPos.index, firstRowPos: lastPos.y });\r\n }\r\n return rest;\r\n }\r\n //we have some exceptions\r\n var visible = [];\r\n var closest = heightExceptions[0]; //closest before not in range\r\n for (var _i = 0, heightExceptions_1 = heightExceptions; _i < heightExceptions_1.length; _i++) {\r\n var item = heightExceptions_1[_i];\r\n var y = item.y, y2 = item.y2;\r\n if (y >= offset2) {\r\n break;\r\n }\r\n if (y2 <= offset) {\r\n closest = item;\r\n continue;\r\n }\r\n visible.push(item);\r\n }\r\n if (visible.length === 0) {\r\n //console.log('we are in the between some exceptions and none are visible');\r\n return calc(closest.y2, closest.index + 1); //skip myself\r\n }\r\n {\r\n //console.log('we show at least one exception');\r\n var firstException = visible[0];\r\n var lastException = visible[visible.length - 1];\r\n var first = Math.max(0, firstException.index - Math.max(0, Math.ceil((firstException.y - offset) / rowHeight)));\r\n var last = lastException.index;\r\n if (offset2 >= lastException.y2) {\r\n last = indexOf(offset2 - lastException.y2, lastException.index + 1);\r\n }\r\n var firstRowPos = firstException.y - (firstException.index - first) * rowHeight;\r\n var endPos = lastException.y2 + (last - lastException.index) * rowHeight;\r\n //console.log(first, '@', firstRowPos, last, '#', end, offset, offset2, firstRowPos <= offset, offset2 <= end);\r\n console.assert(firstRowPos <= offset && (endPos >= offset2 || last === numberOfRows - 1), 'error', firstRowPos, endPos, offset, offset2, firstException, lastException);\r\n return { first: first, last: last, firstRowPos: firstRowPos, endPos: endPos };\r\n }\r\n}\r\nexport function frozenDelta(current, target) {\r\n var clength = current.length;\r\n var tlength = target.length;\r\n if (clength === 0) {\r\n return { added: target, removed: [], common: 0 };\r\n }\r\n if (tlength === 0) {\r\n return { added: [], removed: current, common: 0 };\r\n }\r\n if (clength === tlength) { //since sorted and left increasing true\r\n return { added: [], removed: [], common: clength };\r\n }\r\n var removed = current.slice(Math.min(tlength, clength));\r\n var added = target.slice(Math.min(tlength, clength));\r\n return { added: added, removed: removed, common: clength - removed.length };\r\n}\r\nexport function updateFrozen(old, columns, first) {\r\n var oldLast = old.length === 0 ? 0 : old[old.length - 1] + 1;\r\n var added = [];\r\n var removed = [];\r\n for (var i = old.length - 1; i >= 0; --i) {\r\n var index = old[i];\r\n if (index >= first) {\r\n removed.push(old.pop());\r\n }\r\n else {\r\n // can stop since sorted and it will never happen again\r\n break;\r\n }\r\n }\r\n //added\r\n for (var i = oldLast; i < first; ++i) {\r\n if (columns[i].frozen) {\r\n added.push(i);\r\n old.push(i);\r\n }\r\n }\r\n return { target: old, added: added, removed: removed };\r\n}\r\n//# sourceMappingURL=logic.js.map","/**\r\n * scrolling result\r\n */\r\nexport var EScrollResult;\r\n(function (EScrollResult) {\r\n /**\r\n * nothing has changed\r\n */\r\n EScrollResult[EScrollResult[\"NONE\"] = 0] = \"NONE\";\r\n /**\r\n * all rows needed to be recreated\r\n */\r\n EScrollResult[EScrollResult[\"ALL\"] = 1] = \"ALL\";\r\n /**\r\n * unknown\r\n */\r\n EScrollResult[EScrollResult[\"SOME\"] = 2] = \"SOME\";\r\n /**\r\n * some rows are added at the bottom\r\n */\r\n EScrollResult[EScrollResult[\"SOME_BOTTOM\"] = 3] = \"SOME_BOTTOM\";\r\n /**\r\n * some rows are added at the top\r\n */\r\n EScrollResult[EScrollResult[\"SOME_TOP\"] = 4] = \"SOME_TOP\";\r\n})(EScrollResult || (EScrollResult = {}));\r\n//# sourceMappingURL=IMixin.js.map","var PREFIX = 'le';\r\n/**\r\n * @internal\r\n * @param suffix suffix to suffix\r\n */\r\nexport function cssClass(suffix) {\r\n if (!suffix) {\r\n return PREFIX;\r\n }\r\n return PREFIX + \"-\" + suffix;\r\n}\r\nexport var CSS_CLASS_LOADING = cssClass('loading');\r\nexport var CSS_CLASS_FROZEN = cssClass('frozen');\r\nexport var CSS_CLASS_HIDDEN = cssClass('hidden');\r\nexport var CSS_CLASS_MULTI = cssClass('multi');\r\nexport var CSS_CLASS_EVEN = cssClass('even');\r\nexport var CSS_CLASS_SHIFTED = cssClass('shifted');\r\nexport var CSS_CLASS_SCROLLBAR_TESTER = cssClass('scrollbar-tester');\r\nexport var CSS_CLASS_HEADER = cssClass('header');\r\nexport var CSS_CLASS_BODY = cssClass('body');\r\nexport var CSS_CLASS_FOOTER = cssClass('footer');\r\nexport var CSS_CLASS_THEAD = cssClass('thead');\r\nexport var CSS_CLASS_TBODY = cssClass('tbody');\r\nexport var CSS_CLASS_TR = cssClass('tr');\r\nexport var CSS_CLASS_TH = cssClass('th');\r\nexport var CSS_CLASS_TD = cssClass('td');\r\nexport var CSS_CLASS_SCROLLING = cssClass('scrolling');\r\nexport var CSS_CLASS_ROW_ANIMATION = cssClass('row-animation');\r\n//# sourceMappingURL=index.js.map","import { ABORTED, isAbortAble } from './abortAble';\r\nimport { defaultPhases, EAnimationMode, noAnimationChange } from './animation';\r\nimport KeyFinder from './animation/KeyFinder';\r\nimport { addScroll, clear, defaultMode, removeScroll } from './internal';\r\nimport { isScrollEventWaiting } from './internal/scroll';\r\nimport { range } from './logic';\r\nimport { EScrollResult } from './mixin';\r\nimport { cssClass, CSS_CLASS_EVEN, CSS_CLASS_FOOTER, CSS_CLASS_LOADING, CSS_CLASS_ROW_ANIMATION, CSS_CLASS_SCROLLING, CSS_CLASS_TR } from './styles';\r\nexport function isLoadingCell(node) {\r\n return node.classList.contains(CSS_CLASS_LOADING);\r\n}\r\n/**\r\n * base class for creating a scalable table renderer based on rows\r\n */\r\nvar ARowRenderer = /** @class */ (function () {\r\n function ARowRenderer(body, options) {\r\n var _this = this;\r\n if (options === void 0) { options = {}; }\r\n this.body = body;\r\n this.pool = [];\r\n this.loadingPool = [];\r\n this.loading = new WeakMap();\r\n /**\r\n * currently visible slice\r\n */\r\n this.visible = {\r\n first: 0,\r\n forcedFirst: 0,\r\n last: -1,\r\n forcedLast: -1\r\n };\r\n /**\r\n * position of the first visible row in pixel\r\n * @type {number}\r\n */\r\n this.visibleFirstRowPos = 0;\r\n this.scrollListener = null;\r\n this.lastScrollInfo = null;\r\n this.abortAnimation = function () { return undefined; };\r\n this.options = {\r\n async: defaultMode,\r\n minScrollDelta: 10,\r\n mixins: [],\r\n scrollingHint: false,\r\n batchSize: 10,\r\n striped: false,\r\n viewportOversize: 200\r\n };\r\n this.adapter = this.createAdapter();\r\n Object.assign(this.options, options);\r\n this.mixins = this.options.mixins.map(function (mixinClass) { return new mixinClass(_this.adapter); });\r\n this.fragment = body.ownerDocument.createDocumentFragment();\r\n }\r\n /**\r\n * register another mixin to this renderer\r\n * @param {IMixinClass} mixinClass the mixin class to instantitiate\r\n * @param options optional constructor options\r\n */\r\n ARowRenderer.prototype.addMixin = function (mixinClass, options) {\r\n this.mixins.push(new mixinClass(this.adapter, options));\r\n };\r\n ARowRenderer.prototype.createAdapter = function () {\r\n var _this = this;\r\n var r = {\r\n visible: this.visible,\r\n addAtBeginning: this.addAtBeginning.bind(this),\r\n addAtBottom: this.addAtBottom.bind(this),\r\n removeFromBeginning: this.removeFromBeginning.bind(this),\r\n removeFromBottom: this.removeFromBottom.bind(this),\r\n updateOffset: this.updateOffset.bind(this),\r\n isScrollEventWaiting: function () { return isScrollEventWaiting(_this.bodyScroller, _this.options.async); }\r\n };\r\n Object.defineProperties(r, {\r\n visibleFirstRowPos: {\r\n get: function () { return _this.visibleFirstRowPos; },\r\n enumerable: true\r\n },\r\n context: {\r\n get: function () { return _this.context; },\r\n enumerable: true\r\n },\r\n scrollOffset: {\r\n get: function () { return _this.lastScrollInfo ? _this.lastScrollInfo.top : 0; },\r\n enumerable: true\r\n },\r\n scrollTotal: {\r\n get: function () { return _this.lastScrollInfo ? _this.lastScrollInfo.height : _this.bodyScroller.clientHeight; },\r\n enumerable: true\r\n }\r\n });\r\n return r;\r\n };\r\n Object.defineProperty(ARowRenderer.prototype, \"bodyScroller\", {\r\n /**\r\n * get the scrolling container i.e. parent of the body element\r\n * @returns {HTMLElement}\r\n */\r\n get: function () {\r\n return this.body.parentElement;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ARowRenderer.prototype, \"bodySizer\", {\r\n get: function () {\r\n var parent = this.bodyScroller;\r\n var sizer = Array.from(parent.children).find(function (d) { return d.tagName.toLowerCase() === 'footer'; });\r\n if (sizer) {\r\n return sizer;\r\n }\r\n var s = parent.ownerDocument.createElement('footer');\r\n s.classList.add(CSS_CLASS_FOOTER, cssClass(\"footer-\" + this.idPrefix));\r\n parent.insertBefore(s, parent.firstChild);\r\n return s;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * initializes the table and register the onscroll listener\r\n * @returns {void} nothing\r\n */\r\n ARowRenderer.prototype.init = function () {\r\n var _this = this;\r\n var scroller = this.bodyScroller;\r\n var old = addScroll(scroller, this.options.async, this.scrollListener = function (act) {\r\n _this.lastScrollInfo = act;\r\n if (Math.abs(old.top - act.top) < _this.options.minScrollDelta && Math.abs(old.height - act.height) < _this.options.minScrollDelta) {\r\n return;\r\n }\r\n var isGoingDown = act.top > old.top;\r\n old = act;\r\n _this.onScrolledVertically(act.top, act.height, isGoingDown);\r\n if (_this.options.scrollingHint) {\r\n _this.body.classList.remove(CSS_CLASS_SCROLLING);\r\n }\r\n });\r\n if (this.options.scrollingHint) {\r\n addScroll(scroller, 'animation', function () { return _this.body.classList.add(CSS_CLASS_SCROLLING); });\r\n }\r\n this.recreate();\r\n };\r\n /**\r\n * destroys this renderer and unregisters all event listeners\r\n */\r\n ARowRenderer.prototype.destroy = function () {\r\n removeScroll(this.bodyScroller, this.scrollListener);\r\n this.body.remove();\r\n };\r\n ARowRenderer.cleanUp = function (item) {\r\n item.style.height = null;\r\n };\r\n ARowRenderer.prototype.select = function (index) {\r\n var item;\r\n var result;\r\n if (this.pool.length > 0) {\r\n item = this.pool.pop();\r\n result = this.updateRow(item, index);\r\n }\r\n else if (this.loadingPool.length > 0) {\r\n item = this.loadingPool.pop();\r\n item.classList.remove(CSS_CLASS_LOADING);\r\n result = this.createRow(item, index);\r\n }\r\n else {\r\n item = this.body.ownerDocument.createElement('div');\r\n item.classList.add(CSS_CLASS_TR, cssClass(\"tr-\" + this.idPrefix));\r\n result = this.createRow(item, index);\r\n }\r\n item.dataset.index = String(index);\r\n if (this.options.striped) {\r\n item.classList.toggle(CSS_CLASS_EVEN, index % 2 === 0);\r\n }\r\n return { item: item, result: result };\r\n };\r\n ARowRenderer.prototype.selectProxy = function () {\r\n var proxy;\r\n if (this.loadingPool.length > 0) {\r\n proxy = this.loadingPool.pop();\r\n }\r\n else {\r\n proxy = this.body.ownerDocument.createElement('div');\r\n proxy.classList.add(CSS_CLASS_LOADING, CSS_CLASS_TR, cssClass(\"tr-\" + this.idPrefix));\r\n }\r\n return proxy;\r\n };\r\n ARowRenderer.prototype.recycle = function (item) {\r\n ARowRenderer.cleanUp(item);\r\n // check if the original dom element is still being manipulated\r\n if (this.loading.has(item)) {\r\n var abort = this.loading.get(item);\r\n abort.abort();\r\n }\r\n else {\r\n this.pool.push(item);\r\n }\r\n };\r\n ARowRenderer.prototype.proxy = function (item, result) {\r\n var _this = this;\r\n if (!isAbortAble(result)) {\r\n return item;\r\n }\r\n var abort = result;\r\n //lazy loading\r\n var real = item;\r\n var proxy = this.selectProxy();\r\n // copy attributes\r\n proxy.dataset.index = real.dataset.index;\r\n proxy.style.height = real.style.height;\r\n this.loading.set(proxy, abort);\r\n abort.then(function (result) {\r\n if (result === ABORTED) {\r\n //aborted can recycle the real one\r\n ARowRenderer.cleanUp(real);\r\n _this.pool.push(real);\r\n }\r\n else {\r\n //fully loaded\r\n _this.body.replaceChild(real, proxy);\r\n }\r\n _this.loading.delete(proxy);\r\n ARowRenderer.cleanUp(proxy);\r\n _this.loadingPool.push(proxy);\r\n });\r\n return proxy;\r\n };\r\n ARowRenderer.prototype.create = function (index) {\r\n var _a = this.select(index), item = _a.item, result = _a.result;\r\n var _b = this.context, ex = _b.exceptionsLookup, padding = _b.padding;\r\n if (ex.has(index)) {\r\n item.style.height = ex.get(index) - padding(index) + \"px\";\r\n }\r\n return this.proxy(item, result);\r\n };\r\n ARowRenderer.prototype.removeAll = function (perform) {\r\n if (perform === void 0) { perform = true; }\r\n var b = this.body;\r\n if (!perform) {\r\n return Array.from(b.children);\r\n }\r\n var torecycle = [];\r\n while (b.lastElementChild) {\r\n var i = b.lastElementChild;\r\n b.removeChild(i);\r\n this.recycle(i);\r\n torecycle.push(i);\r\n }\r\n return torecycle;\r\n };\r\n /**\r\n * triggers and visual update of all visible rows\r\n */\r\n ARowRenderer.prototype.update = function () {\r\n var _this = this;\r\n var first = this.visible.first;\r\n var fragment = this.fragment;\r\n var items = Array.from(this.body.children);\r\n clear(this.body);\r\n items.forEach(function (item, i) {\r\n if (_this.loading.has(item)) {\r\n // still loading\r\n fragment.appendChild(item);\r\n return;\r\n }\r\n var abort = _this.updateRow(item, i + first);\r\n fragment.appendChild(_this.proxy(item, abort));\r\n });\r\n this.body.appendChild(fragment);\r\n };\r\n /**\r\n * utility to execute a function for each visible row\r\n * @param {(row: HTMLElement, rowIndex: number) => void} callback callback to execute\r\n * @param {boolean} inplace whether the DOM changes should be performed inplace instead of in a fragment\r\n */\r\n ARowRenderer.prototype.forEachRow = function (callback, inplace) {\r\n var _this = this;\r\n if (inplace === void 0) { inplace = false; }\r\n var rows = Array.from(this.body.children);\r\n var fragment = this.fragment;\r\n if (!inplace) {\r\n clear(this.body);\r\n }\r\n rows.forEach(function (row, index) {\r\n if (!isLoadingCell(row) && row.dataset.animation !== 'update_remove' && row.dataset.animation !== 'hide') {\r\n //skip loading ones and temporary ones\r\n callback(row, index + _this.visible.first);\r\n }\r\n if (!inplace) {\r\n fragment.appendChild(row);\r\n }\r\n });\r\n if (!inplace) {\r\n this.body.appendChild(fragment);\r\n }\r\n };\r\n ARowRenderer.prototype.removeFromBeginning = function (from, to, perform) {\r\n if (perform === void 0) { perform = true; }\r\n return this.remove(from, to, true, perform);\r\n };\r\n ARowRenderer.prototype.removeFromBottom = function (from, to, perform) {\r\n if (perform === void 0) { perform = true; }\r\n return this.remove(from, to, false, perform);\r\n };\r\n ARowRenderer.prototype.remove = function (from, to, fromBeginning, perform) {\r\n if (perform === void 0) { perform = true; }\r\n if (to < from) {\r\n return;\r\n }\r\n var b = this.body;\r\n var torecycle = [];\r\n // console.log('remove', fromBeginning, (to - from) + 1, this.body.childElementCount - ((to - from) + 1));\r\n var act = (fromBeginning ? b.firstChild : b.lastChild);\r\n for (var i = from; i <= to; ++i) {\r\n var item = act;\r\n act = (fromBeginning ? act.nextSibling : act.previousSibling);\r\n if (perform) {\r\n b.removeChild(item);\r\n this.recycle(item);\r\n }\r\n torecycle.push(item);\r\n }\r\n return torecycle;\r\n };\r\n ARowRenderer.prototype.addAtBeginning = function (from, to, perform) {\r\n if (perform === void 0) { perform = true; }\r\n if (to < from) {\r\n return;\r\n }\r\n // console.log('add', (to - from) + 1, this.body.childElementCount + ((to - from) + 1));\r\n var fragment = this.fragment;\r\n if (from === to && perform) {\r\n this.body.insertBefore(this.create(from), this.body.firstChild);\r\n return;\r\n }\r\n for (var i = from; i <= to; ++i) {\r\n fragment.appendChild(this.create(i));\r\n }\r\n if (perform) {\r\n this.body.insertBefore(fragment, this.body.firstChild);\r\n }\r\n return fragment;\r\n };\r\n ARowRenderer.prototype.addAtBottom = function (from, to, perform) {\r\n if (perform === void 0) { perform = true; }\r\n if (to < from) {\r\n return;\r\n }\r\n // console.log('add_b', (to - from) + 1, this.body.childElementCount + ((to - from) + 1));\r\n if (from === to && perform) {\r\n this.body.appendChild(this.create(from));\r\n return;\r\n }\r\n var fragment = this.fragment;\r\n for (var i = from; i <= to; ++i) {\r\n fragment.appendChild(this.create(i));\r\n }\r\n if (perform) {\r\n this.body.appendChild(fragment);\r\n }\r\n return fragment;\r\n };\r\n ARowRenderer.prototype.updateOffset = function (firstRowPos) {\r\n this.visibleFirstRowPos = firstRowPos;\r\n this.updateSizer(firstRowPos);\r\n };\r\n ARowRenderer.prototype.updateSizer = function (firstRowPos) {\r\n var totalHeight = this.context.totalHeight;\r\n setTransform(this.body, 0, firstRowPos.toFixed(0));\r\n setTransform(this.bodySizer, 0, Math.max(0, totalHeight - 1).toFixed(0));\r\n };\r\n /**\r\n * removes all rows and recreates the table\r\n * @param {IAnimationContext} ctx optional animation context to create a transition between the previous and the current tables\r\n * @returns {void} nothing\r\n */\r\n ARowRenderer.prototype.recreate = function (ctx) {\r\n this.abortAnimation();\r\n if (ctx) {\r\n return this.recreateAnimated(ctx);\r\n }\r\n return this.recreatePure();\r\n };\r\n ARowRenderer.prototype.recreatePure = function () {\r\n var context = this.context;\r\n var scroller = this.bodyScroller;\r\n //update first to avoid resetting scrollTop\r\n this.updateOffset(0);\r\n this.removeAll();\r\n this.clearPool();\r\n var _a = range(scroller.scrollTop, scroller.clientHeight, context.defaultRowHeight, context.exceptions, context.numberOfRows), first = _a.first, last = _a.last, firstRowPos = _a.firstRowPos;\r\n this.visible.first = this.visible.forcedFirst = first;\r\n this.visible.last = this.visible.forcedLast = last;\r\n if (first < 0) {\r\n // empty\r\n this.updateOffset(0);\r\n return;\r\n }\r\n this.addAtBottom(first, last);\r\n this.updateOffset(firstRowPos);\r\n };\r\n ARowRenderer.prototype.recreateAnimated = function (ctx) {\r\n var _this = this;\r\n var lookup = new Map();\r\n var prev = new KeyFinder(ctx.previous, ctx.previousKey);\r\n var cur = new KeyFinder(this.context, ctx.currentKey);\r\n var next = range(this.bodyScroller.scrollTop, this.bodyScroller.clientHeight, cur.context.defaultRowHeight, cur.context.exceptions, cur.context.numberOfRows);\r\n {\r\n var rows_1 = Array.from(this.body.children);\r\n var old = Object.assign({}, this.visible);\r\n //store the current rows in a lookup and clear\r\n clear(this.body);\r\n prev.positions(old.first, Math.min(old.last, old.first + rows_1.length), this.visibleFirstRowPos, function (i, key, pos) {\r\n var n = rows_1[i];\r\n if (n) { // shouldn't happen that it is not there\r\n lookup.set(key, { n: n, pos: pos, i: i });\r\n }\r\n // else {\r\n // console.error(i, key, pos, rows);\r\n //}\r\n });\r\n }\r\n this.visible.first = this.visible.forcedFirst = next.first;\r\n this.visible.last = this.visible.forcedLast = next.last;\r\n var fragment = this.fragment;\r\n var animation = [];\r\n var nodeY = next.firstRowPos;\r\n cur.positions(next.first, next.last, next.firstRowPos, function (i, key, pos) {\r\n var node;\r\n var mode = EAnimationMode.UPDATE;\r\n var previous;\r\n if (lookup.has(key)) {\r\n // still visible\r\n var item = lookup.get(key);\r\n lookup.delete(key);\r\n // update height\r\n item.n.dataset.index = String(i);\r\n node = _this.proxy(item.n, _this.updateRow(item.n, i));\r\n previous = {\r\n index: item.i,\r\n y: item.pos,\r\n height: prev.exceptionHeightOf(item.i, true)\r\n };\r\n }\r\n else {\r\n // need a new row\r\n var old = prev.posByKey(key);\r\n // maybe not visible before so keep in place\r\n node = _this.create(i);\r\n mode = old.index < 0 ? EAnimationMode.SHOW : EAnimationMode.UPDATE_CREATE;\r\n previous = {\r\n index: old.index,\r\n y: old.pos >= 0 ? old.pos : pos,\r\n height: old.index < 0 ? cur.exceptionHeightOf(i, true) : prev.exceptionHeightOf(old.index, true)\r\n };\r\n }\r\n animation.push({\r\n node: node,\r\n key: key,\r\n mode: mode,\r\n previous: previous,\r\n nodeY: nodeY,\r\n nodeYCurrentHeight: pos,\r\n current: {\r\n index: i,\r\n y: pos,\r\n height: cur.exceptionHeightOf(i)\r\n }\r\n });\r\n node.style.transform = \"translate(0, \" + (nodeY - pos) + \"px)\";\r\n nodeY += previous.height + (previous.index < 0 ? cur.padding(i) : prev.padding(previous.index));\r\n fragment.appendChild(node);\r\n });\r\n var nodeYCurrentHeight = next.endPos;\r\n // items that are going to be removed\r\n lookup.forEach(function (item, key) {\r\n // calculate their next position\r\n var r = cur.posByKey(key);\r\n // maybe not visible anymore, keep in place\r\n var nextPos = r.pos >= 0 ? r.pos : item.pos;\r\n var node = item.n;\r\n // located at addedPos\r\n // should end up at nextPos\r\n // was previously at item.pos\r\n node.style.transform = \"translate(0, \" + (item.pos - nodeY) + \"px)\";\r\n fragment.appendChild(node);\r\n var prevHeight = prev.exceptionHeightOf(item.i, true);\r\n animation.push({\r\n node: item.n,\r\n key: key,\r\n mode: r.index < 0 ? EAnimationMode.HIDE : EAnimationMode.UPDATE_REMOVE,\r\n previous: {\r\n index: item.i,\r\n y: item.pos,\r\n height: prevHeight\r\n },\r\n nodeY: nodeY,\r\n nodeYCurrentHeight: nodeYCurrentHeight,\r\n current: {\r\n index: r.index,\r\n y: nextPos,\r\n height: r.index < 0 ? null : cur.exceptionHeightOf(r.index)\r\n }\r\n });\r\n nodeYCurrentHeight += r.index < 0 ? cur.context.defaultRowHeight : (cur.exceptionHeightOf(r.index, true) + cur.padding(r.index));\r\n nodeY += prevHeight + prev.padding(item.i);\r\n });\r\n this.updateOffset(next.firstRowPos);\r\n this.animate(animation, ctx.phases || defaultPhases, prev, cur, fragment);\r\n };\r\n ARowRenderer.prototype.animate = function (animation, phases, previousFinder, currentFinder, fragment) {\r\n var _this = this;\r\n if (animation.length <= 0) {\r\n this.body.appendChild(fragment);\r\n return;\r\n }\r\n var currentTimer = -1;\r\n var actPhase = 0;\r\n var executePhase = function (phase, items) {\r\n if (items === void 0) { items = animation; }\r\n items.forEach(function (anim) { return phase.apply(anim, previousFinder, currentFinder); });\r\n };\r\n var run = function () {\r\n //dummy log for forcing dom update\r\n console.assert(animation[0].node.offsetTop >= 0, 'dummy log for forcing dom update');\r\n executePhase(phases[actPhase++]);\r\n // shifted by one since already added through ++\r\n if (actPhase < phases.length) {\r\n // schedule the next one\r\n var next = phases[actPhase];\r\n currentTimer = self.setTimeout(run, next.delay);\r\n return;\r\n }\r\n // last one\r\n var body = _this.body.classList;\r\n Array.from(body).forEach(function (v) {\r\n if (v.startsWith(cssClass()) && v.endsWith('-animation')) {\r\n body.remove(v);\r\n }\r\n });\r\n // clean up\r\n animation.forEach(function (_a) {\r\n var node = _a.node, mode = _a.mode;\r\n if (mode !== EAnimationMode.UPDATE_REMOVE && mode !== EAnimationMode.HIDE) {\r\n return;\r\n }\r\n node.remove();\r\n node.style.transform = null;\r\n _this.recycle(node);\r\n });\r\n _this.abortAnimation = function () { return undefined; };\r\n currentTimer = -1;\r\n };\r\n // execute all phases having a delay of zero\r\n while (phases[actPhase].delay === 0) {\r\n executePhase(phases[actPhase++]);\r\n }\r\n // after the initial one\r\n var body = this.body;\r\n this.body.appendChild(fragment);\r\n var dummyAnimation = [];\r\n animation = animation.filter(function (d) {\r\n if (noAnimationChange(d, previousFinder.context.defaultRowHeight, currentFinder.context.defaultRowHeight)) {\r\n dummyAnimation.push(d);\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (dummyAnimation.length > 0) {\r\n // execute all phases for them\r\n phases.slice(actPhase).forEach(function (phase) { return executePhase(phase, dummyAnimation); });\r\n }\r\n if (animation.length === 0) {\r\n return;\r\n }\r\n body.classList.add(CSS_CLASS_ROW_ANIMATION);\r\n (new Set(animation.map(function (d) { return d.mode; }))).forEach(function (mode) {\r\n // add class but map to UPDATE only\r\n body.classList.add(cssClass(EAnimationMode[mode].toLowerCase().split('_')[0] + \"-animation\"));\r\n });\r\n this.abortAnimation = function () {\r\n if (currentTimer <= 0) {\r\n return;\r\n }\r\n // abort by removing\r\n clearTimeout(currentTimer);\r\n currentTimer = -1;\r\n // run the last phase\r\n actPhase = phases.length - 1;\r\n run();\r\n };\r\n // next tick such that DOM will be updated\r\n currentTimer = self.setTimeout(run, phases[actPhase].delay);\r\n };\r\n /**\r\n * clears the row pool used for faster creation\r\n */\r\n ARowRenderer.prototype.clearPool = function () {\r\n // clear pool\r\n this.pool.splice(0, this.pool.length);\r\n };\r\n /**\r\n * triggers a revalidation of the current scrolling offest\r\n */\r\n ARowRenderer.prototype.revalidate = function () {\r\n var scroller = this.bodyScroller;\r\n this.onScrolledVertically(scroller.scrollTop, scroller.clientHeight, true);\r\n this.updateOffset(this.visibleFirstRowPos);\r\n };\r\n /**\r\n * scrolling vertically\r\n * @param {number} scrollTop top scrolling\r\n * @param {number} clientHeight visible height\r\n * @param {boolean} isGoingDown hint whether the scrollTop increases\r\n * @return {EScrollResult} full in case of a full rebuild or partial update\r\n */\r\n ARowRenderer.prototype.onScrolledVertically = function (scrollTop, clientHeight, isGoingDown) {\r\n var shift = this.options.viewportOversize;\r\n var shiftTop = Math.max(0, scrollTop - shift);\r\n var scrollResult = this.onScrolledImpl(shiftTop, clientHeight + shift + (scrollTop - shiftTop));\r\n for (var _i = 0, _a = this.mixins; _i < _a.length; _i++) {\r\n var mixin = _a[_i];\r\n mixin.onScrolled(isGoingDown, scrollResult);\r\n }\r\n return scrollResult;\r\n };\r\n ARowRenderer.prototype.shiftLast = function (current, currentDelta) {\r\n var b = this.options.batchSize;\r\n if (currentDelta >= b) {\r\n return current;\r\n }\r\n var total = this.context.numberOfRows;\r\n return Math.min(total - 1, current + (this.options.batchSize - currentDelta));\r\n };\r\n ARowRenderer.prototype.shiftFirst = function (current, currentFirstRow, currentDelta) {\r\n var b = this.options.batchSize;\r\n if (currentDelta >= b || current <= 0) {\r\n return { first: current, firstRowPos: currentFirstRow };\r\n }\r\n var first = Math.max(0, current - (this.options.batchSize - currentDelta));\r\n var _a = this.context, exceptionsLookup = _a.exceptionsLookup, defaultRowHeight = _a.defaultRowHeight;\r\n var firstRowPos = currentFirstRow;\r\n for (var i = first; i < current; ++i) {\r\n if (exceptionsLookup.has(i)) {\r\n firstRowPos -= exceptionsLookup.get(i);\r\n }\r\n else {\r\n firstRowPos -= defaultRowHeight;\r\n }\r\n }\r\n return { first: first, firstRowPos: firstRowPos };\r\n };\r\n ARowRenderer.prototype.onScrolledImpl = function (scrollTop, clientHeight) {\r\n var context = this.context;\r\n var _a = range(scrollTop, clientHeight, context.defaultRowHeight, context.exceptions, context.numberOfRows), first = _a.first, last = _a.last, firstRowPos = _a.firstRowPos;\r\n var visible = this.visible;\r\n visible.forcedFirst = first;\r\n visible.forcedLast = last;\r\n if ((first - visible.first) >= 0 && (last - visible.last) <= 0) {\r\n //nothing to do\r\n return EScrollResult.NONE;\r\n }\r\n var r = EScrollResult.SOME;\r\n var torecycle;\r\n var toadd;\r\n var toaddBottom = false;\r\n if (first > visible.last || last < visible.first) {\r\n //no overlap, clean and draw everything\r\n //console.log(`ff added: ${last - first + 1} removed: ${visibleLast - visibleFirst + 1} ${first}:${last} ${offset}`);\r\n //removeRows(visibleFirst, visibleLast);\r\n torecycle = this.removeAll(false);\r\n toadd = this.addAtBottom(first, last, false);\r\n toaddBottom = true;\r\n r = EScrollResult.ALL;\r\n }\r\n else if (first < visible.first) {\r\n //some first rows missing and some last rows to much\r\n //console.log(`up added: ${visibleFirst - first + 1} removed: ${visibleLast - last + 1} ${first}:${last} ${offset}`);\r\n var toRemove = visible.last - (last + 1);\r\n if (toRemove >= this.options.batchSize) {\r\n torecycle = this.removeFromBottom(last + 1, visible.last, false);\r\n }\r\n else {\r\n last = visible.last;\r\n }\r\n var shift = this.shiftFirst(first, firstRowPos, visible.first - 1 - first);\r\n first = shift.first;\r\n firstRowPos = shift.firstRowPos;\r\n toadd = this.addAtBeginning(first, visible.first - 1, false);\r\n toaddBottom = false;\r\n r = EScrollResult.SOME_TOP;\r\n }\r\n else {\r\n //console.log(`do added: ${last - visibleLast + 1} removed: ${first - visibleFirst + 1} ${first}:${last} ${offset}`);\r\n //some last rows missing and some first rows to much\r\n var toRemove = first - 1 - visible.first;\r\n if (toRemove >= this.options.batchSize) {\r\n torecycle = this.removeFromBeginning(visible.first, first - 1, false);\r\n }\r\n else {\r\n first = visible.first;\r\n firstRowPos = this.visibleFirstRowPos;\r\n }\r\n last = this.shiftLast(last, last - visible.last + 1);\r\n toadd = this.addAtBottom(visible.last + 1, last, false);\r\n toaddBottom = true;\r\n r = EScrollResult.SOME_BOTTOM;\r\n }\r\n visible.first = first;\r\n visible.last = last;\r\n this.updateOffset(firstRowPos);\r\n this.manipulate(torecycle, toadd, toaddBottom);\r\n return r;\r\n };\r\n ARowRenderer.prototype.manipulate = function (toRecycle, toAdd, bottom) {\r\n if (toRecycle) {\r\n for (var _i = 0, toRecycle_1 = toRecycle; _i < toRecycle_1.length; _i++) {\r\n var item = toRecycle_1[_i];\r\n item.remove();\r\n this.recycle(item);\r\n }\r\n }\r\n if (!toAdd) {\r\n return;\r\n }\r\n if (bottom) {\r\n this.body.appendChild(toAdd);\r\n }\r\n else {\r\n this.body.insertBefore(toAdd, this.body.firstChild);\r\n }\r\n };\r\n return ARowRenderer;\r\n}());\r\nexport { ARowRenderer };\r\nexport default ARowRenderer;\r\nexport function setTransform(elem, x, y) {\r\n var text = \"translate(\" + x + \"px, \" + y + \"px)\";\r\n var anyelem = elem;\r\n if (anyelem.__transform__ === text) {\r\n return;\r\n }\r\n anyelem.__transform__ = elem.style.transform = text;\r\n}\r\n//# sourceMappingURL=ARowRenderer.js.map","// import manually import './style.scss';\r\nfunction assignStyles(target, source) {\r\n for (var _i = 0, _a = Object.keys(source); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n var v = source[key];\r\n if (!v.endsWith(' !important')) {\r\n if (target[key] !== v) {\r\n target[key] = v;\r\n }\r\n continue;\r\n }\r\n // handle special important case\r\n var plain = v.slice(0, -' !important'.length);\r\n if (target[key] === plain) {\r\n continue;\r\n }\r\n target[key] = plain;\r\n // see https://gist.github.com/youssman/745578062609e8acac9f\r\n var hyphen = key.replace(/([a-zA-Z])(?=[A-Z])/g, '$1-').toLowerCase();\r\n target.setProperty(hyphen, plain, 'important');\r\n }\r\n}\r\nvar StyleManager = /** @class */ (function () {\r\n /**\r\n * the parent element to append this managed style\r\n * @param {HTMLElement} root\r\n */\r\n function StyleManager(root) {\r\n this.rules = [];\r\n this.testVerifyTimeout = -1;\r\n this.node = root.ownerDocument.createElement('style');\r\n this.node.appendChild(root.ownerDocument.createTextNode('')); // for webkit?\r\n root.appendChild(this.node);\r\n }\r\n StyleManager.prototype.destroy = function () {\r\n this.node.remove();\r\n };\r\n StyleManager.prototype.verifySheet = function () {\r\n var _this = this;\r\n var sheet = this.sheet;\r\n if (!sheet) {\r\n if (this.testVerifyTimeout >= 0) {\r\n return;\r\n }\r\n // test till attached\r\n this.testVerifyTimeout = self.setTimeout(function () {\r\n _this.testVerifyTimeout = -1;\r\n _this.verifySheet();\r\n }, 20);\r\n return;\r\n }\r\n var rules = sheet.cssRules;\r\n if (rules.length === this.rules.length && this.rules.every(function (d, i) { return rules[i].selectorText === d.selector; })) {\r\n // same\r\n return;\r\n }\r\n console.warn('invalid sheet rules detected');\r\n var l = rules.length;\r\n for (var i = 0; i < l; ++i) {\r\n sheet.deleteRule(i);\r\n }\r\n // create all\r\n for (var _i = 0, _a = this.rules; _i < _a.length; _i++) {\r\n var rule = _a[_i];\r\n var index = sheet.insertRule(rule.selector + \" {}\", sheet.cssRules.length);\r\n var cssRule = sheet.cssRules[index];\r\n rule.selector = cssRule.selectorText;\r\n assignStyles(cssRule.style, rule.style);\r\n }\r\n };\r\n Object.defineProperty(StyleManager.prototype, \"sheet\", {\r\n get: function () {\r\n return this.node.sheet;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n StyleManager.prototype.getSheetRule = function (index) {\r\n var sheet = this.sheet;\r\n return sheet ? sheet.cssRules[index] : null;\r\n };\r\n /**\r\n * add a custom css rule\r\n * @param {string} id unique id of the rule for later identification\r\n * @param {string} selector the css selector\r\n * @param {Partial<CSSStyleDeclaration>} style the style attributes\r\n * @returns {string} the id again\r\n */\r\n StyleManager.prototype.addRule = function (id, selector, style) {\r\n this.verifySheet();\r\n var sheet = this.sheet;\r\n if (!sheet) {\r\n // upon next update\r\n this.rules.push({ id: id, selector: selector, style: style });\r\n return;\r\n }\r\n var index = sheet.insertRule(selector + \" {}\", sheet.cssRules.length);\r\n var rule = sheet.cssRules[index];\r\n this.rules.push({ id: id, selector: rule.selectorText, style: style });\r\n assignStyles(rule.style, style);\r\n return id;\r\n };\r\n /**\r\n * updates or add a rule, see @addRule\r\n * @param {string} id unique id of the rule for later identification\r\n * @param {string} selector the css selector\r\n * @param {Partial<CSSStyleDeclaration>} style the style attributes\r\n * @returns {string} the id again\r\n */\r\n StyleManager.prototype.updateRule = function (id, selector, style) {\r\n this.verifySheet();\r\n var index = this.rules.findIndex(function (d) { return d.id === id; });\r\n if (index < 0) {\r\n return this.addRule(id, selector, style);\r\n }\r\n var stored = this.rules[index];\r\n stored.selector = selector;\r\n stored.style = style;\r\n var rule = this.getSheetRule(index);\r\n if (rule) {\r\n if (rule.selectorText.replace(/\\s/gm, '') !== selector.replace(/\\s/gm, '')) { //ignoring white space\r\n rule.selectorText = selector;\r\n stored.selector = rule.selectorText;\r\n }\r\n assignStyles(rule.style, style);\r\n }\r\n return id;\r\n };\r\n /**\r\n * deletes the given rule by id\r\n * @param {string} id the rule to delete\r\n */\r\n StyleManager.prototype.deleteRule = function (id) {\r\n this.verifySheet();\r\n var index = this.rules.findIndex(function (d) { return d.id === id; });\r\n if (index < 0) {\r\n return;\r\n }\r\n this.rules.splice(index, 1);\r\n var sheet = this.sheet;\r\n if (sheet) {\r\n sheet.deleteRule(index);\r\n }\r\n };\r\n Object.defineProperty(StyleManager.prototype, \"ruleNames\", {\r\n /**\r\n * get a list of all registered rule ids\r\n * @returns {string[]}\r\n */\r\n get: function () {\r\n return this.rules.map(function (d) { return d.id; });\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return StyleManager;\r\n}());\r\nexport default StyleManager;\r\n//# sourceMappingURL=StyleManager.js.map","import * as tslib_1 from \"tslib\";\r\nimport { addScroll } from '../internal';\r\nimport { cssClass, CSS_CLASS_BODY, CSS_CLASS_FOOTER, CSS_CLASS_HEADER, CSS_CLASS_SCROLLBAR_TESTER, CSS_CLASS_SHIFTED, CSS_CLASS_TBODY, CSS_CLASS_THEAD } from '../styles';\r\nimport StyleManager from './StyleManager';\r\nexport function setTemplate(root, id) {\r\n id = id.startsWith('#') ? id.slice(1) : id;\r\n root.innerHTML = \"\\n <header id=\\\"header-\" + id + \"\\\" class=\\\"\" + CSS_CLASS_HEADER + \" \" + cssClass(\"header-\" + id) + \"\\\">\\n <article class=\\\"\" + CSS_CLASS_THEAD + \" \" + cssClass(\"thead-\" + id) + \"\\\"></article>\\n </header>\\n <main id=\\\"body-\" + id + \"\\\" class=\\\"\" + CSS_CLASS_BODY + \" \" + cssClass(\"body-\" + id) + \"\\\">\\n <footer class=\\\"\" + CSS_CLASS_FOOTER + \"\\\">&nbsp;</footer>\\n <article class=\\\"\" + CSS_CLASS_TBODY + \" \" + cssClass(\"tbody-\" + id) + \"\\\"></article>\\n </main>\";\r\n return root;\r\n}\r\n/**\r\n * generates the HTML Ids used for the header and body article of a table\r\n * @param {string} tableId base table id\r\n * @param {boolean} asSelector flag whether to prepend with # for CSS selector\r\n * @return {ISelectors} the table ids used for header and body\r\n */\r\nexport function tableIds(tableId) {\r\n return {\r\n thead: \"thead-\" + tableId,\r\n tbody: \"tbody-\" + tableId,\r\n tr: \"tr-\" + tableId,\r\n th: \"th-\" + tableId,\r\n td: \"td-\" + tableId\r\n };\r\n}\r\nexport function tableCSSClasses(tableId) {\r\n var ids = tableIds(tableId);\r\n return {\r\n thead: cssClass(ids.thead),\r\n tbody: cssClass(ids.tbody),\r\n tr: cssClass(ids.tr),\r\n th: cssClass(ids.th),\r\n td: cssClass(ids.td)\r\n };\r\n}\r\n/**\r\n * utility for custom generated CSS rules with a focus on dynamically generated grid layouts\r\n */\r\nvar GridStyleManager = /** @class */ (function (_super) {\r\n tslib_1.__extends(GridStyleManager, _super);\r\n function GridStyleManager(root, id) {\r\n var _this = _super.call(this, root) || this;\r\n _this.id = id.startsWith('#') ? id.slice(1) : id;\r\n _this.ids = tableIds(_this.id);\r\n _this.cssClasses = tableCSSClasses(_this.id);\r\n var headerScroller = root.getElementsByTagName('header')[0];\r\n var bodyScroller = root.getElementsByTagName('main')[0];\r\n // async since style needs to be added to dom first\r\n self.setTimeout(function () {\r\n var width = measureScrollbar(root).width;\r\n _this.updateRule('__scollBarFix2', \"#header-\" + _this.id + \" > article:last-of-type\", {\r\n borderRight: width + \"px solid transparent\"\r\n });\r\n }, 20);\r\n var old = headerScroller.scrollLeft;\r\n // update frozen and sync header with body\r\n addScroll(bodyScroller, 'animation', function (act) {\r\n var newValue = act.left;\r\n if (old !== newValue) {\r\n old = headerScroller.scrollLeft = newValue;\r\n }\r\n root.classList.toggle(CSS_CLASS_SHIFTED, act.left > 0);\r\n });\r\n return _this;\r\n }\r\n /**\r\n * updates the column widths and default row height for a table\r\n * @param {number} defaultRowHeight\r\n * @param {IColumn[]} columns\r\n * @param {number} frozenShift shift frozen colums\r\n * @param {string} tableId optional tableId in case of multiple tables within the same engine\r\n * @param {string} unit\r\n */\r\n GridStyleManager.prototype.update = function (defaultRowHeight, columns, padding, frozenShift, tableId, unit) {\r\n if (unit === void 0) { unit = 'px'; }\r\n var ids = tableIds(tableId);\r\n var selectors = tableCSSClasses(tableId);\r\n var total = \"\" + columns.reduce(function (a, b, i) { return a + b.width + padding(i); }, 0) + unit;\r\n this.updateRule(\"__heightsRule\" + selectors.tr, \".\" + selectors.tr, {\r\n height: defaultRowHeight + \"px\",\r\n width: total\r\n });\r\n this.updateRule(\"__heightsRule\" + selectors.tbody, \"#\" + ids.tbody, {\r\n width: total\r\n });\r\n this.updateColumns(columns, padding, selectors, frozenShift, unit);\r\n };\r\n /**\r\n * removes a given tableId if not needed anymore\r\n * @param {string} tableId tableId to remove\r\n */\r\n GridStyleManager.prototype.remove = function (tableId) {\r\n var selectors = tableCSSClasses(tableId);\r\n this.deleteRule(\"__heightsRule\" + selectors.tr);\r\n this.deleteRule(\"__heightsRule\" + selectors.tbody);\r\n var prefix = \"__col\" + selectors.td + \"_\";\r\n var rules = this.ruleNames.reduce(function (a, b) { return a + (b.startsWith(prefix) ? 1 : 0); }, 0);\r\n // reset\r\n for (var i = 0; i < rules; ++i) {\r\n this.deleteRule(\"\" + prefix + i);\r\n }\r\n };\r\n GridStyleManager.prototype.updateColumns = function (columns, padding, cssSelectors, frozenShift, unit) {\r\n var _this = this;\r\n if (unit === void 0) { unit = 'px'; }\r\n var prefix = \"__col\" + cssSelectors.td + \"_\";\r\n var rules = new Set(this.ruleNames.filter(function (d) { return d.startsWith(prefix); }));\r\n var acc = 0;\r\n columns.forEach(function (c, i) {\r\n var th = \".\" + cssSelectors.th + \"[data-id=\\\"\" + c.id + \"\\\"]\";\r\n var thStyles = {\r\n width: \"\" + c.width + unit\r\n };\r\n var td = \".\" + cssSelectors.td + \"[data-id=\\\"\" + c.id + \"\\\"]\";\r\n var tdStyles = {\r\n transform: \"translateX(\" + acc + unit + \")\",\r\n width: \"\" + c.width + unit\r\n };\r\n if (c.frozen) {\r\n thStyles.left = acc + \"px\";\r\n _this.updateRule(\"\" + prefix + td + \"F\", \".\" + cssSelectors.td + \".\" + CSS_CLASS_SHIFTED + \"[data-id=\\\"\" + c.id + \"\\\"]\", {\r\n transform: \"translateX(0)\",\r\n left: \"\" + (acc + frozenShift) + unit\r\n });\r\n rules.delete(\"\" + prefix + td + \"F\");\r\n }\r\n _this.updateRule(\"\" + prefix + th, th, thStyles);\r\n rules.delete(\"\" + prefix + th);\r\n _this.updateRule(\"\" + prefix + td, td, tdStyles);\r\n rules.delete(\"\" + prefix + td);\r\n acc += c.width + padding(i);\r\n });\r\n rules.forEach(function (d) { return _this.deleteRule(d); });\r\n };\r\n return GridStyleManager;\r\n}(StyleManager));\r\nexport default GridStyleManager;\r\n/**\r\n * measure the width and height of the scrollbars\r\n * based on Slick grid implementation\r\n * @param root\r\n */\r\nfunction measureScrollbar(root) {\r\n var body = root.ownerDocument.body;\r\n body.insertAdjacentHTML('beforeend', \"\\n <div class=\\\"\" + CSS_CLASS_SCROLLBAR_TESTER + \"\\\"><div></div></div>\\n \");\r\n var elem = body.lastElementChild;\r\n var width = elem.offsetWidth - elem.clientWidth;\r\n var height = elem.offsetHeight - elem.clientHeight;\r\n elem.remove();\r\n return { width: width, height: height };\r\n}\r\n//# sourceMappingURL=GridStyleManager.js.map","import { setTransform } from '../ARowRenderer';\r\nimport { addScroll, defaultMode } from '../internal';\r\nimport { GridStyleManager, tableCSSClasses, tableIds } from '../style';\r\nimport { cssClass, CSS_CLASS_BODY, CSS_CLASS_FOOTER, CSS_CLASS_HEADER, CSS_CLASS_MULTI, CSS_CLASS_TBODY, CSS_CLASS_THEAD } from '../styles';\r\n/**\r\n * manager of multiple columns separated by separators each an own row renderer\r\n */\r\nvar MultiTableRowRenderer = /** @class */ (function () {\r\n function MultiTableRowRenderer(node, htmlId, options) {\r\n var _this = this;\r\n if (options === void 0) { options = {}; }\r\n this.node = node;\r\n this.tableId = 0;\r\n this.sections = [];\r\n this.options = {\r\n columnPadding: 0,\r\n async: defaultMode,\r\n minScrollDelta: 30\r\n };\r\n Object.assign(this.options, options);\r\n htmlId = htmlId.startsWith('#') ? htmlId.slice(1) : htmlId;\r\n node.id = htmlId;\r\n node.innerHTML = \"<header id=\\\"header-\" + htmlId + \"\\\" class=\\\"\" + CSS_CLASS_HEADER + \" \" + cssClass(\"header-\" + htmlId) + \"\\\">\\n <footer class=\\\"\" + CSS_CLASS_FOOTER + \" \" + cssClass(\"footer-\" + htmlId) + \"\\\">&nbsp;</footer>\\n </header>\\n <main id=\\\"body-\" + htmlId + \"\\\" class=\\\"\" + CSS_CLASS_BODY + \" \" + cssClass(\"body-\" + htmlId) + \"\\\">\\n <footer class=\\\"\" + CSS_CLASS_FOOTER + \"\\\">&nbsp;</footer>\\n </main>\";\r\n node.classList.add(cssClass(), CSS_CLASS_MULTI, 'lineup-engine');\r\n this.style = new GridStyleManager(this.node, htmlId);\r\n var old = addScroll(this.main, this.options.async, function (act) {\r\n if (Math.abs(old.left - act.left) < _this.options.minScrollDelta && Math.abs(old.width - act.width) < _this.options.minScrollDelta) {\r\n return;\r\n }\r\n var isGoingRight = act.left > old.left;\r\n old = act;\r\n _this.onScrolledHorizontally(act.left, act.width, isGoingRight);\r\n });\r\n }\r\n MultiTableRowRenderer.prototype.update = function () {\r\n var _this = this;\r\n this.onScrolledHorizontally(this.main.scrollLeft, this.main.clientWidth, false);\r\n var offset = 0;\r\n this.sections.forEach(function (s) {\r\n s.body.style.left = s.header.style.left = offset + \"px\";\r\n offset += s.width + _this.options.columnPadding;\r\n });\r\n };\r\n MultiTableRowRenderer.prototype.onScrolledHorizontally = function (scrollLeft, clientWidth, isGoingRight) {\r\n var _this = this;\r\n var offset = 0;\r\n var scrollEnd = scrollLeft + clientWidth;\r\n this.sections.forEach(function (s) {\r\n var end = offset + s.width;\r\n if (end < scrollLeft || offset > scrollEnd) {\r\n s.hide();\r\n }\r\n else {\r\n s.show(Math.max(0, scrollLeft - offset), Math.min(scrollEnd - offset, s.width), isGoingRight);\r\n }\r\n offset = end + _this.options.columnPadding;\r\n });\r\n this.updateOffset();\r\n };\r\n MultiTableRowRenderer.prototype.updateOffset = function () {\r\n var _this = this;\r\n var headerFooter = this.header.getElementsByTagName('footer')[0];\r\n var bodyFooter = this.main.getElementsByTagName('footer')[0];\r\n var maxHeight = Math.max.apply(Math, [0].concat(this.sections.map(function (d) { return d.height; })));\r\n var total = this.sections.reduce(function (a, c) { return a + c.width + _this.options.columnPadding; }, 0);\r\n setTransform(headerFooter, total, 0);\r\n setTransform(bodyFooter, total, maxHeight);\r\n };\r\n MultiTableRowRenderer.prototype.destroy = function () {\r\n this.sections.forEach(function (d) { return d.destroy(); });\r\n this.node.remove();\r\n };\r\n Object.defineProperty(MultiTableRowRenderer.prototype, \"doc\", {\r\n get: function () {\r\n return this.node.ownerDocument;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(MultiTableRowRenderer.prototype, \"header\", {\r\n get: function () {\r\n return this.node.getElementsByTagName('header')[0];\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(MultiTableRowRenderer.prototype, \"main\", {\r\n get: function () {\r\n return this.node.getElementsByTagName('main')[0];\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * push another table to this instance\r\n * @param {ITableFactory<T extends ITableSection>} factory factory for the table\r\n * @param extras additional arguments to provide for the factory\r\n * @returns {T} the table instance\r\n */\r\n MultiTableRowRenderer.prototype.pushTable = function (factory) {\r\n var extras = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n extras[_i - 1] = arguments[_i];\r\n }\r\n var header = this.doc.createElement('article');\r\n var body = this.doc.createElement('article');\r\n var tableId = this.node.id + \"T\" + this.tableId++;\r\n var ids = tableIds(tableId);\r\n var cssClasses = tableCSSClasses(tableId);\r\n header.id = ids.thead;\r\n header.classList.add(CSS_CLASS_THEAD, cssClasses.thead);\r\n body.id = ids.tbody;\r\n body.classList.add(CSS_CLASS_TBODY, cssClasses.tbody);\r\n this.header.insertBefore(header, this.header.lastElementChild); //before the footer\r\n this.main.appendChild(body);\r\n var table = factory.apply(void 0, [header, body, tableId, this.style].concat(extras));\r\n table.init();\r\n this.sections.push(table);\r\n this.update();\r\n return table;\r\n };\r\n /**\r\n * push another separator to the manager\r\n * @param {ISeparatorFactory<T extends ITableSection>} factory the factory to create the separator\r\n * @param extras optional additional arguments\r\n * @returns {T} the new created separator\r\n */\r\n MultiTableRowRenderer.prototype.pushSeparator = function (factory) {\r\n var extras = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n extras[_i - 1] = arguments[_i];\r\n }\r\n var header = this.doc.createElement('section');\r\n var body = this.doc.createElement('section');\r\n header.classList.add(cssClass('header-separator'));\r\n body.classList.add(cssClass('separator'));\r\n this.header.insertBefore(header, this.header.lastElementChild); //before the footer\r\n this.main.appendChild(body);\r\n var separator = factory.apply(void 0, [header, body, this.style].concat(extras));\r\n separator.init();\r\n this.sections.push(separator);\r\n this.update();\r\n return separator;\r\n };\r\n /**\r\n * removes a given table section\r\n * @param {ITableSection} section section to remove\r\n * @returns {boolean} successful flag\r\n */\r\n MultiTableRowRenderer.prototype.remove = function (section) {\r\n var index = this.sections.indexOf(section);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this.sections.splice(index, 1);\r\n section.destroy();\r\n this.update();\r\n return true;\r\n };\r\n MultiTableRowRenderer.prototype.clear = function () {\r\n this.sections.splice(0, this.sections.length).forEach(function (s) { return s.destroy(); });\r\n this.update();\r\n };\r\n /**\r\n * triggers and update because of a change in width of one or more table sections\r\n */\r\n MultiTableRowRenderer.prototype.widthChanged = function () {\r\n this.update();\r\n };\r\n return MultiTableRowRenderer;\r\n}());\r\nexport default MultiTableRowRenderer;\r\n//# sourceMappingURL=MultiTableRowRenderer.js.map","import { range } from '../logic';\r\nimport { EScrollResult } from './IMixin';\r\n/**\r\n * mixin that prefetches rows depending on the scrolling direction for faster rendering\r\n */\r\nvar PrefetchMixin = /** @class */ (function () {\r\n function PrefetchMixin(adapter, options) {\r\n this.adapter = adapter;\r\n this.prefetchTimeout = -1;\r\n this.cleanupTimeout = -1;\r\n this.options = {\r\n prefetchRows: 20,\r\n cleanUpRows: 10,\r\n delay: 200\r\n };\r\n Object.assign(this.options, options);\r\n return this;\r\n }\r\n PrefetchMixin.prototype.prefetchDown = function () {\r\n this.prefetchTimeout = -1;\r\n if (this.adapter.isScrollEventWaiting()) {\r\n return;\r\n }\r\n var context = this.adapter.context;\r\n var nextLast = Math.min(this.adapter.visible.forcedLast + this.options.prefetchRows, context.numberOfRows - 1);\r\n // add some rows in advance\r\n if (this.adapter.visible.last === nextLast && this.adapter.visible.last >= (this.adapter.visible.forcedLast + this.options.prefetchRows)) {\r\n return;\r\n }\r\n this.adapter.addAtBottom(this.adapter.visible.last + 1, nextLast);\r\n //console.log('prefetch', visibleFirst, visibleLast + 1, '=>', nextLast, ranking.children.length);\r\n this.adapter.visible.last = nextLast;\r\n };\r\n PrefetchMixin.prototype.prefetchUp = function () {\r\n this.prefetchTimeout = -1;\r\n if (this.adapter.isScrollEventWaiting() || this.adapter.visible.first <= (this.adapter.visible.forcedFirst - this.options.prefetchRows)) {\r\n return;\r\n }\r\n var context = this.adapter.context;\r\n var fakeOffset = Math.max(this.adapter.scrollOffset - this.options.prefetchRows * context.defaultRowHeight, 0);\r\n var height = this.adapter.scrollTotal;\r\n var _a = range(fakeOffset, height, context.defaultRowHeight, context.exceptions, context.numberOfRows), first = _a.first, firstRowPos = _a.firstRowPos;\r\n if (first === this.adapter.visible.first) {\r\n return;\r\n }\r\n var frozenShift = this.adapter.syncFrozen ? this.adapter.syncFrozen(first) : 0;\r\n this.adapter.addAtBeginning(first, this.adapter.visible.first - 1, frozenShift);\r\n //console.log('prefetch up ', visibleFirst, '=>', first, visibleLast, ranking.children.length);\r\n this.adapter.visible.first = first;\r\n this.adapter.updateOffset(firstRowPos);\r\n };\r\n PrefetchMixin.prototype.triggerPrefetch = function (isGoingDown) {\r\n if (this.prefetchTimeout >= 0) {\r\n clearTimeout(this.prefetchTimeout);\r\n }\r\n var prefetchDownPossible = this.adapter.visible.last < (this.adapter.visible.forcedLast + this.options.prefetchRows);\r\n var prefetchUpPossible = this.adapter.visible.first > (this.adapter.visible.forcedFirst - this.options.prefetchRows);\r\n var isLast = this.adapter.visible.last === this.adapter.context.numberOfRows;\r\n var isFirst = this.adapter.visible.first === 0;\r\n if ((isGoingDown && !prefetchDownPossible && !isLast) || (!isGoingDown && !prefetchUpPossible && !isFirst)) {\r\n return;\r\n }\r\n // go down if we are already at the top, too\r\n var op = (isGoingDown || isFirst) ? this.prefetchDown.bind(this) : this.prefetchUp.bind(this);\r\n this.prefetchTimeout = self.setTimeout(op, this.options.delay);\r\n };\r\n PrefetchMixin.prototype.cleanUpTop = function (first) {\r\n this.cleanupTimeout = -1;\r\n if (this.adapter.isScrollEventWaiting()) {\r\n return;\r\n }\r\n var newFirst = Math.max(0, first - this.options.cleanUpRows);\r\n if (newFirst <= this.adapter.visible.first) {\r\n return;\r\n }\r\n //console.log('cleanup top');\r\n var frozenShift = this.adapter.syncFrozen ? this.adapter.syncFrozen(newFirst) : 0;\r\n this.adapter.removeFromBeginning(this.adapter.visible.first, newFirst - 1, frozenShift);\r\n var context = this.adapter.context;\r\n //console.log('cleanup up ', visibleFirst, '=>', newFirst, visibleLast, ranking.children.length);\r\n var shift = (newFirst - this.adapter.visible.first) * context.defaultRowHeight;\r\n if (context.exceptions.length > 0) {\r\n for (var i = this.adapter.visible.first; i < newFirst; ++i) {\r\n if (context.exceptionsLookup.has(i)) {\r\n shift += context.exceptionsLookup.get(i) - context.defaultRowHeight;\r\n }\r\n }\r\n }\r\n this.adapter.visible.first = newFirst;\r\n this.adapter.updateOffset(this.adapter.visibleFirstRowPos + shift);\r\n this.prefetchDown();\r\n };\r\n PrefetchMixin.prototype.cleanUpBottom = function (last) {\r\n this.cleanupTimeout = -1;\r\n var newLast = last + this.options.cleanUpRows;\r\n if (this.adapter.visible.last <= newLast) {\r\n return;\r\n }\r\n //console.log('cleanup bottom');\r\n this.adapter.removeFromBottom(newLast + 1, this.adapter.visible.last);\r\n this.adapter.visible.last = newLast;\r\n this.prefetchUp();\r\n };\r\n PrefetchMixin.prototype.triggerCleanUp = function (first, last, isGoingDown) {\r\n if (this.cleanupTimeout >= 0) {\r\n clearTimeout(this.cleanupTimeout);\r\n }\r\n if ((isGoingDown && (first - this.options.cleanUpRows) <= this.adapter.visible.first) || (!isGoingDown && this.adapter.visible.last <= (last + this.options.cleanUpRows))) {\r\n return;\r\n }\r\n this.cleanupTimeout = self.setTimeout(isGoingDown ? this.cleanUpTop.bind(this) : this.cleanUpBottom.bind(this), this.options.delay, isGoingDown ? first : last);\r\n };\r\n PrefetchMixin.prototype.onScrolled = function (isGoingDown, scrollResult) {\r\n if (this.adapter.isScrollEventWaiting()) {\r\n return;\r\n }\r\n if (scrollResult !== EScrollResult.ALL && this.options.cleanUpRows > 0) {\r\n this.triggerCleanUp(this.adapter.visible.forcedFirst, this.adapter.visible.forcedLast, isGoingDown);\r\n }\r\n if (scrollResult !== EScrollResult.NONE && this.options.prefetchRows > 0) {\r\n this.triggerPrefetch(isGoingDown);\r\n }\r\n };\r\n return PrefetchMixin;\r\n}());\r\nexport default PrefetchMixin;\r\n//# sourceMappingURL=PrefetchMixin.js.map","import { ABORTED, isAbortAble, isAsyncUpdate } from '../../abortAble';\r\nimport { isLoadingCell } from '../../ARowRenderer';\r\nimport { clear } from '../../internal';\r\nimport { isScrollEventWaiting } from '../../internal/scroll';\r\nimport { range, updateFrozen } from '../../logic';\r\nimport { EScrollResult } from '../../mixin';\r\nimport { cssClass, CSS_CLASS_FROZEN, CSS_CLASS_LOADING, CSS_CLASS_SHIFTED, CSS_CLASS_TD, CSS_CLASS_TH } from '../../styles';\r\nvar debug = false;\r\n/**\r\n * @internal\r\n */\r\nvar ACellAdapter = /** @class */ (function () {\r\n function ACellAdapter(header, style, tableId) {\r\n var _this = this;\r\n var mixinClasses = [];\r\n for (var _i = 3; _i < arguments.length; _i++) {\r\n mixinClasses[_i - 3] = arguments[_i];\r\n }\r\n this.header = header;\r\n this.style = style;\r\n this.tableId = tableId;\r\n /**\r\n * pool of cells per column\r\n * @type {Array}\r\n */\r\n this.cellPool = [];\r\n this.loading = new WeakMap();\r\n this.visibleColumns = {\r\n frozen: [],\r\n first: 0,\r\n forcedFirst: 0,\r\n last: -1,\r\n forcedLast: -1\r\n };\r\n this.visibleFirstColumnPos = 0;\r\n this.horizontallyShifted = false;\r\n this.columnAdapter = this.createColumnAdapter();\r\n this.columnMixins = mixinClasses.map(function (mixinClass) { return new mixinClass(_this.columnAdapter); });\r\n this.columnFragment = header.ownerDocument.createDocumentFragment();\r\n }\r\n ACellAdapter.prototype.leftShift = function () {\r\n var ctx = this.context;\r\n var frozen = this.visibleColumns.frozen.reduce(function (a, d) { return a + ctx.columns[d].width + ctx.column.padding(d); }, 0);\r\n return this.visibleFirstColumnPos - frozen;\r\n };\r\n Object.defineProperty(ACellAdapter.prototype, \"headerScroller\", {\r\n get: function () {\r\n return this.header.parentElement;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ACellAdapter.prototype.addColumnMixin = function (mixinClass, options) {\r\n this.columnMixins.push(new mixinClass(this.columnAdapter, options));\r\n };\r\n ACellAdapter.prototype.createColumnAdapter = function () {\r\n var _this = this;\r\n var r = {\r\n visible: this.visibleColumns,\r\n addAtBeginning: this.addColumnAtStart.bind(this),\r\n addAtBottom: this.addColumnAtEnd.bind(this),\r\n removeFromBeginning: this.removeColumnFromStart.bind(this),\r\n removeFromBottom: this.removeColumnFromEnd.bind(this),\r\n updateOffset: this.updateColumnOffset.bind(this),\r\n scroller: this.headerScroller,\r\n syncFrozen: this.syncFrozen.bind(this),\r\n isScrollEventWaiting: function () { return isScrollEventWaiting(_this.headerScroller, 'animation'); }\r\n };\r\n Object.defineProperties(r, {\r\n visibleFirstRowPos: {\r\n get: function () { return _this.visibleFirstColumnPos; },\r\n enumerable: true\r\n },\r\n context: {\r\n get: function () { return _this.context.column; },\r\n enumerable: true\r\n },\r\n scrollOffset: {\r\n get: function () { return _this.lastScrollInfo ? _this.lastScrollInfo.left : 0; },\r\n enumerable: true\r\n },\r\n scrollTotal: {\r\n get: function () { return _this.lastScrollInfo ? _this.lastScrollInfo.width : _this.headerScroller.clientWidth; },\r\n enumerable: true\r\n }\r\n });\r\n return r;\r\n };\r\n ACellAdapter.prototype.init = function () {\r\n var _this = this;\r\n var context = this.context;\r\n this.style.update(context.defaultRowHeight - context.padding(-1), context.columns, context.column.padding, 0, this.tableId);\r\n context.columns.forEach(function () {\r\n //init pool\r\n _this.cellPool.push([]);\r\n });\r\n };\r\n ACellAdapter.prototype.onScrolledHorizontally = function (scrollLeft, clientWidth, isGoingRight) {\r\n var scrollResult = this.onScrolledHorizontallyImpl(scrollLeft, clientWidth);\r\n for (var _i = 0, _a = this.columnMixins; _i < _a.length; _i++) {\r\n var mixin = _a[_i];\r\n mixin.onScrolled(isGoingRight, scrollResult);\r\n }\r\n return scrollResult;\r\n };\r\n ACellAdapter.prototype.removeColumnFromStart = function (from, to, frozenShift) {\r\n var _this = this;\r\n if (frozenShift === void 0) { frozenShift = this.visibleColumns.frozen.length; }\r\n this.forEachRow(function (row) {\r\n _this.removeCellFromStart(row, from, to, frozenShift);\r\n });\r\n if (debug) {\r\n this.verifyRows();\r\n }\r\n };\r\n ACellAdapter.prototype.removeCellFromStart = function (row, from, to, frozenShift) {\r\n for (var i = from; i <= to; ++i) {\r\n var node = (frozenShift === 0 ? row.firstElementChild : row.children[frozenShift]);\r\n node.remove();\r\n this.recycleCell(node, i);\r\n }\r\n if (debug) {\r\n verifyRow(row, -1, this.context.columns);\r\n }\r\n };\r\n ACellAdapter.prototype.removeColumnFromEnd = function (from, to) {\r\n var _this = this;\r\n this.forEachRow(function (row) {\r\n _this.removeCellFromEnd(row, from, to);\r\n });\r\n if (debug) {\r\n this.verifyRows();\r\n }\r\n };\r\n ACellAdapter.prototype.removeCellFromEnd = function (row, from, to) {\r\n for (var i = to; i >= from; --i) {\r\n var node = row.lastElementChild;\r\n node.remove();\r\n this.recycleCell(node, i);\r\n }\r\n if (debug) {\r\n verifyRow(row, -1, this.context.columns);\r\n }\r\n };\r\n ACellAdapter.prototype.removeFrozenCells = function (row, columnIndices, shift) {\r\n for (var _i = 0, columnIndices_1 = columnIndices; _i < columnIndices_1.length; _i++) {\r\n var columnIndex = columnIndices_1[_i];\r\n var node = row.children[shift];\r\n node.remove();\r\n this.recycleCell(node, columnIndex);\r\n }\r\n if (debug) {\r\n verifyRow(row, -1, this.context.columns);\r\n }\r\n };\r\n ACellAdapter.prototype.removeFrozenColumns = function (columnIndices, shift) {\r\n var _this = this;\r\n this.forEachRow(function (row) {\r\n _this.removeFrozenCells(row, columnIndices, shift);\r\n });\r\n if (debug) {\r\n this.verifyRows();\r\n }\r\n };\r\n ACellAdapter.prototype.removeAllColumns = function (includingFrozen) {\r\n var _this = this;\r\n this.forEachRow(function (row) {\r\n _this.removeAllCells(row, includingFrozen);\r\n });\r\n if (debug) {\r\n this.verifyRows();\r\n }\r\n };\r\n ACellAdapter.prototype.removeAllCells = function (row, includingFrozen, shift) {\r\n var _this = this;\r\n if (shift === void 0) { shift = this.visibleColumns.first; }\r\n var arr = Array.from(row.children);\r\n var frozen = this.visibleColumns.frozen;\r\n clear(row);\r\n if (includingFrozen || frozen.length === 0) {\r\n for (var _i = 0, frozen_1 = frozen; _i < frozen_1.length; _i++) {\r\n var i = frozen_1[_i];\r\n this.recycleCell(arr.shift(), i);\r\n }\r\n }\r\n else {\r\n // have frozen and keep them, so readd them\r\n for (var _a = 0, frozen_2 = frozen; _a < frozen_2.length; _a++) {\r\n var _1 = frozen_2[_a];\r\n row.appendChild(arr.shift());\r\n }\r\n }\r\n arr.forEach(function (item, i) {\r\n _this.recycleCell(item, i + shift);\r\n });\r\n if (debug) {\r\n verifyRow(row, -1, this.context.columns);\r\n }\r\n };\r\n ACellAdapter.prototype.selectProxyCell = function (row, column, columns) {\r\n var pool = this.cellPool[column];\r\n var columnObj = columns[column];\r\n var item;\r\n var ready;\r\n var pooled = pool.pop();\r\n var r = pooled ? this.updateCell(pooled, row, columnObj) || pooled : this.createCell(this.header.ownerDocument, row, columnObj);\r\n if (isAsyncUpdate(r)) {\r\n item = r.item;\r\n ready = r.ready;\r\n }\r\n else {\r\n item = r;\r\n }\r\n if (item !== pooled) {\r\n item.dataset.id = columnObj.id;\r\n item.classList.add(CSS_CLASS_TD, this.style.cssClasses.td, cssClass(\"td-\" + this.tableId));\r\n }\r\n this.updateShiftedState(item, columnObj);\r\n return { item: item, ready: ready };\r\n };\r\n ACellAdapter.prototype.handleCellReady = function (item, ready, column) {\r\n var _this = this;\r\n if (column === void 0) { column = -1; }\r\n item.classList.add(CSS_CLASS_LOADING);\r\n var abort = ready;\r\n //lazy loading\r\n this.loading.set(item, abort);\r\n abort.then(function (result) {\r\n _this.loading.delete(item);\r\n item.classList.remove(CSS_CLASS_LOADING);\r\n if (result === ABORTED && column >= 0) {\r\n //aborted can recycle the real one\r\n _this.cellPool[column].push(item);\r\n }\r\n });\r\n return item;\r\n };\r\n ACellAdapter.prototype.selectCell = function (row, column, columns) {\r\n var _a = this.selectProxyCell(row, column, columns), item = _a.item, ready = _a.ready;\r\n if (!isAbortAble(ready)) {\r\n return item;\r\n }\r\n return this.handleCellReady(item, ready, column);\r\n };\r\n ACellAdapter.prototype.updateShiftedState = function (node, col) {\r\n node.classList.toggle(CSS_CLASS_SHIFTED, col.frozen && this.horizontallyShifted);\r\n };\r\n ACellAdapter.prototype.recycleCell = function (item, column) {\r\n if (column === void 0) { column = -1; }\r\n // check if the dom element is still being manipulated\r\n if (this.loading.has(item)) {\r\n var abort = this.loading.get(item);\r\n abort.abort();\r\n }\r\n else if (!isLoadingCell(item) && column >= 0) {\r\n this.cellPool[column].push(item);\r\n }\r\n };\r\n ACellAdapter.prototype.addColumnAtStart = function (from, to, frozenShift) {\r\n var _this = this;\r\n if (frozenShift === void 0) { frozenShift = this.visibleColumns.frozen.length; }\r\n var columns = this.context.columns;\r\n this.forEachRow(function (row, rowIndex) {\r\n _this.addCellAtStart(row, rowIndex, from, to, frozenShift, columns);\r\n });\r\n if (debug) {\r\n this.verifyRows();\r\n }\r\n };\r\n ACellAdapter.prototype.addCellAtStart = function (row, rowIndex, from, to, frozenShift, columns) {\r\n if (debug) {\r\n verifyRow(row, rowIndex, this.context.columns);\r\n }\r\n for (var i = to; i >= from; --i) {\r\n var cell = this.selectCell(rowIndex, i, columns);\r\n row.insertBefore(cell, frozenShift > 0 ? row.children[frozenShift] : row.firstChild);\r\n }\r\n if (debug) {\r\n verifyRow(row, rowIndex, this.context.columns);\r\n }\r\n };\r\n ACellAdapter.prototype.insertFrozenCells = function (row, rowIndex, columnIndices, shift, columns) {\r\n var before = row.children[shift];\r\n for (var _i = 0, columnIndices_2 = columnIndices; _i < columnIndices_2.length; _i++) {\r\n var i = columnIndices_2[_i];\r\n var cell = this.selectCell(rowIndex, i, columns);\r\n if (before) {\r\n row.insertBefore(cell, before);\r\n }\r\n else {\r\n row.appendChild(cell);\r\n }\r\n }\r\n };\r\n ACellAdapter.prototype.insertFrozenColumns = function (columnIndices, shift) {\r\n var _this = this;\r\n var columns = this.context.columns;\r\n this.forEachRow(function (row, rowIndex) {\r\n _this.insertFrozenCells(row, rowIndex, columnIndices, shift, columns);\r\n });\r\n };\r\n ACellAdapter.prototype.addColumnAtEnd = function (from, to) {\r\n var _this = this;\r\n var columns = this.context.columns;\r\n this.forEachRow(function (row, rowIndex) {\r\n _this.addCellAtEnd(row, rowIndex, from, to, columns);\r\n });\r\n if (debug) {\r\n this.verifyRows();\r\n }\r\n };\r\n ACellAdapter.prototype.verifyRows = function () {\r\n var columns = this.context.columns;\r\n this.forEachRow(function (row, rowIndex) { return verifyRow(row, rowIndex, columns); });\r\n };\r\n ACellAdapter.prototype.addCellAtEnd = function (row, rowIndex, from, to, columns) {\r\n for (var i = from; i <= to; ++i) {\r\n var cell = this.selectCell(rowIndex, i, columns);\r\n row.appendChild(cell);\r\n }\r\n if (debug) {\r\n verifyRow(row, rowIndex, this.context.columns);\r\n }\r\n };\r\n ACellAdapter.prototype.updateHeaders = function () {\r\n var _this = this;\r\n var columns = this.context.columns;\r\n Array.from(this.header.children).forEach(function (node, i) {\r\n var base = node;\r\n var col = columns[i];\r\n var r = _this.updateHeader(base, col);\r\n var n;\r\n if (isAsyncUpdate(r)) {\r\n n = _this.handleCellReady(r.item, r.ready, -1);\r\n }\r\n else {\r\n n = r || base;\r\n }\r\n if (n === base) {\r\n return;\r\n }\r\n n.dataset.id = col.id;\r\n n.classList.add(CSS_CLASS_TH, _this.style.cssClasses.th, cssClass(\"th-\" + _this.tableId));\r\n _this.header.replaceChild(base, n);\r\n });\r\n };\r\n ACellAdapter.prototype.recreate = function (left, width) {\r\n var _this = this;\r\n var context = this.context;\r\n this.style.update(context.defaultRowHeight - context.padding(-1), context.columns, context.column.padding, -this.leftShift(), this.tableId);\r\n this.clearPool();\r\n // init pool\r\n for (var i = this.cellPool.length; i < context.columns.length; ++i) {\r\n this.cellPool.push([]);\r\n }\r\n //create all header columns\r\n {\r\n var fragment_1 = this.columnFragment;\r\n var document_1 = fragment_1.ownerDocument;\r\n // create lookup cache to reuse headers\r\n var ids_1 = new Map();\r\n while (this.header.lastChild) {\r\n var c = this.header.lastChild;\r\n this.header.removeChild(c);\r\n ids_1.set(c.dataset.id, c);\r\n }\r\n context.columns.forEach(function (col) {\r\n var existing = ids_1.get(col.id);\r\n var r = existing ? _this.updateHeader(existing, col) || existing : _this.createHeader(document_1, col);\r\n var n;\r\n if (isAsyncUpdate(r)) {\r\n n = _this.handleCellReady(r.item, r.ready, -1);\r\n }\r\n else {\r\n n = r;\r\n }\r\n if (n !== existing) {\r\n n.dataset.id = col.id;\r\n n.classList.add(CSS_CLASS_TH, _this.style.cssClasses.th, cssClass(\"th-\" + _this.tableId));\r\n }\r\n fragment_1.appendChild(n);\r\n });\r\n this.header.appendChild(fragment_1);\r\n }\r\n var _a = range(left, width, context.column.defaultRowHeight, context.column.exceptions, context.column.numberOfRows), first = _a.first, last = _a.last, firstRowPos = _a.firstRowPos;\r\n this.visibleColumns.first = this.visibleColumns.forcedFirst = first;\r\n this.visibleColumns.last = this.visibleColumns.forcedLast = last;\r\n if (context.columns.some(function (c) { return c.frozen; })) {\r\n var target = updateFrozen([], context.columns, first).target;\r\n this.visibleColumns.frozen = target;\r\n }\r\n else {\r\n this.visibleColumns.frozen = [];\r\n }\r\n this.updateColumnOffset(firstRowPos);\r\n };\r\n ACellAdapter.prototype.clearPool = function () {\r\n this.cellPool.forEach(function (p) { return p.splice(0, p.length); });\r\n };\r\n ACellAdapter.prototype.updateColumnOffset = function (firstColumnPos) {\r\n var changed = firstColumnPos !== this.visibleFirstColumnPos;\r\n this.visibleFirstColumnPos = firstColumnPos;\r\n if (changed) {\r\n var context = this.context;\r\n this.style.update(context.defaultRowHeight - context.padding(-1), context.columns, context.column.padding, -this.leftShift(), this.tableId);\r\n }\r\n };\r\n ACellAdapter.prototype.createRow = function (node, rowIndex) {\r\n var columns = this.context.columns;\r\n var visible = this.visibleColumns;\r\n if (visible.frozen.length > 0) {\r\n for (var _i = 0, _a = visible.frozen; _i < _a.length; _i++) {\r\n var i = _a[_i];\r\n var cell = this.selectCell(rowIndex, i, columns);\r\n node.appendChild(cell);\r\n }\r\n }\r\n for (var i = visible.first; i <= visible.last; ++i) {\r\n var cell = this.selectCell(rowIndex, i, columns);\r\n node.appendChild(cell);\r\n }\r\n };\r\n ACellAdapter.prototype.updateRow = function (node, rowIndex) {\r\n var columns = this.context.columns;\r\n var visible = this.visibleColumns;\r\n //columns may not match anymore if it is a pooled item a long time ago\r\n switch (node.childElementCount) {\r\n case 0:\r\n if (visible.frozen.length > 0) {\r\n this.insertFrozenCells(node, rowIndex, visible.frozen, 0, columns);\r\n }\r\n this.addCellAtEnd(node, rowIndex, visible.first, visible.last, columns);\r\n break;\r\n case 1:\r\n var old = node.firstElementChild;\r\n var id_1 = old.dataset.id;\r\n var columnIndex = columns.findIndex(function (c) { return c.id === id_1; });\r\n node.removeChild(old);\r\n if (columnIndex >= 0) {\r\n this.recycleCell(old, columnIndex);\r\n }\r\n if (visible.frozen.length > 0) {\r\n this.insertFrozenCells(node, rowIndex, visible.frozen, 0, columns);\r\n }\r\n this.addCellAtEnd(node, rowIndex, visible.first, visible.last, columns);\r\n break;\r\n default:\r\n this.mergeColumns(node, rowIndex);\r\n break;\r\n }\r\n };\r\n ACellAdapter.prototype.mergeColumns = function (node, rowIndex) {\r\n var _this = this;\r\n var columns = this.context.columns;\r\n var visible = this.visibleColumns;\r\n var ids = new Map();\r\n while (node.lastChild) {\r\n var c = node.lastChild;\r\n node.removeChild(c);\r\n ids.set(c.dataset.id, c);\r\n }\r\n var updateImpl = function (i) {\r\n var col = columns[i];\r\n var existing = ids.get(col.id);\r\n if (!existing) {\r\n var cell_1 = _this.selectCell(rowIndex, i, columns);\r\n node.appendChild(cell_1);\r\n return;\r\n }\r\n ids.delete(col.id);\r\n var r = _this.updateCell(existing, rowIndex, col) || existing;\r\n var cell;\r\n if (isAsyncUpdate(r)) {\r\n cell = _this.handleCellReady(r.item, r.ready, i);\r\n }\r\n else {\r\n cell = r;\r\n }\r\n if (cell && cell !== existing) {\r\n cell.dataset.id = col.id;\r\n cell.classList.add(CSS_CLASS_TD, _this.style.cssClasses.td, cssClass(\"td-\" + _this.tableId));\r\n }\r\n _this.updateShiftedState(cell, col);\r\n node.appendChild(cell);\r\n };\r\n for (var _i = 0, _a = visible.frozen; _i < _a.length; _i++) {\r\n var frozen = _a[_i];\r\n updateImpl(frozen);\r\n }\r\n for (var i = visible.first; i <= visible.last; ++i) {\r\n updateImpl(i);\r\n }\r\n if (ids.size === 0) {\r\n return;\r\n }\r\n // recycle\r\n var byId = new Map(columns.map(function (d, i) { return [d.id, i]; }));\r\n ids.forEach(function (node, key) {\r\n var index = byId.get(key);\r\n if (index != null && index >= 0) {\r\n _this.recycleCell(node, index);\r\n }\r\n });\r\n };\r\n ACellAdapter.prototype.updateShiftedStates = function () {\r\n if (!this.context.columns.some(function (d) { return d.frozen; })) {\r\n return;\r\n }\r\n var shifted = this.horizontallyShifted;\r\n var clazz = CSS_CLASS_SHIFTED;\r\n if (shifted) {\r\n var headers = Array.from(this.header.querySelectorAll(\".\" + CSS_CLASS_FROZEN + \":not(.\" + clazz + \")\"));\r\n var bodies = Array.from(this.body.querySelectorAll(\".\" + CSS_CLASS_FROZEN + \":not(.\" + clazz + \")\"));\r\n for (var _i = 0, headers_1 = headers; _i < headers_1.length; _i++) {\r\n var item = headers_1[_i];\r\n item.classList.add(clazz);\r\n }\r\n for (var _a = 0, bodies_1 = bodies; _a < bodies_1.length; _a++) {\r\n var item = bodies_1[_a];\r\n item.classList.add(clazz);\r\n }\r\n }\r\n else {\r\n var headers = Array.from(this.header.querySelectorAll(\".\" + CSS_CLASS_FROZEN + \".\" + clazz));\r\n var bodies = Array.from(this.body.querySelectorAll(\".\" + CSS_CLASS_FROZEN + \".\" + clazz));\r\n for (var _b = 0, headers_2 = headers; _b < headers_2.length; _b++) {\r\n var item = headers_2[_b];\r\n item.classList.remove(clazz);\r\n }\r\n for (var _c = 0, bodies_2 = bodies; _c < bodies_2.length; _c++) {\r\n var item = bodies_2[_c];\r\n item.classList.remove(clazz);\r\n }\r\n }\r\n };\r\n ACellAdapter.prototype.syncFrozen = function (first) {\r\n var columns = this.context.columns;\r\n var visible = this.visibleColumns;\r\n if (!columns.some(function (d) { return d.frozen; })) {\r\n return 0;\r\n }\r\n if (first === 0) {\r\n if (visible.frozen.length > 0) {\r\n this.removeFrozenColumns(visible.frozen, 0);\r\n visible.frozen = [];\r\n }\r\n return 0;\r\n }\r\n var old = visible.frozen.length;\r\n var _a = updateFrozen(visible.frozen, columns, first), target = _a.target, added = _a.added, removed = _a.removed;\r\n if (removed.length > 0) {\r\n this.removeFrozenColumns(removed, old - removed.length);\r\n }\r\n if (added.length > 0) {\r\n this.insertFrozenColumns(added, old - removed.length);\r\n }\r\n visible.frozen = target;\r\n return target.length;\r\n };\r\n ACellAdapter.prototype.onScrolledHorizontallyImpl = function (scrollLeft, clientWidth) {\r\n var shiftingChanged = this.horizontallyShifted !== scrollLeft > 0;\r\n this.horizontallyShifted = scrollLeft > 0;\r\n var column = this.context.column;\r\n var _a = range(scrollLeft, clientWidth, column.defaultRowHeight, column.exceptions, column.numberOfRows), first = _a.first, last = _a.last, firstRowPos = _a.firstRowPos;\r\n var visible = this.visibleColumns;\r\n visible.forcedFirst = first;\r\n visible.forcedLast = last;\r\n if ((first - visible.first) >= 0 && (last - visible.last) <= 0) {\r\n //nothing to do\r\n if (shiftingChanged) {\r\n this.updateShiftedStates();\r\n }\r\n return EScrollResult.NONE;\r\n }\r\n var r = EScrollResult.SOME;\r\n var frozenShift = this.syncFrozen(first);\r\n if (first > visible.last || last < visible.first) {\r\n //no overlap, clean and draw everything\r\n //console.log(`ff added: ${last - first + 1} removed: ${visibleLast - visibleFirst + 1} ${first}:${last} ${offset}`);\r\n //removeRows(visibleFirst, visibleLast);\r\n this.removeAllColumns(false);\r\n this.addColumnAtEnd(first, last);\r\n r = EScrollResult.ALL;\r\n }\r\n else if (first < visible.first) {\r\n //some first rows missing and some last rows to much\r\n //console.log(`up added: ${visibleFirst - first + 1} removed: ${visibleLast - last + 1} ${first}:${last} ${offset}`);\r\n this.removeColumnFromEnd(last + 1, visible.last);\r\n this.updateShiftedStates();\r\n this.addColumnAtStart(first, visible.first - 1, frozenShift);\r\n r = EScrollResult.SOME_TOP;\r\n }\r\n else {\r\n //console.log(`do added: ${last - visibleLast + 1} removed: ${first - visibleFirst + 1} ${first}:${last} ${offset}`);\r\n //some last rows missing and some first rows to much\r\n this.removeColumnFromStart(visible.first, first - 1, frozenShift);\r\n this.updateShiftedStates();\r\n this.addColumnAtEnd(visible.last + 1, last);\r\n r = EScrollResult.SOME_BOTTOM;\r\n }\r\n visible.first = first;\r\n visible.last = last;\r\n this.updateColumnOffset(firstRowPos);\r\n return r;\r\n };\r\n return ACellAdapter;\r\n}());\r\nexport { ACellAdapter };\r\n/**\r\n * @internal\r\n */\r\nexport default ACellAdapter;\r\nfunction verifyRow(row, index, columns) {\r\n var cols = Array.from(row.children);\r\n //sort incrementally\r\n if (cols.length <= 1) {\r\n return;\r\n }\r\n var colObjs = cols.map(function (c) { return columns.find(function (d) { return d.id === c.dataset.id; }); });\r\n console.assert(colObjs.every(function (d) { return Boolean(d); }), 'all columns must exist', index);\r\n console.assert(colObjs.every(function (d, i) { return i === 0 || d.index >= colObjs[i - 1].index; }), 'all columns in ascending order', index);\r\n console.assert((new Set(colObjs)).size === colObjs.length, 'unique columns', colObjs);\r\n}\r\n//# sourceMappingURL=ACellAdapter.js.map","import * as tslib_1 from \"tslib\";\r\nimport ARowRenderer, { setTransform } from '../ARowRenderer';\r\nimport { EScrollResult } from '../mixin';\r\nimport { CSS_CLASS_HIDDEN, CSS_CLASS_LOADING } from '../styles';\r\nimport ACellAdapter from './internal/ACellAdapter';\r\n/**\r\n * base class for a cell renderer as table section\r\n */\r\nvar ACellTableSection = /** @class */ (function (_super) {\r\n tslib_1.__extends(ACellTableSection, _super);\r\n function ACellTableSection(header, body, tableId, style, options) {\r\n if (options === void 0) { options = {}; }\r\n var _this = _super.call(this, body, options) || this;\r\n _this.header = header;\r\n _this.body = body;\r\n _this.tableId = tableId;\r\n _this.style = style;\r\n var that = _this;\r\n var LocalCell = /** @class */ (function (_super) {\r\n tslib_1.__extends(LocalCell, _super);\r\n function LocalCell() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Object.defineProperty(LocalCell.prototype, \"context\", {\r\n get: function () {\r\n return that.context;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(LocalCell.prototype, \"body\", {\r\n get: function () {\r\n return that.body;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(LocalCell.prototype, \"lastScrollInfo\", {\r\n get: function () {\r\n return that.lastScrollInfo;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n LocalCell.prototype.createHeader = function (document, column) {\r\n return that.createHeader(document, column);\r\n };\r\n LocalCell.prototype.updateHeader = function (node, column) {\r\n return that.updateHeader(node, column);\r\n };\r\n LocalCell.prototype.createCell = function (document, index, column) {\r\n return that.createCell(document, index, column);\r\n };\r\n LocalCell.prototype.updateColumnOffset = function (firstColumnPos) {\r\n _super.prototype.updateColumnOffset.call(this, firstColumnPos);\r\n that.updateOffset(that.visibleFirstRowPos);\r\n };\r\n LocalCell.prototype.updateCell = function (node, index, column) {\r\n return that.updateCell(node, index, column);\r\n };\r\n LocalCell.prototype.forEachRow = function (callback) {\r\n return that.forEachRow(callback);\r\n };\r\n return LocalCell;\r\n }(ACellAdapter));\r\n _this.cell = new (LocalCell.bind.apply(LocalCell, [void 0, _this.header, _this.style, tableId].concat((options.mixins || []))))();\r\n return _this;\r\n }\r\n ACellTableSection.prototype.addColumnMixin = function (mixinClass, options) {\r\n this.cell.addColumnMixin(mixinClass, options);\r\n };\r\n Object.defineProperty(ACellTableSection.prototype, \"idPrefix\", {\r\n get: function () {\r\n return this.tableId;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ACellTableSection.prototype, \"width\", {\r\n get: function () {\r\n return this.context.column.totalHeight;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ACellTableSection.prototype, \"visibleColumns\", {\r\n get: function () {\r\n return this.cell.visibleColumns;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ACellTableSection.prototype, \"visibleFirstColumnPos\", {\r\n get: function () {\r\n return this.cell.visibleFirstColumnPos;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ACellTableSection.prototype, \"height\", {\r\n get: function () {\r\n return this.context.totalHeight;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ACellTableSection.prototype, \"hidden\", {\r\n get: function () {\r\n return this.header.classList.contains(CSS_CLASS_LOADING);\r\n },\r\n set: function (value) {\r\n var old = this.hidden;\r\n if (old === value) {\r\n return;\r\n }\r\n this.header.classList.toggle(CSS_CLASS_LOADING, value);\r\n this.body.classList.toggle(CSS_CLASS_LOADING, value);\r\n this.header.classList.toggle(CSS_CLASS_HIDDEN, value);\r\n this.body.classList.toggle(CSS_CLASS_HIDDEN, value);\r\n this.onVisibilityChanged(!value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ACellTableSection.prototype.updateSizer = function (firstRowPos) {\r\n this.updateShifts(firstRowPos, this.cell.leftShift());\r\n // no sizer update since centrally managed\r\n };\r\n ACellTableSection.prototype.updateShifts = function (top, _left) {\r\n setTransform(this.body, 0 /*left.toFixed(0)*/, top.toFixed(0));\r\n };\r\n /**\r\n * hook when the visibility changes\r\n * @param {boolean} _visible current visibility\r\n */\r\n ACellTableSection.prototype.onVisibilityChanged = function (_visible) {\r\n // hook\r\n };\r\n ACellTableSection.prototype.hide = function () {\r\n this.hidden = true;\r\n };\r\n ACellTableSection.prototype.show = function (scrollLeft, clientWidth, isGoingRight) {\r\n var wasHidden = this.hidden;\r\n this.hidden = false;\r\n if (wasHidden) { // full update\r\n this.revalidate();\r\n }\r\n else {\r\n this.onScrolledHorizontally(scrollLeft, clientWidth, isGoingRight);\r\n }\r\n };\r\n ACellTableSection.prototype.init = function () {\r\n this.hide(); // hide by default\r\n this.cell.init();\r\n _super.prototype.init.call(this);\r\n };\r\n ACellTableSection.prototype.destroy = function () {\r\n _super.prototype.destroy.call(this);\r\n this.header.remove();\r\n this.style.remove(this.tableId);\r\n };\r\n ACellTableSection.prototype.onScrolledVertically = function (scrollTop, clientHeight, isGoingDown) {\r\n if (this.hidden) {\r\n return EScrollResult.NONE;\r\n }\r\n return _super.prototype.onScrolledVertically.call(this, scrollTop, clientHeight, isGoingDown);\r\n };\r\n ACellTableSection.prototype.onScrolledHorizontally = function (scrollLeft, clientWidth, isGoingRight) {\r\n var r = this.cell.onScrolledHorizontally(scrollLeft, clientWidth, isGoingRight);\r\n this.updateSizer(this.visibleFirstRowPos);\r\n return r;\r\n };\r\n /**\r\n * triggers updating the header\r\n */\r\n ACellTableSection.prototype.updateHeaders = function () {\r\n this.cell.updateHeaders();\r\n };\r\n ACellTableSection.prototype.handleCellReady = function (item, ready, column) {\r\n if (column === void 0) { column = -1; }\r\n return this.cell.handleCellReady(item, ready, column);\r\n };\r\n ACellTableSection.prototype.recycleCell = function (item, column) {\r\n if (column === void 0) { column = -1; }\r\n this.cell.recycleCell(item, column);\r\n };\r\n /**\r\n * trigger an update all all column widths\r\n */\r\n ACellTableSection.prototype.updateColumnWidths = function () {\r\n var context = this.context;\r\n this.style.update(context.defaultRowHeight - context.padding(-1), context.columns, context.column.padding, -this.cell.leftShift(), this.tableId);\r\n };\r\n ACellTableSection.prototype.recreate = function (ctx) {\r\n var scroller = this.bodyScroller;\r\n var oldLeft = scroller.scrollLeft;\r\n this.cell.recreate(oldLeft, scroller.clientWidth);\r\n _super.prototype.recreate.call(this, ctx);\r\n // restore left\r\n scroller.scrollLeft = oldLeft;\r\n };\r\n ACellTableSection.prototype.clearPool = function () {\r\n _super.prototype.clearPool.call(this);\r\n this.cell.clearPool();\r\n };\r\n ACellTableSection.prototype.createRow = function (node, rowIndex) {\r\n this.cell.createRow(node, rowIndex);\r\n node.classList.add(this.style.cssClasses.tr);\r\n };\r\n ACellTableSection.prototype.updateRow = function (node, rowIndex) {\r\n this.cell.updateRow(node, rowIndex);\r\n };\r\n return ACellTableSection;\r\n}(ARowRenderer));\r\nexport { ACellTableSection };\r\nexport default ACellTableSection;\r\n//# sourceMappingURL=ACellTableSection.js.map","import {defaultPhases, EAnimationMode, IAnimationContext, IAnimationItem, IExceptionContext, IPhase, KeyFinder} from 'lineupengine';\nimport {IGroupData, IGroupItem, isGroup} from '../model';\n\n/** @internal */\nexport interface IGroupLookUp {\n item2groupIndex: Map<number, number>;\n group2firstItemIndex: Map<string, number>;\n}\n\nfunction toGroupLookup(items: (IGroupItem | IGroupData)[]): IGroupLookUp {\n const item2groupIndex = new Map<number, number>();\n const group2firstItemIndex = new Map<string, number>();\n items.forEach((item, i) => {\n if (isGroup(item)) {\n for (let o = 0; o < item.order.length; ++o) {\n item2groupIndex.set(o, i);\n }\n } else if (item.group && item.relativeIndex === 0) {\n group2firstItemIndex.set(item.group.name, i);\n }\n });\n return {item2groupIndex, group2firstItemIndex};\n}\n\nfunction toKey(item: IGroupItem | IGroupData) {\n if (isGroup(item)) {\n return item.name;\n }\n return (<IGroupItem>item).dataIndex.toString();\n}\n\n/** @internal */\nexport function lineupAnimation(previous: IExceptionContext, previousData: (IGroupItem | IGroupData)[], currentData: (IGroupItem | IGroupData)[]): IAnimationContext {\n\n const previousKey = (index: number) => toKey(previousData[index]);\n const currentKey = (index: number) => toKey(currentData[index]);\n\n\n const previousGroupCount = previousData.reduce((acc, i) => acc + (isGroup(i) ? 1 : 0), 0);\n const currentGroupCount = currentData.reduce((acc, i) => acc + (isGroup(i) ? 1 : 0), 0);\n\n if (previousGroupCount === currentGroupCount) {\n // reorder or filter only\n return {currentKey, previous, previousKey};\n }\n\n // try to appear where the group was uncollapsed and vice versa\n let prevHelper: IGroupLookUp;\n const appearPosition = (currentRowIndex: number, previousFinder: KeyFinder, defaultValue: number) => {\n if (!prevHelper) {\n prevHelper = toGroupLookup(previousData);\n }\n const item = currentData[currentRowIndex];\n const referenceIndex = isGroup(item) ? prevHelper.group2firstItemIndex.get(item.name) : prevHelper.item2groupIndex.get(item.dataIndex);\n if (referenceIndex === undefined) {\n return defaultValue;\n }\n const pos = previousFinder.posByKey(previousKey(referenceIndex));\n return pos.pos >= 0 ? pos.pos : defaultValue;\n };\n\n\n let currHelper: IGroupLookUp;\n const removePosition = (previousRowIndex: number, currentFinder: KeyFinder, defaultValue: number) => {\n if (!currHelper) {\n currHelper = toGroupLookup(currentData);\n }\n const item = previousData[previousRowIndex];\n const referenceIndex = isGroup(item) ? currHelper.group2firstItemIndex.get(item.name) : currHelper.item2groupIndex.get(item.dataIndex);\n if (referenceIndex === undefined) {\n return defaultValue;\n }\n const pos = currentFinder.posByKey(currentKey(referenceIndex));\n return pos.pos >= 0 ? pos.pos : defaultValue;\n };\n\n const phases: IPhase[] = [\n Object.assign({}, defaultPhases[0], {\n apply(item: Readonly<IAnimationItem>, previousFinder: KeyFinder) {\n defaultPhases[0].apply(item);\n if (item.mode === EAnimationMode.SHOW) {\n item.node.style.transform = `translate(0, ${appearPosition(item.current.index, previousFinder, item.previous.y) - item.nodeY}px)`;\n }\n }\n }),\n Object.assign({}, defaultPhases[1], {\n apply(item: Readonly<IAnimationItem>, _previousFinder: KeyFinder, currentFinder: KeyFinder) {\n defaultPhases[1].apply(item);\n if (item.mode === EAnimationMode.HIDE) {\n item.node.style.transform = `translate(0, ${removePosition(item.previous.index, currentFinder, item.current.y) - item.nodeY}px)`;\n }\n }\n }),\n defaultPhases[defaultPhases.length - 1]\n ];\n\n return {previous, previousKey, currentKey, phases};\n}\n","import {IColumn, IAbortAblePromise, IAsyncUpdate, isAbortAble} from 'lineupengine';\nimport {Column} from '../model';\nimport {ICellRenderer, IGroupCellRenderer} from '../renderer';\nimport {ISummaryRenderer, IRenderCallback} from '../renderer';\nimport {createHeader, updateHeader} from './header';\nimport {IRankingContext} from './interfaces';\nimport {ILineUpFlags} from '../config';\nimport {cssClass, engineCssClass} from '../styles';\nimport {isPromiseLike} from '../internal';\n\nexport interface IRenderers {\n singleId: string;\n single: ICellRenderer;\n groupId: string;\n group: IGroupCellRenderer;\n summaryId: string;\n summary: ISummaryRenderer | null;\n singleTemplate: HTMLElement | null;\n groupTemplate: HTMLElement | null;\n summaryTemplate: HTMLElement | null;\n}\n\nexport default class RenderColumn implements IColumn {\n renderers: IRenderers | null = null;\n\n constructor(public readonly c: Column, public index: number, protected ctx: IRankingContext, protected readonly flags: ILineUpFlags) {\n\n }\n\n get width() {\n return this.c.getWidth();\n }\n\n get id() {\n return this.c.id;\n }\n\n get frozen() {\n return this.flags.disableFrozenColumns ? false : this.c.frozen;\n }\n\n private singleRenderer() {\n if (!this.renderers || !this.renderers.single) {\n return null;\n }\n if (this.renderers.singleTemplate) {\n return <HTMLElement>this.renderers.singleTemplate.cloneNode(true);\n }\n const elem = this.ctx.asElement(this.renderers.single.template);\n elem.classList.add(cssClass(`renderer-${this.renderers.singleId}`), cssClass('detail'));\n elem.dataset.renderer = this.renderers.singleId;\n elem.dataset.group = 'd';\n\n this.renderers.singleTemplate = <HTMLElement>elem.cloneNode(true);\n return elem;\n }\n\n private groupRenderer() {\n if (!this.renderers || !this.renderers.group) {\n return null;\n }\n if (this.renderers.groupTemplate) {\n return <HTMLElement>this.renderers.groupTemplate.cloneNode(true);\n }\n const elem = this.ctx.asElement(this.renderers.group.template);\n elem.classList.add(cssClass(`renderer-${this.renderers.groupId}`), cssClass('group'));\n elem.dataset.renderer = this.renderers.groupId;\n elem.dataset.group = 'g';\n\n this.renderers.groupTemplate = <HTMLElement>elem.cloneNode(true);\n return elem;\n }\n\n private summaryRenderer() {\n if (!this.renderers || !this.renderers.summary) {\n return null;\n }\n if (this.renderers.summaryTemplate) {\n return <HTMLElement>this.renderers.summaryTemplate.cloneNode(true);\n }\n const elem = this.ctx.asElement(this.renderers.summary.template);\n elem.classList.add(cssClass('summary'), cssClass('th-summary'), cssClass(`renderer-${this.renderers.summaryId}`));\n elem.dataset.renderer = this.renderers.summaryId;\n\n this.renderers.summaryTemplate = <HTMLElement>elem.cloneNode(true);\n return elem;\n }\n\n createHeader(): HTMLElement | IAsyncUpdate<HTMLElement> {\n const node = createHeader(this.c, this.ctx, {\n extraPrefix: 'th',\n dragAble: this.flags.advancedUIFeatures,\n mergeDropAble: this.flags.advancedModelFeatures,\n rearrangeAble: this.flags.advancedUIFeatures,\n resizeable: this.flags.advancedUIFeatures\n });\n node.classList.add(cssClass('header'));\n if (!this.flags.disableFrozenColumns) {\n node.classList.toggle(engineCssClass('frozen'), this.frozen);\n }\n\n if (this.renderers && this.renderers.summary) {\n const summary = this.summaryRenderer()!;\n node.appendChild(summary);\n }\n return this.updateHeader(node);\n }\n\n hasSummaryLine() {\n return Boolean(this.c.getMetaData().summary);\n }\n\n updateHeader(node: HTMLElement): HTMLElement | IAsyncUpdate<HTMLElement> {\n updateHeader(node, this.c);\n if (!this.renderers || !this.renderers.summary) {\n return node;\n }\n let summary = <HTMLElement>node.getElementsByClassName(cssClass('summary'))[0]!;\n const oldRenderer = summary.dataset.renderer;\n const currentRenderer = this.renderers.summaryId;\n if (oldRenderer !== currentRenderer) {\n summary.remove();\n summary = this.summaryRenderer()!;\n node.appendChild(summary);\n }\n const ready = this.renderers.summary.update(summary);\n if (ready) {\n return {item: node, ready};\n }\n return node;\n }\n\n createCell(index: number): HTMLElement | IAsyncUpdate<HTMLElement> {\n const isGroup = this.ctx.isGroup(index);\n const node = isGroup ? this.groupRenderer()! : this.singleRenderer()!;\n return this.updateCell(node, index);\n }\n\n updateCell(node: HTMLElement, index: number): HTMLElement | IAsyncUpdate<HTMLElement> {\n if (!this.flags.disableFrozenColumns) {\n node.classList.toggle(engineCssClass('frozen'), this.frozen);\n }\n const isGroup = this.ctx.isGroup(index);\n // assert that we have the template of the right mode\n const oldRenderer = node.dataset.renderer;\n const currentRenderer = isGroup ? this.renderers!.groupId : this.renderers!.singleId;\n const oldGroup = node.dataset.group;\n const currentGroup = (isGroup ? 'g' : 'd');\n if (oldRenderer !== currentRenderer || oldGroup !== currentGroup) {\n node = isGroup ? this.groupRenderer()! : this.singleRenderer()!;\n }\n let ready: IAbortAblePromise<void> | void | null;\n if (isGroup) {\n const g = this.ctx.getGroup(index);\n ready = this.renderers!.group.update(node, g);\n } else {\n const r = this.ctx.getRow(index);\n const row = this.ctx.provider.getRow(r.dataIndex);\n if (!isPromiseLike(row)) {\n ready = this.renderers!.single.update(node, row, r.relativeIndex, r.group);\n } else {\n ready = chainAbortAble(row, (row) => this.renderers!.single.update(node, row, r.relativeIndex, r.group));\n }\n }\n if (ready) {\n return {item: node, ready};\n }\n return node;\n }\n\n renderCell(ctx: CanvasRenderingContext2D, index: number): boolean | IAbortAblePromise<IRenderCallback> {\n const r = this.ctx.getRow(index);\n const s = this.renderers!.single;\n if (!s.render) {\n return false;\n }\n const row = this.ctx.provider.getRow(r.dataIndex);\n if (!isPromiseLike(row)) {\n return s.render(ctx, row, r.relativeIndex, r.group) || false;\n }\n return chainAbortAble(row, (row) => s.render!(ctx, row, r.relativeIndex, r.group) || false);\n }\n\n}\n\n\nfunction chainAbortAble<T, U, V>(toWait: Promise<T>, mapper: (value: T) => IAbortAblePromise<U> | V): IAbortAblePromise<U> | V {\n let aborted = false;\n const p: any = new Promise<IAbortAblePromise<U> | null | void>((resolve) => {\n if (aborted) {\n return;\n }\n toWait.then((r) => {\n if (aborted) {\n return;\n }\n const mapped = mapper(r);\n if (isAbortAble(<any>mapped)) {\n p.abort = (<IAbortAblePromise<U>>mapped).abort.bind(mapped);\n return p.then(resolve);\n }\n return resolve(<any>mapped);\n });\n });\n\n p.abort = () => {\n aborted = true;\n };\n return p;\n}\n","import {abortAbleAll, IAbortAblePromise, IAsyncUpdate, isAsyncUpdate, StyleManager} from 'lineupengine';\nimport {ILineUpFlags} from '../config';\nimport {round} from '../internal';\nimport {Column, IMultiLevelColumn} from '../model';\nimport {ISummaryRenderer} from '../renderer';\nimport {multiLevelGridCSSClass} from '../renderer/utils';\nimport {COLUMN_PADDING, cssClass} from '../styles';\nimport {createHeader, updateHeader} from './header';\nimport {IRankingContext} from './interfaces';\nimport RenderColumn from './RenderColumn';\n\n/** @internal */\nexport default class MultiLevelRenderColumn extends RenderColumn {\n private summaries: ISummaryRenderer[] = [];\n\n constructor(c: IMultiLevelColumn & Column, index: number, ctx: IRankingContext, flags: ILineUpFlags) {\n super(c, index, ctx, flags);\n }\n\n private get mc() {\n return <IMultiLevelColumn & Column>this.c;\n }\n\n get width() {\n return this.c.getWidth() + COLUMN_PADDING * this.mc.length;\n }\n\n createHeader() {\n const r = super.createHeader();\n const wrapper = this.ctx.document.createElement('div');\n wrapper.classList.add(cssClass('nested'));\n wrapper.classList.add(multiLevelGridCSSClass(this.ctx.idPrefix, this.c));\n\n if (isAsyncUpdate(r)) {\n r.item.appendChild(wrapper);\n } else {\n r.appendChild(wrapper);\n }\n\n return this.updateNested(wrapper, r);\n }\n\n private matchChildren(wrapper: HTMLElement, children: Column[]) {\n function matches(col: Column, i: number) {\n //do both match?\n const n = <HTMLElement>wrapper.children[i];\n return n != null && n.dataset.colId === col.id;\n }\n\n if (children.every(matches) && children.length === wrapper.childElementCount) {\n // 1:1 match\n return;\n }\n\n const lookup = new Map((<HTMLElement[]>Array.from(wrapper.children)).map((n: HTMLElement, i) =>\n (<[string, {node: HTMLElement, summary: ISummaryRenderer}]>[n.dataset.colId!, {node: n, summary: this.summaries[i]}]))\n );\n\n // reset summaries array\n this.summaries = [];\n\n children.forEach((cc, i) => {\n const existing = lookup.get(cc.id);\n if (existing) { // reuse existing\n lookup.delete(cc.id);\n const n = existing.node;\n (<any>n.style).gridColumnStart = (i + 1).toString();\n wrapper.appendChild(n);\n this.summaries[i] = existing.summary;\n return;\n }\n\n const n = createHeader(cc, this.ctx, {\n extraPrefix: 'th',\n mergeDropAble: false,\n dragAble: this.flags.advancedModelFeatures,\n rearrangeAble: this.flags.advancedModelFeatures,\n resizeable: this.flags.advancedModelFeatures\n });\n n.classList.add(cssClass('header'), cssClass('nested-th'));\n (<any>n.style).gridColumnStart = (i + 1).toString();\n wrapper.appendChild(n);\n\n if (!this.renderers || !this.renderers.summary) {\n return;\n }\n const summary = this.ctx.summaryRenderer(cc, false);\n const summaryNode = this.ctx.asElement(summary.template);\n summaryNode.classList.add(cssClass('summary'), cssClass('th-summary'), cssClass(`renderer-${cc.getSummaryRenderer()}`));\n summaryNode.dataset.renderer = cc.getSummaryRenderer();\n n.appendChild(summaryNode);\n this.summaries[i] = summary;\n summary.update(summaryNode);\n });\n\n // delete not used ones anymore\n lookup.forEach((v) => v.node.remove());\n }\n\n updateHeader(node: HTMLElement) {\n const r = super.updateHeader(node);\n node = isAsyncUpdate(r) ? r.item : r;\n const wrapper = <HTMLElement>node.getElementsByClassName(cssClass('nested'))[0];\n if (!wrapper) {\n return r; // too early\n }\n node.appendChild(wrapper); // ensure the last one\n return this.updateNested(wrapper, r);\n }\n\n hasSummaryLine() {\n return super.hasSummaryLine() || this.mc.children.some((c) => Boolean(c.getMetaData().summary));\n }\n\n updateWidthRule(style: StyleManager) {\n const mc = this.mc;\n // need this for chrome to work properly\n const widths = mc.children.map((c) => `minmax(0, ${round(c.getWidth())}fr)`);\n const clazz = multiLevelGridCSSClass(this.ctx.idPrefix, this.c);\n style.updateRule(`stacked-${this.c.id}`, `.${clazz}`, <any>{\n display: 'grid',\n gridTemplateColumns: widths.join(' ')\n });\n return clazz;\n }\n\n private updateNested(wrapper: HTMLElement, r: HTMLElement | IAsyncUpdate<HTMLElement>) {\n const sub = this.mc.children;\n this.matchChildren(wrapper, sub);\n\n const children = <HTMLElement[]>Array.from(wrapper.children);\n\n const toWait: IAbortAblePromise<void>[] = [];\n let header: HTMLElement;\n if (isAsyncUpdate(r)) {\n toWait.push(r.ready);\n header = r.item;\n } else {\n header = r;\n }\n\n sub.forEach((c, i) => {\n const node = children[i];\n updateHeader(node, c);\n\n if (!this.renderers || !this.renderers.summary) {\n return;\n }\n let summary = <HTMLElement>node.getElementsByClassName(cssClass('summary'))[0];\n const oldRenderer = summary.dataset.renderer;\n const currentRenderer = c.getSummaryRenderer();\n if (oldRenderer !== currentRenderer) {\n const renderer = this.ctx.summaryRenderer(c, false);\n summary.remove();\n summary = this.ctx.asElement(renderer.template);\n summary.classList.add(cssClass('summary'), cssClass('th-summary'), cssClass(`renderer-${currentRenderer}`));\n summary.dataset.renderer = currentRenderer;\n this.summaries[i] = renderer;\n node.appendChild(summary);\n }\n const ready = this.summaries[i].update(summary);\n if (ready) {\n toWait.push(ready);\n }\n });\n\n if (toWait.length === 0) {\n return header;\n }\n return {\n item: header,\n ready: <IAbortAblePromise<void>>abortAbleAll(toWait)\n };\n }\n}\n","import {ILineUpFlags} from '../config';\nimport {Column, IGroupData, IGroupItem} from '../model';\nimport {IDataProvider} from '../provider';\nimport {IImposer, IRenderContext, ISummaryRenderer} from '../renderer';\nimport DialogManager from './dialogs/DialogManager';\nimport {IDialogContext} from './dialogs';\n\nexport interface IUIOptions {\n /**\n * whether to show this action as a shortcut action\n * @default 'menu'\n */\n mode: 'menu' | 'menu+shortcut' | 'shortcut' | ((col: Column, mode: 'sidePanel' | 'header') => 'menu' | 'menu+shortcut' | 'shortcut');\n\n /**\n * order hint for sorting actions\n * @default 50\n */\n order: number;\n\n featureLevel: 'basic' | 'advanced';\n featureCategory: 'ranking' | 'model' | 'ui';\n}\n\nexport interface IOnClickHandler {\n (col: Column, evt: MouseEvent, ctx: IRankingHeaderContext, level: number, viaShortcut: boolean): any;\n}\n\nexport interface IToolbarAction {\n title: string;\n\n enabled?(col: Column): boolean;\n\n onClick: IOnClickHandler;\n\n options: Partial<IUIOptions>;\n}\n\nexport interface IToolbarDialogAddonHandler {\n elems: string | (HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement)[];\n reset(): void;\n submit(): boolean | undefined;\n cancel(): void;\n}\n\nexport interface IToolbarDialogAddon {\n title: string;\n\n order: number;\n\n append(col: Column, node: HTMLElement, dialog: IDialogContext, ctx: IRankingHeaderContext): IToolbarDialogAddonHandler;\n}\n\n\nexport interface IRenderInfo {\n type: string;\n label: string;\n}\n\nexport interface IRankingHeaderContextContainer {\n readonly idPrefix: string;\n readonly document: Document;\n readonly provider: IDataProvider;\n\n readonly dialogManager: DialogManager;\n\n asElement(html: string): HTMLElement;\n\n resolveToolbarActions(col: Column, keys: string[]): IToolbarAction[];\n resolveToolbarDialogAddons(col: Column, keys: string[]): IToolbarDialogAddon[];\n\n readonly flags: ILineUpFlags;\n\n getPossibleRenderer(col: Column): {item: IRenderInfo[], group: IRenderInfo[], summary: IRenderInfo[]};\n\n summaryRenderer(co: Column, interactive: boolean, imposer?: IImposer): ISummaryRenderer;\n\n readonly caches: {\n toolbar: Map<string, IToolbarAction[]>,\n toolbarAddons: Map<string, IToolbarDialogAddon[]>\n };\n}\n\nexport interface IRankingBodyContext extends IRankingHeaderContextContainer, IRenderContext {\n isGroup(index: number): boolean;\n\n getGroup(index: number): IGroupData;\n\n getRow(index: number): IGroupItem;\n}\n\nexport declare type IRankingHeaderContext = Readonly<IRankingHeaderContextContainer>;\n\nexport declare type IRankingContext = Readonly<IRankingBodyContext>;\n\nexport enum EMode {\n ITEM = 'item',\n BAND = 'band'\n}\n","import {OrderedSet, AEventDispatcher, IEventListener} from '../internal';\nimport {IGroupData, IGroupItem, isGroup} from '../model';\nimport {IDataProvider} from '../provider';\nimport {cssClass, engineCssClass} from '../styles';\nimport {forEachIndices} from '../model/internal';\nimport {rangeSelection} from '../provider/utils';\n\ninterface IPoint {\n x: number;\n y: number;\n}\n\ninterface IShift {\n xShift: number;\n yShift: number;\n node: HTMLElement;\n}\n\n/**\n * @asMemberOf SelectionManager\n * @internal\n * @event\n */\nexport declare function selectRange(from: number, to: number, additional: boolean): void;\n\n/** @internal */\nexport default class SelectionManager extends AEventDispatcher {\n static readonly EVENT_SELECT_RANGE = 'selectRange';\n private static readonly MIN_DISTANCE = 10;\n\n private readonly hr: HTMLHRElement;\n\n private start: (IPoint & IShift) | null = null;\n\n constructor(private readonly ctx: {provider: IDataProvider}, private readonly body: HTMLElement) {\n super();\n const root = body.parentElement!.parentElement!;\n let hr = <HTMLHRElement>root.querySelector('hr');\n if (!hr) {\n hr = root.ownerDocument!.createElement('hr');\n root.appendChild(hr);\n }\n this.hr = hr;\n this.hr.classList.add(cssClass('hr'));\n\n const mouseMove = (evt: MouseEvent) => {\n this.showHint(evt);\n };\n const mouseUp = (evt: MouseEvent) => {\n this.body.removeEventListener('mousemove', mouseMove);\n this.body.removeEventListener('mouseup', mouseUp);\n this.body.removeEventListener('mouseleave', mouseUp);\n\n if (!this.start) {\n return;\n }\n const row = engineCssClass('tr');\n const startNode = this.start.node.classList.contains(row) ? this.start.node : <HTMLElement>this.start.node.closest(`.${row}`);\n // somehow on firefox the mouseUp will be triggered on the original node\n // thus search the node explicitly\n const end = <HTMLElement>this.body.ownerDocument!.elementFromPoint(evt.clientX, evt.clientY);\n const endNode = end.classList.contains(row) ? end : <HTMLElement>(end.closest(`.${row}`));\n this.start = null;\n\n this.body.classList.remove(cssClass('selection-active'));\n this.hr.classList.remove(cssClass('selection-active'));\n\n this.select(evt.ctrlKey, startNode, endNode);\n };\n\n body.addEventListener('mousedown', (evt) => {\n const r = root.getBoundingClientRect();\n this.start = {x: evt.clientX, y: evt.clientY, xShift: r.left, yShift: r.top, node: <HTMLElement>evt.target};\n\n this.body.classList.add(cssClass('selection-active'));\n body.addEventListener('mousemove', mouseMove, {\n passive: true\n });\n body.addEventListener('mouseup', mouseUp, {\n passive: true\n });\n body.addEventListener('mouseleave', mouseUp, {\n passive: true\n });\n }, {\n passive: true\n });\n }\n\n protected createEventList() {\n return super.createEventList().concat([SelectionManager.EVENT_SELECT_RANGE]);\n }\n\n on(type: typeof SelectionManager.EVENT_SELECT_RANGE, listener: typeof selectRange | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n private select(additional: boolean, startNode?: HTMLElement, endNode?: HTMLElement) {\n if (!startNode || !endNode || startNode === endNode) {\n return; // no single\n }\n\n const startIndex = parseInt(startNode.dataset.index!, 10);\n const endIndex = parseInt(endNode.dataset.index!, 10);\n\n const from = Math.min(startIndex, endIndex);\n const end = Math.max(startIndex, endIndex);\n if (from === end) {\n return; // no single\n }\n // bounce event end\n requestAnimationFrame(() => this.fire(SelectionManager.EVENT_SELECT_RANGE, from, end, additional));\n }\n\n private showHint(end: MouseEvent) {\n const start = this.start!;\n const sy = start.y;\n const ey = end.clientY;\n\n const visible = Math.abs(sy - ey) > SelectionManager.MIN_DISTANCE;\n this.hr.classList.toggle(cssClass('selection-active'), visible);\n this.hr.style.transform = `translate(${start.x - start.xShift}px,${sy - start.yShift}px)scale(1,${Math.abs(ey - sy)})rotate(${ey > sy ? 90 : -90}deg)`;\n }\n\n remove(node: HTMLElement) {\n node.onclick = <any>undefined;\n }\n\n add(node: HTMLElement) {\n node.onclick = (evt) => {\n const dataIndex = parseInt(node.dataset.i!, 10);\n if (evt.shiftKey) {\n const relIndex = parseInt(node.dataset.index!, 10);\n const ranking = node.parentElement!.dataset.ranking!;\n if (rangeSelection(this.ctx.provider, ranking, dataIndex, relIndex, evt.ctrlKey)) {\n return;\n }\n }\n this.ctx.provider.toggleSelection(dataIndex, evt.ctrlKey);\n };\n }\n\n selectRange(rows: {forEach: (c: (item: (IGroupItem | IGroupData)) => void) => void}, additional: boolean = false) {\n const current = new OrderedSet<number>(additional ? this.ctx.provider.getSelection() : []);\n const toggle = (dataIndex: number) => {\n if (current.has(dataIndex)) {\n current.delete(dataIndex);\n } else {\n current.add(dataIndex);\n }\n };\n rows.forEach((d) => {\n if (isGroup(d)) {\n forEachIndices(d.order, toggle);\n } else {\n toggle(d.dataIndex);\n }\n });\n this.ctx.provider.setSelection(Array.from(current));\n }\n\n updateState(node: HTMLElement, dataIndex: number) {\n if (this.ctx.provider.isSelected(dataIndex)) {\n node.classList.add(cssClass('selected'));\n } else {\n node.classList.remove(cssClass('selected'));\n }\n }\n\n update(node: HTMLElement, selectedDataIndices: {has(dataIndex: number): boolean}) {\n const dataIndex = parseInt(node.dataset.i!, 10);\n if (selectedDataIndices.has(dataIndex)) {\n node.classList.add(cssClass('selected'));\n } else {\n node.classList.remove(cssClass('selected'));\n }\n }\n}\n","import {ACellTableSection, GridStyleManager, IAbortAblePromise, ICellRenderContext, IExceptionContext, isAbortAble, isAsyncUpdate, isLoadingCell, ITableSection, nonUniformContext, PrefetchMixin, tableIds, uniformContext, IAsyncUpdate} from 'lineupengine';\nimport {ILineUpFlags} from '../config';\nimport {HOVER_DELAY_SHOW_DETAIL} from '../constants';\nimport {AEventDispatcher, clear, debounce, IEventContext, IEventHandler, IEventListener, suffix} from '../internal';\nimport {Column, IGroupData, IGroupItem, IOrderedGroup, isGroup, isMultiLevelColumn, Ranking, StackColumn, IGroupParent, defaultGroup, IGroup} from '../model';\nimport {IImposer, IRenderCallback, IRenderContext} from '../renderer';\nimport {CANVAS_HEIGHT, COLUMN_PADDING, cssClass, engineCssClass} from '../styles';\nimport {lineupAnimation} from './animation';\nimport {IRankingBodyContext, IRankingHeaderContextContainer} from './interfaces';\nimport MultiLevelRenderColumn from './MultiLevelRenderColumn';\nimport RenderColumn, {IRenderers} from './RenderColumn';\nimport SelectionManager from './SelectionManager';\nimport {groupRoots} from '../model/internal';\nimport {isAlwaysShowingGroupStrategy, toRowMeta} from '../provider/internal';\n\nexport interface IEngineRankingContext extends IRankingHeaderContextContainer, IRenderContext {\n createRenderer(c: Column, imposer?: IImposer): IRenderers;\n}\n\n\nexport interface IEngineRankingOptions {\n animation: boolean;\n levelOfDetail: (rowIndex: number) => 'high' | 'low';\n customRowUpdate: (row: HTMLElement, rowIndex: number) => void;\n flags: ILineUpFlags;\n}\n\n/**\n * emitted when the width of the ranking changed\n * @asMemberOf EngineRanking\n * @event\n */\nexport declare function widthChanged(): void;\n/**\n * emitted when the data of the ranking needs to be updated\n * @asMemberOf EngineRanking\n * @event\n */\nexport declare function updateData(): void;\n/**\n * emitted when the table has be recreated\n * @asMemberOf EngineRanking\n * @event\n */\nexport declare function recreate(): void;\n/**\n * emitted when the highlight changes\n * @asMemberOf EngineRanking\n * @param dataIndex the highlghted data index or -1 for none\n * @event\n */\nexport declare function highlightChanged(dataIndex: number): void;\n\n\n/** @internal */\nclass RankingEvents extends AEventDispatcher {\n static readonly EVENT_WIDTH_CHANGED = 'widthChanged';\n static readonly EVENT_UPDATE_DATA = 'updateData';\n static readonly EVENT_RECREATE = 'recreate';\n static readonly EVENT_HIGHLIGHT_CHANGED = 'highlightChanged';\n\n fire(type: string | string[], ...args: any[]) {\n super.fire(type, ...args);\n }\n\n protected createEventList() {\n return super.createEventList().concat([RankingEvents.EVENT_WIDTH_CHANGED, RankingEvents.EVENT_UPDATE_DATA, RankingEvents.EVENT_RECREATE, RankingEvents.EVENT_HIGHLIGHT_CHANGED]);\n }\n}\n\nconst PASSIVE: AddEventListenerOptions = {\n passive: false\n};\n\nexport default class EngineRanking extends ACellTableSection<RenderColumn> implements ITableSection, IEventHandler {\n static readonly EVENT_WIDTH_CHANGED = RankingEvents.EVENT_WIDTH_CHANGED;\n static readonly EVENT_UPDATE_DATA = RankingEvents.EVENT_UPDATE_DATA;\n static readonly EVENT_RECREATE = RankingEvents.EVENT_RECREATE;\n static readonly EVENT_HIGHLIGHT_CHANGED = RankingEvents.EVENT_HIGHLIGHT_CHANGED;\n\n private _context: ICellRenderContext<RenderColumn>;\n\n private readonly loadingCanvas = new WeakMap<HTMLCanvasElement, {col: number, render: IAbortAblePromise<IRenderCallback>}[]>();\n\n private readonly renderCtx: IRankingBodyContext;\n private data: (IGroupItem | IGroupData)[] = [];\n private readonly selection: SelectionManager;\n private highlight: number = -1;\n private readonly canvasPool: HTMLCanvasElement[] = [];\n\n private currentCanvasShift: number = 0;\n private currentCanvasWidth: number = 0;\n\n private readonly events = new RankingEvents();\n\n private roptions: Readonly<IEngineRankingOptions> = {\n animation: true,\n levelOfDetail: () => 'high',\n customRowUpdate: () => undefined,\n flags: {\n disableFrozenColumns: false,\n advancedModelFeatures: true,\n advancedRankingFeatures: true,\n advancedUIFeatures: true\n }\n };\n\n private readonly delayedUpdate: (this: {type: string}) => void;\n private readonly delayedUpdateAll: () => void;\n private readonly delayedUpdateColumnWidths: () => void;\n private readonly columns: RenderColumn[];\n\n private readonly canvasMouseHandler = {\n timer: new Set<number>(),\n hoveredRows: new Set<HTMLElement>(),\n cleanUp: () => {\n const c = this.canvasMouseHandler;\n c.timer.forEach((timer) => {\n self.clearTimeout(timer);\n });\n c.timer.clear();\n for (const row of Array.from(c.hoveredRows)) {\n c.unhover(row);\n }\n },\n enter: (evt: MouseEvent) => {\n const c = this.canvasMouseHandler;\n c.cleanUp();\n const row = <HTMLElement>evt.currentTarget;\n row.addEventListener('mouseleave', c.leave, PASSIVE);\n c.timer.add(self.setTimeout(() => {\n c.hoveredRows.add(row);\n this.updateHoveredRow(row, true);\n }, HOVER_DELAY_SHOW_DETAIL));\n },\n leave: (evt: MouseEvent | HTMLElement) => {\n // on row to survive canvas removal\n const c = this.canvasMouseHandler;\n const row = <HTMLElement>((typeof (<MouseEvent>evt).currentTarget !== 'undefined') ? (<MouseEvent>evt).currentTarget : evt);\n c.unhover(row);\n\n c.cleanUp();\n },\n unhover: (row: HTMLElement) => {\n // remove self\n const c = this.canvasMouseHandler;\n c.hoveredRows.delete(row);\n row.removeEventListener('mouseleave', c.leave);\n if (!EngineRanking.isCanvasRenderedRow(row) && row.parentElement) { // and part of dom\n self.setTimeout(() => this.updateHoveredRow(row, false));\n }\n }\n };\n\n private readonly highlightHandler = {\n enabled: false,\n enter: (evt: MouseEvent) => {\n if (this.highlight >= 0) {\n const old = this.body.getElementsByClassName(engineCssClass('highlighted'))[0];\n if (old) {\n old.classList.remove(engineCssClass('highlighted'));\n }\n this.highlight = -1;\n }\n const row = <HTMLElement>evt.currentTarget;\n const dataIndex = parseInt(row.dataset.i || '-1', 10);\n this.events.fire(EngineRanking.EVENT_HIGHLIGHT_CHANGED, dataIndex);\n },\n leave: () => {\n if (this.highlight >= 0) {\n const old = this.body.getElementsByClassName(engineCssClass('highlighted'))[0];\n if (old) {\n old.classList.remove(engineCssClass('highlighted'));\n }\n this.highlight = -1;\n }\n this.events.fire(EngineRanking.EVENT_HIGHLIGHT_CHANGED, -1);\n }\n };\n\n constructor(public readonly ranking: Ranking, header: HTMLElement, body: HTMLElement, tableId: string, style: GridStyleManager, private readonly ctx: IEngineRankingContext, roptions: Partial<IEngineRankingOptions> = {}) {\n super(header, body, tableId, style, {mixins: [PrefetchMixin], batchSize: 20});\n Object.assign(this.roptions, roptions);\n body.dataset.ranking = ranking.id;\n\n const that = this;\n this.delayedUpdate = debounce((function (this: {type: string, primaryType: string}) {\n if (this.type !== Ranking.EVENT_DIRTY_VALUES) {\n that.events.fire(EngineRanking.EVENT_UPDATE_DATA);\n return;\n }\n if (this.primaryType !== Column.EVENT_RENDERER_TYPE_CHANGED && this.primaryType !== Column.EVENT_GROUP_RENDERER_TYPE_CHANGED && this.primaryType !== Column.EVENT_LABEL_CHANGED) { // just the single column will be updated\n that.updateBody();\n }\n }), 50, (current, next) => {\n const currentEvent = current.self.type;\n // order changed is more important\n return currentEvent === Ranking.EVENT_ORDER_CHANGED ? current : next;\n });\n\n this.delayedUpdateAll = debounce(() => this.updateAll(), 50);\n this.delayedUpdateColumnWidths = debounce(() => this.updateColumnWidths(), 50);\n ranking.on(`${Ranking.EVENT_ADD_COLUMN}.hist`, (col: Column, index: number) => {\n this.columns.splice(index, 0, this.createCol(col, index));\n this.reindex();\n this.delayedUpdateAll();\n });\n ranking.on(`${Ranking.EVENT_REMOVE_COLUMN}.body`, (col: Column, index: number) => {\n EngineRanking.disableListener(col);\n this.columns.splice(index, 1);\n this.reindex();\n this.delayedUpdateAll();\n });\n ranking.on(`${Ranking.EVENT_MOVE_COLUMN}.body`, (col: Column, index: number, old: number) => {\n //delete first\n const c = this.columns.splice(old, 1)[0];\n console.assert(c.c === col);\n // adapt target index based on previous index, i.e shift by one\n this.columns.splice(old < index ? index - 1 : index, 0, c);\n this.reindex();\n this.delayedUpdateAll();\n });\n ranking.on(`${Ranking.EVENT_COLUMN_VISIBILITY_CHANGED}.body`, (col: Column, _oldValue: boolean, newValue: boolean) => {\n if (newValue) {\n // become visible\n const index = ranking.children.indexOf(col);\n this.columns.splice(index, 0, this.createCol(col, index));\n } else {\n // hide\n const index = this.columns.findIndex((d) => d.c === col);\n EngineRanking.disableListener(col);\n this.columns.splice(index, 1);\n }\n this.reindex();\n this.delayedUpdateAll();\n });\n ranking.on(`${Ranking.EVENT_ORDER_CHANGED}.body`, this.delayedUpdate);\n\n this.selection = new SelectionManager(this.ctx, body);\n this.selection.on(SelectionManager.EVENT_SELECT_RANGE, (from: number, to: number, additional: boolean) => {\n this.selection.selectRange(this.data.slice(from, to + 1), additional);\n });\n\n this.renderCtx = Object.assign({\n isGroup: (index: number) => isGroup(this.data[index]),\n getRow: (index: number) => <IGroupItem>this.data[index],\n getGroup: (index: number) => <IGroupData>this.data[index]\n }, ctx);\n\n // default context\n this.columns = ranking.children.filter((c) => c.isVisible()).map((c, i) => this.createCol(c, i));\n this._context = Object.assign({\n columns: this.columns,\n column: nonUniformContext(this.columns.map((w) => w.width), 100, COLUMN_PADDING)\n }, uniformContext(0, 20));\n\n this.columns.forEach((column) => {\n if (column instanceof MultiLevelRenderColumn) {\n column.updateWidthRule(this.style);\n }\n column.renderers = this.ctx.createRenderer(column.c);\n });\n\n this.style.updateRule(`hoverOnly${this.tableId}`, `\n #${tableIds(this.tableId).tbody}:hover > .${engineCssClass('tr')}:hover .${cssClass('hover-only')},\n #${tableIds(this.tableId).tbody} > .${engineCssClass('tr')}.${cssClass('selected')} .${cssClass('hover-only')},\n #${tableIds(this.tableId).tbody} > .${engineCssClass('tr')}.${engineCssClass('highlighted')} .${cssClass('hover-only')}`, {\n visibility: 'visible'\n });\n\n this.updateCanvasRule();\n }\n\n on(type: typeof EngineRanking.EVENT_WIDTH_CHANGED, listener: typeof widthChanged | null): this;\n on(type: typeof EngineRanking.EVENT_UPDATE_DATA, listener: typeof updateData | null): this;\n on(type: typeof EngineRanking.EVENT_RECREATE, listener: typeof recreate | null): this;\n on(type: typeof EngineRanking.EVENT_HIGHLIGHT_CHANGED, listener: typeof highlightChanged | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n this.events.on(type, listener);\n return this;\n }\n\n get id() {\n return this.ranking.id;\n }\n\n protected onVisibilityChanged(visible: boolean) {\n super.onVisibilityChanged(visible);\n if (visible) {\n this.delayedUpdate.call({type: Ranking.EVENT_ORDER_CHANGED});\n }\n }\n\n updateHeaders() {\n this.updateColumnSummaryFlag();\n return super.updateHeaders();\n }\n\n get currentData() {\n return this.data;\n }\n\n get context(): ICellRenderContext<RenderColumn> {\n return this._context;\n }\n\n protected createHeader(_document: Document, column: RenderColumn): HTMLElement | IAsyncUpdate<HTMLElement> {\n return column.createHeader();\n }\n\n private updateColumnSummaryFlag() {\n // updates the header flag depending on whether there are any sublabels\n this.header.classList.toggle(cssClass('show-sublabel'), this.columns.some((c) => c.hasSummaryLine()));\n }\n\n protected updateHeader(node: HTMLElement, column: RenderColumn) {\n if (column instanceof MultiLevelRenderColumn) {\n column.updateWidthRule(this.style);\n }\n return column.updateHeader(node);\n }\n\n protected createCell(_document: Document, index: number, column: RenderColumn) {\n return column.createCell(index);\n }\n\n private createCellHandled(col: RenderColumn, index: number) {\n const r = col.createCell(index);\n let item: HTMLElement;\n if (isAsyncUpdate(r)) {\n item = this.handleCellReady(r.item, r.ready, col.index);\n } else {\n item = r;\n }\n this.initCellClasses(item, col.id);\n return item;\n }\n\n protected updateCell(node: HTMLElement, index: number, column: RenderColumn) {\n return column.updateCell(node, index);\n }\n\n private selectCanvas() {\n if (this.canvasPool.length > 0) {\n return this.canvasPool.pop()!;\n }\n const c = this.body.ownerDocument!.createElement('canvas');\n c.classList.add(cssClass(`low-c${this.tableId}`));\n return c;\n }\n\n private rowFlags(row: HTMLElement) {\n const rowany: any = row;\n const v = rowany.__lu__;\n if (v == null) {\n return rowany.__lu__ = {};\n }\n return v;\n }\n\n private visibleRenderedWidth() {\n let width = 0;\n for (const col of this.visibleColumns.frozen) {\n width += this.columns[col].width + COLUMN_PADDING;\n }\n for (let col = this.visibleColumns.first; col <= this.visibleColumns.last; ++col) {\n width += this.columns[col].width + COLUMN_PADDING;\n }\n if (width > 0) {\n width -= COLUMN_PADDING; // for the last one\n }\n return width;\n }\n\n private pushLazyRedraw(canvas: HTMLCanvasElement, x: number, column: RenderColumn, render: IAbortAblePromise<IRenderCallback>) {\n render.then((r) => {\n const l = (this.loadingCanvas.get(canvas) || []);\n const pos = l.findIndex((d) => d.render === render && d.col === column.index);\n if (pos < 0) { // not part anymore ignore\n return;\n }\n l.splice(pos, 1);\n if (typeof r === 'function') { // i.e not aborted\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(x - 1, 0, column.width + 2, canvas.height);\n ctx.save();\n ctx.translate(x, 0);\n r(ctx);\n ctx.restore();\n }\n\n if (l.length > 0) {\n return;\n }\n this.loadingCanvas.delete(canvas);\n canvas.classList.remove(cssClass('loading-c'));\n });\n\n if (!this.loadingCanvas.has(canvas)) {\n canvas.classList.add(cssClass('loading-c'));\n this.loadingCanvas.set(canvas, [{col: column.index, render}]);\n } else {\n this.loadingCanvas.get(canvas)!.push({col: column.index, render});\n }\n }\n\n private renderRow(canvas: HTMLCanvasElement, node: HTMLElement, index: number) {\n if (this.loadingCanvas.has(canvas)) {\n for (const a of this.loadingCanvas.get(canvas)!) {\n a.render.abort();\n }\n this.loadingCanvas.delete(canvas);\n }\n canvas.classList.remove(cssClass('loading-c'));\n\n canvas.width = this.currentCanvasWidth;\n canvas.height = CANVAS_HEIGHT;\n const ctx = canvas.getContext('2d')!;\n ctx.imageSmoothingEnabled = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.save();\n const domColumns = <RenderColumn[]>[];\n\n let x = 0;\n const renderCellImpl = (col: number) => {\n const c = this.columns[col];\n const r = c.renderCell(ctx, index);\n if (r === true) {\n domColumns.push(c);\n } else if (r !== false && isAbortAble(r)) {\n this.pushLazyRedraw(canvas, x, c, r);\n }\n const shift = c.width + COLUMN_PADDING;\n x += shift;\n ctx.translate(shift, 0);\n };\n\n for (const col of this.visibleColumns.frozen) {\n renderCellImpl(col);\n }\n for (let col = this.visibleColumns.first; col <= this.visibleColumns.last; ++col) {\n renderCellImpl(col);\n }\n ctx.restore();\n\n const visibleElements = node.childElementCount - 1; // for canvas\n\n if (domColumns.length === 0) {\n while (node.lastElementChild !== node.firstElementChild) {\n const n = <HTMLElement>node.lastElementChild!;\n node.removeChild(n);\n this.recycleCell(n);\n }\n return;\n }\n if (domColumns.length === 1) {\n const first = domColumns[0];\n if (visibleElements === 0) {\n const item = this.createCellHandled(first, index);\n item.classList.add(cssClass('low'));\n node.appendChild(item);\n return;\n }\n const firstDOM = <HTMLElement>node.lastElementChild!;\n if (visibleElements === 1 && firstDOM.dataset.colId === first.id) {\n const isLoading = isLoadingCell(firstDOM);\n if (isLoading) {\n const item = this.createCellHandled(first, index);\n node.replaceChild(item, firstDOM);\n this.recycleCell(firstDOM, first.index);\n return;\n }\n this.updateCellImpl(first, <HTMLElement>node.lastElementChild, index);\n return;\n }\n }\n\n const existing = new Map((<HTMLElement[]>Array.from(node.children)).slice(1).map((d) => <[string, HTMLElement]>[d.dataset.id, d]));\n for (const col of domColumns) {\n const elem = existing.get(col.id);\n if (elem && !isLoadingCell(elem)) {\n existing.delete(col.id);\n this.updateCellImpl(col, elem, index);\n } else {\n const c = this.createCellHandled(col, index);\n c.classList.add(cssClass('low'));\n node.appendChild(c);\n }\n }\n existing.forEach((v) => {\n v.remove();\n this.recycleCell(v);\n });\n }\n\n\n protected updateCanvasCell(canvas: HTMLCanvasElement, node: HTMLElement, index: number, column: RenderColumn, x: number) {\n // delete lazy that would render the same thing\n if (this.loadingCanvas.has(canvas)) {\n const l = this.loadingCanvas.get(canvas)!;\n const me = l.filter((d) => d.col === column.index);\n if (me.length > 0) {\n this.loadingCanvas.set(canvas, l.filter((d) => d.col !== column.index));\n for (const a of me) {\n a.render.abort();\n }\n }\n }\n\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(x - 1, 0, column.width + 2, canvas.height);\n ctx.save();\n ctx.translate(x, 0);\n const needDOM = column.renderCell(ctx, index);\n ctx.restore();\n\n if (typeof needDOM !== 'boolean' && isAbortAble(needDOM)) {\n this.pushLazyRedraw(canvas, x, column, needDOM);\n }\n\n if (needDOM !== true && node.childElementCount === 1) { // just canvas\n return;\n }\n const elem = <HTMLElement>node.querySelector(`[data-id=\"${column.id}\"]`);\n if (elem && !needDOM) {\n elem.remove();\n this.recycleCell(elem, column.index);\n return;\n }\n if (elem) {\n return this.updateCellImpl(column, elem, index);\n }\n\n const c = this.createCellHandled(column, index);\n c.classList.add(cssClass('low'));\n node.appendChild(c);\n }\n\n private reindex() {\n this.columns.forEach((c, i) => {\n c.index = i;\n });\n }\n\n updateAll() {\n this.columns.forEach((c, i) => {\n c.index = i;\n c.renderers = this.ctx.createRenderer(c.c);\n });\n\n this._context = Object.assign({}, this._context, {\n column: nonUniformContext(this.columns.map((w) => w.width), 100, COLUMN_PADDING)\n });\n\n this.updateColumnSummaryFlag();\n\n this.events.fire(EngineRanking.EVENT_RECREATE);\n super.recreate();\n this.events.fire(EngineRanking.EVENT_WIDTH_CHANGED);\n }\n\n updateBody() {\n if (this.hidden) {\n return;\n }\n this.events.fire(EngineRanking.EVENT_WIDTH_CHANGED);\n super.forEachRow((row, rowIndex) => this.updateRow(row, rowIndex));\n }\n\n updateHeaderOf(col: Column) {\n const i = this._context.columns.findIndex((d) => d.c === col);\n if (i < 0) {\n return false;\n }\n const node = <HTMLElement>this.header.children[i]!;\n const column = this._context.columns[i];\n if (node && column) {\n this.updateHeader(node, column);\n }\n this.updateColumnSummaryFlag();\n return node && column;\n }\n\n protected createRow(node: HTMLElement, rowIndex: number): void {\n node.classList.add(this.style.cssClasses.tr);\n this.roptions.customRowUpdate(node, rowIndex);\n if (this.highlightHandler.enabled) {\n node.addEventListener('mouseenter', this.highlightHandler.enter, PASSIVE);\n this.rowFlags(node).highlight = true;\n }\n\n const isGroup = this.renderCtx.isGroup(rowIndex);\n\n const meta = this.toRowMeta(rowIndex);\n if (!meta) {\n delete node.dataset.meta;\n } else {\n node.dataset.meta = meta;\n }\n\n if (isGroup) {\n node.dataset.agg = 'group';\n super.createRow(node, rowIndex);\n return;\n }\n\n const {dataIndex} = this.renderCtx.getRow(rowIndex);\n node.classList.toggle(engineCssClass('highlighted'), this.highlight === dataIndex);\n node.dataset.i = dataIndex.toString();\n node.dataset.agg = 'detail'; //or 'group'\n\n this.selection.updateState(node, dataIndex);\n this.selection.add(node);\n\n const low = this.roptions.levelOfDetail(rowIndex) === 'low';\n node.classList.toggle(cssClass('low'), low);\n\n if (!low || this.ctx.provider.isSelected(dataIndex)) {\n super.createRow(node, rowIndex);\n return;\n }\n\n const canvas = this.selectCanvas();\n node.appendChild(canvas);\n node.addEventListener('mouseenter', this.canvasMouseHandler.enter, PASSIVE);\n this.renderRow(canvas, node, rowIndex);\n }\n\n protected updateRow(node: HTMLElement, rowIndex: number, hoverLod?: 'high' | 'low'): void {\n this.roptions.customRowUpdate(node, rowIndex);\n\n const computedLod = this.roptions.levelOfDetail(rowIndex);\n const low = (hoverLod ? hoverLod : computedLod) === 'low';\n const wasLow = node.classList.contains(cssClass('low'));\n const isGroup = this.renderCtx.isGroup(rowIndex);\n const wasGroup = node.dataset.agg === 'group';\n\n node.classList.toggle(cssClass('low'), computedLod === 'low');\n\n if (this.highlightHandler.enabled && !this.rowFlags(node).highlight) {\n node.addEventListener('mouseenter', this.highlightHandler.enter, PASSIVE);\n this.rowFlags(node).highlight = true;\n }\n\n if (isGroup !== wasGroup) {\n // change of mode clear the children to reinitialize them\n clear(node);\n\n // adapt body\n node.dataset.agg = isGroup ? 'group' : 'detail';\n if (isGroup) {\n node.dataset.i = '';\n this.selection.remove(node);\n } else {\n this.selection.add(node);\n }\n }\n\n if (wasLow && (!computedLod || isGroup)) {\n node.removeEventListener('mouseenter', this.canvasMouseHandler.enter);\n }\n\n const meta = this.toRowMeta(rowIndex);\n if (!meta) {\n delete node.dataset.meta;\n } else {\n node.dataset.meta = meta;\n }\n\n if (isGroup) {\n node.classList.remove(engineCssClass('highlighted'));\n super.updateRow(node, rowIndex);\n return;\n }\n\n const {dataIndex} = this.renderCtx.getRow(rowIndex);\n node.classList.toggle(engineCssClass('highlighted'), this.highlight === dataIndex);\n node.dataset.i = dataIndex.toString();\n this.selection.updateState(node, dataIndex);\n\n const canvas = (wasLow && node.firstElementChild!.nodeName.toLowerCase() === 'canvas') ? <HTMLCanvasElement>node.firstElementChild! : null;\n if (!low || this.ctx.provider.isSelected(dataIndex)) {\n if (canvas) {\n this.recycleCanvas(canvas);\n clear(node);\n node.removeEventListener('mouseenter', this.canvasMouseHandler.enter);\n }\n super.updateRow(node, rowIndex);\n return;\n }\n\n // use canvas\n if (wasLow && canvas) {\n this.renderRow(canvas, node, rowIndex);\n return;\n }\n // clear old\n clear(node);\n node.dataset.agg = 'detail';\n const canvas2 = this.selectCanvas();\n node.appendChild(canvas2);\n node.addEventListener('mouseenter', this.canvasMouseHandler.enter, PASSIVE);\n this.renderRow(canvas2, node, rowIndex);\n }\n\n private updateCanvasBody() {\n this.updateCanvasRule();\n super.forEachRow((row, index) => {\n if (EngineRanking.isCanvasRenderedRow(row)) {\n this.renderRow(<HTMLCanvasElement>row.firstElementChild!, row, index);\n }\n });\n }\n\n private toRowMeta(rowIndex: number) {\n const provider = this.renderCtx.provider;\n const topNGetter = (group: IGroup) => provider.getTopNAggregated(this.ranking, group);\n return toRowMeta(this.renderCtx.getRow(rowIndex), provider.getAggregationStrategy(), topNGetter);\n }\n\n private updateCanvasRule() {\n this.style.updateRule(`renderCanvas${this.tableId}`, `.${cssClass(`low-c${this.tableId}`)}`, {\n transform: `translateX(${this.currentCanvasShift}px)`,\n width: `${this.currentCanvasWidth}px`\n });\n }\n\n protected updateShifts(top: number, left: number) {\n super.updateShifts(top, left);\n\n const width = this.visibleRenderedWidth();\n if (left === this.currentCanvasShift && width === this.currentCanvasWidth) {\n return;\n }\n\n this.currentCanvasShift = left;\n this.currentCanvasWidth = width;\n this.updateCanvasBody();\n }\n\n private recycleCanvas(canvas: HTMLCanvasElement) {\n if (this.loadingCanvas.has(canvas)) {\n for (const a of this.loadingCanvas.get(canvas)!) {\n a.render.abort();\n }\n this.loadingCanvas.delete(canvas);\n } else if (!canvas.classList.contains(cssClass('loading-c'))) {\n this.canvasPool.push(canvas);\n }\n }\n\n enableHighlightListening(enable: boolean) {\n if (this.highlightHandler.enabled === enable) {\n return;\n }\n\n this.highlightHandler.enabled = enable;\n\n if (enable) {\n this.body.addEventListener('mouseleave', this.highlightHandler.leave, PASSIVE);\n super.forEachRow((row) => {\n row.addEventListener('mouseenter', this.highlightHandler.enter, PASSIVE);\n this.rowFlags(row).highlight = true;\n });\n return;\n }\n\n this.body.removeEventListener('mouseleave', this.highlightHandler.leave);\n\n super.forEachRow((row) => {\n row.removeEventListener('mouseenter', this.highlightHandler.enter);\n this.rowFlags(row).highlight = false;\n });\n }\n\n private updateHoveredRow(row: HTMLElement, hover: boolean) {\n const isCanvas = EngineRanking.isCanvasRenderedRow(row);\n if (isCanvas !== hover) {\n return; // good nothing to do\n }\n const index = parseInt(row.dataset.index!, 10);\n this.updateRow(row, index, hover ? 'high' : 'low');\n }\n\n protected forEachRow(callback: (row: HTMLElement, rowIndex: number) => void, inplace: boolean = false) {\n const adapter = (row: HTMLElement, rowIndex: number) => {\n if (EngineRanking.isCanvasRenderedRow(row)) {\n // skip canvas\n return;\n }\n callback(row, rowIndex);\n };\n return super.forEachRow(adapter, inplace);\n }\n\n updateSelection(selectedDataIndices: {has(i: number): boolean}) {\n super.forEachRow((node: HTMLElement, rowIndex: number) => {\n if (this.renderCtx.isGroup(rowIndex)) {\n this.updateRow(node, rowIndex);\n } else {\n // fast pass for item\n this.selection.update(node, selectedDataIndices);\n }\n }, true);\n }\n\n updateColumnWidths() {\n // update the column context in place\n (<any>this._context).column = nonUniformContext(this._context.columns.map((w) => w.width), 100, COLUMN_PADDING);\n super.updateColumnWidths();\n const {columns} = this.context;\n //no data update needed since just width changed\n columns.forEach((column) => {\n if (column instanceof MultiLevelRenderColumn) {\n column.updateWidthRule(this.style);\n }\n column.renderers = this.ctx.createRenderer(column.c);\n });\n this.events.fire(EngineRanking.EVENT_WIDTH_CHANGED);\n }\n\n private updateColumn(index: number) {\n const columns = this.context.columns;\n const column = columns[index];\n if (!column) {\n return false;\n }\n let x = 0;\n for (let i = this.visibleColumns.first; i < index; ++i) {\n x += columns[i].width + COLUMN_PADDING;\n }\n super.forEachRow((row, rowIndex) => {\n if (EngineRanking.isCanvasRenderedRow(row)) {\n this.updateCanvasCell(<HTMLCanvasElement>row.firstElementChild!, row, rowIndex, column, x);\n return;\n }\n this.updateCellImpl(column, <HTMLElement>row.children[index], rowIndex);\n });\n return true;\n }\n\n private updateCellImpl(column: RenderColumn, before: HTMLElement, rowIndex: number) {\n if (!before) {\n return; // race condition\n }\n const r = this.updateCell(before, rowIndex, column);\n let after: HTMLElement;\n if (isAsyncUpdate(r)) {\n after = this.handleCellReady(r.item, r.ready, column.index);\n } else {\n after = r;\n }\n if (before === after || !after) {\n return;\n }\n this.initCellClasses(after, column.id);\n before.parentElement!.replaceChild(after, before);\n }\n\n private initCellClasses(node: HTMLElement, id: string) {\n node.dataset.id = id;\n node.classList.add(engineCssClass('td'), this.style.cssClasses.td, engineCssClass(`td-${this.tableId}`));\n }\n\n destroy() {\n super.destroy();\n this.style.deleteRule(`hoverOnly${this.tableId}`);\n this.style.deleteRule(`renderCanvas${this.tableId}`);\n this.ranking.flatColumns.forEach((c) => EngineRanking.disableListener(c));\n }\n\n groupData(): (IGroupItem | IGroupData)[] {\n const groups = this.ranking.getGroups();\n const provider = this.ctx.provider;\n const strategy = provider.getAggregationStrategy();\n const alwaysShowGroup = isAlwaysShowingGroupStrategy(strategy);\n\n const r = <(IGroupItem | IGroupData)[]>[];\n\n if (groups.length === 0) {\n return r;\n }\n\n const pushItem = (group: IOrderedGroup, dataIndex: number, i: number) => {\n r.push({\n group,\n dataIndex,\n relativeIndex: i\n });\n };\n\n if (groups.length === 1 && groups[0].name === defaultGroup.name) {\n const group = groups[0];\n const l = group.order.length;\n for (let i = 0; i < l; ++i) {\n pushItem(group, group.order[i], i);\n }\n return r;\n }\n\n const roots = groupRoots(groups);\n\n const pushGroup = (group: IOrderedGroup | Readonly<IGroupParent>) => {\n const n = provider.getTopNAggregated(this.ranking, group);\n\n // all are IOrderedGroup since propagated\n const ordered = <IOrderedGroup>group;\n const gparent = <IGroupParent>group;\n\n if (n === 0 || alwaysShowGroup) {\n r.push(ordered);\n }\n\n if (n !== 0 && Array.isArray(gparent.subGroups) && gparent.subGroups.length > 0) {\n for (const g of gparent.subGroups) {\n pushGroup(<IOrderedGroup | Readonly<IGroupParent>>g);\n }\n return;\n }\n\n const l = n < 0 ? ordered.order.length : Math.min(n, ordered.order.length);\n for (let i = 0; i < l; ++i) {\n pushItem(ordered, ordered.order[i], i);\n }\n };\n\n for (const root of roots) {\n pushGroup(root);\n }\n\n return r;\n }\n\n render(data: (IGroupItem | IGroupData)[], rowContext: IExceptionContext) {\n const previous = this._context;\n const previousData = this.data;\n this.data = data;\n\n this.columns.forEach((c, i) => {\n c.index = i;\n c.renderers = this.ctx.createRenderer(c.c);\n });\n this._context = Object.assign({\n columns: this.columns,\n column: nonUniformContext(this.columns.map((w) => w.width), 100, COLUMN_PADDING)\n }, rowContext);\n\n if (!this.bodyScroller) { // somehow not part of dom\n return;\n }\n this.events.fire(EngineRanking.EVENT_RECREATE);\n return super.recreate(this.roptions.animation ? lineupAnimation(previous, previousData, this.data) : undefined);\n }\n\n setHighlight(dataIndex: number) {\n this.highlight = dataIndex;\n const old = this.body.querySelector(`[data-i].${engineCssClass('highlighted')}`);\n if (old) {\n old.classList.remove(engineCssClass('highlighted'));\n }\n if (dataIndex < 0) {\n return;\n }\n const item = this.body.querySelector(`[data-i=\"${dataIndex}\"]`);\n if (item) {\n item.classList.add(engineCssClass('highlighted'));\n }\n return item != null;\n }\n\n findNearest(dataIndices: number[]) {\n // find the nearest visible data index\n // first check if already visible\n const index = dataIndices.find((d) => Boolean(this.body.querySelectorAll(`[data-i=\"${d}\"]`)));\n if (index != null) {\n return index; // visible one\n }\n const visible = this.visible;\n const lookFor = new Set(dataIndices);\n let firstBeforePos = -1;\n let firstAfterPos = -1;\n for (let i = visible.first; i >= 0; --i) {\n const d = this.data[i];\n if (!isGroup(d) && lookFor.has(d.dataIndex)) {\n firstBeforePos = i;\n break;\n }\n }\n for (let i = visible.last; i < this.data.length; ++i) {\n const d = this.data[i];\n if (!isGroup(d) && lookFor.has(d.dataIndex)) {\n firstAfterPos = i;\n break;\n }\n }\n\n if (firstBeforePos < 0 && firstBeforePos < 0) {\n return -1; // not found at all\n }\n const nearestPos = (firstBeforePos >= 0 && (visible.first - firstBeforePos) < (firstAfterPos - visible.last)) ? firstBeforePos : firstAfterPos;\n return (<IGroupItem>this.data[nearestPos]).dataIndex;\n }\n\n scrollIntoView(dataIndex: number) {\n const item = this.body.querySelector(`[data-i=\"${dataIndex}\"]`);\n if (item) {\n item.scrollIntoView(true);\n return true;\n }\n const index = this.data.findIndex((d) => !isGroup(d) && d.dataIndex === dataIndex);\n if (index < 0) {\n return false; // part of a group?\n }\n\n const posOf = () => {\n const c = this._context;\n if (c.exceptions.length === 0 || index < c.exceptions[0].index) {\n // fast pass\n return index * c.defaultRowHeight;\n }\n const before = c.exceptions.reverse().find((d) => d.index <= index);\n if (!before) {\n return -1;\n }\n if (before.index === index) {\n return before.y;\n }\n const regular = index - before.index - 1;\n return before.y2 + regular * c.defaultRowHeight;\n };\n const pos = posOf();\n if (pos < 0) {\n return false;\n }\n const scroller = this.bodyScroller;\n if (!scroller) {\n return false;\n }\n const top = scroller.scrollTop;\n scroller.scrollTop = Math.min(pos, scroller.scrollHeight - scroller.clientHeight);\n this.onScrolledVertically(scroller.scrollTop, scroller.clientHeight, top < scroller.scrollTop);\n\n const found = this.body.querySelector(`[data-i=\"${dataIndex}\"]`);\n if (found) {\n found.scrollIntoView(true);\n return true;\n }\n return false;\n }\n\n getHighlight() {\n const item = <HTMLElement>this.body.querySelector(`[data-i]:hover, [data-i].${engineCssClass('highlighted')}`);\n if (item) {\n return parseInt(item.dataset.i!, 10);\n }\n return this.highlight;\n }\n\n private createCol(c: Column, index: number) {\n const col = (isMultiLevelColumn(c) && !c.getCollapsed()) ? new MultiLevelRenderColumn(c, index, this.renderCtx, this.roptions.flags) : new RenderColumn(c, index, this.renderCtx, this.roptions.flags);\n\n c.on(`${Column.EVENT_WIDTH_CHANGED}.body`, () => {\n // replace myself upon width change since we renderers are allowed to\n col.renderers = this.ctx.createRenderer(c);\n this.delayedUpdateColumnWidths();\n });\n const debounceUpdate = debounce(() => {\n const valid = this.updateColumn(col.index);\n if (!valid) {\n EngineRanking.disableListener(c); // destroy myself\n }\n }, 25);\n c.on([`${Column.EVENT_RENDERER_TYPE_CHANGED}.body`, `${Column.EVENT_GROUP_RENDERER_TYPE_CHANGED}.body`], () => {\n // replace myself upon renderer type change\n col.renderers = this.ctx.createRenderer(c);\n debounceUpdate();\n });\n const that = this;\n c.on(`${Column.EVENT_DIRTY_HEADER}.body`, function (this: IEventContext) {\n const valid = that.updateHeaderOf(col.c);\n if (!valid) {\n EngineRanking.disableListener(c); // destroy myself\n }\n });\n c.on(suffix('.body', Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, Column.EVENT_DIRTY_CACHES), () => {\n // replace myself upon renderer type change\n col.renderers = this.ctx.createRenderer(c);\n const valid = this.updateHeaderOf(col.c);\n if (!valid) {\n EngineRanking.disableListener(c); // destroy myself\n }\n });\n c.on(`${Column.EVENT_DIRTY_VALUES}.body`, debounceUpdate);\n\n if (isMultiLevelColumn(c)) {\n c.on(`${StackColumn.EVENT_COLLAPSE_CHANGED}.body`, () => {\n // rebuild myself from scratch\n EngineRanking.disableListener(c); // destroy myself\n const index = col.index;\n const replacement = this.createCol(c, index);\n replacement.index = index;\n this.columns.splice(index, 1, replacement);\n this.delayedUpdateAll();\n });\n if (!c.getCollapsed()) {\n (<MultiLevelRenderColumn>col).updateWidthRule(this.style);\n c.on(`${StackColumn.EVENT_MULTI_LEVEL_CHANGED}.body`, () => {\n (<MultiLevelRenderColumn>col).updateWidthRule(this.style);\n });\n c.on(`${StackColumn.EVENT_MULTI_LEVEL_CHANGED}.bodyUpdate`, debounceUpdate);\n }\n }\n\n return col;\n }\n\n private static isCanvasRenderedRow(row: HTMLElement) {\n return row.classList.contains(cssClass('low')) && row.childElementCount >= 1 && row.firstElementChild!.nodeName.toLowerCase() === 'canvas';\n }\n\n private static disableListener(c: Column) {\n c.on(`${Column.EVENT_WIDTH_CHANGED}.body`, null);\n c.on(suffix('.body', Column.EVENT_RENDERER_TYPE_CHANGED, Column.EVENT_GROUP_RENDERER_TYPE_CHANGED, Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, Column.EVENT_DIRTY_CACHES, Column.EVENT_LABEL_CHANGED), null);\n c.on(`${Ranking.EVENT_DIRTY_HEADER}.body`, null);\n c.on(`${Ranking.EVENT_DIRTY_VALUES}.body`, null);\n\n if (!(isMultiLevelColumn(c))) {\n return;\n }\n c.on(`${StackColumn.EVENT_COLLAPSE_CHANGED}.body`, null);\n c.on(`${StackColumn.EVENT_MULTI_LEVEL_CHANGED}.body`, null);\n c.on(`${StackColumn.EVENT_MULTI_LEVEL_CHANGED}.bodyUpdate`, null);\n }\n}\n","import {IExceptionContext, ITableSection, range} from 'lineupengine';\nimport {IGroupData, IGroupItem, IOrderedGroup, isGroup, Ranking} from '../model';\nimport {aria, cssClass, engineCssClass, SLOPEGRAPH_WIDTH} from '../styles';\nimport {IRankingHeaderContextContainer, EMode} from './interfaces';\nimport {forEachIndices, filterIndices} from '../model/internal';\n\ninterface ISlope {\n isSelected(selection: {has(dataIndex: number): boolean}): boolean;\n\n update(path: SVGPathElement, width: number): void;\n\n readonly dataIndices: number[];\n}\n\nclass ItemSlope implements ISlope {\n constructor(private readonly left: number, private readonly right: number, public readonly dataIndices: number[]) {\n\n }\n\n isSelected(selection: {has(dataIndex: number): boolean}) {\n return this.dataIndices.length === 1 ? selection.has(this.dataIndices[0]) : this.dataIndices.some((s) => selection.has(s));\n }\n\n update(path: SVGPathElement, width: number) {\n path.setAttribute('data-i', String(this.dataIndices[0]));\n path.setAttribute('class', cssClass('slope'));\n path.setAttribute('d', `M0,${this.left}L${width},${this.right}`);\n }\n}\n\nclass GroupSlope implements ISlope {\n constructor(private readonly left: [number, number], private readonly right: [number, number], public readonly dataIndices: number[]) {\n\n }\n\n isSelected(selection: {has(dataIndex: number): boolean}) {\n return this.dataIndices.some((s) => selection.has(s));\n }\n\n update(path: SVGPathElement, width: number) {\n path.setAttribute('class', cssClass('group-slope'));\n path.setAttribute('d', `M0,${this.left[0]}L${width},${this.right[0]}L${width},${this.right[1]}L0,${this.left[1]}Z`);\n }\n}\n\ninterface IPos {\n start: number;\n heightPerRow: number;\n rows: number[]; // data indices\n offset: number;\n ref: number[];\n group: IOrderedGroup;\n}\n\nexport interface ISlopeGraphOptions {\n mode: EMode;\n}\n\nexport default class SlopeGraph implements ITableSection {\n readonly node: SVGSVGElement;\n\n private leftSlopes: ISlope[][] = [];\n // rendered row to one ore multiple slopes\n private rightSlopes: ISlope[][] = [];\n private readonly pool: SVGPathElement[] = [];\n\n private scrollListener: ((act: {top: number, height: number}) => void) | null = null;\n\n readonly width = SLOPEGRAPH_WIDTH;\n readonly height = 0;\n\n private current: {\n leftRanking: Ranking;\n left: (IGroupItem | IGroupData)[];\n leftContext: IExceptionContext;\n rightRanking: Ranking;\n right: (IGroupItem | IGroupData)[];\n rightContext: IExceptionContext;\n } | null = null;\n\n private chosen = new Set<ISlope>();\n private chosenSelectionOnly = new Set<ISlope>();\n\n private _mode: EMode = EMode.ITEM;\n\n constructor(public readonly header: HTMLElement, public readonly body: HTMLElement, public readonly id: string, private readonly ctx: IRankingHeaderContextContainer, options: Partial<ISlopeGraphOptions> = {}) {\n this.node = header.ownerDocument!.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.node.innerHTML = `<g transform=\"translate(0,0)\"></g>`;\n header.classList.add(cssClass('slopegraph-header'));\n this._mode = options.mode === EMode.BAND ? EMode.BAND : EMode.ITEM;\n this.initHeader(header);\n body.classList.add(cssClass('slopegraph'));\n this.body.style.height = `1px`;\n body.appendChild(this.node);\n }\n\n init() {\n this.hide(); // hide by default\n\n const scroller = <any>this.body.parentElement!;\n\n //sync scrolling of header and body\n // use internals from lineup engine\n const scroll = (<any>scroller).__le_scroller__;\n let old: {top: number, height: number} = scroll.asInfo();\n scroll.push('animation', this.scrollListener = (act: {top: number, height: number}) => {\n if (Math.abs(old.top - act.top) < 5) {\n return;\n }\n old = act;\n this.onScrolledVertically(act.top, act.height);\n });\n }\n\n private initHeader(header: HTMLElement) {\n const active = cssClass('active');\n header.innerHTML = `<i title=\"Item\" class=\"${this._mode === EMode.ITEM ? active : ''}\">${aria('Item')}</i>\n <i title=\"Band\" class=\"${this._mode === EMode.BAND ? active : ''}\">${aria('Band')}</i>`;\n\n const icons = <HTMLElement[]>Array.from(header.children);\n icons.forEach((n: HTMLElement, i) => {\n n.onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n if (n.classList.contains(active)) {\n return;\n }\n this.mode = i === 0 ? EMode.ITEM : EMode.BAND;\n icons.forEach((d, j) => d.classList.toggle(active, j === i));\n };\n });\n }\n\n get mode() {\n return this._mode;\n }\n\n set mode(value: EMode) {\n if (value === this._mode) {\n return;\n }\n this._mode = value;\n if (this.current) {\n this.rebuild(this.current.leftRanking, this.current.left, this.current.leftContext, this.current.rightRanking, this.current.right, this.current.rightContext);\n }\n }\n\n get hidden() {\n return this.header.classList.contains(engineCssClass('loading'));\n }\n\n set hidden(value: boolean) {\n this.header.classList.toggle(engineCssClass('loading'), value);\n this.body.classList.toggle(engineCssClass('loading'), value);\n }\n\n hide() {\n this.hidden = true;\n }\n\n show() {\n const was = this.hidden;\n this.hidden = false;\n if (was) {\n this.revalidate();\n }\n }\n\n destroy() {\n this.header.remove();\n if (this.scrollListener) {\n //sync scrolling of header and body\n // use internals from lineup engine\n const scroll = (<any>this.body.parentElement!).__le_scroller__;\n scroll.remove(this.scrollListener);\n }\n this.body.remove();\n }\n\n rebuild(leftRanking: Ranking, left: (IGroupItem | IGroupData)[], leftContext: IExceptionContext, rightRanking: Ranking, right: (IGroupItem | IGroupData)[], rightContext: IExceptionContext) {\n this.current = {leftRanking, left, leftContext, right, rightRanking, rightContext};\n\n const lookup: Map<number, IPos> = this.prepareRightSlopes(right, rightContext);\n this.computeSlopes(left, leftContext, lookup);\n\n this.revalidate();\n }\n\n private computeSlopes(left: (IGroupItem | IGroupData)[], leftContext: IExceptionContext, lookup: Map<number, IPos>) {\n const mode = this.mode;\n const fakeGroups = new Map<IOrderedGroup, ISlope[]>();\n\n const createFakeGroup = (first: number, group: IOrderedGroup) => {\n let count = 0;\n let height = 0;\n // find all items in this group, assuming that they are in order\n for (let i = first; i < left.length; ++i) {\n const item = left[i];\n if (isGroup(item) || (<IGroupItem>item).group !== group) {\n break;\n }\n count++;\n height += (leftContext.exceptionsLookup.get(i) || leftContext.defaultRowHeight);\n }\n\n const padded = height - leftContext.padding(first + count - 1);\n\n const gr = group;\n\n return {gr, padded, height};\n };\n\n let acc = 0;\n this.leftSlopes = left.map((r, i) => {\n\n let height = (leftContext.exceptionsLookup.get(i) || leftContext.defaultRowHeight);\n let padded = height - 0; //leftContext.padding(i);\n const slopes = <ISlope[]>[];\n const start = acc;\n\n // shift by item height\n acc += height;\n\n let offset = 0;\n\n const push = (s: ISlope, right: IPos, common = 1, heightPerRow = 0) => {\n // store slope in both\n slopes.push(s);\n forEachIndices(right.ref, (r) => this.rightSlopes[r].push(s));\n\n // update the offset of myself and of the right side\n right.offset += common * right.heightPerRow;\n offset += common * heightPerRow;\n };\n\n let gr: IGroupData;\n\n if (isGroup(r)) {\n gr = r;\n } else {\n const item = (<IGroupItem>r);\n const dataIndex = item.dataIndex;\n const right = lookup.get(dataIndex);\n\n if (!right) { // no match\n return slopes;\n }\n if (mode === EMode.ITEM) {\n const s = new ItemSlope(start + padded / 2, right.start + right.offset + right.heightPerRow / 2, [dataIndex]);\n push(s, right);\n return slopes;\n }\n\n if (fakeGroups.has(item.group)) {\n // already handled by the first one, take the fake slopes\n return fakeGroups.get(item.group)!;\n }\n\n const fakeGroup = createFakeGroup(i, item.group);\n gr = fakeGroup.gr;\n height = fakeGroup.height;\n padded = fakeGroup.padded;\n fakeGroups.set(item.group, slopes);\n }\n\n // free group items to share\n const free = new Set(gr.order);\n\n const heightPerRow = padded / gr.order.length;\n\n forEachIndices(gr.order, (d: number) => {\n if (!free.has(d)) {\n return; // already handled\n }\n free.delete(d);\n const right = lookup.get(d);\n if (!right) {\n return; // no matching\n }\n // find all of this group\n const intersection = filterIndices(right.rows, (r) => free.delete(r));\n intersection.push(d); //self\n\n const common = intersection.length;\n let s: ISlope;\n if (common === 1) {\n s = new ItemSlope(start + offset + heightPerRow / 2, right.start + right.offset + right.heightPerRow / 2, [d]);\n } else if (mode === EMode.ITEM) {\n // fake item\n s = new ItemSlope(start + offset + heightPerRow * common / 2, right.start + right.offset + right.heightPerRow * common / 2, intersection);\n } else {\n s = new GroupSlope([start + offset, start + offset + heightPerRow * common], [right.start + right.offset, right.start + right.offset + right.heightPerRow * common], intersection);\n }\n push(s, right, common, heightPerRow);\n });\n return slopes;\n });\n }\n\n private prepareRightSlopes(right: (IGroupItem | IGroupData)[], rightContext: IExceptionContext) {\n const lookup = new Map<number, IPos>();\n const mode = this.mode;\n\n const fakeGroups = new Map<IOrderedGroup, IPos>();\n let acc = 0;\n\n this.rightSlopes = right.map((r, i) => {\n const height = (rightContext.exceptionsLookup.get(i) || rightContext.defaultRowHeight);\n const padded = height - 0; //rightContext.padding(i);\n const start = acc;\n acc += height;\n const slopes = <ISlope[]>[];\n\n const base = {\n start,\n offset: 0,\n ref: [i]\n };\n if (isGroup(r)) {\n const p = Object.assign(base, {\n rows: Array.from(r.order),\n heightPerRow: padded / r.order.length,\n group: r\n });\n\n forEachIndices(r.order, (ri) => lookup.set(ri, p));\n return slopes;\n }\n // item\n const item = (<IGroupItem>r);\n const dataIndex = r.dataIndex;\n\n let p = Object.assign(base, {\n rows: [dataIndex],\n heightPerRow: padded,\n group: item.group\n });\n\n if (mode === EMode.ITEM) {\n lookup.set(dataIndex, p);\n return slopes;\n }\n // forced band mode\n // merge with the 'ueber' band\n if (!fakeGroups.has(item.group)) {\n p.heightPerRow = height; // include padding\n // TODO just support uniform item height\n fakeGroups.set(item.group, p);\n } else { // reuse old\n p = fakeGroups.get(item.group)!;\n p.rows.push(dataIndex);\n p.ref.push(i);\n }\n lookup.set(dataIndex, p);\n return slopes;\n });\n\n return lookup;\n }\n\n private revalidate() {\n if (!this.current || this.hidden) {\n return;\n }\n const p = this.body.parentElement!;\n this.onScrolledVertically(p.scrollTop, p.clientHeight);\n }\n\n\n highlight(dataIndex: number) {\n const highlight = engineCssClass('highlighted');\n const old = this.body.querySelector(`[data-i].${highlight}`);\n if (old) {\n old.classList.remove(highlight);\n }\n if (dataIndex < 0) {\n return;\n }\n const item = this.body.querySelector(`[data-i=\"${dataIndex}\"]`);\n if (item) {\n item.classList.add(highlight);\n }\n return item != null;\n }\n\n private onScrolledVertically(scrollTop: number, clientHeight: number) {\n if (!this.current) {\n return;\n }\n\n // which lines are currently shown\n const {leftContext, rightContext} = this.current;\n const left = range(scrollTop, clientHeight, leftContext.defaultRowHeight, leftContext.exceptions, leftContext.numberOfRows);\n const right = range(scrollTop, clientHeight, rightContext.defaultRowHeight, rightContext.exceptions, rightContext.numberOfRows);\n\n const start = Math.min(left.firstRowPos, right.firstRowPos);\n const end = Math.max(left.endPos, right.endPos);\n\n // move to right position\n this.body.style.transform = `translate(0, ${start.toFixed(0)}px)`;\n this.body.style.height = `${(end - start).toFixed(0)}px`;\n (this.node.firstElementChild!).setAttribute('transform', `translate(0,-${start.toFixed(0)})`);\n\n this.chosen = this.choose(left.first, left.last, right.first, right.last);\n this.render(this.chosen, this.chooseSelection(left.first, left.last, this.chosen));\n }\n\n private choose(leftVisibleFirst: number, leftVisibleLast: number, rightVisibleFirst: number, rightVisibleLast: number) {\n // assume no separate scrolling\n\n const slopes = new Set<ISlope>();\n for (let i = leftVisibleFirst; i <= leftVisibleLast; ++i) {\n for (const s of this.leftSlopes[i]) {\n slopes.add(s);\n }\n }\n for (let i = rightVisibleFirst; i <= rightVisibleLast; ++i) {\n for (const s of this.rightSlopes[i]) {\n slopes.add(s);\n }\n }\n return slopes;\n }\n\n private chooseSelection(leftVisibleFirst: number, leftVisibleLast: number, alreadyVisible: Set<ISlope>) {\n const slopes = new Set<ISlope>();\n // ensure selected slopes are always part of\n const p = this.ctx.provider;\n\n if (p.getSelection().length === 0) {\n return slopes;\n }\n\n const selectionLookup = {has: (dataIndex: number) => p.isSelected(dataIndex)};\n\n // try all not visible ones\n for (let i = 0; i < leftVisibleFirst; ++i) {\n for (const s of this.leftSlopes[i]) {\n if (s.isSelected(selectionLookup) && !alreadyVisible.has(s)) {\n slopes.add(s);\n }\n }\n }\n for (let i = leftVisibleLast + 1; i < this.leftSlopes.length; ++i) {\n for (const s of this.leftSlopes[i]) {\n if (s.isSelected(selectionLookup) && !alreadyVisible.has(s)) {\n slopes.add(s);\n }\n }\n }\n return slopes;\n }\n\n private updatePath(p: SVGPathElement, g: SVGGElement, s: ISlope, width: number, selection: {has(dataIndex: number): boolean}) {\n s.update(p, width);\n (<any>p).__data__ = s; // data binding\n const selected = s.isSelected(selection);\n p.classList.toggle(cssClass('selected'), selected);\n if (selected) {\n g.appendChild(p); // to put it on top\n }\n }\n\n private render(visible: Set<ISlope>, selectionSlopes: Set<ISlope>) {\n const g = <SVGGElement>this.node.firstElementChild!;\n const width = g.ownerSVGElement!.getBoundingClientRect()!.width;\n const paths = this.matchLength(visible.size + selectionSlopes.size, g);\n\n const p = this.ctx.provider;\n const selectionLookup = {has: (dataIndex: number) => p.isSelected(dataIndex)};\n\n // update paths\n let i = 0;\n const updatePath = (s: ISlope) => {\n this.updatePath(paths[i++], g, s, width, selectionLookup);\n };\n\n visible.forEach(updatePath);\n selectionSlopes.forEach(updatePath);\n }\n\n private addPath(g: SVGGElement) {\n const elem = this.pool.pop();\n if (elem) {\n g.appendChild(elem);\n return elem;\n }\n\n const path = g.ownerDocument!.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.onclick = (evt) => {\n // d3 style\n const s: ISlope = (<any>path).__data__;\n const p = this.ctx.provider;\n const ids = s.dataIndices;\n if (evt.ctrlKey) {\n ids.forEach((id) => p.toggleSelection(id, true));\n } else {\n // either unset or set depending on the first state\n const isSelected = p.isSelected(ids[0]!);\n p.setSelection(isSelected ? [] : ids);\n }\n };\n g.appendChild(path);\n return path;\n }\n\n private matchLength(slopes: number, g: SVGGElement) {\n const paths = <SVGPathElement[]>Array.from(g.children);\n for (let i = slopes; i < paths.length; ++i) {\n const elem = paths[i];\n this.pool.push(elem);\n elem.remove();\n }\n\n for (let i = paths.length; i < slopes; ++i) {\n paths.push(this.addPath(g));\n }\n return paths;\n }\n\n updateSelection(selectedDataIndices: Set<number>) {\n const g = <SVGGElement>this.node.firstElementChild!;\n const paths = <SVGPathElement[]>Array.from(g.children);\n\n const openDataIndices = new Set(selectedDataIndices);\n\n if (selectedDataIndices.size === 0) {\n // clear\n for (const p of paths) {\n const s: ISlope = (<any>p).__data__;\n p.classList.toggle(cssClass('selected'), false);\n if (this.chosenSelectionOnly.has(s)) {\n p.remove();\n }\n }\n this.chosenSelectionOnly.clear();\n return;\n }\n\n for (const p of paths) {\n const s: ISlope = (<any>p).__data__;\n const selected = s.isSelected(selectedDataIndices);\n p.classList.toggle(cssClass('selected'), selected);\n if (!selected) {\n if (this.chosenSelectionOnly.delete(s)) {\n // was only needed because of the selection\n p.remove();\n }\n continue;\n }\n\n g.appendChild(p); // to put it on top\n // remove already handled\n s.dataIndices.forEach((d) => openDataIndices.delete(d));\n }\n\n if (openDataIndices.size === 0) {\n return;\n }\n\n // find and add missing slopes\n const width = g.ownerSVGElement!.getBoundingClientRect()!.width;\n for (const ss of this.leftSlopes) {\n for (const s of ss) {\n if (this.chosen.has(s) || this.chosenSelectionOnly.has(s) || !s.isSelected(openDataIndices)) {\n // not visible or not selected -> skip\n continue;\n }\n // create new path for it\n this.chosenSelectionOnly.add(s);\n const p = this.addPath(g);\n this.updatePath(p, g, s, width, openDataIndices);\n }\n }\n }\n}\n","import {GridStyleManager, MultiTableRowRenderer, nonUniformContext} from 'lineupengine';\nimport {ILineUpFlags, ILineUpOptions} from '../config';\nimport {AEventDispatcher, IEventListener, round, suffix} from '../internal';\nimport {Column, IGroupData, IGroupItem, isGroup, Ranking, IGroup} from '../model';\nimport {DataProvider} from '../provider';\nimport {isSummaryGroup, groupEndLevel} from '../provider/internal';\nimport {IImposer, IRenderContext} from '../renderer';\nimport {chooseGroupRenderer, chooseRenderer, chooseSummaryRenderer, getPossibleRenderer} from '../renderer/renderers';\nimport {cssClass, engineCssClass} from '../styles';\nimport DialogManager from './dialogs/DialogManager';\nimport domElementCache from './domElementCache';\nimport EngineRanking, {IEngineRankingContext} from './EngineRanking';\nimport {EMode, IRankingHeaderContext, IRankingHeaderContextContainer} from './interfaces';\nimport SlopeGraph from './SlopeGraph';\nimport {ADialog} from './dialogs';\n\n/**\n * emitted when the highlight changes\n * @asMemberOf EngineRenderer\n * @param dataIndex the highlghted data index or -1 for none\n * @event\n */\nexport declare function highlightChanged(dataIndex: number): void;\n\n/**\n * emitted a dialog is opened\n * @asMemberOf EngineRenderer\n * @param dialog the opened dialog\n * @event\n */\nexport declare function dialogOpenedER(dialog: ADialog): void;\n/**\n * emitted a dialog is closed\n * @asMemberOf EngineRenderer\n * @param dialog the closed dialog\n * @param action the action how the dialog was closed\n * @event\n */\nexport declare function dialogClosedER(dialog: ADialog, action: 'cancel' | 'confirm'): void;\n\nexport default class EngineRenderer extends AEventDispatcher {\n static readonly EVENT_HIGHLIGHT_CHANGED = EngineRanking.EVENT_HIGHLIGHT_CHANGED;\n static readonly EVENT_DIALOG_OPENED = DialogManager.EVENT_DIALOG_OPENED;\n static readonly EVENT_DIALOG_CLOSED = DialogManager.EVENT_DIALOG_CLOSED;\n\n protected readonly options: Readonly<ILineUpOptions>;\n\n readonly node: HTMLElement;\n private readonly table: MultiTableRowRenderer;\n private readonly rankings: EngineRanking[] = [];\n private readonly slopeGraphs: SlopeGraph[] = [];\n\n readonly ctx: IRankingHeaderContextContainer & IRenderContext & IEngineRankingContext;\n\n private readonly updateAbles: ((ctx: IRankingHeaderContext) => void)[] = [];\n private zoomFactor = 1;\n readonly idPrefix = `lu${Math.random().toString(36).slice(-8).substr(0, 3)}`; //generate a random string with length3;\n\n private enabledHighlightListening: boolean = false;\n\n constructor(protected data: DataProvider, parent: HTMLElement, options: Readonly<ILineUpOptions>) {\n super();\n this.options = options;\n this.node = parent.ownerDocument!.createElement('main');\n this.node.id = this.idPrefix;\n // FIXME inline\n this.node.classList.toggle(cssClass('whole-hover'), options.expandLineOnHover);\n parent.appendChild(this.node);\n\n const dialogManager = new DialogManager({\n doc: parent.ownerDocument!,\n livePreviews: options.livePreviews,\n onDialogBackgroundClick: options.onDialogBackgroundClick,\n });\n this.forward(dialogManager, ...suffix('.main', EngineRenderer.EVENT_DIALOG_OPENED, EngineRenderer.EVENT_DIALOG_CLOSED));\n\n parent.appendChild(dialogManager.node);\n this.ctx = {\n idPrefix: this.idPrefix,\n document: parent.ownerDocument!,\n provider: data,\n tasks: data.getTaskExecutor(),\n dialogManager,\n resolveToolbarActions: (col, keys) => this.options.resolveToolbarActions(col, keys, this.options.toolbarActions),\n resolveToolbarDialogAddons: (col, keys) => this.options.resolveToolbarDialogAddons(col, keys, this.options.toolbarDialogAddons),\n flags: <ILineUpFlags>this.options.flags,\n asElement: domElementCache(parent.ownerDocument!),\n renderer: (col: Column, imposer?: IImposer) => {\n const r = chooseRenderer(col, this.options.renderers);\n return r.create!(col, this.ctx, imposer);\n },\n groupRenderer: (col: Column, imposer?: IImposer) => {\n const r = chooseGroupRenderer(col, this.options.renderers);\n return r.createGroup!(col, this.ctx, imposer);\n },\n summaryRenderer: (col: Column, interactive: boolean, imposer?: IImposer) => {\n const r = chooseSummaryRenderer(col, this.options.renderers);\n return r.createSummary!(col, this.ctx, interactive, imposer);\n },\n createRenderer(col: Column, imposer?: IImposer) {\n const single = this.renderer(col, imposer);\n const group = this.groupRenderer(col, imposer);\n const summary = options.summaryHeader ? this.summaryRenderer(col, false, imposer) : null;\n return {\n single,\n group,\n summary,\n singleId: col.getRenderer(),\n groupId: col.getGroupRenderer(),\n summaryId: col.getSummaryRenderer(),\n singleTemplate: null,\n groupTemplate: null,\n summaryTemplate: null\n };\n },\n getPossibleRenderer: (col: Column) => getPossibleRenderer(col, this.options.renderers, this.options.canRender),\n colWidth: (col: Column) => !col.isVisible() ? 0 : col.getWidth(),\n caches: {\n toolbar: new Map(),\n toolbarAddons: new Map()\n }\n };\n\n this.table = new MultiTableRowRenderer(this.node, this.idPrefix);\n\n {\n // helper object for better resizing experience\n const footer = this.table.node.querySelector(`.${engineCssClass('body')} .${engineCssClass('footer')}`)!;\n const copy = <HTMLElement>footer.cloneNode(true);\n copy.classList.add(cssClass('resize-helper'));\n footer!.insertAdjacentElement('afterend', copy);\n }\n\n //apply rules\n {\n\n this.style.addRule('lineup_rowPadding0', `\n .${this.style.cssClasses.tr}`, {\n marginTop: `${options.rowPadding}px`\n });\n\n for (let level = 0; level < 4; ++level) {\n this.style.addRule(`lineup_groupPadding${level}`, `\n .${this.style.cssClasses.tr}[data-meta~=last${level === 0 ? '' : level}]`, {\n marginBottom: `${options.groupPadding * (level + 1)}px`\n });\n }\n\n\n this.style.addRule('lineup_rowPaddingAgg0', `\n .${cssClass('agg-level')}::after`, {\n top: `-${options.rowPadding}px`\n });\n for (let level = 1; level <= 4; ++level) {\n this.style.addRule(`lineup_rowPaddingAgg${level}`, `\n .${cssClass('agg-level')}[data-level='${level}']::after`, {\n top: `-${options.rowPadding + options.groupPadding}px`\n });\n }\n\n // FIXME flat\n this.style.addRule('lineup_rotation', `\n #${this.idPrefix}.${cssClass('rotated-label')} .${cssClass('label')}.${cssClass('rotated')}`, {\n transform: `rotate(${-this.options.labelRotation}deg)`\n });\n\n const toDisable: string[] = [];\n if (!this.options.flags.advancedRankingFeatures) {\n toDisable.push('ranking');\n }\n if (!this.options.flags.advancedModelFeatures) {\n toDisable.push('model');\n }\n if (!this.options.flags.advancedUIFeatures) {\n toDisable.push('ui');\n }\n if (toDisable.length > 0) {\n this.style.addRule('lineup_feature_disable', `\n ${toDisable.map((d) => `.${cssClass('feature')}-${d}.${cssClass('feature-advanced')}`).join(', ')}`, {\n display: 'none !important'\n });\n }\n }\n\n this.initProvider(data);\n }\n\n get style(): GridStyleManager {\n return this.table.style;\n }\n\n zoomOut() {\n this.zoomFactor = Math.max(this.zoomFactor - 0.1, 0.5);\n this.updateZoomFactor();\n this.update();\n }\n\n zoomIn() {\n this.zoomFactor = Math.min(this.zoomFactor + 0.1, 2.0);\n this.updateZoomFactor();\n this.update();\n }\n\n private updateZoomFactor() {\n const body = <HTMLElement>this.node.querySelector('main')!;\n body.style.fontSize = `${this.zoomFactor * 100}%`;\n }\n\n pushUpdateAble(updateAble: (ctx: IRankingHeaderContext) => void) {\n this.updateAbles.push(updateAble);\n }\n\n protected createEventList() {\n return super.createEventList().concat([EngineRenderer.EVENT_HIGHLIGHT_CHANGED, EngineRenderer.EVENT_DIALOG_OPENED, EngineRenderer.EVENT_DIALOG_CLOSED]);\n }\n\n on(type: typeof EngineRenderer.EVENT_HIGHLIGHT_CHANGED, listener: typeof highlightChanged | null): this;\n on(type: typeof EngineRenderer.EVENT_DIALOG_OPENED, listener: typeof dialogOpenedER | null): this;\n on(type: typeof EngineRenderer.EVENT_DIALOG_CLOSED, listener: typeof dialogClosedER | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n\n setDataProvider(data: DataProvider) {\n this.takeDownProvider();\n\n this.data = data;\n (<any>this.ctx).provider = data;\n (<any>this.ctx).tasks = data.getTaskExecutor();\n\n this.initProvider(data);\n }\n\n private takeDownProvider() {\n this.data.on(`${DataProvider.EVENT_SELECTION_CHANGED}.body`, null);\n this.data.on(`${DataProvider.EVENT_ADD_RANKING}.body`, null);\n this.data.on(`${DataProvider.EVENT_REMOVE_RANKING}.body`, null);\n this.data.on(`${DataProvider.EVENT_GROUP_AGGREGATION_CHANGED}.body`, null);\n this.data.on(`${DataProvider.EVENT_SHOWTOPN_CHANGED}.body`, null);\n this.data.on(`${DataProvider.EVENT_JUMP_TO_NEAREST}.body`, null);\n this.data.on(`${DataProvider.EVENT_BUSY}.body`, null);\n\n this.rankings.forEach((r) => this.table.remove(r));\n this.rankings.splice(0, this.rankings.length);\n this.slopeGraphs.forEach((s) => this.table.remove(s));\n this.slopeGraphs.splice(0, this.slopeGraphs.length);\n }\n\n private initProvider(data: DataProvider) {\n data.on(`${DataProvider.EVENT_SELECTION_CHANGED}.body`, () => this.updateSelection(data.getSelection()));\n data.on(`${DataProvider.EVENT_ADD_RANKING}.body`, (ranking: Ranking) => {\n this.addRanking(ranking);\n });\n data.on(`${DataProvider.EVENT_REMOVE_RANKING}.body`, (ranking: Ranking) => {\n this.removeRanking(ranking);\n });\n data.on(`${DataProvider.EVENT_GROUP_AGGREGATION_CHANGED}.body`, (ranking: Ranking) => {\n this.update(this.rankings.filter((r) => r.ranking === ranking));\n });\n data.on(`${DataProvider.EVENT_SHOWTOPN_CHANGED}.body`, () => {\n this.update(this.rankings);\n });\n data.on(`${DataProvider.EVENT_JUMP_TO_NEAREST}.body`, (indices: number[]) => {\n this.setHighlightToNearest(indices, true);\n });\n\n (<any>this.ctx).provider = data;\n\n this.data.getRankings().forEach((r) => this.addRanking(r));\n }\n\n private updateSelection(dataIndices: number[]) {\n const s = new Set(dataIndices);\n this.rankings.forEach((r) => r.updateSelection(s));\n\n this.slopeGraphs.forEach((r) => r.updateSelection(s));\n }\n\n private updateHist(ranking?: EngineRanking, col?: Column) {\n if (!this.options.summaryHeader) {\n return;\n }\n const rankings = ranking ? [ranking] : this.rankings;\n\n for (const r of rankings) {\n if (col) {\n // single update\n r.updateHeaderOf(col);\n } else {\n r.updateHeaders();\n }\n }\n this.updateUpdateAbles();\n }\n\n private addRanking(ranking: Ranking) {\n if (this.rankings.length > 0) {\n // add slope graph first\n const s = this.table.pushSeparator((header, body) => new SlopeGraph(header, body, `${ranking.id}S`, this.ctx, {\n mode: this.options.defaultSlopeGraphMode === 'band' ? EMode.BAND : EMode.ITEM\n }));\n this.slopeGraphs.push(s);\n }\n\n const r = this.table.pushTable((header, body, tableId, style) => new EngineRanking(ranking, header, body, tableId, style, this.ctx, {\n animation: this.options.animated,\n customRowUpdate: this.options.customRowUpdate || (() => undefined),\n levelOfDetail: this.options.levelOfDetail || (() => 'high'),\n flags: <ILineUpFlags>this.options.flags\n }));\n r.on(EngineRanking.EVENT_WIDTH_CHANGED, () => {\n this.updateRotatedHeaderState();\n this.table.widthChanged();\n });\n r.on(EngineRanking.EVENT_UPDATE_DATA, () => this.update([r]));\n r.on(EngineRanking.EVENT_RECREATE, () => this.updateUpdateAbles());\n this.forward(r, EngineRanking.EVENT_HIGHLIGHT_CHANGED);\n if (this.enabledHighlightListening) {\n r.enableHighlightListening(true);\n }\n\n ranking.on(suffix('.renderer', Ranking.EVENT_ORDER_CHANGED), () => this.updateHist(r));\n\n this.rankings.push(r);\n this.update([r]);\n }\n\n private updateRotatedHeaderState() {\n if (this.options.labelRotation === 0) {\n return;\n }\n const l = this.node.querySelector(`.${cssClass('label')}.${cssClass('rotated')}`);\n this.node.classList.toggle(cssClass('rotated-label'), Boolean(l));\n }\n\n private removeRanking(ranking: Ranking | null) {\n if (!ranking) {\n // remove all\n this.rankings.splice(0, this.rankings.length);\n this.slopeGraphs.splice(0, this.slopeGraphs.length);\n this.table.clear();\n return;\n }\n const index = this.rankings.findIndex((r) => r.ranking === ranking);\n if (index < 0) {\n return; // error\n }\n const section = this.rankings.splice(index, 1)[0]!;\n const slope = this.slopeGraphs.splice(index === 0 ? index : index - 1, 1)[0];\n this.table.remove(section);\n if (slope) {\n this.table.remove(slope);\n }\n }\n\n update(rankings: EngineRanking[] = this.rankings) {\n // visible and has parent = part of dom\n rankings = rankings.filter((d) => !d.hidden && d.body.parentElement!);\n if (rankings.length === 0) {\n return;\n }\n\n const round2 = (v: number) => round(v, 2);\n const rowPadding = round2(this.zoomFactor * this.options.rowPadding!);\n const groupPadding = round2(this.zoomFactor * this.options.groupPadding!);\n\n const heightsFor = (ranking: Ranking, data: (IGroupItem | IGroupData)[]) => {\n if (this.options.dynamicHeight) {\n const impl = this.options.dynamicHeight(data, ranking);\n const f = (v: number | any, d: any) => typeof v === 'number' ? v : v(d);\n if (impl) {\n return {\n defaultHeight: round2(this.zoomFactor * impl.defaultHeight),\n height: (d: IGroupItem | IGroupData) => round2(this.zoomFactor * f(impl.height, d)),\n padding: (d: IGroupItem | IGroupData) => round2(this.zoomFactor * f(impl.padding, d)),\n };\n }\n }\n const item = round2(this.zoomFactor * this.options.rowHeight!);\n const group = round2(this.zoomFactor * this.options.groupHeight!);\n return {\n defaultHeight: item,\n height: (d: IGroupItem | IGroupData) => isGroup(d) ? group : item,\n padding: rowPadding\n };\n };\n\n for (const r of rankings) {\n const grouped = r.groupData();\n\n // inline with creating the groupData\n const {height, defaultHeight, padding} = heightsFor(r.ranking, grouped);\n\n const strategy = this.data.getAggregationStrategy();\n const topNGetter = (group: IGroup) => this.data.getTopNAggregated(r.ranking, group);\n\n // inline and create manually for better performance\n const rowContext = nonUniformContext(grouped.map(height), defaultHeight, (index) => {\n const pad = (typeof padding === 'number' ? padding : padding(grouped[index] || null));\n const v = grouped[index];\n\n if (index < 0 || !v || (isGroup(v) && isSummaryGroup(v, strategy, topNGetter))) {\n return pad;\n }\n return pad + groupPadding * groupEndLevel(v, topNGetter);\n });\n r.render(grouped, rowContext);\n }\n\n this.updateSlopeGraphs(rankings);\n\n this.updateUpdateAbles();\n this.updateRotatedHeaderState();\n this.table.widthChanged();\n }\n\n private updateUpdateAbles() {\n for (const u of this.updateAbles) {\n u(this.ctx);\n }\n }\n\n private updateSlopeGraphs(rankings: EngineRanking[] = this.rankings) {\n const indices = new Set(rankings.map((d) => this.rankings.indexOf(d)));\n\n for (let i = 0; i < this.slopeGraphs.length; ++i) {\n const s = this.slopeGraphs[i];\n if (s.hidden) {\n return;\n }\n const left = i;\n const right = i + 1;\n if (!indices.has(left) && !indices.has(right)) {\n return;\n }\n const leftRanking = this.rankings[left];\n const rightRanking = this.rankings[right];\n s.rebuild(leftRanking.ranking, leftRanking.currentData, leftRanking.context, rightRanking.ranking, rightRanking.currentData, rightRanking.context);\n }\n }\n\n setHighlight(dataIndex: number, scrollIntoView: boolean) {\n const found = this.rankings.map((r) => r.setHighlight(dataIndex));\n this.fire(EngineRenderer.EVENT_HIGHLIGHT_CHANGED, dataIndex);\n if (this.rankings.length === 0 || dataIndex < 0) {\n return false;\n }\n if (!scrollIntoView) {\n return found[0]!;\n }\n return this.rankings[0].scrollIntoView(dataIndex);\n }\n\n setHighlightToNearest(dataIndices: number[], scrollIntoView: boolean) {\n if (this.rankings.length === 0) {\n return false;\n }\n const nearest = this.rankings[0].findNearest(dataIndices);\n if (nearest >= 0) {\n return this.setHighlight(nearest, scrollIntoView);\n }\n return false;\n }\n\n getHighlight() {\n for (const ranking of this.rankings) {\n const h = ranking.getHighlight();\n if (h >= 0) {\n return h;\n }\n }\n return -1;\n }\n\n enableHighlightListening(enable: boolean) {\n for (const ranking of this.rankings) {\n ranking.enableHighlightListening(enable);\n }\n this.enabledHighlightListening = enable;\n }\n\n destroy() {\n this.takeDownProvider();\n this.table.destroy();\n this.node.remove();\n }\n}\n\n","\n\n/**\n * caches parsing of html strings in a dom element cache\n * @param doc the doc to create the elements under\n * @internal\n */\nexport default function domElementCache(doc: Document): (html: string) => HTMLElement {\n const cache = new Map<string, HTMLElement>();\n\n const helper = doc.createElement('div');\n\n return (html: string) => {\n if (cache.has(html)) {\n return <HTMLElement>cache.get(html)!.cloneNode(true);\n }\n\n helper.innerHTML = html;\n const node = <HTMLElement>helper.firstElementChild!;\n // keep a copy\n cache.set(html, <HTMLElement>node.cloneNode(true));\n\n return node;\n };\n}\n","import {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\nimport APopup from './APopup';\n\n/** @internal */\nexport default class ChooseRankingDialog extends APopup {\n\n constructor(private readonly items: HTMLElement[], dialog: IDialogContext) {\n super(dialog);\n }\n\n\n protected build(node: HTMLElement) {\n node.classList.add(cssClass('more-options'), cssClass('choose-options'));\n for (const item of this.items) {\n node.appendChild(item);\n }\n }\n}\n","import {clear, AEventDispatcher, IEventListener} from '../../internal';\nimport {cssClass} from '../../styles';\n\nexport interface IItem {\n id: string;\n text: string;\n}\n\nexport interface IGroupSearchItem<T extends IItem> {\n text: string;\n children: (T | IGroupSearchItem<T>)[];\n}\n\nfunction isItem<T extends IItem>(v: T | IGroupSearchItem<T>): v is T {\n return (<T>v).id !== undefined;\n}\n\nexport interface ISearchBoxOptions<T extends IItem> {\n doc: Document;\n\n formatItem(item: T | IGroupSearchItem<T>, node: HTMLElement): string;\n\n placeholder: string;\n}\n\n/**\n * @asMemberOf SearchBox\n * @event\n */\nexport declare function select(item: any): void;\n\n\nexport default class SearchBox<T extends IItem> extends AEventDispatcher {\n static readonly EVENT_SELECT = 'select';\n\n private readonly options: Readonly<ISearchBoxOptions<T>> = {\n formatItem: (item) => item.text,\n doc: document,\n placeholder: 'Select...',\n };\n\n readonly node: HTMLElement;\n private search: HTMLInputElement;\n private body: HTMLElement;\n\n private readonly itemTemplate: HTMLElement;\n private readonly groupTemplate: HTMLElement;\n\n private values: (T | IGroupSearchItem<T>)[] = [];\n\n constructor(options: Partial<ISearchBoxOptions<T>> = {}) {\n super();\n Object.assign(this.options, options);\n\n this.node = this.options.doc.createElement('div');\n this.node.classList.add(cssClass('search'));\n this.node.innerHTML = `<input class=\"${cssClass('search-input')}\" type=\"search\" placeholder=\"${this.options.placeholder}\">\n <ul class=\"${cssClass('search-list')}\"></ul>`;\n\n this.search = <HTMLInputElement>this.node.firstElementChild!;\n this.body = <HTMLElement>this.node.lastElementChild!;\n\n this.search.onfocus = () => this.focus();\n this.search.onblur = () => this.blur();\n this.search.oninput = () => this.filter();\n this.search.onkeydown = (evt) => this.handleKey(evt);\n\n\n this.itemTemplate = this.options.doc.createElement('li');\n this.itemTemplate.classList.add(cssClass('search-item'));\n this.itemTemplate.innerHTML = `<span></span>`;\n this.groupTemplate = this.options.doc.createElement('li');\n this.groupTemplate.classList.add(cssClass('search-group'));\n this.groupTemplate.innerHTML = `<span></span><ul></ul>`;\n }\n\n get data() {\n return this.values;\n }\n\n set data(data: (T | IGroupSearchItem<T>)[]) {\n this.values = data;\n clear(this.body);\n this.buildDialog(this.body, this.values);\n }\n\n private buildDialog(node: HTMLElement, values: (T | IGroupSearchItem<T>)[]) {\n for (const v of values) {\n let li: HTMLElement;\n if (isItem(v)) {\n li = <HTMLElement>this.itemTemplate.cloneNode(true);\n li.onmousedown = (evt) => {\n // see https://stackoverflow.com/questions/10652852/jquery-fire-click-before-blur-event#10653160\n evt.preventDefault();\n };\n li.onclick = () => this.select(v);\n li.onmouseenter = () => this.highlighted = li;\n li.onmouseleave = () => this.highlighted = null;\n node.appendChild(li);\n } else {\n li = <HTMLElement>this.groupTemplate.cloneNode(true);\n this.buildDialog(<HTMLElement>li.lastElementChild!, v.children);\n node.appendChild(li);\n }\n const item = <HTMLElement>li.firstElementChild!;\n item.innerHTML = this.options.formatItem(v, item);\n }\n }\n\n private handleKey(evt: KeyboardEvent) {\n const KEYS = {\n ESC: 27,\n ENTER: 13,\n UP: 38,\n DOWN: 40\n };\n switch (evt.which) {\n case KEYS.ESC:\n this.search.blur();\n break;\n case KEYS.ENTER:\n const h = this.highlighted;\n if (h) {\n h.click();\n }\n break;\n case KEYS.UP:\n this.highlightPrevious();\n break;\n case KEYS.DOWN:\n this.highlightNext();\n break;\n }\n }\n\n private select(item: T) {\n this.search.value = ''; // reset\n this.search.blur();\n this.fire(SearchBox.EVENT_SELECT, item);\n }\n\n focus() {\n this.body.style.width = `${this.search.offsetWidth}px`;\n this.highlighted = <HTMLElement>this.body.firstElementChild || null;\n this.node.classList.add(cssClass('search-open'));\n }\n\n private get highlighted() {\n return <HTMLElement>this.body.getElementsByClassName(cssClass('search-highlighted'))[0] || null;\n }\n\n private set highlighted(value: HTMLElement | null) {\n const old = this.highlighted;\n if (old === value) {\n return;\n }\n if (old) {\n old.classList.remove(cssClass('search-highlighted'));\n }\n if (value) {\n value.classList.add(cssClass('search-highlighted'));\n }\n }\n\n private highlightNext() {\n const h = this.highlighted;\n if (!h || h.classList.contains(cssClass('hidden'))) {\n this.highlighted = <HTMLElement>this.body.querySelector(`.${cssClass('search-item')}:not(.${cssClass('hidden')})`) || null;\n return;\n }\n\n const items = <HTMLElement[]>Array.from(this.body.querySelectorAll(`.${cssClass('search-item')}:not(.${cssClass('hidden')})`));\n const index = items.indexOf(h);\n this.highlighted = items[index + 1] || null;\n }\n\n private highlightPrevious() {\n const h = this.highlighted;\n const items = <HTMLElement[]>Array.from(this.body.querySelectorAll(`.${cssClass('search-item')}:not(.${cssClass('hidden')})`));\n\n if (!h || h.classList.contains(cssClass('hidden'))) {\n this.highlighted = items[items.length - 1] || null;\n return;\n }\n const index = items.indexOf(h);\n this.highlighted = items[index - 1] || null;\n }\n\n private blur() {\n this.search.value = '';\n // clear filter\n this.filterResults(this.body, '');\n this.node.classList.remove(cssClass('search-open'));\n }\n\n private filter() {\n const empty = this.filterResults(this.body, this.search.value.toLowerCase());\n this.body.classList.toggle(cssClass('search-empty'), empty);\n }\n\n private filterResults(node: HTMLElement, text: string) {\n if (text === '') {\n // show all\n (<HTMLElement[]>Array.from(node.getElementsByClassName(cssClass('hidden')))).forEach((d: HTMLElement) => d.classList.remove(cssClass('hidden')));\n return false;\n }\n const children = Array.from(node.children);\n children.forEach((d) => {\n const content = d.firstElementChild!.innerHTML.toLowerCase();\n let hidden = !content.includes(text);\n if (d.classList.contains(cssClass('search-group'))) {\n const ul = <HTMLElement>d.lastElementChild!;\n const allChildrenHidden = this.filterResults(ul, text);\n hidden = hidden && allChildrenHidden;\n }\n d.classList.toggle(cssClass('hidden'), hidden);\n });\n\n return children.every((d) => d.classList.contains(cssClass('hidden')));\n }\n\n protected createEventList() {\n return super.createEventList().concat([SearchBox.EVENT_SELECT]);\n }\n\n on(type: typeof SearchBox.EVENT_SELECT, listener: typeof select | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n}\n","import {Ranking} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {cssClass} from '../../styles';\n\n/** @internal */\nexport default class RenameRankingDialog extends ADialog {\n\n private readonly before: string;\n\n constructor(private readonly ranking: Ranking, dialog: IDialogContext) {\n super(dialog, {\n livePreview: 'rename'\n });\n this.before = ranking.getLabel();\n }\n\n protected build(node: HTMLElement) {\n node.classList.add(cssClass('dialog-rename'));\n node.insertAdjacentHTML('beforeend', `\n <input type=\"text\" value=\"${this.ranking.getLabel()}\" required autofocus placeholder=\"name\">`);\n }\n\n protected reset() {\n this.findInput('input[type=\"text\"]').value = this.before;\n }\n\n protected cancel() {\n this.ranking.setLabel(this.before);\n }\n\n protected submit() {\n const newValue = this.findInput('input[type=\"text\"]').value;\n this.ranking.setLabel(newValue);\n return true;\n }\n}\n","import {Ranking} from '../../model';\nimport {IRankingHeaderContext} from '../interfaces';\nimport {dialogContext, IDialogContext} from './ADialog';\nimport RenameRankingDialog from './RenameRankingDialog';\nimport {cssClass} from '../../styles';\nimport {actionCSSClass} from '../header';\nimport APopup from './APopup';\n\n/** @internal */\nexport default class MoreRankingOptionsDialog extends APopup {\n\n constructor(private readonly ranking: Ranking, dialog: IDialogContext, private readonly ctx: IRankingHeaderContext) {\n super(dialog, {\n autoClose: true\n });\n }\n\n private addIcon(node: HTMLElement, title: string, onClick: (evt: MouseEvent) => void) {\n node.insertAdjacentHTML('beforeend', `<i title=\"${title}\" class=\"${actionCSSClass(title)}\"><span>${title}</span> </i>`);\n const i = <HTMLElement>node.lastElementChild;\n i.onclick = (evt) => {\n evt.stopPropagation();\n onClick(evt);\n };\n }\n\n protected build(node: HTMLElement) {\n node.classList.add(cssClass('more-options'));\n this.addIcon(node, 'Rename', (evt) => {\n evt.stopPropagation();\n evt.preventDefault();\n const dialog = new RenameRankingDialog(this.ranking, dialogContext(this.ctx, this.level + 1, <any>evt));\n dialog.open();\n });\n this.addIcon(node, 'Remove', (evt) => {\n evt.stopPropagation();\n evt.preventDefault();\n this.destroy('confirm');\n this.ctx.provider.removeRanking(this.ranking);\n });\n }\n}\n","import {Column} from '../../model';\nimport ADialog, {IDialogContext} from './ADialog';\nimport {IToolbarDialogAddon, IRankingHeaderContext, IToolbarDialogAddonHandler} from '../interfaces';\n\n/** @internal */\nexport default class AddonDialog extends ADialog {\n private readonly handlers: IToolbarDialogAddonHandler[] = [];\n\n constructor(private readonly column: Column, private readonly addons: IToolbarDialogAddon[], dialog: IDialogContext, private readonly ctx: IRankingHeaderContext, private readonly onClick?: () => void) {\n super(dialog);\n }\n\n protected build(node: HTMLElement) {\n for(const addon of this.addons) {\n this.node.insertAdjacentHTML('beforeend', `<strong>${addon.title}</strong>`);\n this.handlers.push(addon.append(this.column, node, this.dialog, this.ctx));\n }\n }\n\n protected submit(): boolean {\n for (const handler of this.handlers) {\n if (handler.submit() === false) {\n return false;\n }\n }\n if (this.onClick) {\n this.onClick();\n }\n return true;\n }\n\n protected cancel() {\n for (const handler of this.handlers) {\n handler.cancel();\n }\n }\n\n protected reset() {\n for (const handler of this.handlers) {\n handler.reset();\n }\n }\n}\n","import {clear} from '../../internal';\nimport {Column, Ranking, categoryOf, isSortingAscByDefault, ISortCriteria, isSupportType} from '../../model';\nimport {aria, cssClass} from '../../styles';\nimport AddonDialog from '../dialogs/AddonDialog';\nimport {actionCSSClass, updateHeader} from '../header';\nimport {IRankingHeaderContext, IToolbarDialogAddon} from '../interfaces';\nimport {getToolbarDialogAddons, isGroupAble, isGroupSortAble, isSortAble} from '../toolbar';\nimport SearchBox, {ISearchBoxOptions} from './SearchBox';\nimport {dialogContext} from '../dialogs';\n\ninterface IColumnItem {\n col: Column;\n id: string;\n text: string;\n}\n/**\n * @internal\n */\nexport default class Hierarchy {\n readonly node: HTMLElement;\n readonly groupAdder: SearchBox<IColumnItem>;\n readonly sortAdder: SearchBox<IColumnItem>;\n readonly groupSortAdder: SearchBox<IColumnItem>;\n\n constructor(private readonly ctx: IRankingHeaderContext, document: Document) {\n this.node = document.createElement('aside');\n this.node.classList.add(cssClass('hierarchy'), cssClass('feature-advanced'), cssClass('feature-ranking'));\n this.node.innerHTML = `\n <section class=\"${cssClass('group-hierarchy')}\">\n </section>\n <section class=\"${cssClass('sort-hierarchy')}\">\n </section>\n <section class=\"${cssClass('sort-groups-hierarchy')}\">\n </section>\n `;\n const options = <Partial<ISearchBoxOptions<IColumnItem>>>{\n doc: document,\n placeholder: 'Add Sort Criteria...',\n formatItem: (item: IColumnItem, node: HTMLElement) => {\n node.classList.add(cssClass('typed-icon'));\n node.dataset.typeCat = categoryOf(item.col).name;\n node.dataset.type = item.col.desc.type;\n return item.text;\n },\n\n };\n this.groupAdder = new SearchBox(Object.assign({}, options, {\n placeholder: 'Add Grouping Criteria...'\n }));\n this.groupSortAdder = new SearchBox(Object.assign({}, options, {\n placeholder: 'Add Grouping Sort Criteria...'\n }));\n this.sortAdder = new SearchBox(options);\n }\n\n update(ranking: Ranking | null) {\n if (!ranking) {\n this.node.style.display = 'none';\n return;\n }\n this.node.style.display = null;\n this.renderGroups(ranking, <HTMLElement>this.node.firstElementChild!);\n this.renderSorting(ranking, <HTMLElement>this.node.children[1]!);\n this.renderGroupSorting(ranking, <HTMLElement>this.node.lastElementChild!);\n }\n\n private render<T>(node: HTMLElement, items: T[], toColumn: (item: T) => Column, extras: (item: T, node: HTMLElement) => void, addonKey: string, onChange: (item: T, delta: number) => void) {\n const cache = new Map((<HTMLElement[]>Array.from(node.children)).map((d) => <[string, HTMLElement]>[d.dataset.id, d]));\n clear(node);\n\n items.forEach((d) => {\n const col = toColumn(d);\n const item = cache.get(col.id);\n if (item) {\n node.appendChild(item);\n updateHeader(item, col, 0);\n return;\n }\n const addons = getToolbarDialogAddons(col, addonKey, this.ctx);\n\n node.insertAdjacentHTML('beforeend', `<div data-id=\"${col.id}\" class=\"${cssClass('toolbar')} ${cssClass('hierarchy-entry')}\">\n <div class=\"${cssClass('label')} ${cssClass('typed-icon')}\">${col.label}</div>\n ${addons.length > 0 ? `<i title=\"Customize\" class=\"${actionCSSClass('customize')}\">${aria('Customize')}</i>` : ''}\n <i title=\"Move Up\" class=\"${actionCSSClass('Move Up')}\">${aria('Move Up')}</i>\n <i title=\"Move Down\" class=\"${actionCSSClass('Move Down')}\">${aria('Move Down')}</i>\n <i title=\"Remove from hierarchy\" class=\"${actionCSSClass('Remove')}\">${aria('Remove from hierarchy')}</i>\n </div>`);\n const last = <HTMLElement>node.lastElementChild!;\n\n function prevent(evt: Event) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n (<HTMLElement>last.querySelector('i[title=\"Move Down\"]')!).onclick = (evt) => {\n prevent(evt);\n onChange(d, + 1);\n };\n (<HTMLElement>last.querySelector('i[title=\"Move Up\"]')!).onclick = (evt) => {\n prevent(evt);\n onChange(d, -1);\n };\n (<HTMLElement>last.querySelector('i[title^=Remove]')!).onclick = (evt) => {\n prevent(evt);\n onChange(d, 0);\n };\n\n if (addons.length > 0) {\n (<HTMLElement>last.querySelector('i[title=Customize]')!).onclick = (evt) => {\n prevent(evt);\n this.customize(col, addons, <any>evt);\n };\n }\n\n extras(d, last);\n\n updateHeader(last, col, 0);\n });\n }\n\n private renderGroups(ranking: Ranking, node: HTMLElement) {\n const groups = ranking.getGroupCriteria();\n\n if (groups.length === 0) {\n clear(node);\n return;\n }\n\n const click = (col: Column, delta: number) => {\n if (delta === 0) {\n col.groupByMe();\n return;\n }\n const current = col.isGroupedBy();\n col.findMyRanker()!.groupBy(col, current + delta);\n };\n\n const addButton = (_: Column, last: HTMLElement) => {\n last.insertAdjacentHTML('afterbegin', `<i title=\"Group\" class=\"${actionCSSClass('group')}\" data-group=\"true\">${aria('Group')}</i>`);\n };\n\n this.render(node, groups, (d) => d, addButton, 'group', click);\n this.addGroupAdder(ranking, groups, node);\n }\n\n private renderSorting(ranking: Ranking, node: HTMLElement) {\n const sortCriterias = ranking.getSortCriteria();\n\n if (sortCriterias.length === 0) {\n clear(node);\n return;\n }\n\n const click = ({col}: ISortCriteria, delta: number) => {\n const current = col.isSortedByMe();\n if (!isFinite(delta)) {\n col.sortByMe(current.asc === 'desc', current.priority);\n return;\n }\n if (delta === 0) {\n col.sortByMe(current.asc === 'asc', -1);\n return;\n }\n col.sortByMe(current.asc === 'asc', current.priority! + delta);\n };\n\n const addButton = (s: ISortCriteria, last: HTMLElement) => {\n last.insertAdjacentHTML('afterbegin', `\n <i title=\"Sort\" class=\"${actionCSSClass('sort')}\" data-sort=\"${s.asc ? 'asc' : 'desc'}\">${aria('Toggle Sorting')}</i>`);\n (<HTMLElement>last.querySelector('i[title=Sort]')!).onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n click(s, Infinity);\n };\n };\n\n this.render(node, sortCriterias, (d) => d.col, addButton, 'sort', click);\n\n this.addSortAdder(ranking, sortCriterias, node);\n }\n\n private renderGroupSorting(ranking: Ranking, node: HTMLElement) {\n const sortCriterias = ranking.getGroupSortCriteria();\n\n if (sortCriterias.length === 0) {\n clear(node);\n return;\n }\n\n const click = ({col}: ISortCriteria, delta: number) => {\n const current = col.isGroupSortedByMe();\n if (!isFinite(delta)) {\n col.groupSortByMe(current.asc === 'desc', current.priority);\n return;\n }\n if (delta === 0) {\n col.groupSortByMe(current.asc === 'asc', -1);\n return;\n }\n col.groupSortByMe(current.asc === 'asc', current.priority! + delta);\n };\n\n const addButton = (s: ISortCriteria, last: HTMLElement) => {\n last.insertAdjacentHTML('afterbegin', `\n <i title=\"Sort Group\" class=\"${actionCSSClass('sort-groups')}\" data-sort=\"${s.asc ? 'asc' : 'desc'}\">${aria('Toggle Sorting')}</i>`);\n (<HTMLElement>last.querySelector('i[title=\"Sort Group\"]')!).onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n click(s, Infinity);\n };\n };\n\n this.render(node, sortCriterias, (d) => d.col, addButton, 'sortGroup', click);\n\n this.addGroupSortAdder(ranking, sortCriterias, node);\n }\n\n private addAdder(adder: SearchBox<IColumnItem>, ranking: Ranking, addonKey: string, current: Column[], node: HTMLElement, check: (col: Column) => boolean, onSelect: (col: Column) => void) {\n const used = new Set(current);\n\n adder.data = ranking.children.filter((col) => !isSupportType(col) && !used.has(col) && check(col)).map((col) => ({col, id: col.id, text: col.label}));\n\n adder.on(SearchBox.EVENT_SELECT, (item: IColumnItem) => {\n const addons = getToolbarDialogAddons(item.col, addonKey, this.ctx);\n if (addons.length > 0) {\n this.customize(item.col, addons, adder.node, () => onSelect(item.col));\n } else {\n onSelect(item.col);\n }\n });\n\n if (adder.data.length <= 0) {\n return;\n }\n\n const wrapper = node.ownerDocument!.createElement('footer');\n wrapper.appendChild(adder.node);\n wrapper.classList.add(cssClass('hierarchy-adder'));\n node.appendChild(wrapper);\n }\n\n private addSortAdder(ranking: Ranking, sortCriterias: ISortCriteria[], node: HTMLElement) {\n this.addAdder(this.sortAdder, ranking, 'sort', sortCriterias.map((d) => d.col), node, (d) => isSortAble(d, this.ctx), (col) => {\n ranking.sortBy(col, isSortingAscByDefault(col), sortCriterias.length);\n });\n }\n\n private addGroupAdder(ranking: Ranking, groups: Column[], node: HTMLElement) {\n this.addAdder(this.groupAdder, ranking, 'group', groups, node, (d) => isGroupAble(d, this.ctx), (col) => {\n ranking.groupBy(col, groups.length);\n });\n }\n\n private addGroupSortAdder(ranking: Ranking, sortCriterias: ISortCriteria[], node: HTMLElement) {\n this.addAdder(this.groupSortAdder, ranking, 'sortGroup', sortCriterias.map((d) => d.col), node, (d) => isGroupSortAble(d, this.ctx), (col) => {\n ranking.groupSortBy(col, isSortingAscByDefault(col), sortCriterias.length);\n });\n }\n\n private customize(col: Column, addons: IToolbarDialogAddon[], attachment: HTMLElement, onClick?: () => void) {\n const dialog = new AddonDialog(col, addons, dialogContext(this.ctx, 0, attachment), this.ctx, onClick);\n dialog.open();\n }\n}\n\n","import {Column, isMapAbleColumn, NumberColumn} from '../../model';\nimport {IAbortAblePromise} from '../../provider';\nimport {ISummaryRenderer} from '../../renderer';\nimport {cssClass, engineCssClass} from '../../styles';\nimport {createShortcutMenuItems, dragAbleColumn, updateHeader} from '../header';\nimport {IRankingHeaderContext} from '../interfaces';\nimport {suffix} from '../../internal';\n\n/** @internal */\nexport default class SidePanelEntryVis {\n readonly node: HTMLElement;\n private summary: ISummaryRenderer;\n private summaryUpdater: IAbortAblePromise<void> | null = null;\n\n constructor(public readonly column: Column, private ctx: IRankingHeaderContext, document: Document) {\n this.node = document.createElement('article');\n this.node.classList.add(cssClass('side-panel-entry'));\n this.node.dataset.colId = column.id;\n this.node.dataset.type = column.desc.type;\n\n this.summary = ctx.summaryRenderer(column, true);\n\n this.column.on(suffix('.panel', NumberColumn.EVENT_FILTER_CHANGED, Column.EVENT_DIRTY_HEADER), () => {\n this.update();\n });\n this.column.on(suffix('.panel',Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, Column.EVENT_DIRTY_CACHES), () => {\n this.recreateSummary();\n });\n this.init();\n this.update();\n }\n\n\n private init() {\n this.node.innerHTML = `\n <header class=\"${cssClass('side-panel-entry-header')}\">\n <div class=\"${cssClass('side-panel-labels')}\">\n <span class=\"${cssClass('label')} ${cssClass('typed-icon')} ${cssClass('side-panel-label')}\"></span>\n <span class=\"${cssClass('sublabel')} ${cssClass('side-panel-sublabel')}\"></span>\n </div>\n <div class=\"${cssClass('toolbar')} ${cssClass('side-panel-toolbar')}\"></div>\n </header>`;\n createShortcutMenuItems(<HTMLElement>this.node.querySelector(`.${cssClass('toolbar')}`), 0, this.column, this.ctx, 'sidePanel', false);\n dragAbleColumn(<HTMLElement>this.node.querySelector('header'), this.column, this.ctx);\n this.appendSummary();\n }\n\n update(ctx: IRankingHeaderContext = this.ctx) {\n this.ctx = ctx;\n updateHeader(this.node, this.column);\n this.updateSummary();\n }\n\n private updateSummary() {\n const summaryNode = <HTMLElement>this.node.querySelector(`.${cssClass('summary')}`)!;\n if (this.summaryUpdater) {\n this.summaryUpdater.abort();\n summaryNode.classList.remove(engineCssClass('loading'));\n this.summaryUpdater = null;\n }\n const r = this.summary.update(summaryNode);\n if (!r) {\n return;\n }\n\n this.summaryUpdater = r;\n summaryNode.classList.add(engineCssClass('loading'));\n r.then((a) => {\n if (typeof a === 'symbol') {\n return;\n }\n summaryNode.classList.remove(engineCssClass('loading'));\n });\n }\n\n private appendSummary() {\n const summary = this.ctx.asElement(this.summary.template);\n summary.classList.add(cssClass('summary'), cssClass('side-panel-summary'), cssClass('renderer'), cssClass(`renderer-${this.column.getSummaryRenderer()}`));\n summary.dataset.renderer = this.column.getSummaryRenderer();\n summary.dataset.interactive = isMapAbleColumn(this.column).toString();\n this.node.appendChild(summary);\n }\n\n private recreateSummary() {\n // remove old summary\n this.node.removeChild(this.node.querySelector(`.${cssClass('summary')}`)!!);\n\n this.summary = this.ctx.summaryRenderer(this.column, true);\n this.appendSummary();\n this.updateSummary();\n }\n\n destroy() {\n this.column.on(suffix('.panel', NumberColumn.EVENT_FILTER_CHANGED, Column.EVENT_DIRTY_HEADER, Column.EVENT_SUMMARY_RENDERER_TYPE_CHANGED, Column.EVENT_DIRTY_CACHES), null);\n this.node.remove();\n }\n}\n","import {clear, suffix} from '../../internal';\nimport {Ranking, isSupportType} from '../../model';\nimport {aria, cssClass} from '../../styles';\nimport MoreRankingOptionsDialog from '../dialogs/MoreRankingOptionsDialog';\nimport {actionCSSClass} from '../header';\nimport {IRankingHeaderContext} from '../interfaces';\nimport {dialogContext} from '../dialogs';\nimport Hierarchy from './Hierarchy';\nimport {ISidePanelOptions} from './SidePanel';\nimport SidePanelEntryVis from './SidePanelEntryVis';\n\n/** @internal */\nexport default class SidePanelRanking {\n\n readonly header: HTMLElement;\n readonly dropdown: HTMLElement;\n readonly node: HTMLElement;\n\n private readonly hierarchy: Hierarchy | null;\n private readonly entries = new Map<string, SidePanelEntryVis>();\n\n constructor(public readonly ranking: Ranking, private ctx: IRankingHeaderContext, document: Document, private readonly options: Readonly<ISidePanelOptions>) {\n this.node = document.createElement('section');\n this.header = document.createElement('div');\n this.dropdown = document.createElement('div');\n\n this.node.classList.add(cssClass('side-panel-ranking'));\n this.header.classList.add(cssClass('side-panel-ranking-header'), cssClass('side-panel-ranking-label'));\n this.dropdown.classList.add(cssClass('side-panel-ranking-label'));\n\n this.dropdown.innerHTML = this.header.innerHTML = `<span>${ranking.getLabel()}</span><i class=\"${actionCSSClass('more')}\" title=\"More &hellip;\">${aria('More &hellip;')}</i>`;\n (<HTMLElement>this.header.lastElementChild!).onclick = (<HTMLElement>this.dropdown.lastElementChild!).onclick = (evt) => {\n evt.stopPropagation();\n evt.preventDefault();\n const dialog = new MoreRankingOptionsDialog(ranking, dialogContext(ctx, 1, <any>evt), ctx);\n dialog.open();\n };\n\n this.hierarchy = this.options.hierarchy ? new Hierarchy(ctx, document) : null;\n\n this.init();\n }\n\n private init() {\n this.node.innerHTML = `<main class=\"${cssClass('side-panel-ranking-main')}\"></main>`;\n if (this.hierarchy) {\n this.node.insertBefore(this.hierarchy.node, this.node.firstChild);\n }\n\n if (this.hierarchy) {\n this.ranking.on(suffix('.panel', Ranking.EVENT_GROUP_CRITERIA_CHANGED, Ranking.EVENT_SORT_CRITERIA_CHANGED, Ranking.EVENT_GROUP_SORT_CRITERIA_CHANGED), () => {\n this.updateHierarchy();\n });\n }\n this.ranking.on(suffix('.panel', Ranking.EVENT_ADD_COLUMN, Ranking.EVENT_REMOVE_COLUMN, Ranking.EVENT_MOVE_COLUMN), () => {\n this.updateList();\n this.updateHierarchy();\n });\n this.ranking.on(suffix('.panel', Ranking.EVENT_LABEL_CHANGED), () => {\n this.dropdown.firstElementChild!.textContent = this.header.firstElementChild!.textContent = this.ranking.getLabel();\n });\n }\n\n get active() {\n return this.node.classList.contains(cssClass('active'));\n }\n\n set active(value: boolean) {\n this.node.classList.toggle(cssClass('active'), value);\n this.header.classList.toggle(cssClass('active'), value);\n this.dropdown.classList.toggle(cssClass('active'), value);\n if (value) {\n return;\n }\n this.updateList();\n this.updateHierarchy();\n }\n\n update(ctx: IRankingHeaderContext) {\n this.ctx = ctx;\n this.updateList();\n this.updateHierarchy();\n }\n\n private updateHierarchy() {\n if (!this.hierarchy || !this.active) {\n return;\n }\n this.hierarchy.update(this.ranking);\n }\n\n private updateList() {\n if (!this.active) {\n return;\n }\n const node = this.node.querySelector('main')!;\n const columns = this.ranking.flatColumns.filter((d) => !isSupportType(d));\n\n if (columns.length === 0) {\n clear(node);\n this.entries.forEach((d) => d.destroy());\n this.entries.clear();\n return;\n }\n\n clear(node);\n\n const copy = new Map(this.entries);\n this.entries.clear();\n\n columns.forEach((col) => {\n const existing = copy.get(col.id);\n if (existing) {\n existing.update(this.ctx);\n node.appendChild(existing.node);\n this.entries.set(col.id, existing);\n copy.delete(col.id);\n return;\n }\n\n const entry = new SidePanelEntryVis(col, this.ctx, node.ownerDocument!);\n node.appendChild(entry.node);\n this.entries.set(col.id, entry);\n });\n\n copy.forEach((d) => d.destroy());\n }\n\n destroy() {\n this.header.remove();\n this.node.remove();\n this.ranking.on(suffix('.panel', Ranking.EVENT_GROUP_CRITERIA_CHANGED, Ranking.EVENT_SORT_CRITERIA_CHANGED, Ranking.EVENT_GROUP_SORT_CRITERIA_CHANGED, Ranking.EVENT_ADD_COLUMN, Ranking.EVENT_MOVE_COLUMN, Ranking.EVENT_REMOVE_COLUMN, Ranking.EVENT_LABEL_CHANGED), null);\n\n this.entries.forEach((d) => d.destroy());\n this.entries.clear();\n }\n}\n","import {suffix} from '../../internal';\nimport {categoryOfDesc, IColumnCategory, createAggregateDesc, createGroupDesc, createImpositionDesc, createNestedDesc, createRankDesc, createReduceDesc, createScriptDesc, createSelectionDesc, createStackDesc, IColumnDesc, Ranking} from '../../model';\nimport {DataProvider, IDataProvider} from '../../provider';\nimport {aria, cssClass} from '../../styles';\nimport ChooseRankingDialog from '../dialogs/ChooseRankingDialog';\nimport {IRankingHeaderContext} from '../interfaces';\nimport {dialogContext} from '../dialogs';\nimport SearchBox, {IGroupSearchItem, ISearchBoxOptions} from './SearchBox';\nimport SidePanelRanking from './SidePanelRanking';\nimport {format} from 'd3-format';\n\n\nexport interface IColumnWrapper {\n desc: IColumnDesc;\n category: IColumnCategory;\n id: string;\n text: string;\n}\n\nfunction isWrapper(item: IColumnWrapper | IGroupSearchItem<IColumnWrapper>): item is IColumnWrapper {\n return (<IColumnWrapper>item).desc != null;\n}\n\nexport interface ISidePanelOptions extends Partial<ISearchBoxOptions<IColumnWrapper>> {\n additionalDescs: IColumnDesc[];\n chooser: boolean;\n hierarchy: boolean;\n collapseable: boolean | 'collapsed';\n}\n\nexport default class SidePanel {\n\n private readonly options: ISidePanelOptions = {\n additionalDescs: [\n createStackDesc('Weighted Sum'),\n createScriptDesc('Scripted Formula'),\n createNestedDesc('Nested'),\n createReduceDesc(),\n createImpositionDesc(),\n createRankDesc(),\n createSelectionDesc(),\n createGroupDesc(),\n createAggregateDesc(),\n ],\n chooser: true,\n hierarchy: true,\n placeholder: 'Add Column...',\n formatItem: (item: IColumnWrapper | IGroupSearchItem<IColumnWrapper>, node: HTMLElement) => {\n const w: IColumnWrapper = isWrapper(item) ? item : (<IColumnWrapper>item.children[0]);\n node.dataset.typeCat = w.category.name;\n node.classList.add(cssClass('typed-icon'));\n if (isWrapper(item)) {\n node.dataset.type = w.desc.type;\n }\n if (node.parentElement) {\n node.parentElement.classList.add(cssClass('feature-model'));\n node.parentElement.classList.toggle(cssClass('feature-advanced'), w.category.featureLevel === 'advanced');\n node.parentElement.classList.toggle(cssClass('feature-basic'), w.category.featureLevel === 'basic');\n }\n return item.text;\n },\n collapseable: true\n };\n\n readonly node: HTMLElement;\n private readonly search: SearchBox<IColumnWrapper> | null;\n private chooser: HTMLElement | null = null;\n private readonly descs: IColumnWrapper[] = [];\n private data: IDataProvider;\n private readonly rankings: SidePanelRanking[] = [];\n\n constructor(private ctx: IRankingHeaderContext, document: Document, options: Partial<ISidePanelOptions> = {}) {\n Object.assign(this.options, options);\n\n this.node = document.createElement('aside');\n this.node.classList.add(cssClass('side-panel'));\n\n this.search = this.options.chooser ? new SearchBox<IColumnWrapper>(this.options) : null;\n\n this.data = ctx.provider;\n this.init();\n this.update(ctx);\n }\n\n private init() {\n this.node.innerHTML = `\n <aside class=\"${cssClass('stats')}\"></aside>\n <header class=\"${cssClass('side-panel-rankings')}\">\n <i class=\"${cssClass('action')}\" title=\"Choose &hellip;\">${aria('Choose &hellip;')}</i>\n </header>\n <main class=\"${cssClass('side-panel-main')}\"></main>\n `;\n\n {\n const choose = <HTMLElement>this.node.querySelector('header > i');\n choose.onclick = (evt) => {\n evt.stopPropagation();\n const dialog = new ChooseRankingDialog(this.rankings.map((d) => d.dropdown), dialogContext(this.ctx, 1, <any>evt));\n dialog.open();\n };\n }\n\n if (this.options.collapseable) {\n this.node.insertAdjacentHTML('beforeend', `<div class=\"${cssClass('collapser')}\" title=\"Collapse Panel\">${aria('Collapse Panel')}</div>`);\n const last = <HTMLElement>this.node.lastElementChild;\n last.onclick = () => this.collapsed = !this.collapsed;\n this.collapsed = this.options.collapseable === 'collapsed';\n }\n this.initChooser();\n this.changeDataStorage(null, this.data);\n }\n\n private initChooser() {\n if (!this.search) {\n return;\n }\n this.chooser = this.node.ownerDocument!.createElement('header');\n this.chooser.appendChild(this.chooser.ownerDocument!.createElement('form'));\n this.chooser.classList.add(cssClass('side-panel-chooser'));\n this.chooser.firstElementChild!.appendChild(this.search.node);\n this.search.on(SearchBox.EVENT_SELECT, (panel: IColumnWrapper) => {\n const col = this.data.create(panel.desc);\n if (!col) {\n return;\n }\n const a = this.active;\n if (a) {\n a.ranking.push(col);\n }\n });\n }\n\n private get active() {\n return this.rankings.find((d) => d.active);\n }\n\n private changeDataStorage(old: IDataProvider | null, data: IDataProvider) {\n if (old) {\n old.on(suffix('.panel', DataProvider.EVENT_ADD_RANKING, DataProvider.EVENT_REMOVE_RANKING,\n DataProvider.EVENT_ADD_DESC, DataProvider.EVENT_CLEAR_DESC, DataProvider.EVENT_ORDER_CHANGED, DataProvider.EVENT_SELECTION_CHANGED), null);\n }\n this.data = data;\n\n const wrapDesc = (desc: IColumnDesc) => ({\n desc,\n category: categoryOfDesc(desc, data.columnTypes),\n id: `${desc.type}@${desc.label}`,\n text: desc.label\n });\n this.descs.splice(0, this.descs.length, ...data.getColumns().concat(this.options.additionalDescs).map(wrapDesc));\n\n data.on(`${DataProvider.EVENT_ADD_DESC}.panel`, (desc) => {\n this.descs.push(wrapDesc(desc));\n this.updateChooser();\n });\n\n data.on(`${DataProvider.EVENT_CLEAR_DESC}.panel`, () => {\n this.descs.splice(0, this.descs.length);\n this.updateChooser();\n });\n\n data.on(suffix('.panel', DataProvider.EVENT_SELECTION_CHANGED, DataProvider.EVENT_ORDER_CHANGED), () => {\n this.updateStats();\n });\n\n data.on(suffix('.panel', DataProvider.EVENT_ADD_RANKING), (ranking: Ranking, index: number) => {\n this.createEntry(ranking, index);\n this.makeActive(index);\n });\n\n data.on(suffix('.panel', DataProvider.EVENT_REMOVE_RANKING), (_: Ranking, index: number) => {\n if (index < 0) {\n // remove all\n this.rankings.splice(0, this.rankings.length).forEach((d) => d.destroy());\n this.node.querySelector('header')!.dataset.count = '0';\n this.makeActive(-1);\n return;\n }\n const r = this.rankings.splice(index, 1)[0];\n this.node.querySelector('header')!.dataset.count = String(this.rankings.length);\n r.destroy();\n if (r.active) {\n this.makeActive(this.rankings.length === 0 ? -1 : Math.max(index - 1, 0));\n }\n });\n\n this.rankings.splice(0, this.rankings.length).forEach((d) => d.destroy());\n data.getRankings().forEach((d, i) => {\n this.createEntry(d, i);\n });\n if (this.rankings.length > 0) {\n this.makeActive(0);\n }\n\n this.updateStats();\n }\n\n private createEntry(ranking: Ranking, index: number) {\n const entry = new SidePanelRanking(ranking, this.ctx, this.node.ownerDocument!, this.options);\n\n const header = this.node.querySelector('header')!;\n const main = this.node.querySelector('main')!;\n\n header.insertBefore(entry.header, header.children[index + 1]); // for the action\n header.dataset.count = String(this.rankings.length + 1);\n\n entry.header.onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n this.makeActive(this.rankings.indexOf(entry));\n };\n entry.dropdown.onclick = entry.header.onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n this.ctx.dialogManager.removeAboveLevel(0);\n this.makeActive(this.rankings.indexOf(entry));\n };\n\n main.insertBefore(entry.node, main.children[index]);\n\n this.rankings.splice(index, 0, entry);\n }\n\n get collapsed() {\n return this.node.classList.contains(cssClass('collapsed'));\n }\n\n set collapsed(value: boolean) {\n this.node.classList.toggle(cssClass('collapsed'), value);\n if (value) {\n return;\n }\n this.updateChooser();\n this.updateStats();\n this.updateRanking();\n }\n\n private makeActive(index: number) {\n this.rankings.forEach((d, i) => d.active = index === i);\n\n const active = this.active;\n if (active && this.chooser) {\n active.node.insertAdjacentElement('afterbegin', this.chooser);\n // scroll to body\n const parent = <HTMLElement>this.node.closest(`.${cssClass()}`)!;\n const body = parent ? parent.querySelector(`article[data-ranking=\"${active.ranking.id}\"]`) : null;\n if (body) {\n body.scrollIntoView();\n }\n }\n this.updateRanking();\n }\n\n private updateRanking() {\n const active = this.active;\n if (active && !this.collapsed) {\n active.update(this.ctx);\n }\n }\n\n update(ctx: IRankingHeaderContext) {\n const bak = this.data;\n this.ctx = ctx;\n if (ctx.provider !== bak) {\n this.changeDataStorage(bak, ctx.provider);\n }\n this.updateChooser();\n this.updateStats();\n\n const active = this.active;\n if (active) {\n active.update(ctx);\n }\n }\n\n private updateStats() {\n if (this.collapsed) {\n return;\n }\n const stats = <HTMLElement>this.node.querySelector(`.${cssClass('stats')}`);\n const s = this.data.getSelection();\n const r = this.data.getFirstRanking();\n const f = format(',d');\n const visible = r ? r.getGroups().reduce((a, b) => a + b.order.length, 0) : 0;\n const total = this.data.getTotalNumberOfRows();\n stats.innerHTML = `Showing <strong>${f(visible)}</strong> of ${f(total)} items${s.length > 0 ? `; <span>${f(s.length)} selected</span>` : ''}${visible < total ? ` <i class=\"${cssClass('action')} ${cssClass('action-filter')} ${cssClass('stats-reset')}\" title=\"Reset filters\"><span>Reset</span></i>` : ''}`;\n\n const resetButton = stats.querySelector<HTMLElement>(`.${cssClass('stats-reset')}`);\n if (!resetButton) {\n return;\n }\n resetButton.onclick = (evt) => {\n evt.preventDefault();\n evt.stopPropagation();\n this.data.clearFilters();\n };\n }\n\n destroy() {\n this.node.remove();\n if (!this.data) {\n return;\n }\n this.rankings.forEach((d) => d.destroy());\n this.rankings.length = 0;\n this.data.on(suffix('.panel', DataProvider.EVENT_ADD_RANKING, DataProvider.EVENT_REMOVE_RANKING,\n DataProvider.EVENT_ADD_DESC), null);\n }\n\n private static groupByType(entries: IColumnWrapper[]): {text: string, children: IColumnWrapper[]}[] {\n const map = new Map<IColumnCategory, IColumnWrapper[]>();\n entries.forEach((entry) => {\n if (!map.has(entry.category)) {\n map.set(entry.category, [entry]);\n } else {\n map.get(entry.category)!.push(entry);\n }\n });\n return Array.from(map).map(([key, value]) => {\n return {\n text: key.label,\n order: key.order,\n children: value.sort((a, b) => a.text.localeCompare(b.text))\n };\n }).sort((a, b) => a.order - b.order);\n }\n\n private updateChooser() {\n if (!this.search || this.collapsed) {\n return;\n }\n this.search.data = SidePanel.groupByType(this.descs);\n }\n}\n","import {ILineUpOptions, defaultOptions} from '../config';\nimport {merge, suffix} from '../internal';\nimport {DataProvider} from '../provider';\nimport {cssClass} from '../styles';\nimport {ALineUp} from './ALineUp';\nimport EngineRenderer from './EngineRenderer';\nimport SidePanel from './panel/SidePanel';\n\nexport default class LineUp extends ALineUp {\n static readonly EVENT_SELECTION_CHANGED = ALineUp.EVENT_SELECTION_CHANGED;\n static readonly EVENT_DIALOG_OPENED = ALineUp.EVENT_DIALOG_OPENED;\n static readonly EVENT_DIALOG_CLOSED = ALineUp.EVENT_DIALOG_CLOSED;\n static readonly EVENT_HIGHLIGHT_CHANGED = ALineUp.EVENT_HIGHLIGHT_CHANGED;\n\n private readonly renderer: EngineRenderer | null;\n private readonly panel: SidePanel | null;\n\n private readonly options = defaultOptions();\n\n constructor(node: HTMLElement, data: DataProvider, options: Partial<ILineUpOptions> = {}) {\n super(node, data, options && options.ignoreUnsupportedBrowser === true);\n\n merge(this.options, options);\n\n if (!this.isBrowserSupported) {\n this.renderer = null;\n this.panel = null;\n return;\n }\n\n this.node.classList.add(cssClass());\n\n\n this.renderer = new EngineRenderer(data, this.node, this.options);\n if (this.options.sidePanel) {\n this.panel = new SidePanel(this.renderer.ctx, this.node.ownerDocument!, {\n collapseable: this.options.sidePanelCollapsed ? 'collapsed' : true,\n hierarchy: this.options.hierarchyIndicator && this.options.flags.advancedRankingFeatures\n });\n this.renderer.pushUpdateAble((ctx) => this.panel!.update(ctx));\n this.node.insertBefore(this.panel.node, this.node.firstChild);\n } else {\n this.panel = null;\n }\n this.forward(this.renderer, ...suffix('.main', EngineRenderer.EVENT_HIGHLIGHT_CHANGED, EngineRenderer.EVENT_DIALOG_OPENED, EngineRenderer.EVENT_DIALOG_CLOSED));\n }\n\n destroy() {\n this.node.classList.remove(cssClass());\n if (this.renderer) {\n this.renderer.destroy();\n }\n if (this.panel) {\n this.panel.destroy();\n }\n super.destroy();\n }\n\n update() {\n if (this.renderer) {\n this.renderer.update();\n }\n }\n\n setDataProvider(data: DataProvider, dump?: any) {\n super.setDataProvider(data, dump);\n if (!this.renderer) {\n return;\n }\n this.renderer.setDataProvider(data);\n this.update();\n if (this.panel) {\n this.panel.update(this.renderer.ctx);\n }\n }\n\n setHighlight(dataIndex: number, scrollIntoView: boolean = true) {\n return this.renderer != null && this.renderer.setHighlight(dataIndex, scrollIntoView);\n }\n\n getHighlight() {\n return this.renderer ? this.renderer.getHighlight() : -1;\n }\n\n protected enableHighlightListening(enable: boolean) {\n if (this.renderer) {\n this.renderer.enableHighlightListening(enable);\n }\n }\n}\n","import {IGroupData, IGroupItem, isGroup} from '../../model';\nimport {groupEndLevel, ITopNGetter} from '../../provider/internal';\n\nexport interface IRule {\n apply(data: (IGroupData | IGroupItem)[], availableHeight: number, selection: Set<number>, topNGetter: ITopNGetter): IRuleInstance;\n\n levelOfDetail(item: IGroupData | IGroupItem, height: number): 'high' | 'low';\n}\n\nexport interface IRuleInstance {\n item: number | ((item: IGroupItem) => number);\n group: number | ((group: IGroupData) => number);\n violation?: string;\n}\n\n\nexport function spaceFillingRule(config: {groupHeight: number, rowHeight: number, groupPadding: number}) {\n function levelOfDetail(item: IGroupData | IGroupItem, height: number): 'high' | 'low' {\n const group = isGroup(item);\n const maxHeight = group ? config.groupHeight : config.rowHeight;\n if (height >= maxHeight * 0.9) {\n return 'high';\n }\n return 'low';\n }\n\n function itemHeight(data: (IGroupData | IGroupItem)[], availableHeight: number, selection: Set<number>, topNGetter: ITopNGetter) {\n const visibleHeight = availableHeight - config.rowHeight - 5; // some padding for hover\n const items = <IGroupItem[]>data.filter((d) => !isGroup(d));\n const groups = data.length - items.length;\n const selected = items.reduce((a, d) => a + (selection.has(d.dataIndex) ? 1 : 0), 0);\n const unselected = items.length - selected;\n const groupSeparators = items.reduce((a, d) => a + groupEndLevel(d, topNGetter), 0);\n\n if (unselected <= 0) {\n // doesn't matter since all are selected anyhow\n return {height: config.rowHeight, violation: ''};\n }\n const available = visibleHeight - groups * config.groupHeight - groupSeparators * config.groupPadding - selected * config.rowHeight;\n\n const height = Math.floor(available / unselected); // round to avoid sub pixel issues\n if (height < 1) {\n return {\n height: 1,\n violation: `Not possible to fit all rows on the screen.`\n };\n }\n // clamp to max height\n if (height > config.rowHeight) {\n return {\n height: config.rowHeight,\n violation: ''\n };\n }\n return {height, violation: ''};\n }\n\n return <IRule>{\n apply: (data: (IGroupData | IGroupItem)[], availableHeight: number, selection: Set<number>, topNGetter: ITopNGetter) => {\n\n const {violation, height} = itemHeight(data, availableHeight, selection, topNGetter);\n\n const item = (item: IGroupItem) => {\n if (selection.has(item.dataIndex)) {\n return config.rowHeight;\n }\n return height;\n };\n return {item, group: config.groupHeight, violation};\n },\n levelOfDetail\n };\n}\n","import {GridStyleManager} from 'lineupengine';\nimport {ILineUpOptions} from '../../config';\nimport {debounce, AEventDispatcher, IEventListener, suffix} from '../../internal';\nimport {IGroupData, IGroupItem, isGroup, Ranking, IGroup} from '../../model';\nimport {DataProvider} from '../../provider';\nimport {IRenderContext} from '../../renderer';\nimport {IEngineRankingContext} from '../EngineRanking';\nimport EngineRenderer from '../EngineRenderer';\nimport {IRankingHeaderContext, IRankingHeaderContextContainer} from '../interfaces';\nimport {IRule} from './rules';\nimport {ADialog} from '../dialogs';\n\n/**\n * emitted when the highlight changes\n * @asMemberOf TaggleRenderer\n * @param dataIndex the highlighted data index or -1 for none\n * @event\n */\nexport declare function highlightChanged(dataIndex: number): void;\n/**\n * emitted a dialog is opened\n * @asMemberOf TaggleRenderer\n * @param dialog the opened dialog\n * @event\n */\nexport declare function dialogOpened(dialog: ADialog): void;\n/**\n * emitted a dialog is closed\n * @asMemberOf TaggleRenderer\n * @param dialog the closed dialog\n * @param action the action how the dialog was closed\n * @event\n */\nexport declare function dialogClosed(dialog: ADialog, action: 'cancel' | 'confirm'): void;\n\nexport interface ITaggleOptions {\n violationChanged(rule: IRule| null, violation: string): void;\n\n rowPadding: number;\n}\n\nexport default class TaggleRenderer extends AEventDispatcher {\n static readonly EVENT_HIGHLIGHT_CHANGED = EngineRenderer.EVENT_HIGHLIGHT_CHANGED;\n static readonly EVENT_DIALOG_OPENED = EngineRenderer.EVENT_DIALOG_OPENED;\n static readonly EVENT_DIALOG_CLOSED = EngineRenderer.EVENT_DIALOG_CLOSED;\n\n private isDynamicLeafHeight: boolean = false;\n\n private rule: IRule | null = null;\n private levelOfDetail: ((rowIndex: number) => 'high' | 'low') | null = null;\n private readonly resizeListener = () => debounce(() => this.update(), 100);\n private readonly renderer: EngineRenderer;\n\n private readonly options: Readonly<ITaggleOptions> = {\n violationChanged: () => undefined,\n rowPadding: 2\n };\n\n constructor(public data: DataProvider, parent: HTMLElement, options: (Partial<ITaggleOptions> & Readonly<ILineUpOptions>)) {\n super();\n Object.assign(this.options, options);\n\n this.renderer = new EngineRenderer(data, parent, Object.assign({}, options, {\n dynamicHeight: (data: (IGroupData | IGroupItem)[], ranking: Ranking) => {\n const r = this.dynamicHeight(data, ranking);\n if (r) {\n return r;\n }\n return options.dynamicHeight ? options.dynamicHeight(data, ranking) : null;\n },\n levelOfDetail: (rowIndex: number) => this.levelOfDetail ? this.levelOfDetail(rowIndex) : 'high'\n }));\n\n this.data.on(`${DataProvider.EVENT_SELECTION_CHANGED}.rule`, () => {\n if (this.isDynamicLeafHeight) {\n this.update();\n }\n });\n this.forward(this.renderer, ...suffix('.main', EngineRenderer.EVENT_HIGHLIGHT_CHANGED, EngineRenderer.EVENT_DIALOG_OPENED, EngineRenderer.EVENT_DIALOG_CLOSED));\n\n window.addEventListener('resize', this.resizeListener, {\n passive: true\n });\n }\n\n get style(): GridStyleManager {\n return this.renderer.style;\n }\n\n get ctx(): IRankingHeaderContextContainer & IRenderContext & IEngineRankingContext {\n return this.renderer.ctx;\n }\n\n pushUpdateAble(updateAble: (ctx: IRankingHeaderContext) => void) {\n this.renderer.pushUpdateAble(updateAble);\n }\n\n private dynamicHeight(data: (IGroupData | IGroupItem)[], ranking: Ranking) {\n if (!this.rule) {\n this.levelOfDetail = null;\n this.options.violationChanged(null, '');\n return null;\n }\n\n const availableHeight = this.renderer ? this.renderer.node.querySelector('main')!.clientHeight : 100;\n const topNGetter = (group: IGroup) => this.data.getTopNAggregated(ranking, group);\n const instance = this.rule.apply(data, availableHeight, new Set(this.data.getSelection()), topNGetter);\n\n this.isDynamicLeafHeight = typeof instance.item === 'function';\n\n this.options.violationChanged(this.rule, instance.violation || '');\n\n const height = (item: IGroupItem | IGroupData) => {\n if (isGroup(item)) {\n return typeof instance.group === 'number' ? instance.group : instance.group(item);\n }\n return typeof instance.item === 'number' ? instance.item : instance.item(item);\n };\n\n this.levelOfDetail = (rowIndex: number) => {\n const item = data[rowIndex];\n return this.rule ? this.rule.levelOfDetail(item, height(item)) : 'high';\n };\n\n // padding is always 0 since included in height\n // const padding = (item: IGroupData | IGroupItem | null) => {\n // if (!item) {\n // item = data[0];\n // }\n // const lod = this.rule ? this.rule.levelOfDetail(item, height(item)) : 'high';\n // return lod === 'high' ? 0 : 0; // always 0 since\n // };\n\n return {\n defaultHeight: typeof instance.item === 'number' ? instance.item : NaN,\n height,\n padding: 0\n };\n }\n\n protected createEventList() {\n return super.createEventList().concat([TaggleRenderer.EVENT_HIGHLIGHT_CHANGED, TaggleRenderer.EVENT_DIALOG_OPENED, TaggleRenderer.EVENT_DIALOG_CLOSED]);\n }\n\n on(type: typeof TaggleRenderer.EVENT_HIGHLIGHT_CHANGED, listener: typeof highlightChanged | null): this;\n on(type: typeof TaggleRenderer.EVENT_DIALOG_OPENED, listener: typeof dialogOpened | null): this;\n on(type: typeof TaggleRenderer.EVENT_DIALOG_CLOSED, listener: typeof dialogClosed | null): this;\n on(type: string | string[], listener: IEventListener | null): this; // required for correct typings in *.d.ts\n on(type: string | string[], listener: IEventListener | null): this {\n return super.on(type, listener);\n }\n\n\n zoomOut() {\n this.renderer.zoomOut();\n }\n\n zoomIn() {\n this.renderer.zoomIn();\n }\n\n switchRule(rule: IRule | null) {\n if (this.rule === rule) {\n return;\n }\n this.rule = rule;\n this.update();\n }\n\n destroy() {\n this.renderer.destroy();\n window.removeEventListener('resize', this.resizeListener);\n }\n\n update() {\n this.renderer.update();\n }\n\n setDataProvider(data: DataProvider) {\n if (this.data) {\n this.data.on(`${DataProvider.EVENT_SELECTION_CHANGED}.rule`, null);\n }\n this.data = data;\n this.data.on(`${DataProvider.EVENT_SELECTION_CHANGED}.rule`, () => {\n if (this.isDynamicLeafHeight) {\n this.update();\n }\n });\n this.renderer.setDataProvider(data);\n this.update();\n }\n\n setHighlight(dataIndex: number, scrollIntoView: boolean) {\n return this.renderer.setHighlight(dataIndex, scrollIntoView);\n }\n\n getHighlight() {\n return this.renderer.getHighlight();\n }\n\n enableHighlightListening(enable: boolean) {\n this.renderer.enableHighlightListening(enable);\n }\n}\n","import {GridStyleManager} from 'lineupengine';\nimport {defaultOptions} from '../../config';\nimport {ITaggleOptions} from '../../config';\nimport {merge, suffix} from '../../internal';\nimport {DataProvider} from '../../provider';\nimport {cssClass, engineCssClass} from '../../styles';\nimport {ALineUp} from '../ALineUp';\nimport SidePanel from '../panel/SidePanel';\nimport {spaceFillingRule} from './rules';\nimport TaggleRenderer from './TaggleRenderer';\n\nexport default class Taggle extends ALineUp {\n static readonly EVENT_SELECTION_CHANGED = ALineUp.EVENT_SELECTION_CHANGED;\n static readonly EVENT_DIALOG_OPENED = ALineUp.EVENT_DIALOG_OPENED;\n static readonly EVENT_DIALOG_CLOSED = ALineUp.EVENT_DIALOG_CLOSED;\n static readonly EVENT_HIGHLIGHT_CHANGED = ALineUp.EVENT_HIGHLIGHT_CHANGED;\n\n private readonly spaceFilling: HTMLElement | null;\n private readonly renderer: TaggleRenderer | null;\n private readonly panel: SidePanel | null;\n\n private readonly options = defaultOptions();\n\n\n constructor(node: HTMLElement, data: DataProvider, options: Partial<ITaggleOptions> = {}) {\n super(node, data, options && options.ignoreUnsupportedBrowser === true);\n merge(this.options, options);\n merge(this.options, {\n violationChanged: (_rule: any, violation?: string) => this.setViolation(violation)\n });\n\n if (!this.isBrowserSupported) {\n this.spaceFilling = null;\n this.renderer = null;\n this.panel = null;\n return;\n }\n\n this.node.classList.add(cssClass(), cssClass('taggle'));\n\n this.renderer = new TaggleRenderer(data, this.node, this.options);\n this.panel = new SidePanel(this.renderer.ctx, this.node.ownerDocument!, {\n collapseable: this.options.sidePanelCollapsed ? 'collapsed' : true,\n hierarchy: this.options.hierarchyIndicator && this.options.flags.advancedRankingFeatures\n });\n this.renderer.pushUpdateAble((ctx) => this.panel!.update(ctx));\n this.node.insertBefore(this.panel.node, this.node.firstChild);\n {\n this.panel.node.insertAdjacentHTML('afterbegin', `<div class=\"${cssClass('rule-button-chooser')} ${cssClass('feature-advanced')} ${cssClass('feature-ui')}\"><label>\n <input type=\"checkbox\">\n <span>Overview</span>\n <div class=\"${cssClass('rule-violation')}\"></div>\n </label></div>`);\n const spaceFilling = spaceFillingRule(this.options);\n this.spaceFilling = <HTMLElement>this.panel.node.querySelector(`.${cssClass('rule-button-chooser')}`)!;\n const input = <HTMLInputElement>this.spaceFilling.querySelector('input');\n input.onchange = () => {\n const selected = this.spaceFilling!.classList.toggle(cssClass('chosen'));\n self.setTimeout(() => {\n this.updateLodRules(selected);\n this.renderer!.switchRule(selected ? spaceFilling : null);\n });\n };\n if (this.options.overviewMode) {\n input.checked = true;\n this.spaceFilling.classList.toggle(cssClass('chosen'));\n this.updateLodRules(true);\n this.renderer.switchRule(spaceFilling);\n }\n }\n this.forward(this.renderer, ...suffix('.main', TaggleRenderer.EVENT_HIGHLIGHT_CHANGED, TaggleRenderer.EVENT_DIALOG_OPENED, TaggleRenderer.EVENT_DIALOG_CLOSED));\n }\n\n private updateLodRules(overviewMode: boolean) {\n if (!this.renderer) {\n return;\n }\n updateLodRules(this.renderer.style, overviewMode, this.options);\n }\n\n private setViolation(violation?: string) {\n violation = violation || '';\n if (!this.spaceFilling) {\n return;\n }\n this.spaceFilling.classList.toggle(cssClass('violated'), Boolean(violation));\n const elem = this.spaceFilling.querySelector(`.${cssClass('rule-violation')}`)!;\n if (!violation) {\n elem.textContent = '';\n } else {\n elem.innerHTML = violation.replace(/\\n/g, '<br>');\n }\n }\n\n destroy() {\n this.node.classList.remove(cssClass(), cssClass('taggle'));\n if (this.renderer) {\n this.renderer.destroy();\n }\n if (this.panel) {\n this.panel.destroy();\n }\n super.destroy();\n }\n\n update() {\n if (this.renderer) {\n this.renderer.update();\n }\n }\n\n setHighlight(dataIndex: number, scrollIntoView: boolean = true) {\n return this.renderer != null && this.renderer.setHighlight(dataIndex, scrollIntoView);\n }\n\n getHighlight() {\n return this.renderer ? this.renderer.getHighlight() : -1;\n }\n\n protected enableHighlightListening(enable: boolean) {\n if (this.renderer) {\n this.renderer.enableHighlightListening(enable);\n }\n }\n\n setDataProvider(data: DataProvider, dump?: any) {\n super.setDataProvider(data, dump);\n if (!this.renderer) {\n return;\n }\n this.renderer.setDataProvider(data);\n this.update();\n this.panel!.update(this.renderer.ctx);\n }\n}\n\nexport function updateLodRules(style: GridStyleManager, overviewMode: boolean, options: Readonly<ITaggleOptions>) {\n if (!overviewMode) {\n style.deleteRule('taggle_lod_rule');\n style.deleteRule('lineup_rowPadding1');\n style.deleteRule('lineup_rowPadding2');\n return;\n }\n\n style.updateRule('taggle_lod_rule', `\n .${engineCssClass('tr')}.${cssClass('low')}[data-agg=detail]:hover`, {\n /* show regular height for hovered rows in low + medium LOD */\n height: `${options.rowHeight}px !important`\n });\n\n style.updateRule('lineup_rowPadding1', `\n .${engineCssClass('tr')}.${cssClass('low')}`, {\n marginTop: '0'\n });\n\n // no margin for hovered low level row otherwise everything will be shifted down and the hover is gone again\n // .${engineCssClass('tr')}.${cssClass('low')}:hover,\n\n // padding in general and for hovered low detail rows + their afterwards\n style.updateRule('lineup_rowPadding2', `\n .${engineCssClass('tr')}.${cssClass('low')}.${engineCssClass('highlighted')},\n .${engineCssClass('tr')}.${cssClass('selected')},\n .${engineCssClass('tr')}.${cssClass('low')}:hover + .${engineCssClass('tr')}.${cssClass('low')},\n .${engineCssClass('tr')}.${cssClass('low')}.${engineCssClass('highlighted')} + .${engineCssClass('tr')}.${cssClass('low')},\n .${engineCssClass('tr')}.${cssClass('selected')} + .${engineCssClass('tr')}.${cssClass('low')}`, {\n marginTop: `${options.rowPadding}px !important`\n });\n}\n","import {IArrayDesc, IColumnDesc} from '../../model';\n\nexport default class ColumnBuilder<T extends IColumnDesc = IColumnDesc> {\n protected readonly desc: T;\n\n constructor(type: string, column: string) {\n this.desc = <any>{column, type, label: column ? column[0].toUpperCase() + column.slice(1): type};\n }\n\n /**\n * column label\n */\n label(label: string) {\n this.desc.label = label;\n return this;\n }\n\n /**\n * column summary text (subtitle)\n */\n summary(summary: string) {\n this.desc.summary = summary;\n return this;\n }\n\n /**\n * column description\n */\n description(description: string) {\n this.desc.description = description;\n return this;\n }\n\n /**\n * sets the frozen state of this column, i.e is sticky to the left side when scrolling horizontally\n */\n frozen() {\n this.desc.frozen = true;\n return this;\n }\n\n /**\n * specify the renderer to used for this column\n * @param {string} renderer within a cell\n * @param {string} groupRenderer within an aggregated cell\n * @param {string} summaryRenderer within the summary in the header and side panel\n */\n renderer(renderer?: string, groupRenderer?: string, summaryRenderer?: string) {\n if (renderer) {\n this.desc.renderer = renderer;\n }\n if (groupRenderer) {\n this.desc.groupRenderer = groupRenderer;\n }\n if (summaryRenderer) {\n this.desc.summaryRenderer = summaryRenderer;\n }\n return this;\n }\n\n /**\n * specify a custom additional attribute for the description\n * @param {string} key the property key\n * @param value its value\n */\n custom(key: string, value: any) {\n (<any>this.desc)[key] = value;\n return this;\n }\n\n /**\n * sets the default width of the column\n */\n width(width: number) {\n this.desc.width = width;\n return this;\n }\n\n /**\n * sets the column color in case of numerical columns\n * @deprecated use colorMapping in the number case instead\n */\n color(_color: string) {\n return this;\n }\n\n /**\n * converts the column type to be an array type, supports only base types: boolean, categorical, date, number, and string\n * @param {string[] | number} labels labels to use for each array item or the expected length of an value\n */\n asArray(labels?: string[] | number) {\n console.assert(['boolean', 'categorical', 'date', 'number', 'string', 'link'].includes(this.desc.type!));\n this.desc.type += 's';\n const a = <IArrayDesc>this.desc;\n if (Array.isArray(labels)) {\n a.labels = labels;\n a.dataLength = labels.length;\n } else if (typeof labels === 'number') {\n a.dataLength = labels;\n }\n return this;\n }\n\n /**\n * converts the column type to be a map type, supports only base types: categorical, date, number, and string\n */\n asMap() {\n console.assert(['categorical', 'date', 'number', 'string', 'link'].includes(this.desc.type!));\n this.desc.type += 'Map';\n return this;\n }\n\n /**\n * build the column description\n */\n build(_data: any[]): T {\n return <any>this.desc;\n }\n}\n\n/**\n * build a column of a given type\n * @param {string} type column type\n * @param {string} column column which contains the associated data\n * @returns {ColumnBuilder<IColumnDesc>}\n */\nexport function buildColumn(type: string, column: string) {\n return new ColumnBuilder(type, column);\n}\n","import {IDynamicHeight, ITaggleOptions, ILivePreviewOptions} from '../config';\nimport Column, {IGroupData, IGroupItem, Ranking} from '../model';\nimport {ICellRendererFactory, ERenderMode} from '../renderer';\nimport {IToolbarAction, IToolbarDialogAddon} from '../ui';\n\n/**\n * builder for LineUp/Taggle instance\n */\nexport default class LineUpBuilder {\n protected readonly options: Partial<ITaggleOptions> = {\n renderers: {},\n toolbarActions: {},\n toolbarDialogAddons: {},\n flags: {}\n };\n\n /**\n * option to enable/disable animated transitions\n * @default true\n */\n animated(enable: boolean) {\n this.options.animated = enable;\n return this;\n }\n\n livePreviews(options: Partial<ILivePreviewOptions>) {\n this.options.livePreviews = options;\n return this;\n }\n\n /**\n * option to rotate labels on demand in narrow columns\n * @param rotation rotation in degrees\n * @default 0 - disabled\n */\n labelRotation(rotation: number) {\n this.options.labelRotation = rotation;\n return this;\n }\n\n /**\n * option to enable/disable the side panel\n * @param {boolean} enable enable flag\n * @param {boolean} collapsed whether collapsed by default\n */\n sidePanel(enable: boolean, collapsed: boolean = false) {\n this.options.sidePanel = enable;\n this.options.sidePanelCollapsed = collapsed;\n return this;\n }\n\n /**\n * show the sorting and grouping hierarchy indicator in the side panel\n * @param {boolean} enable enable flag\n */\n hierarchyIndicator(enable: boolean) {\n this.options.hierarchyIndicator = enable;\n return this;\n }\n\n /**\n * option to specify the default slope graph mode\n * @default 'item'\n */\n defaultSlopeGraphMode(mode: 'item' | 'band') {\n this.options.defaultSlopeGraphMode = mode;\n return this;\n }\n\n /**\n * option to enable/disable showing a summary (histogram, ...) in the header\n * @default true\n */\n summaryHeader(enable: boolean) {\n this.options.summaryHeader = enable;\n return this;\n }\n\n /**\n * option to enforce that the whole row is shown upon hover without overflow hidden\n * @default false\n */\n expandLineOnHover(enable: boolean) {\n this.options.expandLineOnHover = enable;\n return this;\n }\n\n /**\n * option to enable overview mode by default, just valid when building a Taggle instance\n * @returns {this}\n */\n overviewMode() {\n this.options.overviewMode = true;\n return this;\n }\n\n /**\n * option to ignore unsupported browser check - at own risk\n * @returns {this}\n */\n ignoreUnsupportedBrowser() {\n this.options.ignoreUnsupportedBrowser = true;\n return this;\n }\n\n /**\n * register a new renderer factory function\n * @param id the rederer id\n * @param factory factory class implementing the renderer\n */\n registerRenderer(id: string, factory: ICellRendererFactory) {\n this.options.renderers![id] = factory;\n return this;\n }\n\n /**\n * custom function whether the given renderer should be allowed to render the give colum in the given mode\n */\n canRender(canRender: (type: string, renderer: ICellRendererFactory, col: Column, mode: ERenderMode) => boolean) {\n this.options.canRender = canRender;\n return this;\n }\n\n /**\n * register another toolbar action which can be used within a model class\n * @param id toolbar id\n * @param action\n */\n registerToolbarAction(id: string, action: IToolbarAction) {\n this.options.toolbarActions![id] = action;\n return this;\n }\n\n /**\n * register another toolbar action which can be sued within a model class\n * @param id dialog id\n * @param addon addon description\n */\n registerToolbarDialogAddon(id: string, addon: IToolbarDialogAddon) {\n this.options.toolbarDialogAddons![id] = addon;\n return this;\n }\n\n /**\n * height and padding of a row\n * @default 18 and 2\n */\n rowHeight(rowHeight: number, rowPadding: number = 2) {\n this.options.rowHeight = rowHeight;\n this.options.rowPadding = rowPadding;\n return this;\n }\n\n /**\n * height and padding of an aggregated group in pixel\n * @default 40 and 5\n */\n groupRowHeight(groupHeight: number, groupPadding: number = 5) {\n this.options.groupHeight = groupHeight;\n this.options.groupPadding = groupPadding;\n return this;\n }\n\n /**\n * custom function to compute the height of a row (group or item)\n * @param {(data: (IGroupItem | IGroupData)[], ranking: Ranking) => (IDynamicHeight | null)} callback\n */\n dynamicHeight(callback: (data: (IGroupItem | IGroupData)[], ranking: Ranking) => (IDynamicHeight | null)) {\n this.options.dynamicHeight = callback;\n return this;\n }\n\n /**\n * disables advanced ranking features (sort by, group by, sorting hierarchy, ...)\n */\n disableAdvancedRankingFeatures() {\n this.options.flags!.advancedRankingFeatures = false;\n return this;\n }\n\n /**\n * disables advanced model features (add combine column, data mapping, edit pattern, ...)\n */\n disableAdvancedModelFeatures() {\n this.options.flags!.advancedModelFeatures = false;\n return this;\n }\n\n /**\n * disables advanced ui features (change visualization, color mapping)\n */\n disableAdvancedUIFeatures() {\n this.options.flags!.advancedUIFeatures = false;\n return this;\n }\n}\n","import {\n Column, CompositeColumn, Ranking, ReduceColumn, StackColumn,\n createAggregateDesc, createGroupDesc, createImpositionBoxPlotDesc, createImpositionDesc, createImpositionsDesc,\n createNestedDesc, createRankDesc, createReduceDesc, createScriptDesc, createSelectionDesc, createStackDesc,\n EAdvancedSortMethod, IColumnDesc, ISortCriteria\n} from '../model';\nimport {DataProvider} from '../provider';\n\nexport interface IImposeColumnBuilder {\n type: 'impose';\n column: string;\n label?: string;\n colorColumn: string;\n}\n\nexport interface INestedBuilder {\n type: 'nested';\n label?: string;\n columns: string[];\n}\n\nexport interface IWeightedSumBuilder {\n type: 'weightedSum';\n columns: string[];\n label?: string;\n weights: number[];\n}\n\nexport interface IReduceBuilder {\n type: 'min' | 'max' | 'mean' | 'median';\n columns: string[];\n label?: string;\n}\n\nexport interface IScriptedBuilder {\n type: 'script';\n code: string;\n columns: string[];\n label?: string;\n}\n\n/**\n * builder for a ranking\n */\nexport class RankingBuilder {\n private static readonly ALL_MAGIC_FLAG = '*';\n\n private readonly columns: (string | {desc: IColumnDesc | ((data: DataProvider) => IColumnDesc), columns: string[], post?: (col: Column) => void })[] = [];\n private readonly sort: {column: string, asc: boolean}[] = [];\n private readonly groupSort: {column: string, asc: boolean}[] = [];\n private readonly groups: string[] = [];\n\n /**\n * specify another sorting criteria\n * @param {string} column the column name optionally with encoded sorting separated by colon, e.g. a:desc\n * @param {boolean | \"asc\" | \"desc\"} asc ascending or descending order\n */\n sortBy(column: string, asc: boolean | 'asc' | 'desc' = true) {\n if (column.includes(':')) {\n // encoded sorting order\n const index = column.indexOf(':');\n asc = <'asc' | 'desc'>column.slice(index + 1);\n column = column.slice(0, index);\n }\n this.sort.push({column, asc: asc === true || String(asc)[0] === 'a'});\n return this;\n }\n\n /**\n * specify grouping criteria\n * @returns {this}\n */\n groupBy(...columns: (string | string[])[]) {\n for (const col of columns) {\n if (Array.isArray(col)) {\n this.groups.push(...col);\n } else {\n this.groups.push(col);\n }\n }\n return this;\n }\n\n /**\n * specify another grouping sorting criteria\n * @param {string} column the column name optionally with encoded sorting separated by colon, e.g. a:desc\n * @param {boolean | \"asc\" | \"desc\"} asc ascending or descending order\n */\n groupSortBy(column: string, asc: boolean | 'asc' | 'desc' = true) {\n if (column.includes(':')) {\n // encoded sorting order\n const index = column.indexOf(':');\n asc = <'asc' | 'desc'>column.slice(index + 1);\n column = column.slice(0, index);\n }\n this.groupSort.push({column, asc: asc === true || String(asc)[0] === 'a'});\n return this;\n }\n\n /**\n * add another column to this ranking, identified by column name or label. magic names are used for special columns:\n * <ul>\n * <li>'*' = all columns</li>\n * <li>'_*' = all support columns</li>\n * <li>'_aggregate' = aggregate column</li>\n * <li>'_selection' = selection column</li>\n * <li>'_group' = group column</li>\n * <li>'_rank' = rank column</li>\n * </ul>\n * In addition build objects for combined columns are supported.\n * @param {string | IImposeColumnBuilder | INestedBuilder | IWeightedSumBuilder | IReduceBuilder | IScriptedBuilder} column\n */\n column(column: string | IImposeColumnBuilder | INestedBuilder | IWeightedSumBuilder | IReduceBuilder | IScriptedBuilder) {\n if (typeof column === 'string') {\n switch (column) {\n case '_aggregate':\n return this.aggregate();\n case '_selection':\n return this.selection();\n case '_group':\n return this.group();\n case '_rank':\n return this.rank();\n case '_*':\n return this.supportTypes();\n case '*':\n return this.allColumns();\n }\n this.columns.push(column);\n return this;\n }\n const label = column.label || null;\n // builder ish\n switch (column.type) {\n case 'impose':\n return this.impose(label, column.column, column.colorColumn);\n case 'min':\n case 'max':\n case 'median':\n case 'mean':\n console.assert(column.columns.length >= 2);\n return this.reduce(label, <any>column.type, column.columns[0], column.columns[1], ...column.columns.slice(2));\n case 'nested':\n console.assert(column.columns.length >= 1);\n return this.nested(label, column.columns[0], ... column.columns.slice(1));\n case 'script':\n return this.scripted(label, column.code, ...column.columns);\n case 'weightedSum':\n console.assert(column.columns.length >= 2);\n console.assert(column.columns.length === column.weights.length);\n const mixed: (string | number)[] = [];\n column.columns.slice(2).forEach((c, i) => {\n mixed.push(c);\n mixed.push(column.weights[i + 2]);\n });\n return this.weightedSum(label, column.columns[0], column.weights[0], column.columns[1], column.weights[1], ...mixed);\n }\n console.error('invalid column type: ', column);\n return this;\n }\n\n /**\n * add an imposed column (numerical column colored by categorical column) to this ranking\n * @param {string | null} label optional label\n * @param {string} numberColumn numerical column reference\n * @param {string} colorColumn categorical column reference\n */\n impose(label: string | null, numberColumn: string, colorColumn: string) {\n this.columns.push({\n desc: (data) => {\n const base = data.getColumns().find((d) => d.label === numberColumn || (<any>d).column === numberColumn);\n switch (base ? base.type : '') {\n case 'boxplot':\n return createImpositionBoxPlotDesc(label ? label : undefined);\n case 'numbers':\n return createImpositionsDesc(label ? label : undefined);\n default:\n return createImpositionDesc(label ? label : undefined);\n }\n },\n columns: [numberColumn, colorColumn]\n });\n return this;\n }\n\n /**\n * add a nested / group composite column\n * @param {string | null} label optional label\n * @param {string} column first element of the group enforcing not empty ones\n * @param {string} columns additional columns\n */\n nested(label: string | null, column: string, ...columns: string[]) {\n this.columns.push({\n desc: createNestedDesc(label ? label : undefined),\n columns: [column].concat(columns)\n });\n return this;\n }\n\n /**\n * @param {IColumnDesc} desc the composite column description\n * @param {string} columns additional columns to add as children\n */\n composite(desc: IColumnDesc, ...columns: string[]) {\n this.columns.push({\n desc,\n columns\n });\n return this;\n }\n\n /**\n * add a weighted sum / stack column\n * @param {string | null} label optional label\n * @param {string} numberColumn1 the first numerical column\n * @param {number} weight1 its weight (0..1)\n * @param {string} numberColumn2 the second numerical column\n * @param {number} weight2 its weight (0..1)\n * @param {string | number} numberColumnAndWeights alternating column weight references\n */\n weightedSum(label: string | null, numberColumn1: string, weight1: number, numberColumn2: string, weight2: number, ...numberColumnAndWeights: (string | number)[]) {\n const weights = [weight1, weight2].concat(<number[]>numberColumnAndWeights.filter((_, i) => i % 2 === 1));\n this.columns.push({\n desc: createStackDesc(label ? label : undefined),\n columns: [numberColumn1, numberColumn2].concat(<string[]>numberColumnAndWeights.filter((_, i) => i % 2 === 0)),\n post: (col) => {\n (<StackColumn>col).setWeights(weights);\n }\n });\n return this;\n }\n\n /**\n * add reducing column (min, max, median, mean, ...)\n * @param {string | null} label optional label\n * @param {EAdvancedSortMethod} operation operation to apply (min, max, median, mean, ...)\n * @param {string} numberColumn1 first numerical column\n * @param {string} numberColumn2 second numerical column\n * @param {string} numberColumns additional numerical columns\n */\n reduce(label: string | null, operation: EAdvancedSortMethod, numberColumn1: string, numberColumn2: string, ...numberColumns: string[]) {\n this.columns.push({\n desc: createReduceDesc(label ? label : undefined),\n columns: [numberColumn1, numberColumn2].concat(numberColumns),\n post: (col) => {\n (<ReduceColumn>col).setReduce(operation);\n }\n });\n return this;\n }\n\n /**\n * add a scripted / formula column\n * @param {string | null} label optional label\n * @param {string} code the JS code see ScriptColumn for details\n * @param {string} numberColumns additional script columns\n */\n scripted(label: string | null, code: string, ...numberColumns: string[]) {\n this.columns.push({\n desc: Object.assign(createScriptDesc(label ? label : undefined), {script: code}),\n columns: numberColumns\n });\n return this;\n }\n\n /**\n * add a selection column for easier multi selections\n */\n selection() {\n this.columns.push({\n desc: createSelectionDesc(),\n columns: []\n });\n return this;\n }\n\n /**\n * add a group column to show the current group name\n */\n group() {\n this.columns.push({\n desc: createGroupDesc(),\n columns: []\n });\n return this;\n }\n\n /**\n * add an aggregate column to this ranking to collapse/expand groups\n */\n aggregate() {\n this.columns.push({\n desc: createAggregateDesc(),\n columns: []\n });\n return this;\n }\n\n /**\n * add a ranking column\n */\n rank() {\n this.columns.push({\n desc: createRankDesc(),\n columns: []\n });\n return this;\n }\n\n /**\n * add suporttypes (aggregate, rank, selection) to the ranking\n */\n supportTypes() {\n return this.aggregate().rank().selection();\n }\n\n /**\n * add all columns to this ranking\n */\n allColumns() {\n this.columns.push(RankingBuilder.ALL_MAGIC_FLAG);\n return this;\n }\n\n build(data: DataProvider): Ranking {\n const r = data.pushRanking();\n const cols = data.getColumns();\n\n const findDesc = (c: string) => cols.find((d) => d.label === c || (<any>d).column === c);\n\n const addColumn = (c: string) => {\n const desc = findDesc(c);\n if (desc) {\n return data.push(r, desc) != null;\n }\n console.warn('invalid column: ', c);\n return false;\n };\n\n this.columns.forEach((c) => {\n if (c === RankingBuilder.ALL_MAGIC_FLAG) {\n cols.forEach((col) => data.push(r, col));\n return;\n }\n if (typeof c === 'string') {\n addColumn(c);\n return;\n }\n const col = data.create(typeof c.desc === 'function' ? c.desc(data) : c.desc)!;\n r.push(col);\n c.columns.forEach((ci) => {\n const d = findDesc(ci);\n const child = d ? data.create(d) : null;\n if (!child) {\n console.warn('invalid column: ', ci);\n return;\n }\n (<CompositeColumn>col).push(child);\n });\n if (c.post) {\n c.post(col);\n }\n });\n\n const children = r.children;\n {\n const groups: Column[] = [];\n this.groups.forEach((column) => {\n const col = children.find((d) => d.desc.label === column || (<any>d).desc.column === column);\n if (col) {\n groups.push(col);\n return;\n }\n const desc = findDesc(column);\n if (!desc) {\n console.warn('invalid group criteria column: ', column);\n return;\n }\n const col2 = data.push(r, desc);\n if (col2) {\n groups.push(col2);\n return;\n }\n console.warn('invalid group criteria column: ', column);\n });\n if (groups.length > 0) {\n r.setGroupCriteria(groups);\n }\n }\n {\n const sorts: ISortCriteria[] = [];\n this.sort.forEach(({column, asc}) => {\n const col = children.find((d) => d.desc.label === column || (<any>d).desc.column === column);\n if (col) {\n sorts.push({col, asc});\n return;\n }\n const desc = findDesc(column);\n if (!desc) {\n console.warn('invalid sort criteria column: ', column);\n return;\n }\n const col2 = data.push(r, desc);\n if (col2) {\n sorts.push({col: col2, asc});\n return;\n }\n console.warn('invalid sort criteria column: ', column);\n });\n if (sorts.length > 0) {\n r.setSortCriteria(sorts);\n }\n }\n {\n const sorts: ISortCriteria[] = [];\n this.groupSort.forEach(({column, asc}) => {\n const col = children.find((d) => d.desc.label === column || (<any>d).desc.column === column);\n if (col) {\n sorts.push({col, asc});\n return;\n }\n const desc = findDesc(column);\n if (!desc) {\n console.warn('invalid group sort criteria column: ', column);\n return;\n }\n const col2 = data.push(r, desc);\n if (col2) {\n sorts.push({col: col2, asc});\n return;\n }\n console.warn('invalid group sort criteria column: ', column);\n });\n if (sorts.length > 0) {\n r.setGroupSortCriteria(sorts);\n }\n }\n return r;\n }\n}\n\n/**\n * creates a new instance of a ranking builder\n * @returns {RankingBuilder}\n */\nexport function buildRanking() {\n return new RankingBuilder();\n}\n","import {ICategoricalColumnDesc, ICategory} from '../../model';\nimport ColumnBuilder from './ColumnBuilder';\nimport {cleanCategories} from '../../provider/utils';\nimport {resolveValue} from '../../internal';\n\nexport default class CategoricalColumnBuilder extends ColumnBuilder<ICategoricalColumnDesc> {\n\n constructor(column: string) {\n super('categorical', column);\n }\n\n /**\n * converts this type to an ordinal column type, such that categories are mapped to numbers\n */\n asOrdinal() {\n this.desc.type = 'ordinal';\n return this;\n }\n\n /**\n * specify the categories of this categorical column\n * @param {(string | Partial<ICategory>)[]} categories\n */\n categories(categories: (string | Partial<ICategory>)[]) {\n this.desc.categories = categories;\n return this;\n }\n\n /**\n * converts this type to a set column, i.e. multiple unique category in a value\n * @param {string} separator optional separator separating a string value\n */\n asSet(separator?: string) {\n if (separator) {\n (<any>this.desc).separator = separator;\n }\n this.desc.type = 'set';\n return this;\n }\n\n private derive(data: any[]) {\n // derive categories\n const categories = new Set<string>();\n const isSet = this.desc.type === 'set';\n const separator = (<any>this.desc).separator || ';';\n const val = (vi: any) => {\n if (typeof vi === 'string' && vi !== '') {\n return vi;\n }\n if (vi != null && typeof vi.value === 'string' && vi.value !== '') {\n return vi.value;\n }\n return null;\n };\n const col = (<any>this.desc).column;\n data.forEach((d) => {\n const v = resolveValue(d, col);\n if (Array.isArray(v)) {\n v.forEach((vi) => categories.add(val(vi)));\n } else if (v != null && v !== '') {\n const vs: string[] = isSet ? [v.toString()] : v.toString().split(separator);\n vs.forEach((vi) => categories.add(val(vi)));\n }\n });\n this.categories(cleanCategories(categories));\n }\n\n build(data: any[]): ICategoricalColumnDesc {\n if (!this.desc.categories) {\n this.derive(data);\n }\n return super.build(data);\n }\n}\n\n/**\n * build a categorical column type\n * @param {string} column column which contains the associated data\n * @param {(string | Partial<ICategory>)[]} categories optional category definition\n * @returns {CategoricalColumnBuilder}\n */\nexport function buildCategoricalColumn(column: string, categories?: (string | Partial<ICategory>)[]) {\n const r = new CategoricalColumnBuilder(column);\n if (categories) {\n r.categories(categories);\n }\n return r;\n}\n","import {min, max, resolveValue} from '../../internal';\nimport {EAdvancedSortMethod, ESortMethod, INumberColumnDesc, ITypedDump} from '../../model';\nimport ColumnBuilder from './ColumnBuilder';\nimport {IScriptMappingFunctionType} from '../../model/MappingFunction';\n\nexport default class NumberColumnBuilder extends ColumnBuilder<INumberColumnDesc> {\n\n constructor(column: string) {\n super('number', column);\n }\n\n /**\n * defines the mapping for this number column to normalize the data\n * @param {\"linear\" | \"sqrt\" | \"pow1.1\" | \"pow2\" | \"pow3\"} type mapping type\n * @param {[number , number]} domain input data domain [min, max]\n * @param {[number , number]} range optional output domain [0, 1]\n */\n mapping(type: 'linear' | 'sqrt' | 'pow1.1' | 'pow2' | 'pow3', domain: [number, number], range?: [number, number]) {\n if (type === 'linear') {\n this.desc.domain = domain;\n if (range) {\n this.desc.range = range;\n }\n return this;\n }\n this.desc.map = {\n type, domain, range: range || [0, 1]\n };\n return this;\n }\n\n /**\n * sets the column color in case of numerical columns\n * @deprecated use colorMapping instead\n */\n color(color: string) {\n return this.colorMapping(color);\n }\n\n colorMapping(type: string | ((v: number)=>string) | ITypedDump) {\n this.desc.colorMapping = type;\n return this;\n }\n\n /**\n * d3-format to use for formatting\n * @param format d3-format\n */\n numberFormat(format: string) {\n this.desc.numberFormat = format;\n return this;\n }\n\n /**\n * defines a script to normalize the data, see ScriptedMappingFunction for details\n * @param {string} code the code to execute\n * @param {[number , number]} domain the input data domain [min, max]\n */\n scripted(code: string | IScriptMappingFunctionType, domain: [number, number]) {\n this.desc.map = {domain, code, type: 'script'};\n return this;\n }\n\n\n /**\n * @inheritDoc\n * @param {string[] | number} labels labels to use for each array item or the expected length of an value\n * @param {EAdvancedSortMethod} sort sorting criteria when sorting by this column\n */\n asArray(labels?: string[] | number, sort?: EAdvancedSortMethod) {\n if (sort) {\n (<any>this.desc).sort = sort;\n }\n return super.asArray(labels);\n }\n\n /**\n * @inheritDoc\n * @param {EAdvancedSortMethod} sort sorting criteria when sorting by this column\n */\n asMap(sort?: EAdvancedSortMethod) {\n if (sort) {\n (<any>this.desc).sort = sort;\n }\n return super.asMap();\n }\n\n /**\n * converts type to a boxplot column type\n * @param {ESortMethod} sort sorting criteria when sorting by this column\n */\n asBoxPlot(sort?: ESortMethod) {\n if (sort) {\n (<any>this.desc).sort = sort;\n }\n this.desc.type = 'boxplot';\n return this;\n }\n\n private derive(data: any[]) {\n const col = (<any>this.desc).column;\n\n const asArray = (v: any, extra: string) => {\n const vs: number[] = [];\n (Array.isArray(v) ? v : [v]).forEach((vi) => {\n if (typeof vi === 'number' && !isNaN(vi)) {\n vs.push(vi);\n }\n if (vi != null && typeof vi.value === 'number' && !isNaN(vi.value)) {\n vs.push(vi.value);\n }\n if (vi != null && typeof vi[extra] === 'number' && !isNaN(vi[extra])) {\n vs.push(vi[extra]);\n }\n });\n return vs;\n };\n\n const minv = min(data, (d) => {\n const v = resolveValue(d, col);\n const vs: number[] = asArray(v, 'min');\n return vs.length === 0 ? Infinity : min(vs);\n });\n const maxv = max(data, (d) => {\n const v = resolveValue(d, col);\n const vs: number[] = asArray(v, 'max');\n return vs.length === 0 ? -Infinity : max(vs);\n });\n return <[number, number]>[minv, maxv];\n }\n\n\n build(data: any[]): INumberColumnDesc {\n if (!this.desc.map && !this.desc.domain) {\n // derive domain\n this.mapping('linear', this.derive(data));\n } else {\n const d = this.desc.domain || this.desc.map!.domain;\n if (isNaN(d[0]) || isNaN(d[1])) {\n const ext = this.derive(data);\n if (isNaN(d[0])) {\n d[0] = ext[0];\n }\n if (isNaN(d[1])) {\n d[1] = ext[1];\n }\n }\n }\n return super.build(data);\n }\n}\n\n/**\n * builds numerical column builder\n * @param {string} column column which contains the associated data\n * @param {[number , number]} domain domain (min, max) of this column\n * @returns {NumberColumnBuilder}\n */\nexport function buildNumberColumn(column: string, domain?: [number, number]) {\n const r = new NumberColumnBuilder(column);\n if (domain) {\n r.mapping('linear', domain);\n }\n return r;\n}\n","import {EAlignment, ILinkColumnDesc} from '../../model';\r\nimport ColumnBuilder from './ColumnBuilder';\r\n\r\nexport default class StringColumnBuilder extends ColumnBuilder<ILinkColumnDesc> {\r\n\r\n constructor(column: string) {\r\n super('string', column);\r\n }\r\n\r\n /**\r\n * makes the text editable within a cell and switches to the annotate type\r\n */\r\n editable() {\r\n this.desc.type = 'annotate';\r\n return this;\r\n }\r\n\r\n /**\r\n * changes the alignment of the column\r\n */\r\n alignment(align: EAlignment) {\r\n this.desc.alignment = align;\r\n return this;\r\n }\r\n\r\n /**\r\n * allow html text as values\r\n */\r\n html() {\r\n this.desc.escape = false;\r\n return this;\r\n }\r\n\r\n /**\r\n * provide a pattern with which the value will be wrapped, use <code>${value}</code> for the current and and <code>${item}</code> for the whole item\r\n * @param {string} pattern pattern to apply\r\n * @param {string[]} templates optional templates for patterns to provide in the edit pattern dialog\r\n */\r\n pattern(pattern: string, templates?: string[]) {\r\n this.desc.type = 'link';\r\n this.desc.pattern = pattern;\r\n if (templates) {\r\n this.desc.patternTemplates = templates;\r\n }\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * builds a string column builder\r\n * @param {string} column column which contains the associated data\r\n * @returns {StringColumnBuilder}\r\n */\r\nexport function buildStringColumn(column: string) {\r\n return new StringColumnBuilder(column);\r\n}\r\n","import {IDateColumnDesc} from '../../model';\r\nimport ColumnBuilder from './ColumnBuilder';\r\n\r\nexport default class DateColumnBuilder extends ColumnBuilder<IDateColumnDesc> {\r\n\r\n constructor(column: string) {\r\n super('date', column);\r\n }\r\n\r\n /**\r\n * specify the format and parsing d3-time pattern to convert Date to strings and vise versa\r\n * @param {string} format d3-time-format pattern\r\n * @param {string} parse optional different parsing pattern\r\n */\r\n format(format: string, parse?: string) {\r\n this.desc.dateFormat = format;\r\n if (parse) {\r\n this.desc.dateParse = parse;\r\n }\r\n return this;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * builds a date column builder\r\n * @param {string} column column which contains the associated data\r\n * @returns {DateColumnBuilder}\r\n */\r\nexport function buildDateColumn(column: string) {\r\n return new DateColumnBuilder(column);\r\n}\r\n","import {IHierarchyColumnDesc, IPartialCategoryNode} from '../../model';\r\nimport ColumnBuilder from './ColumnBuilder';\r\n\r\nexport default class HierarchyColumnBuilder extends ColumnBuilder<IHierarchyColumnDesc> {\r\n\r\n constructor(column: string) {\r\n super('hierarchy', column);\r\n }\r\n\r\n /**\r\n * specify the underlying hierarchy of this column\r\n * @param {IPartialCategoryNode} hierarchy\r\n * @param {string} hierarchySeparator specify the character to separate levels (default dot)\r\n */\r\n hierarchy(hierarchy: IPartialCategoryNode, hierarchySeparator?: string) {\r\n this.desc.hierarchy = hierarchy;\r\n if (hierarchySeparator) {\r\n this.desc.hierarchySeparator = hierarchySeparator;\r\n }\r\n return this;\r\n }\r\n\r\n build(data: any[]): IHierarchyColumnDesc {\r\n console.assert(Boolean(this.desc.hierarchy));\r\n return super.build(data);\r\n }\r\n}\r\n\r\n/**\r\n * build a hierarchical column builder\r\n * @param {string} column column which contains the associated data\r\n * @param {IPartialCategoryNode} hierarchy\r\n * @returns {HierarchyColumnBuilder}\r\n */\r\nexport function buildHierarchicalColumn(column: string, hierarchy?: IPartialCategoryNode) {\r\n const r = new HierarchyColumnBuilder(column);\r\n if (hierarchy) {\r\n r.hierarchy(hierarchy);\r\n }\r\n return r;\r\n}\r\n","import {IActionColumnDesc, IAction, IGroupAction} from '../../model';\r\nimport ColumnBuilder from './ColumnBuilder';\r\n\r\nexport default class ActionsColumnBuilder extends ColumnBuilder<IActionColumnDesc> {\r\n\r\n constructor() {\r\n super('actions', '');\r\n }\r\n\r\n /**\r\n * adds another action\r\n * @param action the action\r\n */\r\n action(action: IAction) {\r\n return this.actions([action]);\r\n }\r\n\r\n /**\r\n * adds multiple actions\r\n * @param actions list of actions\r\n */\r\n actions(actions: IAction[]) {\r\n if (!this.desc.actions) {\r\n this.desc.actions = [];\r\n }\r\n this.desc.actions!.push(...actions);\r\n return this;\r\n }\r\n\r\n /**\r\n * adds another action that is shown in group rows\r\n * @param action the action\r\n */\r\n groupAction(action: IGroupAction) {\r\n return this.groupActions([action]);\r\n }\r\n\r\n /**\r\n * add multiple group actions that are shown in group rows\r\n * @param actions list of actions\r\n */\r\n groupActions(actions: IGroupAction[]) {\r\n if (!this.desc.groupActions) {\r\n this.desc.groupActions = [];\r\n }\r\n this.desc.groupActions!.push(...actions);\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * builds a actions column builder\r\n * @returns {ActionsColumnBuilder}\r\n */\r\nexport function buildActionsColumn() {\r\n return new ActionsColumnBuilder();\r\n}\r\n","import {IBooleanColumnDesc} from '../../model';\nimport ColumnBuilder from './ColumnBuilder';\n\nexport default class BooleanColumnBuilder extends ColumnBuilder<IBooleanColumnDesc> {\n\n constructor(column: string) {\n super('boolean', column);\n }\n\n trueMarker(marker: string) {\n this.desc.trueMarker = marker;\n return this;\n }\n\n falseMarker(marker: string) {\n this.desc.falseMarker = marker;\n return this;\n }\n}\n\n/**\n * builds a boolean column builder\n * @param {string} column column which contains the associated data\n * @returns {BooleanColumnBuilder}\n */\nexport function buildBooleanColumn(column: string) {\n return new BooleanColumnBuilder(column);\n}\n","import {IColumnDesc, IColumnConstructor} from '../model';\nimport {DataProvider, LocalDataProvider, deriveColors, deriveColumnDescriptions, IDataProviderOptions, ILocalDataProviderOptions, IAggregationStrategy} from '../provider';\nimport {LineUp, Taggle} from '../ui';\nimport ColumnBuilder from './column/ColumnBuilder';\nimport LineUpBuilder from './LineUpBuilder';\nimport {RankingBuilder} from './RankingBuilder';\n\nexport * from './column';\nexport * from './RankingBuilder';\n\n/**\n * builder for a LocalDataProvider along with LineUp configuration options\n */\nexport class DataBuilder extends LineUpBuilder {\n private readonly columns: (IColumnDesc | ((data: any[]) => IColumnDesc))[] = [];\n private readonly providerOptions: Partial<ILocalDataProviderOptions & IDataProviderOptions> = {\n columnTypes: {}\n };\n\n private readonly rankBuilders: ((data: DataProvider) => void)[] = [];\n private _deriveColors: boolean = false;\n\n constructor(private readonly data: object[]) {\n super();\n }\n\n /**\n * use the schedulded task executor to asynchronously compute aggregations\n */\n scheduledTaskExecutor() {\n this.providerOptions.taskExecutor = 'scheduled';\n return this;\n }\n\n /**\n * when using a top-n strategy how many items should be shown\n */\n showTopN(n: number) {\n this.providerOptions.showTopN = n;\n return this;\n }\n\n /**\n * change the aggregation strategy that should be used when grouping by a column\n */\n aggregationStrategy(strategy: IAggregationStrategy) {\n this.providerOptions.aggregationStrategy = strategy;\n return this;\n }\n\n /**\n * whether to propagate a collapse operation to its children\n * @default true\n */\n propagateAggregationState(value: boolean) {\n this.providerOptions.propagateAggregationState = value;\n return this;\n }\n\n /**\n * allow just a single selection\n */\n singleSelection() {\n this.providerOptions.singleSelection = true;\n return this;\n }\n\n /**\n * filter all rankings by all filters in LineUp\n */\n filterGlobally() {\n this.providerOptions.filterGlobally = true;\n return this;\n }\n\n /**\n * triggers to derive the column descriptions for the given data\n * @param {string} columns optional enforced order of columns\n */\n deriveColumns(...columns: (string | string[])[]) {\n const cols = (<string[]>[]).concat(...columns);\n for (const c of deriveColumnDescriptions(this.data, {columns: cols})) {\n this.columns.push(c);\n }\n return this;\n }\n\n /**\n * tirggers to assign colors for the given descriptions\n */\n deriveColors() {\n this._deriveColors = true;\n return this;\n }\n\n /**\n * register another column type to this data provider\n * @param {string} type unique type id\n * @param {IColumnConstructor} clazz column class\n */\n registerColumnType(type: string, clazz: IColumnConstructor) {\n this.providerOptions.columnTypes![type] = clazz;\n return this;\n }\n\n /**\n * push another column description to this data provider\n * @param {IColumnDesc | ColumnBuilder} column column description or builder instance\n */\n column(column: IColumnDesc | ColumnBuilder | ((data: any[]) => IColumnDesc)) {\n this.columns.push(column instanceof ColumnBuilder ? column.build.bind(column) : column);\n return this;\n }\n\n /**\n * restores a given ranking dump\n * @param dump dump as created using '.dump()'\n */\n restore(dump: any) {\n this.rankBuilders.push((data) => data.restore(dump));\n return this;\n }\n\n /**\n * add the default ranking (all columns) to this data provider\n * @param {boolean} addSupportTypes add support types, too, default: true\n */\n defaultRanking(addSupportTypes: boolean = true) {\n this.rankBuilders.push((data) => data.deriveDefault(addSupportTypes));\n return this;\n }\n\n /**\n * add another ranking to this data provider\n * @param {((data: DataProvider) => void) | RankingBuilder} builder ranking builder\n */\n ranking(builder: ((data: DataProvider) => void) | RankingBuilder) {\n this.rankBuilders.push(builder instanceof RankingBuilder ? builder.build.bind(builder) : builder);\n return this;\n }\n\n /**\n * builds the data provider itself\n * @returns {LocalDataProvider}\n */\n buildData() {\n // last come survived separted by label to be able to override columns\n const columns: IColumnDesc[] = [];\n const contained = new Set<string>();\n for (const col of this.columns) {\n const c = typeof col === 'function' ? col(this.data) : col;\n const key = `${c.type}@${c.label}`;\n if (!contained.has(key)) {\n columns.push(c);\n contained.add(key);\n continue;\n }\n const oldPos = columns.findIndex((d) => key === `${d.type}@${d.label}`);\n columns.splice(oldPos, 1, c); // replace with new one\n }\n if (this._deriveColors) {\n deriveColors(columns);\n }\n const r = new LocalDataProvider(this.data, columns, this.providerOptions);\n if (this.rankBuilders.length === 0) {\n this.defaultRanking();\n }\n this.rankBuilders.forEach((builder) => builder(r));\n return r;\n }\n\n /**\n * builds LineUp at the given parent DOM node\n * @param {HTMLElement} node parent DOM node to attach\n * @returns {LineUp}\n */\n build(node: HTMLElement) {\n return new LineUp(node, this.buildData(), this.options);\n }\n\n /**\n * builds Taggle at the given parent DOM node\n * @param {HTMLElement} node parent DOM node to attach\n * @returns {Taggle}\n */\n buildTaggle(node: HTMLElement) {\n return new Taggle(node, this.buildData(), this.options);\n }\n}\n\n\n/**\n * creates a new builder instance for the given data\n * @param {object[]} arr data to visualize\n * @returns {DataBuilder}\n */\nexport function builder(arr: object[]) {\n return new DataBuilder(arr);\n}\n\n\n/**\n * build a new Taggle instance in the given node for the given data\n * @param {HTMLElement} node DOM node to attach to\n * @param {any[]} data data to visualize\n * @param {string[]} columns optional enforced column order\n * @returns {Taggle}\n */\nexport function asTaggle(node: HTMLElement, data: any[], ...columns: string[]): Taggle {\n return builder(data)\n .deriveColumns(columns)\n .deriveColors()\n .defaultRanking()\n .buildTaggle(node);\n}\n\n/**\n * build a new LineUp instance in the given node for the given data\n * @param {HTMLElement} node DOM node to attach to\n * @param {any[]} data data to visualize\n * @param {string[]} columns optional enforced column order\n * @returns {LineUp}\n */\nexport function asLineUp(node: HTMLElement, data: any[], ...columns: string[]): LineUp {\n return builder(data)\n .deriveColumns(columns)\n .deriveColors()\n .defaultRanking()\n .build(node);\n}\n","import {extent, resolveValue} from '../../internal';\nimport {IActionColumnDesc, IArrayDesc, IBooleanColumnDesc, ICategoricalColumnDesc, IColumnDesc, IDateColumnDesc, IHierarchyColumnDesc, ILinkColumnDesc, INumberColumnDesc} from '../../model';\nimport {IBuilderAdapterActionsColumnDescProps, IBuilderAdapterBooleanColumnDescProps, IBuilderAdapterCategoricalColumnDescProps, IBuilderAdapterColumnDescProps, IBuilderAdapterDateColumnDescProps, IBuilderAdapterHierarchyColumnDescProps, IBuilderAdapterNumberColumnDescProps, IBuilderAdapterStringColumnDescProps} from '.';\n\nexport function build<T extends IBuilderAdapterColumnDescProps>(props: T, _data?: any[]): IColumnDesc {\n const {column} = props;\n const desc = <any>{column, type: props.type, label: column ? column[0].toUpperCase() + column.slice(1) : props.type};\n\n (<(keyof IBuilderAdapterColumnDescProps)[]>['label', 'description', 'frozen', 'width', 'renderer', 'groupRenderer', 'summaryRenderer', 'visible', 'fixed']).forEach((key) => {\n if (props.hasOwnProperty(key)) {\n desc[key] = props[key];\n }\n });\n\n if (props.custom) { // merge custom attributes\n Object.assign(desc, props.custom);\n }\n\n if (props.asMap) {\n console.assert(['categorical', 'date', 'number', 'string', 'link'].includes(desc.type!));\n desc.type += 'Map';\n }\n\n if (props.asArray != null) {\n console.assert(['boolean', 'categorical', 'date', 'number', 'string', 'link'].includes(desc.type!));\n desc.type += 's';\n const a = <IArrayDesc>desc;\n const labels = props.asArray;\n if (Array.isArray(labels)) {\n a.labels = labels;\n a.dataLength = labels.length;\n } else if (typeof labels === 'number') {\n a.dataLength = labels;\n }\n }\n\n return <any>desc;\n}\n\n\nexport function buildCategorical(props: IBuilderAdapterCategoricalColumnDescProps, data: any[]): ICategoricalColumnDesc {\n const desc: any = build({...props, type: 'categorical'});\n\n if (props.asOrdinal) {\n desc.type = 'ordinal';\n }\n if (props.missingCategory) {\n desc.missingCategory = props.missingCategory;\n }\n if (props.asSet) {\n if (typeof props.asSet === 'string') {\n (<any>desc).separator = props.asSet;\n }\n desc.type = 'set';\n }\n\n\n if (!props.categories) {\n // derive categories\n const categories = new Set(data.map((d) => <string>resolveValue(d, (<any>desc).column)));\n desc.categories = Array.from(categories).sort();\n } else {\n desc.categories = props.categories;\n }\n return desc;\n}\n\nexport function buildDate(props: IBuilderAdapterDateColumnDescProps): IDateColumnDesc {\n const desc: any = build({...props, type: 'date'});\n\n (<(keyof IBuilderAdapterDateColumnDescProps)[]>['dateFormat', 'dateParse']).forEach((key) => {\n if (props.hasOwnProperty(key)) {\n desc[key] = props[key];\n }\n });\n return desc;\n}\n\nexport function buildHierarchy(props: Partial<IBuilderAdapterHierarchyColumnDescProps>): IHierarchyColumnDesc {\n const desc: any = build({...(<any>props), type: 'hierarchy'});\n\n (<(keyof IBuilderAdapterHierarchyColumnDescProps)[]>['hierarchy', 'hierarchySeparator']).forEach((key) => {\n if (props.hasOwnProperty(key)) {\n desc[key] = props[key];\n }\n });\n return desc;\n}\n\nexport function buildNumber(props: IBuilderAdapterNumberColumnDescProps, data: any[]): INumberColumnDesc {\n const desc: any = build({...props, type: 'number'});\n\n const domain = props.domain ? props.domain : <[number, number]>extent(data, (d) => <number>resolveValue(d, (<any>desc).column));\n\n if (props.hasOwnProperty('color')) {\n desc.colorMapping = props.color;\n }\n (<(keyof IBuilderAdapterNumberColumnDescProps)[]>['sort', 'colorMapping']).forEach((key) => {\n if (props.hasOwnProperty(key)) {\n desc[key] = props[key];\n }\n });\n if (props.scripted) {\n desc.map = {domain, code: props.scripted, type: 'script'};\n } else if (!props.mapping || props.mapping === 'linear') {\n desc.domain = domain;\n if (props.range) {\n desc.range = props.range;\n }\n } else {\n desc.map = {\n type: props.mapping,\n domain,\n range: props.range || [0, 1]\n };\n }\n return desc;\n}\n\nexport function buildString(props: IBuilderAdapterStringColumnDescProps): ILinkColumnDesc {\n const desc: any = build({...props, type: 'string'});\n\n (<(keyof IBuilderAdapterStringColumnDescProps)[]>['pattern', 'patternTemplate', 'alignment']).forEach((key) => {\n if (props.hasOwnProperty(key)) {\n desc[key] = props[key];\n }\n });\n if (props.editable) {\n desc.type = 'annotate';\n }\n if (props.pattern) {\n desc.type = 'link';\n }\n if (props.html) {\n desc.escape = false;\n }\n return desc;\n}\n\n\nexport function buildBoolean(props: IBuilderAdapterBooleanColumnDescProps): IBooleanColumnDesc {\n const desc: any = build({...props, type: 'boolean'});\n\n (<(keyof IBuilderAdapterBooleanColumnDescProps)[]>['trueMarker', 'falseMarker']).forEach((key) => {\n if (props.hasOwnProperty(key)) {\n desc[key] = props[key];\n }\n });\n return desc;\n}\n\nexport function buildActions(props: IBuilderAdapterActionsColumnDescProps): IActionColumnDesc {\n const desc: any = build({...props, type: 'actions'});\n\n (<(keyof IBuilderAdapterActionsColumnDescProps)[]>['actions', 'groupActions']).forEach((key) => {\n if (props.hasOwnProperty(key)) {\n desc[key] = props[key];\n }\n });\n return desc;\n}\n\n","import {buildRanking as buildRankingImpl, INestedBuilder, IReduceBuilder, IScriptedBuilder, IWeightedSumBuilder} from '..';\nimport {Ranking} from '../../model';\nimport {LocalDataProvider} from '../../provider';\nimport {IBuilderAdapterImposeColumnProps, IBuilderAdapterNestedColumnProps, IBuilderAdapterRankingProps, IBuilderAdapterReduceColumnProps, IBuilderAdapterScriptColumnProps, IBuilderAdapterSupportColumnProps, IBuilderAdapterWeightedSumColumnProps} from '.';\n\n\n/*\n * build the column description\n */\nexport function buildRanking(props: IBuilderAdapterRankingProps, data: LocalDataProvider): Ranking {\n const r = buildRankingImpl();\n\n if (props.sortBy) {\n const s = Array.isArray(props.sortBy) ? props.sortBy : [props.sortBy];\n s.forEach((si) => {\n if (typeof si === 'string') {\n r.sortBy(si);\n } else {\n r.sortBy(si.column, si.asc);\n }\n });\n }\n if (props.groupBy) {\n const s = Array.isArray(props.groupBy) ? props.groupBy : [props.groupBy];\n r.groupBy(...s);\n }\n if (props.columns) {\n props.columns.forEach((c) => r.column(c));\n }\n return r.build(data);\n}\n\nexport function buildGeneric(props: { column: '*' | string }) {\n return props.column;\n}\n\nexport function buildImposeRanking(props: IBuilderAdapterImposeColumnProps) {\n return <any>Object.assign({\n type: 'impose'\n }, props);\n}\n\n\nexport function buildNestedRanking(props: IBuilderAdapterNestedColumnProps, children: string[]) {\n const r: INestedBuilder = {\n type: 'nested',\n columns: children\n };\n if (props.label) {\n r.label = props.label;\n }\n return r;\n}\n\n\nexport function buildWeightedSumRanking(props: IBuilderAdapterWeightedSumColumnProps, children: { column: string, weight: number }[]) {\n const r: IWeightedSumBuilder = {\n type: 'weightedSum',\n columns: children.map((d) => d.column),\n weights: children.map((d) => d.weight)\n };\n if (props.label) {\n r.label = props.label;\n }\n return r;\n}\n\nexport function buildReduceRanking(props: IBuilderAdapterReduceColumnProps, children: string[]) {\n const r: IReduceBuilder = {\n type: props.type,\n columns: children\n };\n if (props.label) {\n r.label = props.label;\n }\n return r;\n}\n\nexport function buildScriptRanking(props: IBuilderAdapterScriptColumnProps, children: string[]) {\n const r: IScriptedBuilder = {\n type: 'script',\n code: props.code,\n columns: children\n };\n if (props.label) {\n r.label = props.label;\n }\n return r;\n}\n\nexport function buildSupportRanking(props: IBuilderAdapterSupportColumnProps) {\n return `_${props.type}`;\n}\n\nexport function buildAllColumnsRanking() {\n return '*';\n}\n","export {equal} from '../../internal';\n\nexport function isTypeInstance(clazz: any, superClass: any) {\n let c = clazz;\n while (c && c !== superClass) {\n c = c.__proto__;\n }\n return c === superClass;\n}\n\nexport function pick<T extends object>(obj: T, keys: (keyof T)[]): Pick<T, keyof T> {\n const r: Pick<T, keyof T> = <any>{};\n keys.forEach((k) => {\n if (obj.hasOwnProperty(k)) {\n r[k] = obj[k];\n }\n });\n return r;\n}\n\nexport function isSame<T extends object>(current: T, changed: (prop: keyof T) => boolean, props: (keyof T)[]) {\n if (props.every((p) => !changed(p))) {\n return null;\n }\n return pick(current, props);\n}\n","import {IBuilderAdapter, IBuilderAdapterProps, IBuilderAdapterRankingProps, IChangeDetecter} from '.';\nimport {IColumnDesc} from '../../model';\nimport {deriveColors, deriveColumnDescriptions, IDataProviderOptions, ILocalDataProviderOptions, LocalDataProvider} from '../../provider';\nimport {LineUp, Taggle} from '../../ui';\nimport {buildRanking} from './ranking';\nimport {equal, isSame, pick} from './utils';\n\n\nconst providerOptions: (keyof IDataProviderOptions | keyof ILocalDataProviderOptions)[] = ['singleSelection', 'filterGlobally', 'columnTypes', 'taskExecutor', 'jumpToSearchResult'];\nconst lineupOptions: (keyof IBuilderAdapterProps)[] = ['animated', 'sidePanel', 'sidePanelCollapsed', 'hierarchyIndicator', 'defaultSlopeGraphMode', 'summaryHeader', 'expandLineOnHover', 'overviewMode', 'renderers', 'canRender', 'toolbarActions', 'toolbarDialogAddons', 'rowHeight', 'rowPadding', 'groupHeight', 'groupPadding', 'dynamicHeight', 'labelRotation', 'ignoreUnsupportedBrowser', 'livePreviews'];\n\ninterface IRankingContext {\n builders: IBuilderAdapterRankingProps[];\n restore: any;\n derive: boolean;\n supportTypes: boolean;\n}\n\ninterface IColumnContext {\n columns: IColumnDesc[];\n deriveColumns: boolean;\n deriveColumnNames: string[];\n deriveColors: boolean;\n}\n\nexport class Adapter {\n private data: LocalDataProvider | null = null;\n private instance: LineUp | Taggle | null = null;\n\n private prevRankings: IRankingContext | null = null;\n private prevColumns: IColumnContext | null = null;\n private prevHighlight: number | null = null;\n\n private readonly onSelectionChanged = (indices: number[]) => {\n if (this.props.onSelectionChanged && !equal(this.props.selection, indices)) {\n this.props.onSelectionChanged(indices);\n }\n }\n\n private readonly onHighlightChanged = (highlight: number) => {\n const prev = this.prevHighlight != null ? this.prevHighlight : -1;\n if (prev === highlight) {\n return;\n }\n this.prevHighlight = highlight;\n if (this.props.onHighlightChanged) {\n this.props.onHighlightChanged(highlight);\n }\n }\n\n constructor(private readonly adapter: IBuilderAdapter) {\n\n }\n\n private get props() {\n return this.adapter.props();\n }\n\n componentDidMount() {\n this.data = this.buildProvider();\n this.instance = this.adapter.createInstance(this.data, pick(this.props, lineupOptions));\n this.instance.on(LineUp.EVENT_HIGHLIGHT_CHANGED, this.onHighlightChanged);\n }\n\n private resolveColumnDescs(data: any[]): IColumnContext {\n const columns = this.adapter.columnDescs(data);\n const deriveColumns = columns.length === 0 || Boolean(this.props.deriveColumns);\n const deriveColumnNames = Array.isArray(this.props.deriveColumns) ? this.props.deriveColumns : [];\n const deriveColors = Boolean(this.props.deriveColors);\n return {\n columns,\n deriveColors,\n deriveColumns,\n deriveColumnNames\n };\n }\n\n private resolveRankings(): IRankingContext {\n const builders = this.adapter.rankingBuilders();\n\n return {\n builders,\n restore: this.props.restore,\n derive: (builders.length === 0 && !this.props.restore) || Boolean(this.props.defaultRanking),\n supportTypes: this.props.defaultRanking !== 'noSupportTypes'\n };\n }\n\n private buildColumns(data: any[], ctx: IColumnContext) {\n this.prevColumns = ctx;\n const columns = ctx.columns.map((d) => Object.assign({}, d)); // work on copy\n if (ctx.deriveColumns) {\n const labels = new Set(columns.map((d) => `${d.type}@${d.label}`));\n const derived = deriveColumnDescriptions(data, {columns: ctx.deriveColumnNames});\n for (const derive of derived) {\n if (labels.has(`${derive.type}@${derive.label}`)) { // skip same name\n continue;\n }\n columns.push(derive);\n }\n }\n if (ctx.deriveColors) {\n deriveColors(columns);\n }\n return columns;\n }\n\n private buildRankings(data: LocalDataProvider, rankings: IRankingContext) {\n data.clearRankings();\n this.prevRankings = rankings;\n if (rankings.derive) {\n data.deriveDefault(rankings.supportTypes);\n }\n if (rankings.restore) {\n data.restore(rankings.restore);\n }\n rankings.builders.forEach((b) => buildRanking(b, data!));\n }\n\n private buildProvider() {\n const columns = this.buildColumns(this.props.data, this.resolveColumnDescs(this.props.data));\n const data = new LocalDataProvider(this.props.data, columns, pick(this.props, providerOptions));\n\n this.buildRankings(data, this.resolveRankings());\n\n data.setSelection(this.props.selection || []);\n data.on(LocalDataProvider.EVENT_SELECTION_CHANGED, this.onSelectionChanged);\n\n return data;\n }\n\n private updateLineUp(changeDetector: IChangeDetecter, providerChanged: boolean) {\n // check lineup instance properties\n const changedLineUpOptions = isSame(this.props, changeDetector, lineupOptions);\n if (!changedLineUpOptions) {\n if (providerChanged) {\n this.instance!.setDataProvider(this.data!);\n }\n\n if (providerChanged || (this.props.highlight != null && this.prevHighlight !== this.props.highlight)) {\n this.prevHighlight = this.props.highlight == null ? -1 : this.props.highlight;\n this.instance!.on(LineUp.EVENT_HIGHLIGHT_CHANGED, null);\n this.instance!.setHighlight(this.prevHighlight);\n this.instance!.on(LineUp.EVENT_HIGHLIGHT_CHANGED, this.onHighlightChanged);\n return true;\n }\n return false;\n }\n // recreate lineup\n if (this.instance) {\n this.instance.destroy();\n }\n this.instance = this.adapter.createInstance(this.data!, changedLineUpOptions);\n\n this.prevHighlight = this.props.highlight == null ? -1 : this.props.highlight;\n this.instance!.setHighlight(this.prevHighlight);\n this.instance!.on(LineUp.EVENT_HIGHLIGHT_CHANGED, this.onHighlightChanged);\n return true;\n }\n\n private updateProvider(changeDetector: IChangeDetecter) {\n const changedProviderOptions = isSame(this.props, changeDetector, providerOptions);\n if (changedProviderOptions || !this.data || changeDetector('data')) {\n // big change start from scratch\n this.data = this.buildProvider();\n return true;\n }\n\n const rankings = this.resolveRankings();\n const columns = this.resolveColumnDescs(this.props.data);\n const columnsChanged = !equal(this.prevColumns, columns);\n if (columnsChanged) {\n const descs = this.buildColumns(this.props.data, columns);\n this.data.clearColumns();\n descs.forEach((d) => this.data!.pushDesc(d));\n }\n\n if (columnsChanged || !equal(rankings, this.prevRankings)) {\n this.buildRankings(this.data, rankings);\n }\n\n this.data.on(LocalDataProvider.EVENT_SELECTION_CHANGED, null);\n this.data.setSelection(this.props.selection || []);\n this.data.on(LocalDataProvider.EVENT_SELECTION_CHANGED, this.onSelectionChanged);\n return false;\n }\n\n componentDidUpdate(changeDetector: IChangeDetecter) {\n const providerChanged = this.updateProvider(changeDetector);\n this.updateLineUp(changeDetector, providerChanged);\n // this.instance!.update();\n }\n\n componentWillUnmount() {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n this.data = null;\n }\n}\n","\nimport {build, buildCategorical, buildDate, buildHierarchy, buildNumber, buildString, buildActions} from './column';\nimport {Adapter} from './lineup';\nimport {\n buildAllColumnsRanking,\n buildGeneric,\n buildImposeRanking,\n buildNestedRanking,\n buildRanking,\n buildReduceRanking,\n buildScriptRanking,\n buildSupportRanking,\n buildWeightedSumRanking\n} from './ranking';\nimport {equal, isSame, isTypeInstance} from './utils';\n\nexport const builderAdapter = {\n buildString,\n buildNumber,\n buildHierarchy,\n buildDate,\n buildCategorical,\n buildActions,\n build,\n buildGeneric,\n buildWeightedSumRanking,\n buildSupportRanking,\n buildScriptRanking,\n buildReduceRanking,\n buildRanking,\n buildNestedRanking,\n buildImposeRanking,\n buildAllColumnsRanking,\n equal,\n isSame,\n isTypeInstance,\n Adapter\n};\n","import Column from './Column';\nimport ValueColumn from './ValueColumn';\nimport {IValueColumnDesc} from './interfaces';\n\nexport * from './annotations';\nexport {isMissingValue, isUnknown, FIRST_IS_NAN, FIRST_IS_MISSING, missingGroup} from './missing';\nexport * from './interfaces';\nexport * from './ICategoricalColumn';\nexport * from './INumberColumn';\nexport * from './IDateColumn';\nexport * from './IArrayColumn';\n\nexport {toCategories} from './internalCategorical';\n\nexport {ScaleMappingFunction, ScriptMappingFunction, mappingFunctions} from './MappingFunction';\nexport {DEFAULT_CATEGORICAL_COLOR_FUNCTION, ReplacmentColorMappingFunction} from './CategoricalColorMappingFunction';\nexport {CustomColorMappingFunction, DEFAULT_COLOR_FUNCTION, SequentialColorFunction, DivergentColorFunction, UnknownColorFunction, QuantizedColorFunction, SolidColorFunction} from './ColorMappingFunction';\n\nexport {default as ActionColumn} from './ActionColumn';\nexport * from './ActionColumn';\nexport {default as AggregateGroupColumn} from './AggregateGroupColumn';\nexport * from './AggregateGroupColumn';\nexport {default as AnnotateColumn} from './AnnotateColumn';\nexport * from './AnnotateColumn';\nexport {default as ArrayColumn} from './ArrayColumn';\nexport * from './ArrayColumn';\nexport {default as BooleanColumn} from './BooleanColumn';\nexport * from './BooleanColumn';\nexport {default as BooleansColumn} from './BooleansColumn';\nexport * from './BooleansColumn';\nexport {default as BoxPlotColumn} from './BoxPlotColumn';\nexport * from './BoxPlotColumn';\nexport {default as CategoricalColumn} from './CategoricalColumn';\nexport *from './CategoricalColumn';\nexport {default as CategoricalMapColumn} from './CategoricalMapColumn';\nexport * from './CategoricalMapColumn';\nexport {default as CategoricalsColumn} from './CategoricalsColumn';\nexport * from './CategoricalsColumn';\nexport {default, default as Column} from './Column';\n// no * export\nexport {default as CompositeColumn} from './CompositeColumn';\n// no * export\nexport {default as CompositeNumberColumn} from './CompositeNumberColumn';\nexport * from './CompositeNumberColumn';\nexport {default as DateColumn} from './DateColumn';\nexport * from './DateColumn';\nexport {default as DatesColumn} from './DatesColumn';\nexport * from './DatesColumn';\nexport {default as DatesMapColumn} from './DatesMapColumn';\nexport * from './DatesMapColumn';\nexport {default as GroupColumn} from './GroupColumn';\nexport *from './GroupColumn';\nexport {default as HierarchyColumn} from './HierarchyColumn';\nexport * from './HierarchyColumn';\nexport {default as ImpositionBoxPlotColumn} from './ImpositionBoxPlotColumn';\nexport * from './ImpositionBoxPlotColumn';\nexport {default as ImpositionCompositeColumn} from './ImpositionCompositeColumn';\nexport * from './ImpositionCompositeColumn';\nexport {default as ImpositionCompositesColumn} from './ImpositionCompositesColumn';\nexport * from './ImpositionCompositesColumn';\nexport {default as LinkColumn} from './LinkColumn';\nexport * from './LinkColumn';\nexport {default as LinkMapColumn} from './LinkMapColumn';\nexport * from './LinkMapColumn';\nexport {default as LinksColumn} from './LinksColumn';\nexport * from './LinksColumn';\nexport {default as MapColumn} from './MapColumn';\nexport * from './MapColumn';\nexport {default as MultiLevelCompositeColumn} from './MultiLevelCompositeColumn';\nexport * from './MultiLevelCompositeColumn';\nexport {default as NestedColumn} from './NestedColumn';\nexport * from './NestedColumn';\nexport {default as NumberColumn} from './NumberColumn';\nexport * from './NumberColumn';\nexport {default as NumberMapColumn} from './NumberMapColumn';\nexport * from './NumberMapColumn';\nexport {default as NumbersColumn} from './NumbersColumn';\nexport * from './NumbersColumn';\nexport {default as OrdinalColumn} from './OrdinalColumn';\nexport * from './OrdinalColumn';\nexport {default as RankColumn} from './RankColumn';\nexport * from './RankColumn';\nexport {default as Ranking, EDirtyReason} from './Ranking';\n// no * export\nexport {default as ReduceColumn} from './ReduceColumn';\nexport * from './ReduceColumn';\nexport {default as ScriptColumn} from './ScriptColumn';\nexport * from './ScriptColumn';\nexport {default as SelectionColumn} from './SelectionColumn';\nexport * from './SelectionColumn';\nexport {default as SetColumn} from './SetColumn';\nexport * from './SetColumn';\nexport {default as StackColumn} from './StackColumn';\nexport * from './StackColumn';\nexport {default as StringColumn} from './StringColumn';\nexport * from './StringColumn';\nexport {default as StringsColumn} from './StringsColumn';\nexport * from './StringsColumn';\nexport {default as StringMapColumn} from './StringMapColumn';\nexport * from './StringMapColumn';\nexport {default as ValueColumn} from './ValueColumn';\n// no * export\n\n\n/**\n * defines a new column type\n * @param name\n * @param functions\n * @returns {CustomColumn}\n */\nexport function defineColumn<T>(name: string, functions: any = {}): typeof Column {\n class CustomColumn extends ValueColumn<T> {\n constructor(id: string, desc: IValueColumnDesc<T>, ...args: any[]) {\n super(id, desc);\n if (typeof (this.init) === 'function') {\n this.init(id, desc, ...args);\n }\n }\n\n init(..._args: any[]) {\n // dummy\n }\n }\n\n CustomColumn.prototype.toString = () => name;\n CustomColumn.prototype = Object.assign(CustomColumn.prototype, functions);\n\n return CustomColumn;\n}\n","import Column, {IColumnDesc, IDataRow, Ranking, defaultGroup, IndicesArray, IOrderedGroup} from '../model';\nimport ACommonDataProvider from './ACommonDataProvider';\nimport {IDataProviderOptions} from './interfaces';\nimport {DirectRenderTasks} from './DirectRenderTasks';\nimport {IRenderTasks} from '../renderer';\n\n/**\n * interface what the server side has to provide\n */\nexport interface IServerData {\n /**\n * sort the dataset by the given description\n * @param ranking\n */\n sort(ranking: Ranking): Promise<IndicesArray>;\n\n /**\n * returns a slice of the data array identified by a list of indices\n * @param indices\n */\n view(indices: number[]): Promise<any[]>;\n\n /**\n * returns a sample of the values for a given column\n * @param column\n */\n mappingSample(column: any): Promise<number[]>;\n\n /**\n * return the matching indices matching the given arguments\n * @param search\n * @param column\n */\n search(search: string | RegExp, column: any): Promise<number[]>;\n}\n\n\nexport interface IRemoteDataProviderOptions {\n /**\n * maximal cache size (unused at the moment)\n */\n maxCacheSize: number;\n}\n\nfunction createIndex2Pos(order: IndicesArray) {\n const index2pos = <number[]>[];\n for (let i = 0; i < order.length; ++i) {\n index2pos[order[i]] = i + 1;\n }\n return index2pos;\n}\n\n/**\n * a remote implementation of the data provider\n */\nexport default class RemoteDataProvider extends ACommonDataProvider {\n private readonly ooptions: IRemoteDataProviderOptions = {\n maxCacheSize: 1000\n };\n\n private readonly cache = new Map<number, Promise<IDataRow>>();\n\n\n constructor(private server: IServerData, columns: IColumnDesc[] = [], options: Partial<IRemoteDataProviderOptions & IDataProviderOptions> = {}) {\n super(columns, options);\n Object.assign(this.ooptions, options);\n }\n\n getTotalNumberOfRows() {\n // TODO not correct\n return this.cache.size;\n }\n\n getTaskExecutor(): IRenderTasks {\n // FIXME\n return new DirectRenderTasks([]);\n }\n\n sort(ranking: Ranking) : Promise<{groups: IOrderedGroup[], index2pos: IndicesArray}> | {groups: IOrderedGroup[], index2pos: IndicesArray} {\n //use the server side to sort\n return this.server.sort(ranking).then((order) => ({groups: [Object.assign({order}, defaultGroup)], index2pos: createIndex2Pos(order)}));\n }\n\n private loadFromServer(indices: number[]) {\n return this.server.view(indices).then((view) => {\n //enhance with the data index\n return view.map((v, i) => {\n const dataIndex = indices[i];\n return {v, dataIndex};\n });\n });\n }\n\n view(indices: number[]): Promise<any[]> {\n if (indices.length === 0) {\n return Promise.resolve([]);\n }\n const base = this.fetch([indices])[0];\n return Promise.all(base).then((rows) => rows.map((d) => d.v));\n }\n\n\n private computeMissing(orders: number[][]): number[] {\n const union = new Set<number>();\n const unionAdd = union.add.bind(union);\n orders.forEach((order) => order.forEach(unionAdd));\n\n // removed cached\n this.cache.forEach((_v, k) => union.delete(k));\n\n if ((this.cache.size + union.size) > this.ooptions.maxCacheSize) {\n // clean up cache\n }\n // const maxLength = Math.max(...orders.map((o) => o.length));\n return Array.from(union);\n }\n\n private loadInCache(missing: number[]) {\n if (missing.length === 0) {\n return;\n }\n // load data and map to rows;\n const v = this.loadFromServer(missing);\n missing.forEach((_m, i) => {\n const dataIndex = missing[i];\n this.cache.set(dataIndex, v.then((loaded) => ({v: loaded[i], i: dataIndex})));\n });\n }\n\n fetch(orders: number[][]): Promise<IDataRow>[][] {\n const toLoad = this.computeMissing(orders);\n this.loadInCache(toLoad);\n\n return orders.map((order) =>\n order.map((i) => this.cache.get(i)!));\n }\n\n getRow(index: number) {\n if (this.cache.has(index)) {\n return this.cache.get(index)!;\n }\n this.loadInCache([index]);\n return this.cache.get(index)!;\n }\n\n\n mappingSample(col: Column): Promise<number[]> {\n return this.server.mappingSample((<any>col.desc).column);\n }\n\n searchAndJump(search: string | RegExp, col: Column) {\n this.server.search(search, (<any>col.desc).column).then((indices) => {\n this.jumpToNearest(indices);\n });\n }\n}\n","export {colorOf} from './impose';\nexport * from './interfaces';\nexport {renderMissingCanvas, renderMissingDOM} from './missing';\n\nimport {AAggregatedGroupRenderer} from './AAggregatedGroupRenderer';\nimport {ANumbersCellRenderer} from './ANumbersCellRenderer';\nimport ActionRenderer from './ActionRenderer';\nimport AggregateGroupRenderer from './AggregateGroupRenderer';\nimport AnnotationRenderer from './AnnotationRenderer';\nimport BarCellRenderer from './BarCellRenderer';\nimport BooleanCellRenderer from './BooleanCellRenderer';\nimport BoxplotCellRenderer from './BoxplotCellRenderer';\nimport BrightnessCellRenderer, {toHeatMapColor} from './BrightnessCellRenderer';\nimport CategoricalCellRenderer from './CategoricalCellRenderer';\nimport CategoricalHeatmapCellRenderer from './CategoricalHeatmapCellRenderer';\nimport CategoricalStackedDistributionlCellRenderer from './CategoricalStackedDistributionlCellRenderer';\nimport CircleCellRenderer from './CircleCellRenderer';\nimport DateCellRenderer from './DateCellRenderer';\nimport DateHistogramCellRenderer from './DateHistogramCellRenderer';\nimport {DefaultCellRenderer} from './DefaultCellRenderer';\nimport DotCellRenderer from './DotCellRenderer';\nimport GroupCellRenderer from './GroupCellRenderer';\nimport HeatmapCellRenderer from './HeatmapCellRenderer';\nimport HistogramCellRenderer from './HistogramCellRenderer';\nimport ImageCellRenderer from './ImageCellRenderer';\nimport InterleavingCellRenderer from './InterleavingCellRenderer';\nimport LinkCellRenderer from './LinkCellRenderer';\nimport LinkMapCellRenderer from './LinkMapCellRenderer';\nimport LoadingCellRenderer from './LoadingCellRenderer';\nimport MapBarCellRenderer from './MapBarCellRenderer';\nimport MultiLevelCellRenderer from './MultiLevelCellRenderer';\nimport RankCellRenderer from './RankCellRenderer';\nimport SelectionRenderer from './SelectionRenderer';\nimport SetCellRenderer from './SetCellRenderer';\nimport SparklineCellRenderer from './SparklineCellRenderer';\nimport StringCellRenderer from './StringCellRenderer';\nimport TableCellRenderer from './TableCellRenderer';\nimport UpSetCellRenderer from './UpSetCellRenderer';\nimport VerticalBarCellRenderer from './VerticalBarCellRenderer';\nimport {noRenderer, wideEnough, wideEnoughCat, adaptTextColorToBgColor, adaptDynamicColorToBgColor} from './utils';\n\nexport const rendererClasses = {\n AAggregatedGroupRenderer,\n ANumbersCellRenderer,\n ActionRenderer,\n AggregateGroupRenderer,\n AnnotationRenderer,\n BarCellRenderer,\n BooleanCellRenderer,\n BoxplotCellRenderer,\n BrightnessCellRenderer,\n CategoricalCellRenderer,\n CategoricalHeatmapCellRenderer,\n CategoricalStackedDistributionlCellRenderer,\n CircleCellRenderer,\n DateCellRenderer,\n DateHistogramCellRenderer,\n DefaultCellRenderer,\n DotCellRenderer,\n GroupCellRenderer,\n HeatmapCellRenderer,\n HistogramCellRenderer,\n ImageCellRenderer,\n InterleavingCellRenderer,\n LinkCellRenderer,\n LinkMapCellRenderer,\n LoadingCellRenderer,\n MapBarCellRenderer,\n MultiLevelCellRenderer,\n RankCellRenderer,\n SelectionRenderer,\n SetCellRenderer,\n SparklineCellRenderer,\n StringCellRenderer,\n TableCellRenderer,\n UpSetCellRenderer,\n VerticalBarCellRenderer\n};\n\nexport const rendererUtils = {\n toHeatMapColor,\n noRenderer,\n wideEnough,\n wideEnoughCat,\n adaptTextColorToBgColor,\n adaptDynamicColorToBgColor,\n};\n","/**\n * main module of LineUp.js containing the main class and exposes all other modules\n */\n\nimport {IColumnDesc} from './model';\nimport {DataProvider, LocalDataProvider, ILocalDataProviderOptions} from './provider';\nimport {LineUp, Taggle} from './ui';\nimport {ILineUpOptions, ITaggleOptions} from './config';\n\n\nexport * from './builder';\nexport * from './config';\nexport * from './internal/mathInterfaces';\nexport * from './model';\nexport * from './provider';\nexport * from './renderer';\nexport * from './ui';\nexport {LineUp as default} from './ui';\n\n\nexport function createLocalDataProvider(data: any[], columns: IColumnDesc[], options: Partial<ILocalDataProviderOptions> = {}) {\n return new LocalDataProvider(data, columns, options);\n}\n\n/**\n *\n * @param container the html element lineup should be built in\n * @param data {DataProvider} the data providier\n * @param config {Partial<ILineUpOptions>} lineup configuration overrides\n * @returns {LineUp} the created lineup instance\n */\nexport function createLineUp(container: HTMLElement, data: DataProvider, config: Partial<ILineUpOptions> = {}) {\n return new LineUp(container, data, config);\n}\n\nexport function createTaggle(container: HTMLElement, data: DataProvider, config: Partial<ITaggleOptions> = {}) {\n return new Taggle(container, data, config);\n}\n","export * from './';\nexport {default} from './';\nimport '!file-loader?name=schema.4.0.0.json!./provider/schema.json';\nimport './style.scss';\n\ndeclare const __VERSION__: string;\ndeclare const __BUILD_ID__: string;\ndeclare const __LICENSE__: string;\n\n/**\n * LineUp version\n * @type {string}\n */\nexport const version = __VERSION__;\n/**\n * LineUp unique build id\n * @type {string}\n */\nexport const buildId = __BUILD_ID__;\n/**\n * LineUp license type\n * @type {string}\n */\nexport const license = __LICENSE__;\n"],"sourceRoot":""}
\No newline at end of file