axidio-styleguide-library1-v2 0.2.20 → 0.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3014,344 +3014,205 @@ class GuageChartComponent extends ComponentUniqueId {
3014
3014
  svgHeight: 80,
3015
3015
  low_colorMap: ['#43CC00', '#FFEF0C', '#FF4E0C'],
3016
3016
  high_colorMap: ['#FF4E0C', '#FFEF0C', '#43CC00'],
3017
- isHeaderVisible: undefined,
3018
3017
  pointerWidth: 10,
3019
3018
  pointerTailLength: 5,
3020
3019
  pointerHeadLengthPercent: 0.7,
3021
3020
  labelInset: 10,
3022
3021
  legendJustified: false,
3023
3022
  backgroundColor: '#FFFFFF',
3024
- isDrilldownChart: undefined,
3025
3023
  ringScaleFactor: 0,
3026
3024
  textsAtCenterScaleFactor: 0,
3027
3025
  currentValueWidthScaleFactor: 60,
3028
3026
  currentValueHeightScaleFactor: 30,
3029
3027
  pointerColor: '#686868',
3030
- isToggleVisible: undefined,
3031
- selectedKpiTooltop: undefined,
3032
- isValueLableAdjust: undefined,
3033
- isTitleHidden: undefined,
3034
3028
  headerMenuOptions: HeaderConfigHelper.headerConfig.headerMenuOptions,
3035
3029
  };
3036
3030
  }
3037
3031
  get isAlertEnabled() {
3038
- return this.chartConfiguration?.headerMenuOptions?.some(option => option.id === 'editAlert');
3032
+ return (this.chartConfiguration?.headerMenuOptions?.some((option) => option.id === 'editAlert') ?? false);
3039
3033
  }
3040
- ngOnChanges() {
3041
- let self = this;
3042
- d3.select('#' + self.uniqueId).remove();
3043
- this.initializeLineChart();
3034
+ ngOnInit() {
3035
+ this.buildChart();
3036
+ }
3037
+ ngOnChanges(changes) {
3038
+ if (changes['chartData'] || changes['customChartConfiguration']) {
3039
+ this.rebuildChart();
3040
+ }
3044
3041
  }
3045
3042
  onResized(event) {
3046
- let self = this;
3047
- d3.select('#' + self.uniqueId).remove();
3048
- this.initializeLineChart();
3043
+ this.rebuildChart();
3049
3044
  }
3050
- ngOnInit() { }
3051
- initializeLineChart() {
3052
- var self = this;
3053
- let data = [];
3054
- let metaData = null;
3055
- let colorMaps = [];
3056
- let angleValue = [];
3057
- let data_ready = [];
3058
- let labelArray = [];
3059
- let colorType = null;
3060
- let isria = this.customChartConfiguration.isRia;
3061
- for (var i in this.defaultConfiguration) {
3062
- this.chartConfiguration[i] = ChartHelper.getValueByConfigurationType(i, this.defaultConfiguration, this.customChartConfiguration);
3063
- }
3064
- data = this.chartData.data;
3065
- metaData = this.chartData.metaData;
3066
- colorType = metaData.colorType;
3067
- if (colorType == 'low') {
3068
- colorMaps = this.chartConfiguration.low_colorMap;
3069
- }
3070
- else {
3071
- colorMaps = this.chartConfiguration.high_colorMap;
3072
- }
3045
+ rebuildChart() {
3046
+ d3.select(`#${this.uniqueId}`).remove();
3047
+ this.buildChart();
3048
+ }
3049
+ buildChart() {
3050
+ if (!this.chartData?.data || !this.chartData?.metaData)
3051
+ return;
3052
+ this.mergeConfigurations();
3053
+ this.processDataAndRender();
3054
+ }
3055
+ mergeConfigurations() {
3056
+ Object.keys(this.defaultConfiguration).forEach((key) => {
3057
+ this.chartConfiguration[key] = ChartHelper.getValueByConfigurationType(key, this.defaultConfiguration, this.customChartConfiguration);
3058
+ });
3059
+ this.isHeaderVisible =
3060
+ this.chartConfiguration.isHeaderVisible ?? this.isHeaderVisible;
3061
+ }
3062
+ processDataAndRender() {
3063
+ const { data, metaData } = this.chartData;
3064
+ const colorMap = metaData.colorType === 'low'
3065
+ ? this.chartConfiguration.low_colorMap
3066
+ : this.chartConfiguration.high_colorMap;
3067
+ this.setDataType(metaData);
3068
+ const diffs = data.slice(1).map((v, i) => v - data[i]);
3069
+ const total = diffs.reduce((sum, val) => sum + val, 0);
3070
+ const angles = this.computeAngles(diffs, total);
3071
+ const container = d3.select(this.containerElt.nativeElement);
3072
+ const width = parseInt(container.style('width')) -
3073
+ this.chartConfiguration.margin.left -
3074
+ this.chartConfiguration.margin.right;
3075
+ const height = parseInt(d3.select(this.guagecontainerElt.nativeElement).style('height')) -
3076
+ this.chartConfiguration.margin.top -
3077
+ this.chartConfiguration.margin.bottom -
3078
+ 56;
3079
+ const radius = Math.min(width, height) / 2;
3080
+ const svg = this.createSvg(container, width, height, radius);
3081
+ this.drawArcs(svg, diffs, data, angles, colorMap, metaData, radius);
3082
+ this.drawPointer(svg, data, metaData, radius);
3083
+ this.drawLabels(svg, data, diffs, metaData, radius);
3084
+ this.drawTextBlocks(svg, metaData, radius);
3085
+ }
3086
+ setDataType(metaData) {
3073
3087
  if (metaData.dataType) {
3074
- this.dataType = metaData.dataType;
3075
- if (this.dataType == 'USD') {
3076
- this.datatype_status = true;
3077
- this.dataType = '$ ';
3078
- }
3088
+ this.dataType = metaData.dataType === 'USD' ? '$ ' : metaData.dataType;
3089
+ this.datatype_status = metaData.dataType === 'USD';
3079
3090
  }
3080
- data.map(function (dataUnit, i) {
3081
- if (i < data.length - 1) {
3082
- let diff = data[i + 1] - data[i];
3083
- data_ready.push(diff);
3084
- }
3085
- });
3086
- var chartContainer = d3.select(this.containerElt.nativeElement);
3087
- var guagecontainer = d3.select(this.guagecontainerElt.nativeElement);
3088
- var margin = this.chartConfiguration.margin;
3089
- var width = parseInt(chartContainer.style('width')) - margin.left - margin.right;
3090
- var height = parseInt(guagecontainer.style('height')) -
3091
- margin.top -
3092
- margin.bottom -
3093
- 56; //chart header height
3094
- if (this.chartConfiguration.isHeaderVisible != undefined)
3095
- this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
3096
- var svg = chartContainer
3091
+ }
3092
+ computeAngles(values, total) {
3093
+ return values.reduce((acc, unit, i) => {
3094
+ const angle = (unit / total) * 180;
3095
+ acc.push(i === 0 ? angle : acc[i - 1] + angle);
3096
+ return acc;
3097
+ }, []);
3098
+ }
3099
+ createSvg(container, width, height, radius) {
3100
+ return container
3097
3101
  .append('svg')
3098
- .attr('id', self.uniqueId)
3099
- .attr('width', width + margin.left + margin.right)
3100
- .attr('height', height + margin.top + margin.bottom)
3102
+ .attr('id', this.uniqueId)
3103
+ .attr('width', width + this.chartConfiguration.margin.left)
3104
+ .attr('height', height + this.chartConfiguration.margin.top)
3101
3105
  .call(ChartHelper.responsivefy)
3102
- .append('g');
3103
- var radius = Math.min(width, height) / 2;
3104
- if (this.chartConfiguration.isDrilldownChart) {
3105
- this.chartConfiguration.currentValueWidthScaleFactor += 40;
3106
- this.chartConfiguration.currentValueHeightScaleFactor += 20;
3107
- }
3108
- else {
3109
- if (window.innerWidth > 1400) {
3110
- this.chartConfiguration.currentValueHeightScaleFactor += 15;
3111
- this.chartConfiguration.currentValueWidthScaleFactor *= 2;
3112
- }
3113
- }
3114
- let topTextPosition = radius / 2 - 10;
3115
- let midTextPosition = topTextPosition + this.chartConfiguration.currentValueHeightScaleFactor;
3116
- let bottomTextPosition = midTextPosition + this.chartConfiguration.currentValueHeightScaleFactor;
3117
- var data_length = data.length;
3118
- function deg2rad(deg) {
3119
- return (deg * Math.PI) / 180;
3120
- }
3121
- let tempArray = [];
3122
- let total = 0;
3123
- data_ready.map(function (unit) {
3124
- total += unit;
3125
- });
3126
- data_ready.map(function (unit, i) {
3127
- var angle = (unit / total) * 180;
3128
- if (i === 0) {
3129
- tempArray.push(angle);
3130
- }
3131
- else {
3132
- let currentAngle = tempArray[i - 1] + angle;
3133
- tempArray.push(currentAngle);
3134
- }
3135
- });
3136
- angleValue = tempArray;
3137
- var arc = d3
3106
+ .append('g')
3107
+ .attr('transform', `translate(${(parseInt(container.style('width')) / 2 - radius) +
3108
+ this.chartConfiguration.margin.left},${this.chartConfiguration.margin.top})`);
3109
+ }
3110
+ drawArcs(svg, diffs, data, angles, colorMap, metaData, radius) {
3111
+ const arc = d3
3138
3112
  .arc()
3139
3113
  .innerRadius(radius -
3140
- self.chartConfiguration.ringWidth -
3141
- self.chartConfiguration.ringInset)
3114
+ this.chartConfiguration.ringWidth -
3115
+ this.chartConfiguration.ringInset)
3142
3116
  .outerRadius(radius)
3143
- .startAngle(function (d, i) {
3144
- var ratio;
3145
- if (i === 0) {
3146
- ratio = self.chartConfiguration.minAngle;
3147
- }
3148
- else {
3149
- ratio = self.chartConfiguration.minAngle + angleValue[i - 1];
3150
- }
3151
- return deg2rad(ratio);
3152
- })
3153
- .endAngle(function (d, i) {
3154
- var ratio;
3155
- if (i === data_ready.length - 1) {
3156
- ratio = self.chartConfiguration.maxAngle;
3157
- }
3158
- else {
3159
- ratio = self.chartConfiguration.minAngle + angleValue[i];
3160
- }
3161
- return deg2rad(ratio);
3162
- });
3163
- function centerTranslation() {
3164
- return 'translate(' + radius + ',' + radius + ')';
3165
- }
3166
- var centerTx = centerTranslation();
3167
- var tickData = d3
3168
- .range(self.chartConfiguration.majorTicks)
3169
- .map(function (i) {
3170
- return 1 / self.chartConfiguration.majorTicks;
3171
- });
3172
- var arcs = svg.append('g').attr('class', 'arc').attr('transform', centerTx);
3117
+ .startAngle((_, i) => this.deg2rad(i === 0
3118
+ ? this.chartConfiguration.minAngle
3119
+ : this.chartConfiguration.minAngle + angles[i - 1]))
3120
+ .endAngle((_, i) => this.deg2rad(i === diffs.length - 1
3121
+ ? this.chartConfiguration.maxAngle
3122
+ : this.chartConfiguration.minAngle + angles[i]));
3123
+ const arcs = svg
3124
+ .append('g')
3125
+ .attr('class', 'arc')
3126
+ .attr('transform', `translate(${radius},${radius})`);
3173
3127
  arcs
3174
3128
  .selectAll('path')
3175
- .data(data_ready)
3129
+ .data(diffs)
3176
3130
  .enter()
3177
3131
  .append('path')
3178
- .on('click', function (d) {
3179
- if (!metaData.hasDrillDown || metaData.currentValue == 0) {
3180
- return;
3181
- }
3182
- let range = getRange(d);
3183
- self.handleClick(range);
3184
- })
3185
- .attr('fill', function (d, i) {
3186
- return colorMaps[i];
3187
- })
3188
- .attr('id', function (d, i) {
3189
- return colorMaps[i];
3190
- })
3191
3132
  .attr('d', arc)
3192
- // .style('cursor', 'pointer');
3193
- .style('cursor', function (d) {
3194
- if (metaData.currentValue > 0 && metaData.hasDrillDown && !isria)
3195
- return 'pointer';
3196
- else
3197
- return 'default';
3133
+ .attr('fill', (_, i) => colorMap[i])
3134
+ .style('cursor', () => metaData.currentValue > 0 && metaData.hasDrillDown
3135
+ ? 'pointer'
3136
+ : 'default')
3137
+ .on('click', (event, d) => {
3138
+ if (metaData.hasDrillDown && metaData.currentValue > 0) {
3139
+ this.handleClick(`${data[0]} - ${data[data.length - 1]}`);
3140
+ }
3198
3141
  });
3199
- let getRange = function (d) {
3200
- let index = data_ready.indexOf(d);
3201
- return data[0] + ' and ' + data[data.length - 1];
3202
- };
3203
- let pointerHeadLength = Math.round(radius * self.chartConfiguration.pointerHeadLengthPercent);
3204
- var lineData = [
3205
- [self.chartConfiguration.pointerWidth / 2, 0],
3142
+ }
3143
+ drawPointer(svg, data, metaData, radius) {
3144
+ const pointerHeadLength = Math.round(radius * this.chartConfiguration.pointerHeadLengthPercent);
3145
+ const pointerValue = metaData.currentValue - data[0];
3146
+ const range = data[data.length - 1] - data[0];
3147
+ const angle = this.chartConfiguration.minAngle + (pointerValue / range) * 180;
3148
+ const lineData = [
3149
+ [this.chartConfiguration.pointerWidth / 2, 0],
3206
3150
  [0, -pointerHeadLength],
3207
- [-(self.chartConfiguration.pointerWidth / 2), 0],
3208
- [0, self.chartConfiguration.pointerTailLength],
3209
- [self.chartConfiguration.pointerWidth / 2, 0],
3151
+ [-this.chartConfiguration.pointerWidth / 2, 0],
3152
+ [0, this.chartConfiguration.pointerTailLength],
3153
+ [this.chartConfiguration.pointerWidth / 2, 0],
3210
3154
  ];
3211
- var pointerLine = d3.line();
3212
- var pg = svg
3155
+ const pointerLine = d3.line();
3156
+ svg
3213
3157
  .append('g')
3214
- .data([lineData])
3215
3158
  .attr('class', 'pointer')
3216
- .attr('transform', centerTx);
3217
- var pointerValue = metaData.currentValue - data[0];
3218
- var range = data[data_length - 1] - data[0];
3219
- var pointerAngle = self.chartConfiguration.minAngle + (pointerValue / range) * 180;
3220
- pg.append('path')
3221
- .attr('d', pointerLine)
3222
- .attr('fill', self.chartConfiguration.pointerColor)
3223
- .attr('transform', 'rotate(' +
3224
- pointerAngle +
3225
- ') translate(0,' +
3226
- (-radius + self.chartConfiguration.ringWidth + pointerHeadLength) +
3227
- ')');
3228
- var lg = svg.append('g').attr('class', 'label').attr('transform', centerTx);
3229
- let labelArrayTemp = [{ name: data[0], value: 0 }];
3230
- let count = 0;
3231
- data_ready.map(function (dataUnit, i) {
3232
- count += dataUnit;
3233
- let temp = { name: data[i + 1], value: count };
3234
- labelArrayTemp.push(temp);
3159
+ .attr('transform', `translate(${radius},${radius})`)
3160
+ .append('path')
3161
+ .attr('d', pointerLine(lineData))
3162
+ .attr('fill', this.chartConfiguration.pointerColor)
3163
+ .attr('transform', `rotate(${angle}) translate(0,${-radius + this.chartConfiguration.ringWidth + pointerHeadLength})`);
3164
+ }
3165
+ drawLabels(svg, data, diffs, metaData, radius) {
3166
+ const range = data[data.length - 1] - data[0];
3167
+ let cumulative = 0;
3168
+ const labelArray = [{ name: data[0], value: 0 }];
3169
+ diffs.forEach((diff, i) => {
3170
+ cumulative += diff;
3171
+ labelArray.push({ name: data[i + 1], value: cumulative });
3235
3172
  });
3236
- labelArray = labelArrayTemp;
3237
- lg.selectAll('.bubble')
3173
+ const labels = svg
3174
+ .append('g')
3175
+ .attr('class', 'label')
3176
+ .attr('transform', `translate(${radius},${radius})`);
3177
+ labels
3178
+ .selectAll('text')
3238
3179
  .data(labelArray)
3239
3180
  .enter()
3240
- .append('g')
3241
- .attr('transform', function (d) {
3242
- var newAngle = self.chartConfiguration.minAngle + (d.value / range) * 180;
3243
- return ('rotate(' +
3244
- newAngle +
3245
- ') translate(0,' +
3246
- (self.chartConfiguration.labelInset - radius - 20) +
3247
- ')');
3248
- })
3249
- .append('g')
3250
- .attr('transform', function (d, i) {
3251
- var newAngle = self.chartConfiguration.minAngle + (d.value / range) * 180;
3252
- if (i == 0 && self.chartConfiguration.isValueLableAdjust) {
3253
- return 'rotate(' + (0 - newAngle) + ') translate(-27,0)';
3254
- }
3255
- if (i == labelArray.length - 1 &&
3256
- self.chartConfiguration.isValueLableAdjust) {
3257
- return 'rotate(' + (0 - newAngle) + ') translate(-15,0)';
3258
- }
3259
- return 'rotate(' + (0 - newAngle) + ') translate(-17,0)';
3260
- })
3261
3181
  .append('text')
3262
- .attr('style', function (d) {
3263
- if (window.innerWidth < 1400)
3264
- return 'font-size: ' + '12px' + '; font-weight:' + '600;';
3265
- else
3266
- return 'font-size: ' + '14px' + '; font-weight:' + '600;';
3182
+ .attr('transform', (d) => {
3183
+ const newAngle = this.chartConfiguration.minAngle + (d.value / range) * 180;
3184
+ return `rotate(${newAngle}) translate(0,${this.chartConfiguration.labelInset - radius - 20}) rotate(${-newAngle})`;
3267
3185
  })
3268
3186
  .attr('fill', 'var(--chart-text-color)')
3269
- .text(function (d) {
3270
- if (metaData.dataType) {
3271
- return d.name + metaData.dataType;
3272
- }
3273
- return d.name;
3274
- });
3275
- svg
3276
- .append('foreignObject')
3277
- .attr('transform', 'translate(' +
3278
- (radius - this.chartConfiguration.currentValueWidthScaleFactor / 2) +
3279
- ',' +
3280
- topTextPosition +
3281
- ')')
3282
- .attr('width', this.chartConfiguration.currentValueWidthScaleFactor + 8)
3283
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
3284
- .append('xhtml:div')
3285
- .attr('class', 'value-display')
3286
- .style('height', this.chartConfiguration.currentValueHeightScaleFactor + 10 + 'px')
3287
- .style('font-size', function () {
3288
- if (window.innerWidth > 1500) {
3289
- self.chartConfiguration.currentValueHeightScaleFactor - 25 + 'px';
3290
- }
3291
- else {
3292
- self.chartConfiguration.currentValueHeightScaleFactor - 15 + 'px';
3293
- }
3294
- })
3295
- .html(metaData.currentValue + metaData.dataType);
3296
- if (metaData.status) {
3297
- let widthTemp = metaData.status.length > 4 ? 210 : 120;
3187
+ .style('font-size', window.innerWidth < 1400 ? '12px' : '14px')
3188
+ .style('font-weight', 600)
3189
+ .text((d) => `${d.name}${metaData.dataType ?? ''}`);
3190
+ }
3191
+ drawTextBlocks(svg, metaData, radius) {
3192
+ const top = radius / 2 - 10;
3193
+ const mid = top + this.chartConfiguration.currentValueHeightScaleFactor;
3194
+ const bottom = mid + this.chartConfiguration.currentValueHeightScaleFactor;
3195
+ const addText = (cls, text, y, width = 210) => {
3298
3196
  svg
3299
3197
  .append('foreignObject')
3300
- .attr('transform', 'translate(' + (radius - widthTemp / 2) + ',' + midTextPosition + ')')
3301
- .attr('width', widthTemp)
3302
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor + 10)
3198
+ .attr('transform', `translate(${radius - width / 2},${y})`)
3199
+ .attr('width', width)
3200
+ .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
3303
3201
  .append('xhtml:div')
3304
- .attr('class', 'status-display')
3305
- .style('font-size', this.chartConfiguration.currentValueHeightScaleFactor - 25 + 'px')
3306
- .html(metaData.status);
3307
- }
3308
- svg
3309
- .append('foreignObject')
3310
- .attr('transform', 'translate(' + (radius - 105) + ',' + bottomTextPosition + ')')
3311
- .attr('width', 210)
3312
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
3313
- .append('xhtml:div')
3314
- .attr('class', 'daterange-display')
3315
- .style('font-size', function () {
3316
- if (self.chartConfiguration.isDrilldownChart) {
3317
- {
3318
- if (window.innerWidth < 1400)
3319
- return '14px';
3320
- else
3321
- return '18px';
3322
- }
3323
- }
3324
- else {
3325
- if (window.innerWidth < 1400)
3326
- return '14px';
3327
- else
3328
- return '18px';
3329
- }
3330
- })
3331
- .html(function () {
3332
- var desiredSize;
3333
- if (window.innerWidth < 1400)
3334
- desiredSize = '14px';
3335
- else
3336
- desiredSize = '18px';
3337
- if (metaData.dateRange)
3338
- return ('<span class="marginright-3"><i class="fa fa-calendar"></i></span><span> ' +
3339
- metaData.dateRange +
3340
- '</span>');
3341
- else
3342
- return '';
3343
- });
3344
- var containerMidWidth = parseInt(chartContainer.style('width')) / 2;
3345
- var nodeHalfWidth = svg.node().getBoundingClientRect().width / 2;
3346
- var updatedStartingPoint = containerMidWidth - nodeHalfWidth;
3347
- svg.attr('transform', 'translate(' +
3348
- (updatedStartingPoint + margin.left) +
3349
- ',' +
3350
- margin.top +
3351
- ')');
3202
+ .attr('class', cls)
3203
+ .html(text);
3204
+ };
3205
+ addText('value-display', `${metaData.currentValue}${metaData.dataType ?? ''}`, top);
3206
+ if (metaData.status)
3207
+ addText('status-display', metaData.status, mid);
3208
+ if (metaData.dateRange)
3209
+ addText('daterange-display', `<i class="fa fa-calendar"></i> ${metaData.dateRange}`, bottom);
3352
3210
  }
3353
- handleClick(d) {
3354
- this.clickEvent.emit(d);
3211
+ deg2rad(deg) {
3212
+ return (deg * Math.PI) / 180;
3213
+ }
3214
+ handleClick(data) {
3215
+ this.clickEvent.emit(data);
3355
3216
  }
3356
3217
  handleHeaderMenuClick(id) {
3357
3218
  this.headerMenuclickEvent.emit(id);