Best JavaScript code snippet using playwright-internal
graph.serie.box.js
Source:graph.serie.box.js
1import {2 extend,3 guid,4 throwError,5 emptyDom6}7from '../graph.util.js';8import Serie from './graph.serie.js';9const defaultOptions = {10 orientation: 'y',11 maxBoxWidth: 20,12 defaultStyle: {13 meanLineColor: 'rgb( 100, 0, 0 )',14 meanLineWidth: 2,15 boxAboveLineWidth: 1,16 boxAboveLineColor: 'rgb( 0, 0, 0 )',17 boxAboveFillColor: 'transparent',18 boxAboveFillOpacity: 1,19 boxBelowLineWidth: 1,20 boxBelowLineColor: 'rgb( 0, 0, 0 )',21 boxBelowFillColor: 'transparent',22 boxBelowFillOpacity: 1,23 barAboveLineColor: 'rgba( 0, 0, 0, 1 )',24 barAboveLineWidth: 1,25 barBelowLineColor: 'rgba( 0, 0, 0, 1 )',26 barBelowLineWidth: 1,27 outlierLineWidth: 1,28 outlierLineColor: 'rgb( 255, 255, 255 )',29 outlierFillColor: 'rgb( 0, 0, 0 )',30 outlierFillOpacity: 131 }32};33/**34 * @static35 * @extends Serie36 * @example graph.newSerie( name, options, "scatter" );37 * @see Graph#newSerie38 */39class SerieBox extends Serie {40 constructor( graph, name, options, defaultInherited = {} ) {41 super( graph, name, options, extend( true, {}, defaultOptions, defaultInherited ) );42 this.pathDom = document.createElementNS( this.graph.ns, 'path' );43 this.groupMain.appendChild( this.pathDom );44 // Creates an empty style variable45 this.styles = {};46 // Unselected style47 this.styles.unselected = this.options.defaultStyle;48 }49 /**50 * Sets the data of the bar serie51 * @param {Object} data52 * @example serie.setData( [ { x: 'cat', Q2: valMean, Q1: valBoxMin, Q3: valBoxMax, whiskers: [ val1, val2 ], outliers: [ ...yList ] } ] );53 * @return {SerieBar} The current serie instance54 */55 setData( data, noRescale ) {56 this.data = data;57 if ( !Array.isArray( data ) ) {58 return;59 }60 let axisref, axisval, methodref, methodval, blnX;61 if ( this.options.orientation == 'y' ) {62 axisref = this.getXAxis();63 axisval = this.getYAxis();64 methodref = this._checkX.bind( this );65 methodval = this._checkY.bind( this );66 blnX = true;67 this.minY = data[ 0 ].Q2;68 this.maxY = data[ 0 ].Q2;69 this.maxX = data[ 0 ].x;70 this.minX = data[ 0 ].x;71 } else {72 axisref = this.getYAxis();73 axisval = this.getXAxis();74 methodref = this._checkY.bind( this );75 methodval = this._checkX.bind( this );76 blnX = false;77 this.minX = data[ 0 ].Q2;78 this.maxX = data[ 0 ].Q2;79 this.maxY = data[ 0 ].y;80 this.minY = data[ 0 ].y;81 }82 if ( noRescale ) {83 methodref = function() {};84 methodval = function() {};85 }86 if ( !axisref || !axisval ) {87 throwError( 'Error in setting data of the box serie. The X and Y axes must be set beforehand' );88 }89 for ( var i in this.data ) {90 if ( blnX ) {91 methodref( this.data[ i ].x );92 this.data[ i ].pos = this.data[ i ].x;93 } else {94 methodref( this.data[ i ].y );95 this.data[ i ].pos = this.data[ i ].y;96 }97 if ( this.data[ i ].Q3 ) {98 methodval( this.data[ i ].Q3 );99 }100 if ( this.data[ i ].Q1 ) {101 methodval( this.data[ i ].Q1 );102 }103 if ( this.data[ i ].whiskers ) {104 if ( Array.isArray( this.data[ i ].whiskers ) ) {105 if ( this.data[ i ].whiskers.length > 0 ) {106 methodval( this.data[ i ].whiskers[ 0 ] );107 }108 if ( this.data[ i ].whiskers.length > 1 ) {109 methodval( this.data[ i ].whiskers[ 1 ] );110 }111 } else {112 methodval( this.data[ i ].whiskers );113 this.data[ i ].whiskers = [ this.data[ i ].whiskers ];114 }115 } else {116 this.data[ i ].whiskers = [];117 }118 if ( Array.isArray( this.data[ i ].outliers ) ) {119 this.data[ i ].outliers.map( ( val ) => methodval( val ) );120 } else {121 this.data[ i ].outliers = [];122 }123 }124 this.dataHasChanged();125 this.graph.updateDataMinMaxAxes();126 return this;127 }128 _style( type, styleValue, selectionType = 'unselected', applyToSelected = false ) {129 this.styles[ selectionType ] = this.styles[ selectionType ] || {};130 this.styles[ selectionType ][ type ] = styleValue;131 if ( applyToSelected ) {132 this._set( type, styleValue, 'selected' );133 }134 this.styleHasChanged( selectionType );135 return this;136 }137 _gstyle( type, selectionType ) {138 return this.getStyle( selectionType )[ type ];139 }140 /**141 * Retrives a selection object142 * @param {String} [ selectionType = "unselected" ] - The selection type143 * @returns {Object} The selection object144 */145 getStyle( selectionType = 'unselected' ) {146 return this.styles[ selectionType ] || {};147 }148 /**149 * Sets the mean line color150 * @param {String} color - The mean line color151 * @returns {SerieBox} The current serie instance152 */153 setMeanLineColor() {154 return this._style( 'meanLineColor', ...arguments );155 }156 /**157 * Returns the mean line color158 * @return {String} The mean line color159 */160 getMeanLineColor() {161 return this._gstyle( 'meanLineColor', ...arguments );162 }163 setStyle( style, selectionType = 'unselected' ) {164 this.styles[ selectionType ] = extend( {}, this.default().defaultStyle, this.styles.unselected, style );165 this.styleHasChanged( selectionType );166 }167 /**168 * Sets the mean line width169 * @param {Number} width - The line width170 * @returns {SerieBox} The current serie instance171 */172 setMeanLineWidth() {173 return this._style( 'meanLineWidth', ...arguments );174 }175 /**176 * Returns the mean line width177 * @return {Number} The mean line width178 */179 getMeanLineWidth() {180 return this._gstyle( 'meanLineWidth', ...arguments );181 }182 /**183 * Sets the box line color184 * @param {Number} color - The color of the box above the median185 * @returns {SerieBox} The current serie instance186 */187 setBoxAboveLineColor() {188 return this._style( 'boxAboveLineColor', ...arguments );189 }190 /**191 * Returns the box line color192 * @return {String} The line color of the box above the median193 */194 getBoxAboveLineColor() {195 return this._gstyle( 'boxAboveLineColor', ...arguments );196 }197 /**198 * Sets the fill color199 * @param {Number} color - The color of the box below the median200 * @returns {SerieBox} The current serie instance201 */202 setBoxBelowLineColor() {203 return this._style( 'boxBelowLineColor', ...arguments );204 }205 /**206 * Returns the fill color207 * @return {String} The line color of the box below the median208 */209 getBoxBelowLineColor() {210 return this._gstyle( 'boxBelowLineColor', ...arguments );211 }212 /**213 * Sets the fill color214 * @param {Number} width - The contour width of the box above the median215 * @returns {SerieBox} The current serie instance216 */217 setBoxAboveLineWidth() {218 return this._style( 'boxAboveLineWidth', ...arguments );219 }220 /**221 * Returns the line width of the box above the median222 * @return {Number} The line width of the box above the median223 */224 getBoxAboveLineWidth() {225 return this._gstyle( 'boxAboveLineWidth', ...arguments );226 }227 /**228 * Sets the fill color229 * @param {Number} width - The contour width of the box below the median230 * @returns {SerieBox} The current serie instance231 */232 setBoxBelowLineWidth() {233 return this._style( 'boxBelowLineWidth', ...arguments );234 }235 /**236 * Returns the line width of the box below the median237 * @return {Number} The line width of the box below the median238 */239 getBoxBelowLineWidth() {240 return this._gstyle( 'boxBelowLineWidth', ...arguments );241 }242 /**243 * Sets the fill color244 * @param {String} color - The fill color of the box above the median245 * @returns {SerieBox} The current serie instance246 */247 setBoxAboveFillColor() {248 return this._style( 'boxAboveFillColor', ...arguments );249 }250 /**251 * Returns the fill color of the box above the median252 * @return {String} The fill color of the box above the median253 */254 getBoxAboveFillColor() {255 return this._gstyle( 'boxAboveFillColor', ...arguments );256 }257 /**258 * Sets the fill color259 * @param {String} color - The fill color of the box below the median260 * @returns {SerieBox} The current serie instance261 */262 setBoxBelowFillColor() {263 return this._style( 'boxBelowFillColor', ...arguments );264 }265 /**266 * Returns the fill color of the box below the median267 * @return {String} The fill color of the box below the median268 */269 getBoxBelowFillColor() {270 return this._gstyle( 'boxBelowFillColor', ...arguments );271 }272 /**273 * Sets the fill color274 * @param {Number} opacity - The fill opacity of the box above the median275 * @returns {SerieBox} The current serie instance276 */277 setBoxAboveFillOpacity() {278 return this._style( 'boxAboveFillOpacity', ...arguments );279 }280 /**281 * Returns the fill opacity of the box above the median282 * @return {Number} The fill opacity of the box above the median283 */284 getBoxAboveFillOpacity() {285 return this._gstyle( 'boxAboveFillOpacity', ...arguments );286 }287 /**288 * Sets the fill color289 * @param {Number} opacity - The fill opacity of the box below the median290 * @returns {SerieBox} The current serie instance291 */292 setBoxBelowFillOpacity() {293 return this._style( 'boxBelowFillOpacity', ...arguments );294 }295 /**296 * Returns the fill opacity of the box below the median297 * @return {Number} The fill opacity of the box below the median298 */299 getBoxBelowFillOpacity() {300 return this._gstyle( 'boxBelowFillOpacity', ...arguments );301 }302 /**303 * Sets the whisker color304 * @param {String} color - The line color of the whisker above the median305 * @returns {SerieBox} The current serie instance306 */307 setBarAboveLineColor() {308 return this._style( 'barAboveLineColor', ...arguments );309 }310 /**311 * Returns the line color of the whisker above the median312 * @return {String} The line color of the whisker above the median313 */314 getBarAboveLineColor() {315 return this._gstyle( 'barAboveLineColor', ...arguments );316 }317 /**318 * Sets the fill color319 * @param {String} color - The line color of the whisker below the median320 * @returns {SerieBox} The current serie instance321 */322 setBarBelowLineColor() {323 return this._style( 'barBelowLineColor', ...arguments );324 }325 /**326 * Returns the line color of the whisker below the median327 * @return {String} The line color of the whisker below the median328 */329 getBarBelowLineColor() {330 return this._gstyle( 'barBelowLineColor', ...arguments );331 }332 /**333 * Sets the fill color334 * @param {Number} width - The line width of the whisker above the median335 * @returns {SerieBox} The current serie instance336 */337 setBarAboveLineWidth() {338 return this._style( 'barAboveLineWidth', ...arguments );339 }340 /**341 * Returns the line width of the whisker above the median342 * @return {Number} The line width of the whisker above the median343 */344 getBarAboveLineWidth() {345 return this._gstyle( 'barAboveLineWidth', ...arguments );346 }347 /**348 * Sets the fill color349 * @param {Number} width - The line width of the whisker below the median350 * @returns {SerieBox} The current serie instance351 */352 setBarBelowLineWidth() {353 return this._style( 'barBelowLineWidth', ...arguments );354 }355 /**356 * Returns the line width of the whisker below the median357 * @return {Number} The line width of the whisker below the median358 */359 getBarBelowLineWidth() {360 return this._gstyle( 'barBelowLineWidth', ...arguments );361 }362 /**363 * Sets the fill color364 * @param {String} color - The outlier stroke color365 * @returns {SerieBox} The current serie instance366 */367 setOutlierLineColor() {368 return this._style( 'outlierLineColor', ...arguments );369 }370 /**371 * Returns the line color of the outliers372 * @return {String} The line color of the outliers373 */374 getOutlierLineColor() {375 return this._gstyle( 'outlierLineColor', ...arguments );376 }377 /**378 * Sets the stroke width379 * @param {Number} width - The outlier stroke width380 * @returns {SerieBox} The current serie instance381 */382 setOutlierLineWidth() {383 return this._style( 'outlierLineWidth', ...arguments );384 }385 /**386 * Returns the line width of the outliers387 * @return {Number} The line width of the outliers388 */389 getOutlierLineWidth() {390 return this._gstyle( 'outlierLineWidth', ...arguments );391 }392 /**393 * Sets the fill color394 * @param {String} color - The outlier fill color395 * @returns {SerieBox} The current serie instance396 */397 setOutlierFillColor() {398 return this._style( 'outlierFillColor', ...arguments );399 }400 /**401 * Returns the fill color of the outliers402 * @return {String} The fill color of the outliers403 */404 getOutlierFillColor() {405 return this._gstyle( 'outlierFillColor', ...arguments );406 }407 /**408 * Sets the outlier fill opacity409 * @param {Number} opacity - The outlier fill opacity410 * @returns {SerieBox} The current serie instance411 */412 setOutlierFillOpacity() {413 return this._style( 'outlierFillOpacity', ...arguments );414 }415 /**416 * Returns the fill opacity of the outliers417 * @return {Number} The fill opacity of the outliers418 */419 getOutlierFillOpacity() {420 return this._gstyle( 'outlierFillOpacity', ...arguments );421 }422 /**423 * Reapply the current style to the serie lines elements. Mostly used internally424 * @returns {SerieBox} The current serie instance425 */426 applyLineStyles() {427 this.applyLineStyle( this.pathDom );428 }429 /**430 * Applies the current style to a line element. Mostly used internally431 * @memberof SerieBar432 */433 applyLineStyle( line ) {434 line.setAttribute( 'stroke', this.getLineColor() );435 line.setAttribute( 'stroke-width', this.getLineWidth() );436 line.removeAttribute( 'stroke-dasharray' );437 line.setAttribute( 'fill', this.getFillColor() );438 line.setAttribute( 'fill-opacity', this.getFillOpacity() || 1 );439 }440 draw() {441 if ( !this.data ) {442 return;443 }444 let position;445 let axis = this.options.orientation == 'y' ? this.getYAxis() : this.getXAxis();446 let axis2 = this.options.orientation == 'y' ? this.getXAxis() : this.getYAxis();447 let boxOtherDimension; // width or height of the box448 let useCategories = false;449 let mean, boxAbove, boxBelow, barAbove, barBelow, outliers, posAbove, posBelow;450 let categoryNumber;451 emptyDom( this.groupMain );452 if ( axis2.getType() == 'category' ) {453 boxOtherDimension = axis2.getRelPx( 0.8 / ( this.nbCategories ) );454 useCategories = true;455 } else {456 // Get all the spacing and determine the smallest one457 boxOtherDimension = this.options.maxBoxWidth;458 for ( var i = 0, l = this.data.length; i < l - 1; i++ ) {459 boxOtherDimension = Math.max( 5, Math.min( boxOtherDimension, Math.abs( axis2.getPx( this.data[ i + 1 ].x ) - axis2.getPx( this.data[ i ].x ) ) ) );460 }461 }462 for ( var i = 0, l = this.data.length; i < l; i++ ) {463 if ( axis2.getType() == 'category' ) {464 let cat = this.options.orientation == 'y' ? this.data[ i ].x : this.data[ i ].y;465 if ( !this.categoryIndices.hasOwnProperty( cat ) ) {466 if ( Array.isArray( this._linkedToScatterSeries ) ) {467 for ( let scatter_serie of this._linkedToScatterSeries ) {468 if ( scatter_serie.categoryIndices.hasOwnProperty( cat ) ) {469 position = [ axis2.getPos( scatter_serie.categoryIndices[ cat ] ) + 1.2 * boxOtherDimension / 2 ];470 if ( this.options.orientation == 'y' ) {471 axis = scatter_serie.getYAxis();472 } else {473 axis = scatter_serie.getXAxis();474 }475 break;476 }477 }478 }479 } else {480 position = [ axis2.getPos( this.categoryIndices[ cat ] ) + 1.2 * boxOtherDimension / 2 ];481 }482 } else {483 position = [ axis2.getPos( this.options.orientation == 'y' ? this.data[ i ].x : this.data[ i ].y ), boxOtherDimension ];484 }485 mean = axis.getPos( this.data[ i ].Q2 );486 boxAbove = axis.getPos( this.data[ i ].Q3 );487 boxBelow = axis.getPos( this.data[ i ].Q1 );488 this.data[ i ].whiskers.map( ( val ) => {489 if ( val < this.data[ i ].Q1 ) {490 barBelow = axis.getPos( val );491 } else {492 barAbove = axis.getPos( val );493 }494 } );495 outliers = this.data[ i ].outliers.map( ( val ) => axis.getPos( val ) );496 var lineMean = document.createElementNS( this.graph.ns, 'line' );497 this.applyMeanStyle( lineMean );498 var rectAbove = document.createElementNS( this.graph.ns, 'rect' );499 var rectBelow = document.createElementNS( this.graph.ns, 'rect' );500 if ( this.options.orientation == 'y' ) {501 rectAbove.setAttribute( 'width', boxOtherDimension );502 rectAbove.setAttribute( 'x', position[ 0 ] - boxOtherDimension / 2 );503 rectBelow.setAttribute( 'width', boxOtherDimension );504 rectBelow.setAttribute( 'x', position[ 0 ] - boxOtherDimension / 2 );505 lineMean.setAttribute( 'x1', position[ 0 ] - boxOtherDimension / 2 );506 lineMean.setAttribute( 'x2', position[ 0 ] + boxOtherDimension / 2 );507 lineMean.setAttribute( 'y1', mean );508 lineMean.setAttribute( 'y2', mean );509 } else {510 rectAbove.setAttribute( 'height', boxOtherDimension );511 rectAbove.setAttribute( 'y', position[ 0 ] - boxOtherDimension / 2 );512 rectBelow.setAttribute( 'height', boxOtherDimension );513 rectBelow.setAttribute( 'y', position[ 0 ] - boxOtherDimension / 2 );514 lineMean.setAttribute( 'y1', position[ 0 ] - boxOtherDimension / 2 );515 lineMean.setAttribute( 'y2', position[ 0 ] + boxOtherDimension / 2 );516 lineMean.setAttribute( 'x1', mean );517 lineMean.setAttribute( 'x2', mean );518 }519 this.boxPos( rectAbove, mean, boxAbove, this.options.orientation == 'x' );520 this.boxPos( rectBelow, mean, boxBelow, this.options.orientation == 'x' );521 this.applyBoxStyle( rectAbove, rectBelow );522 var whiskerAbove = document.createElementNS( this.graph.ns, 'line' );523 var whiskerBelow = document.createElementNS( this.graph.ns, 'line' );524 if ( this.options.orientation == 'y' ) {525 if ( barAbove !== undefined ) {526 whiskerAbove.setAttribute( 'y1', boxAbove );527 whiskerAbove.setAttribute( 'y2', barAbove );528 whiskerAbove.setAttribute( 'x1', position[ 0 ] );529 whiskerAbove.setAttribute( 'x2', position[ 0 ] );530 }531 if ( barBelow !== undefined ) {532 whiskerBelow.setAttribute( 'y1', boxBelow );533 whiskerBelow.setAttribute( 'y2', barBelow );534 whiskerBelow.setAttribute( 'x1', position[ 0 ] );535 whiskerBelow.setAttribute( 'x2', position[ 0 ] );536 }537 } else {538 if ( barAbove !== undefined ) {539 whiskerAbove.setAttribute( 'x1', boxAbove );540 whiskerAbove.setAttribute( 'x2', barAbove );541 whiskerAbove.setAttribute( 'y1', position[ 0 ] );542 whiskerAbove.setAttribute( 'y2', position[ 0 ] );543 }544 if ( barBelow !== undefined ) {545 whiskerBelow.setAttribute( 'x1', boxBelow );546 whiskerBelow.setAttribute( 'x2', barBelow );547 whiskerBelow.setAttribute( 'y1', position[ 0 ] );548 whiskerBelow.setAttribute( 'y2', position[ 0 ] );549 }550 }551 outliers.map( ( outliervalue ) => {552 let outlier = document.createElementNS( this.graph.ns, 'circle' );553 outlier.setAttribute( 'r', 2 );554 if ( this.options.orientation == 'y' ) {555 outlier.setAttribute( 'cx', position[ 0 ] );556 outlier.setAttribute( 'cy', outliervalue );557 } else {558 outlier.setAttribute( 'cy', position[ 0 ] );559 outlier.setAttribute( 'cx', outliervalue );560 }561 this.setOutlierStyle( outlier );562 this.groupMain.appendChild( outlier );563 } );564 if ( barAbove !== undefined ) {565 this.groupMain.appendChild( whiskerAbove );566 }567 if ( barBelow !== undefined ) {568 this.groupMain.appendChild( whiskerBelow );569 }570 if ( boxAbove !== undefined ) {571 this.groupMain.appendChild( rectAbove );572 }573 if ( boxBelow !== undefined ) {574 this.groupMain.appendChild( rectBelow );575 }576 this.groupMain.appendChild( lineMean );577 this.applyWhiskerStyle( whiskerAbove, whiskerBelow );578 }579 }580 applyBoxStyle( above, below ) {581 above.setAttribute( 'stroke', this.getBoxAboveLineColor() );582 above.setAttribute( 'stroke-width', this.getBoxAboveLineWidth() );583 if ( this.getBoxAboveFillColor() !== undefined ) {584 above.setAttribute( 'fill', this.getBoxAboveFillColor() );585 }586 if ( this.getBoxAboveFillOpacity() !== undefined ) {587 above.setAttribute( 'fill-opacity', this.getBoxAboveFillOpacity() );588 }589 below.setAttribute( 'stroke', this.getBoxBelowLineColor() );590 below.setAttribute( 'stroke-width', this.getBoxBelowLineWidth() );591 if ( this.getBoxBelowFillColor() !== undefined ) {592 below.setAttribute( 'fill', this.getBoxBelowFillColor() );593 }594 if ( this.getBoxAboveFillOpacity() !== undefined ) {595 below.setAttribute( 'fill-opacity', this.getBoxBelowFillOpacity() );596 }597 }598 applyWhiskerStyle( above, below ) {599 above.setAttribute( 'stroke', this.getBarAboveLineColor() );600 above.setAttribute( 'stroke-width', this.getBarAboveLineWidth() );601 below.setAttribute( 'stroke', this.getBarBelowLineColor() );602 below.setAttribute( 'stroke-width', this.getBarBelowLineWidth() );603 }604 applyMeanStyle( line ) {605 line.setAttribute( 'stroke', this.getMeanLineColor() );606 line.setAttribute( 'stroke-width', this.getMeanLineWidth() );607 }608 setOutlierStyle( outlier ) {609 outlier.setAttribute( 'stroke', this.getOutlierLineColor() );610 outlier.setAttribute( 'stroke-width', this.getOutlierLineWidth() );611 if ( this.getBoxBelowFillColor() !== undefined ) {612 outlier.setAttribute( 'fill', this.getOutlierFillColor() );613 }614 if ( this.getBoxAboveFillOpacity() !== undefined ) {615 outlier.setAttribute( 'fill-opacity', this.getOutlierFillOpacity() );616 }617 }618 /**619 * Returns the index of a category based on its name620 * @param {String} name - The name of the category621 */622 getCategoryIndex( name ) {623 if ( !this.categories ) {624 throw new Error( 'No categories were defined. Probably axis.setSeries was not called' );625 }626 for ( var i = 0; i < this.categories.length; i++ ) {627 if ( this.categories[ i ].name == name ) {628 return i;629 }630 }631 return false;632 }633 // Markers now allowed634 setMarkers() {}635 boxPos( box, mean, extremity, blnX ) {636 if ( mean > extremity ) {637 box.setAttribute( blnX ? 'x' : 'y', extremity );638 box.setAttribute( blnX ? 'width' : 'height', mean - extremity );639 } else {640 box.setAttribute( blnX ? 'x' : 'y', mean );641 box.setAttribute( blnX ? 'width' : 'height', extremity - mean );642 }643 }644 getUsedCategories() {645 let xymode = this.options.orientation == 'y' ? 'x' : 'y';646 let categories = this.data.map( ( d ) => d[ xymode ] );647 if ( Array.isArray( this._linkedToScatterSeries ) ) {648 this._linkedToScatterSeries.map( ( scatter_serie ) => {649 scatter_serie.getUsedCategories().map( ( scatter_serie_cat ) => {650 let index;651 if ( ( index = categories.indexOf( scatter_serie_cat ) ) > -1 ) {652 categories.splice( index, 1 );653 }654 } );655 } );656 }657 return categories;658 }659 linkToScatterSerie( ...series ) {660 this._linkedToScatterSeries = series;661 }662}...
Home.js
Source:Home.js
1import React, { Component } from 'react';2import { connect } from 'react-redux'3import { BarChart, AreaChart, Area, LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend,4 Bar, ComposedChart, PieChart, Pie, Sector, Cell } from 'recharts';5import { Col, Row, Table, Icon, Popover, Select , Button } from 'antd'6import { Modal, ButtonToolbar } from 'react-bootstrap';7import Cookies from 'js-cookie'8import TotalRev from '../visualizeComponent/TotalRev'9import BoxAbove from '../visualizeComponent/BoxAbove'10import TourRevRanking from '../visualizeComponent/TourRevRanking'11import PopularNation from '../visualizeComponent/PopularNation'12import TotalRevModal from '../visualizeComponent/Modal/TotalRevModal'13import TourRevRankingModal from '../visualizeComponent/Modal/TourRevRankingModal'14import PopNationModal from '../visualizeComponent/Modal/PopNationModal'15import TotalParticipant from '../visualizeComponent/TotalParticipant'16import TotalParticipantModal from '../visualizeComponent/Modal/TotalParticipantModal'17import TourCustomerRanking from '../visualizeComponent/TourCustomerRanking'18import TourCustomerRankingModal from '../visualizeComponent/Modal/TourCustomerRankingModal'19import TotalCostFromGuide from '../visualizeComponent/TotalCostFromGuide'20import AgencyParticipantsRanking from '../visualizeComponent/AgencyParticipantsRanking'21import ParticipantsFromAgencyModal from '../visualizeComponent/Modal/ParticipantsFromAgencyModal'22import CostFromGuideModal from '../visualizeComponent/Modal/CostFromGuideModal'23import { changeYearDashBoard } from '../../actions/action-changeYearDashBoard'24function throwOptionYearObject(){25 let today = new Date();26 let curYear = today.getFullYear();27 let startYear = 200028 let temp = []29 for (let i = startYear; i <= curYear; i++) {30 temp.push(<Option key= {i}>{i}</Option>);31 }32 return temp33}34const Option = Select.Option;35let today = new Date();36let curYear = today.getFullYear();37class Home extends Component {38 constructor(props){39 super(props)40 this.state = {41 showMoreTourRevRanking: false,42 showMoreNationsSummary: false,43 showMoreTotalRevenue:false,44 showMoreParticipantSummary:false,45 selectedYear:curYear,46 showMoreTourCustomerRankingSummary:false,47 showMoreTotalAgency:false,48 showMoreTotalCostFromGuide:false49 }50 }51 handleClickShowMoreTourRevRanking(){52 this.setState({showMoreTourRevRanking: true})53 }54 handleClickShowMoreNationsSummary(){55 this.setState({showMoreNationsSummary: true})56 }57 handleClickshowMoreTotalRevenue(){58 this.setState({showMoreTotalRevenue: true})59 }60 handleClickShowMoreTourCustomerRanking(){61 this.setState({showMoreTourCustomerRankingSummary: true})62 }63 handleClickShowTotalAgency(){64 this.setState({showMoreTotalAgency: true})65 }66 handleYearSelect(value,option){67 this.setState({selectedYear: value})68 this.props.dispatch(changeYearDashBoard('CHANGE_YEAR',value))69 }70 handleClickShowTotalParticipant(value,option){71 this.setState({showMoreParticipantSummary: true})72 }73 handleClickShowTotalCostFromGuide(){74 this.setState({showMoreTotalCostFromGuide:true})75 }76 // setYearRev(){77 // // Cookies.set('selectedYearInDashBoard',this.state.selectedYear)78 // // this.getRevData(this.state.selectedYear)79 //80 // }81 render() {82 let closeShowMoreTourRevRanking = () => { this.setState({showMoreTourRevRanking: false}) }83 let closeShowMoreNationsSummary = () => { this.setState({showMoreNationsSummary: false}) }84 let closeShowMoreTotalRevenue = () => { this.setState({showMoreTotalRevenue:false}) }85 let closeShowMoreParticipantSummary = () => { this.setState({showMoreParticipantSummary:false}) }86 let closeShowMoreTourCustomerRankingSummary = () => { this.setState({showMoreTourCustomerRankingSummary: false}) }87 let closeShowMoreTotalAgency = () => { this.setState({showMoreTotalAgency:false}) }88 let closeShowMoreTotalCostFromGuide = () => { this.setState({showMoreTotalCostFromGuide:false}) }89 return (90 <div className="home-dashboard">91 <div className="modal-container">92 <Modal93 show={this.state.showMoreTotalAgency}94 onHide={closeShowMoreTotalAgency}95 container={this}96 responsive={true}97 aria-labelledby="contained-modal-title"98 >99 <Modal.Header closeButton>100 <Modal.Title id="contained-modal-title">Participants From Agency</Modal.Title>101 </Modal.Header>102 <Modal.Body>103 <ParticipantsFromAgencyModal dispatch = {this.props.dispatch} />104 </Modal.Body>105 </Modal>106 </div>107 <div className="modal-container">108 <Modal109 show={this.state.showMoreTotalCostFromGuide}110 onHide={closeShowMoreTotalCostFromGuide}111 container={this}112 responsive={true}113 aria-labelledby="contained-modal-title"114 >115 <Modal.Header closeButton>116 <Modal.Title id="contained-modal-title">Cost From Guide</Modal.Title>117 </Modal.Header>118 <Modal.Body>119 <CostFromGuideModal dispatch={this.props.dispatch}/>120 </Modal.Body>121 </Modal>122 </div>123 <div className="modal-container">124 <Modal125 bsSize="large"126 show={this.state.showMoreTotalRevenue}127 onHide={closeShowMoreTotalRevenue}128 responsive={true}129 container={this}130 aria-labelledby="contained-modal-title"131 >132 <Modal.Header closeButton>133 <Modal.Title id="contained-modal-title">Total Revenue Summary</Modal.Title>134 </Modal.Header>135 <Modal.Body>136 <TotalRevModal dispatch = {this.props.dispatch} />137 </Modal.Body>138 </Modal>139 </div>140 <div className="modal-container">141 <Modal142 show={this.state.showMoreTourRevRanking}143 onHide={closeShowMoreTourRevRanking}144 container={this}145 responsive={true}146 aria-labelledby="contained-modal-title"147 >148 <Modal.Header closeButton>149 <Modal.Title id="contained-modal-title">Tour Total Revenue Summary</Modal.Title>150 </Modal.Header>151 <Modal.Body>152 <TourRevRankingModal dispatch = {this.props.dispatch} />153 </Modal.Body>154 </Modal>155 </div>156 <div className="modal-container">157 <Modal158 show={this.state.showMoreNationsSummary}159 onHide={closeShowMoreNationsSummary}160 container={this}161 responsive={true}162 aria-labelledby="contained-modal-title"163 >164 <Modal.Header closeButton>165 <Modal.Title id="contained-modal-title">Popular Nation Summary</Modal.Title>166 </Modal.Header>167 <Modal.Body>168 <PopNationModal dispatch = {this.props.dispatch} />169 </Modal.Body>170 </Modal>171 </div>172 <div className="modal-container">173 <Modal174 bsSize="lg"175 show={this.state.showMoreParticipantSummary}176 onHide={closeShowMoreParticipantSummary}177 container={this}178 responsive={true}179 aria-labelledby="contained-modal-title"180 >181 <Modal.Header closeButton>182 <Modal.Title id="contained-modal-title">Total Participant Summary</Modal.Title>183 </Modal.Header>184 <Modal.Body>185 <TotalParticipantModal dispatch = {this.props.dispatch} />186 </Modal.Body>187 </Modal>188 </div>189 <div className="modal-container">190 <Modal191 show={this.state.showMoreTourCustomerRankingSummary}192 onHide={closeShowMoreTourCustomerRankingSummary}193 container={this}194 responsive={true}195 aria-labelledby="contained-modal-title"196 >197 <Modal.Header closeButton>198 <Modal.Title id="contained-modal-title">Tour Customer Summary</Modal.Title>199 </Modal.Header>200 <Modal.Body>201 <TourCustomerRankingModal dispatch ={this.props.dispatch}/>202 </Modal.Body>203 </Modal>204 </div>205 <div className = "year-selection">206 <Row>207 <Col span={6}>208 <div className ="year-title">209 <h2>{this.state.selectedYear}</h2>210 </div>211 </Col>212 <Col xs={{ span: 6, offset: 2 }} lg={{ span: 6, offset: 12 }} className="year-go">213 <Icon type="calendar" style={{fontSize:'2rem'}} />214 <Select215 showSearch216 style={{width: 150}}217 defaultValue= {this.state.selectedYear}218 placeholder="Year"219 optionFilterProp="children"220 onSelect={this.handleYearSelect.bind(this)}221 filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}222 >223 {throwOptionYearObject()}224 </Select>225 </Col>226 </Row>227 </div>228 <div className="gutter-example" >229 <BoxAbove dispatch = {this.props.dispatch}/>230 </div>231 <Row gutter={16}>232 <Col xs={24} lg={16}>233 <div className = "visualize-box">234 <div className = "visualize-label">235 <Row>236 <Col span = {14} className="label-box">237 <h4>Total Revenue Summary</h4>238 </Col>239 <Col span = {1} offset = {8}>240 <Popover placement="top" title={"See more!"}>241 <Icon className = "read-more-button" type="ellipsis"242 onClick = {()=> this.handleClickshowMoreTotalRevenue()}/>243 </Popover>244 </Col>245 </Row>246 </div>247 <TotalRev dispatch = {this.props.dispatch}/>248 </div>249 <div className = "visualize-box">250 <div className = "visualize-label">251 <Row>252 <Col span = {14} className="label-box">253 <h4>Total Customer Summary</h4>254 </Col>255 <Col span = {1} offset = {8}>256 <Popover placement="top" title={"See more!"}>257 <Icon className = "read-more-button" type="ellipsis"258 onClick = {()=> this.handleClickShowTotalParticipant()}/>259 </Popover>260 </Col>261 </Row>262 </div>263 <TotalParticipant dispatch = {this.props.dispatch} />264 </div>265 <div className = "visualize-box">266 <div className = "visualize-label">267 <Row>268 <Col span = {14} className="label-box">269 <h4>Total Cost From Guide</h4>270 </Col>271 <Col span = {1} offset = {8}>272 <Popover placement="top" title={"See more!"}>273 <Icon className = "read-more-button" type="ellipsis"274 onClick = {()=> this.handleClickShowTotalCostFromGuide()}/>275 </Popover>276 </Col>277 </Row>278 </div>279 <TotalCostFromGuide dispatch={this.props.dispatch}/>280 </div>281 <div className = "visualize-box">282 <div className = "visualize-label">283 <Row>284 <Col span = {14} className="label-box">285 <h4>Participants From Agency Ranking</h4>286 </Col>287 <Col span = {1} offset = {8}>288 <Popover placement="top" title={"See more!"}>289 <Icon className = "read-more-button" type="ellipsis"290 onClick = {()=> this.handleClickShowTotalAgency()}/>291 </Popover>292 </Col>293 </Row>294 </div>295 <AgencyParticipantsRanking dispatch={this.props.dispatch} />296 </div>297 </Col>298 <Col xs={24} lg={8}>299 <div className = "visualize-box">300 <div className = "visualize-label">301 <Row>302 <Col span = {17} className="label-box">303 <h4>Tour Revenue Ranking</h4>304 </Col>305 <Col span = {1} offset = {4}>306 <Popover placement="top" title={"See more!"}>307 <Icon className = "read-more-button" type="ellipsis"308 onClick = {()=> this.handleClickShowMoreTourRevRanking()}/>309 </Popover>310 </Col>311 </Row>312 </div>313 <TourRevRanking dispatch = {this.props.dispatch}/>314 </div>315 <div className = "visualize-box">316 <div className = "visualize-label">317 <Row>318 <Col span = {17} className="label-box">319 <h4>Tour Customer Ranking</h4>320 </Col>321 <Col span = {1} offset = {4}>322 <Popover placement="top" title={"See more!"}>323 <Icon className = "read-more-button" type="ellipsis"324 onClick = {()=> this.handleClickShowMoreTourCustomerRanking()}/>325 </Popover>326 </Col>327 </Row>328 </div>329 <TourCustomerRanking dispatch = {this.props.dispatch}/>330 </div>331 <div className = "visualize-box-pop-nation">332 <div className = "visualize-label">333 <Row>334 <Col span = {17} className="label-box">335 <h4>Popular Nation</h4>336 </Col>337 <Col span = {1} offset = {4}>338 <Popover placement="top" title={"See more!"}>339 <Icon className = "read-more-button" type="ellipsis"340 onClick = {()=> this.handleClickShowMoreNationsSummary()}/>341 </Popover>342 </Col>343 </Row>344 </div>345 <PopularNation dispatch = {this.props.dispatch}/>346 </div>347 </Col>348 { /*</Row>349 <Col span={8}>350 <div className = "fav-nation">351 </div>352 </Col>353 <Col span={8}>354 <div className = "guide-rev">355 </div>356 </Col>357 <Col span={8}>358 <div className = "guide-rev-graph">359 </div>360 </Col>361 <Row>362 */}363 </Row>364 </div>365 );366 }367}368function mapStateToProps(state){369 return{370 }371}...
perlin_grid.js
Source:perlin_grid.js
1var vertexShader = `varying vec2 vUv;2void main()3{4 vUv = uv;5 vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );6 gl_Position = projectionMatrix * mvPosition;7}`;8var fragmentShader = `9uniform float r;10uniform float g;11uniform float b;12uniform float distance;13uniform float pulse;14uniform float rows;15uniform float cols;16varying vec2 vUv;17float checkerRows = 1.5;18float checkerCols = 2.0;19void main( void ) {20 vec2 position = abs(-1.0 + 2.0 * vUv);21 float edging = abs((pow(position.y, 5.0) + pow(position.x, 5.0)) / 1.0);22 float perc = 0.25 + distance * edging * 0.75;23 vec2 checkPosition = vUv;24 25 float checkerX = mod(checkPosition.x, 1.0 / rows) * rows; // loop of 0 to 1 per row: /|/|/|//26 checkerX = abs(checkerX - 0.5) * 2.0; // make up and down: /\/\/\ 27 checkerX = pow(checkerX, 3.0); // power to sharpen edges: \__/\__/28 float checkerY = mod(checkPosition.y, 1.0 / cols) * cols;29 checkerY = abs(checkerY - 0.5) * 2.0;30 checkerY = pow(checkerY, 3.0);31 float checkerMod = 0.0;32 if (rows > 1.0 && floor(checkPosition.x * rows) == checkerMod) {33 perc = 2.0;34 }35 if (cols > 1.0 && floor(checkPosition.y * cols) == checkerMod) {36 perc = 2.0;37 }38 // float checker = (checkerX * checkerY) * 2.0;39 float checker = (checkerX + checkerY) * 0.5;40 float r1 = r * checker + 0.1;41 float g1 = g * checker + 0.05;42 float b1 = b * checker + 0.2;43 float red = r1 * perc + pulse;44 float green = g1 * perc + pulse;45 float blue = b1 * perc + pulse + 0.05;46 // float red = r;47 // float green = g;48 // float blue = b;49 gl_FragColor = vec4(red, green, blue, 1.0);50}`;51var perlin_grid = function(noise) {52 var stage = document.createElement("div");53 var camera, scene, renderer;54 var mouse = {x: 0, y: 0};55 var camPos = {x: 0, y: 0, z: 10};56 var sw = window.innerWidth, sh = window.innerHeight;57 var size = {58 width: 300,59 height: 100,60 depth: 300,61 }62 var edgeSize = 50;63 var gridUnits = 7;64 var gridAbove = [];65 var gridBelow = [];66 var seed = Math.random();67 var holderAbove, holderBelow;68 function num(min, max) { return Math.random() * (max - min) + min; }69 function createMaterial(rows, cols, colourRand, distance) {70 var colourBase = {r: 0.7, g: 0.3, b: 0.6};71 var colour = {72 r: colourBase.r + colourRand.r,73 g: colourBase.g + colourRand.g,74 b: colourBase.b + colourRand.b75 }76 var uniforms = {77 r: { type: "f", value: colour.r},78 g: { type: "f", value: colour.g},79 b: { type: "f", value: colour.b},80 // distanceX: { type: "f", value: 1.0},81 distance: { type: "f", value: distance},82 pulse: { type: "f", value: 0},83 rows: { type: "f", value: rows},84 cols: { type: "f", value: cols},85 };86 var material = new THREE.ShaderMaterial( {87 uniforms: uniforms,88 vertexShader: vertexShader,89 fragmentShader: fragmentShader90 });91 return material;92 }93 function cube(options) {94 var width = options.dimensions.width;95 var height = options.dimensions.height;96 var depth = options.dimensions.depth;97 var colour = options.colour;98 var checker = options.checker;99 var distance = options.distance;100 // these coloured vars are just for debugging101 var shaderRed = createMaterial(checker[0][0], checker[0][1], colour, distance);102 var shaderYellow = createMaterial(checker[1][0], checker[1][1], colour, distance);103 var shaderGreen = createMaterial(checker[2][0], checker[2][1], colour, distance);104 var shaderBlue = createMaterial(checker[3][0], checker[3][1], colour, distance);105 var shaderCyan = createMaterial(checker[4][0], checker[4][1], colour, distance);106 var shaderMagenta = createMaterial(checker[5][0], checker[5][1], colour, distance);107 // const material = new THREE.MeshPhongMaterial({108 // color: props.colour,109 // emissive: 0x803000,110 // });111 var geometry = new THREE.BoxGeometry(width, height, depth);112 var mesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial([113 shaderRed,114 shaderYellow,115 shaderGreen,116 shaderBlue,117 shaderCyan, 118 shaderMagenta119 ]));120 // mesh.colours = colours;121 return mesh;122 }123 const draw = (x, z, distanceFromCentre) => {124 var colourRand = {125 r: num(0, 0.5),126 g: num(0, 0.5),127 b: num(0, 0.5)128 }129 var vertProps = {130 width: edgeSize, 131 height: size.height, 132 depth: edgeSize,133 }134 var distance = size.width / 2 - edgeSize; // only because size.width == size.depth135 var holder = new THREE.Group();136 var verticalEdgeBL = cube({ // back left137 dimensions: vertProps,138 checker: [[1,2],[1,2],[1,1],[1,1],[1,2],[1,2]],139 colour: colourRand, 140 distance: distanceFromCentre141 });142 verticalEdgeBL.position.set(-distance, 0, -distance)143 holder.add(verticalEdgeBL);144 var verticalEdgeBR = cube({145 dimensions: vertProps,146 checker: [[1,2],[1,2],[1,1],[1,1],[1,2],[1,2]],147 colour: colourRand, 148 distance: distanceFromCentre149 });150 verticalEdgeBR.position.set(distance, 0, -distance)151 holder.add(verticalEdgeBR);152 var verticalEdgeFL = cube({153 dimensions: vertProps,154 checker: [[1,2],[1,2],[1,1],[1,1],[1,2],[1,2]],155 colour: colourRand, 156 distance: distanceFromCentre157 });158 verticalEdgeFL.position.set(-distance, 0, distance)159 holder.add(verticalEdgeFL);160 var verticalEdgeFR = cube({161 dimensions: vertProps,162 checker: [[1,2],[1,2],[1,1],[1,1],[1,2],[1,2]],163 colour: colourRand, 164 distance: distanceFromCentre165 });166 verticalEdgeFR.position.set(distance, 0, distance)167 holder.add(verticalEdgeFR); // front right168 var horizProps = {169 width: size.width - edgeSize, 170 height: edgeSize,171 depth: edgeSize,172 }173 var horizontalEdgeF = cube({174 dimensions: horizProps,175 checker: [[1,1],[1,1],[5,1],[5,1],[5,1],[5,1]],176 colour: colourRand, 177 distance: distanceFromCentre178 });179 horizontalEdgeF.position.set(0, (size.height + edgeSize) / 2, -distance)180 holder.add(horizontalEdgeF);181 var horizontalEdgeB = cube({182 dimensions: horizProps,183 checker: [[1,1],[1,1],[5,1],[5,1],[5,1],[5,1]],184 colour: colourRand, 185 distance: distanceFromCentre186 });187 horizontalEdgeB.position.set(0, (size.height + edgeSize) / 2, distance)188 holder.add(horizontalEdgeB);189 return holder;190 }191 function init() {192 return;193 scene = new THREE.Scene();194 camera = new THREE.PerspectiveCamera( 90, sw / sh, 1, 10000 );195 camera.position.set( 0, 100, 500 );196 scene.add( camera );197 var light = new THREE.DirectionalLight( 0xffffff, 2 );198 light.position.set( 1, 1, 1 ).normalize();199 scene.add( light );200 var light = new THREE.DirectionalLight( 0xff00ff, 2 );201 light.position.set( -1, 0, 0 ).normalize();202 scene.add( light );203 renderer = new THREE.WebGLRenderer({antialias: true});204 // renderer.sortObjects = false;205 renderer.setSize( sw, sh );206 holderAbove = new THREE.Group();207 scene.add(holderAbove);208 holderBelow = new THREE.Group();209 scene.add(holderBelow);210 for (var x = 0; x < gridUnits; x++) {211 for (var z = 0; z < gridUnits; z++) {212 var px = (x - gridUnits / 2 + 0.5) * size.width;213 var py = 0;214 var pz = (z - gridUnits / 2 + 0.5) * size.depth;215 var distanceFromCentre = 1 - Math.sqrt(px * px + pz * pz) / 1200;216 // con.log("distanceFromCentre", distanceFromCentre)217 var boxAbove = draw(x, z, distanceFromCentre);218 boxAbove.position.set(px, py, pz);219 holderAbove.add(boxAbove);220 gridAbove.push(boxAbove);221 222 var boxBelow = draw(x, z, distanceFromCentre);223 boxBelow.position.set(px, py, pz);224 boxBelow.rotation.set(Math.PI, Math.PI / 2, 0);225 holderBelow.add(boxBelow);226 gridBelow.push(boxBelow);227 }228 }229 // var boxAbove = draw(0, 0, 1);230 // scene.add(boxAbove);231 stage.appendChild(renderer.domElement);232 animate(0);233 }234 function listen(eventNames, callback) {235 for (var i = 0; i < eventNames.length; i++) {236 window.addEventListener(eventNames[i], callback);237 }238 }239 listen(["resize"], function(e){240 sw = window.innerWidth;241 sh = window.innerHeight242 camera.aspect = sw / sh;243 camera.updateProjectionMatrix();244 renderer.setSize(sw, sh);245 });246 listen(["mousedown", "touchstart"], function(e) {247 e.preventDefault();248 isMouseDown = true;249 });250 listen(["mousemove", "touchmove"], function(e) {251 e.preventDefault();252 if (e.changedTouches && e.changedTouches[0]) e = e.changedTouches[0];253 mouse.x = (e.clientX / sw) * 2 - 1;254 mouse.y = -(e.clientY / sh) * 2 + 1;255 });256 listen(["mouseup", "touchend"], function(e) {257 e.preventDefault();258 isMouseDown = false;259 });260 function render(time) {261 var breathDistance = 1 + (1 + Math.sin(time * 0.004)) * 2;262 263 function renderBox(holder, value, x, z, above) {264 value = value * value * value * value; // power the fuck265 var scale = 1 + value * 50;266 var px = (x - gridUnits / 2 + 0.5) * size.width * breathDistance;267 var py = scale * size.height / 2 * above;268 var pz = (z - gridUnits / 2 + 0.5) * size.depth * breathDistance;269 holder.position.set(px, py, pz);270 // con.log('holder', scale , size.height / 2 * above)271 // con.log('holder', scale)272 // con.log("holder", holder)273 // for (var m = 0; m < holder.children.length; m++) {274 // var mesh = holder.children[m];275 // for (var n = 0; n < mesh.material.materials.length; n++) {276 // var material = mesh.material.materials[n];277 // if (Math.random() > 0.99) {278 // material.uniforms.pulse.value = 1;279 // }280 // material.uniforms.pulse.value -= material.uniforms.pulse.value * 0.1 / (1 + 1);281 // }282 // }283 }284 for (var z = 0; z < gridUnits; z++) { // using double high grid, first half is top, 2nd half is bottom285 for (var x = 0; x < gridUnits; x++) {286 var gridIndex = (x + z * gridUnits);287 var valueAbove = (noise.perlin3(x / gridUnits, z / gridUnits, seed) + 1) / 2;288 var valueBelow = (noise.perlin3(x / gridUnits, z + gridUnits * gridUnits / gridUnits, seed) + 1) / 2;289 var holderAbove = gridAbove[gridIndex];290 var holderBelow = gridBelow[gridIndex];291 renderBox(holderAbove, valueAbove, x, z, 1);292 renderBox(holderBelow, valueBelow, x, z, -1);293 }294 }295 296 seed += 0.01;297 var camDistance = 400;298 camPos.x -= (camPos.x - mouse.x * 1) * 0.02;299 camPos.y -= (camPos.y - mouse.y * 1000) * 0.05;300 // var rotY = time * 0.001 + camPos.x;301 var rotY = camPos.x * 4;302 camera.position.set(Math.sin(rotY) * camDistance, camPos.y, Math.cos(rotY) * camDistance);303 camera.lookAt( scene.position );304 renderer.render( scene, camera );305 }306 function animate(time) {307 requestAnimationFrame( animate );308 if (Math.random() > 0.99) {309 var holder = Math.random() > 0.5 ? holderAbove : holderBelow;310 TweenMax.to(holder.rotation, 0.75, {311 y: Math.PI / 2 * Math.round(num(-2, 2)),312 eade: Quad.easeInOut313 })314 }315 render(time);316 }317 return {318 init,319 stage320 };321};...
playerblockcollision.js
Source:playerblockcollision.js
1var raycaster = new THREE.Raycaster();2//bottom looking, left and right3var intBL, intBR;4//left looking top and bottom5var intLT, intLB;6//right looking top and bottom7var intRT, intRB;8var oldRays = [];9function arrEqual(arr1, arr2){10 if(arr1.length!= arr2.length){return false;}11 for(var i = 0; i < arr1.length;i++){12 if(arr1[i] != arr2[i]){13 return false;14 }15 }16 return true;17}18//left = [1,0,0];19//right = [-1,0,0];20//below = [0,1,0];21function lookDirection(direction){22 // var pVec;23 // creates a vector from the player to some point way below24 for(var i = 0; i < stage.players.length; i++){25 var farAwayPoint = new THREE.Vector3();26 var intersects =[];27 //will be bottom left then bottom right,28 //right bottom, right top,29 //left bottom, left top30 var pVec1 = new THREE.Vector3();31 var pVec2 = new THREE.Vector3();32 var intersects1 = [];33 var intersects2 = [];34 //left35 if(arrEqual(direction, [1,0,0])){36 //far left37 farAwayPoint.x = -1;38 farAwayPoint.y = 0;39 farAwayPoint.z = 0;40 pVec1.x = stage.players[i].x-(2*stage.players[i].width)/5;41 pVec1.y = stage.players[i].y-(2*stage.players[i].height)/5;42 pVec1.z = stage.players[i].z;43 raycaster.set(pVec1, farAwayPoint.normalize());44 intersects1 = raycaster.intersectObjects(stage.blockAMeshes);45 pVec2.x = stage.players[i].x-(2*stage.players[i].width)/5;46 pVec2.y = stage.players[i].y+(2*stage.players[i].height)/5;47 pVec2.z = stage.players[i].z;48 raycaster.set(pVec2, farAwayPoint.normalize());49 intersects2 = raycaster.intersectObjects(stage.blockAMeshes);50 var pointA = pVec1;51 var pointB = new THREE.Vector3();52 pointB.addVectors ( pointA, farAwayPoint.normalize().multiplyScalar( 20 ) );53 drawRay(pointA, pointB, 0xff0000);54 var pointA = pVec2;55 var pointB = new THREE.Vector3();56 pointB.addVectors ( pointA, farAwayPoint.normalize().multiplyScalar( 20 ) );57 drawRay(pointA, pointB, 0xff0000);58 }59 //right60 else if(arrEqual(direction, [-1,0,0])){61 //far right62 farAwayPoint.x = 1;63 farAwayPoint.y = 0;64 farAwayPoint.z = 0;65 //current right below66 pVec1.x = stage.players[i].x+(2*stage.players[i].width)/5;67 pVec1.y = stage.players[i].y-(2*stage.players[i].height)/5;68 pVec1.z = stage.players[i].z;69 raycaster.set(pVec1, farAwayPoint.normalize());70 intersects1 = raycaster.intersectObjects(stage.blockAMeshes);71 //current right top72 pVec2.x = stage.players[i].x+(2*stage.players[i].width)/5;73 pVec2.y = stage.players[i].y+(2*stage.players[i].height)/5;74 pVec2.z = stage.players[i].z;75 raycaster.set(pVec2, farAwayPoint.normalize());76 intersects2 = raycaster.intersectObjects(stage.blockAMeshes);77 //draw right below78 var pointA = pVec1;79 var pointB = new THREE.Vector3();80 pointB.addVectors ( pointA, farAwayPoint.normalize().multiplyScalar( 20 ) );81 drawRay(pointA, pointB, 0x00ff00);82 //draw right top83 var pointA = pVec2;84 var pointB = new THREE.Vector3();85 pointB.addVectors ( pointA, farAwayPoint.normalize().multiplyScalar( 20 ) );86 drawRay(pointA, pointB, 0x00ff00);87 }88 //below89 else if(arrEqual(direction, [0,1,0])){90 farAwayPoint.x = 0;91 farAwayPoint.y = -1;92 farAwayPoint.z = 0;93 pVec1.x = stage.players[i].x-(2*stage.players[i].width)/5;94 pVec1.y = stage.players[i].y-(2*stage.players[i].height)/5;95 pVec1.z = stage.players[i].z;96 raycaster.set(pVec1, farAwayPoint.normalize());97 intersects1 = raycaster.intersectObjects(stage.blockAMeshes);98 pVec2.x = stage.players[i].x+(2*stage.players[i].width)/5;99 pVec2.y = stage.players[i].y-(2*stage.players[i].height)/5;100 pVec2.z = stage.players[i].z;101 raycaster.set(pVec2, farAwayPoint.normalize());102 intersects2 = raycaster.intersectObjects(stage.blockAMeshes);103 var pointA = pVec1;104 var pointB = new THREE.Vector3();105 pointB.addVectors ( pointA, farAwayPoint.normalize().multiplyScalar( 20 ) );106 drawRay(pointA, pointB, 0x0000ff);107 var pointA = pVec2;108 var pointB = new THREE.Vector3();109 pointB.addVectors ( pointA, farAwayPoint.normalize().multiplyScalar( 20 ) );110 drawRay(pointA, pointB, 0x0000ff);111 }112 //above113 else if(arrEqual(direction, [0,-1,0])){114 farAwayPoint.x = 0;115 farAwayPoint.y = 1;116 farAwayPoint.z = 0;117 pVec1.x = stage.players[i].x-(2*stage.players[i].width)/5;118 pVec1.y = stage.players[i].y+(2*stage.players[i].height)/5;119 pVec1.z = stage.players[i].z;120 raycaster.set(pVec1, farAwayPoint.normalize());121 intersects1 = raycaster.intersectObjects(stage.blockAMeshes);122 pVec2.x = stage.players[i].x+(2*stage.players[i].width)/5;123 pVec2.y = stage.players[i].y+(2*stage.players[i].height)/5;124 pVec2.z = stage.players[i].z;125 raycaster.set(pVec2, farAwayPoint.normalize());126 intersects2 = raycaster.intersectObjects(stage.blockAMeshes);127 var pointA = pVec1;128 var pointB = new THREE.Vector3();129 pointB.addVectors ( pointA, farAwayPoint.normalize().multiplyScalar( 20 ) );130 drawRay(pointA, pointB, 0xff00ff);131 var pointA = pVec2;132 var pointB = new THREE.Vector3();133 pointB.addVectors ( pointA, farAwayPoint.normalize().multiplyScalar( 20 ) );134 drawRay(pointA, pointB, 0xff00ff);135 }136 intersects = determineClosest(intersects1, intersects2);137 if ( intersects != undefined) {138 if(intersects.length > 0){139 //players[i].boxBelow = intersects[0].object;140 if(direction[1] == 1){141 stage.players[i].boxBelow = intersects[0].object;142 }143 //stage.players[i].boxLeft = intersects[0].object;144 if(direction[0] == 1){145 stage.players[i].boxLeft = intersects[0].object;146 }147 //players[i].boxRight = intersects[0].object;148 if(direction[0] == -1){149 stage.players[i].boxRight = intersects[0].object;150 }151 if(direction[1] == -1){152 if(intersects[0].object.userData.type != "platform"){153 stage.players[i].boxAbove = intersects[0].object;154 }155 else{156 stage.players[i].boxAbove = undefined;157 }158 }159 }160 else{161 //players[i].boxBelow = undefined;162 if(direction[1] == 1){163 stage.players[i].boxBelow = undefined;164 }165 //players[i].boxLeft = undefined;166 if(direction[0] == 1){167 stage.players[i].boxLeft = undefined;168 }169 if(direction[0] == -1){170 stage.players[i].boxRight = undefined;171 }172 if(direction[1] == -1){173 stage.players[i].boxAbove = undefined;174 }175 }176 } else {177 //players[i].boxBelow = undefined;178 if(direction[1] == 1){179 stage.players[i].boxBelow = undefined;180 }181 //players[i].boxLeft = undefined;182 if(direction[0] == 1){183 stage.players[i].boxLeft = undefined;184 }185 if(direction[0] == -1){186 stage.players[i].boxRight = undefined;187 }188 if(direction[1] == -1){189 stage.players[i].boxAbove = undefined;190 }191 }192 }193}194function determineClosest(arr1, arr2){195 if(arr1.length > 0 && arr2.length > 0){196 if(arr1[0].distance < arr2[0].distance){197 return arr1;198 }199 else{200 return arr2;201 }202 console.log("Both exist but neither is closer");203 return arr1;204 }205 else if(!(arr1.length > 0) && arr2.length > 0){206 return arr2;207 }208 else if(!(arr2.length > 0) && arr1.length > 0){209 return arr1;210 }211 else if(!(arr1.length > 0) && !(arr2.length > 0)){212 return undefined;213 }214 console.log("none of these three cases exist");215 return arr1;216}217function drawRay(pointA, pointB, color){218 // if(drawRays){219 // var geometry = new THREE.Geometry();220 // geometry.vertices.push( pointA );221 // geometry.vertices.push( pointB );222 // var material = new THREE.LineBasicMaterial( { color : color } );223 // var intLT = new THREE.Line(geometry, material);224 // stage.scene.add(intLT);225 // setTimeout(function(){stage.scene.remove(intLT)}, 25);226 // setTimeout(function(){intLT.geometry.dispose();}, 25);227 // }...
BoxAbove.js
Source:BoxAbove.js
1import React, { Component } from 'react';2import { connect } from 'react-redux'3import { Col, Row } from 'antd'4import apiAccess from '../../Helpers/apiAccess'5let today = new Date();6let curYear = today.getFullYear();7class BoxAbove extends Component {8 constructor(props){9 super(props)10 this.state = {11 selectedyear: curYear,12 netCustomers:[],13 individualCustomers:[],14 agencyCustomer:[],15 publicCustomers:[],16 privateCustomers:[],17 mostYearlyPopularTour:''18 }19 }20 getYearlyTotalCustomer(year){21 apiAccess({22 url: 'bookedtours/total-participants/'+year,23 method: 'GET',24 payload: null,25 attemptAction: () => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_CUSTOMER_ATTEMPT' }),26 successAction: (json) => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_CUSTOMER_SUCCESS', json }),27 failureAction: () => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_CUSTOMER_FAILURE' })28 })29 }30 getYearlyBookingTypeCustomer(year){31 apiAccess({32 url: 'bookedtours/total-participants/bookingmethod-type/'+year,33 method: 'GET',34 payload: null,35 attemptAction: () => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_BOOKINGTYPE_CUSTOMER_ATTEMPT' }),36 successAction: (json) => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_BOOKINGTYPE_CUSTOMER_SUCCESS', json }),37 failureAction: () => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_BOOKINGTYPE_CUSTOMER_FAILURE' })38 })39 }40 getYearlyTourTypeCustomer(year){41 apiAccess({42 url: 'bookedtours/total-participants/tour-type/'+year,43 method: 'GET',44 payload: null,45 attemptAction: () => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_TOURTYPE_CUSTOMER_ATTEMPT' }),46 successAction: (json) => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_TOURTYPE_CUSTOMER_SUCCESS', json }),47 failureAction: () => this.props.dispatch({ type: 'GET_YEARLY_TOTAL_TOURTYPE_CUSTOMER_FAILURE' })48 })49 }50 getMostPopularTour(year){51 apiAccess({52 url: 'bookedtours/most-popular-tour/participants/'+year,53 method: 'GET',54 payload: null,55 attemptAction: () => this.props.dispatch({ type: 'GET_ALL_TOUR_CUSTOMERS_RANKING_ATTEMPT' }),56 successAction: (json) => this.props.dispatch({ type: 'GET_ALL_TOUR_CUSTOMERS_RANKING_SUCCESS', json }),57 failureAction: () => this.props.dispatch({ type: 'GET_ALL_TOUR_CUSTOMERS_RANKING_FAILURE' })58 })59 }60 checkBookingTypeCustomer(data){61 for(let i=0;i<data.length;i++){62 if(data[i].booking_method == "Individual"){63 this.setState({individualCustomers:data[i].participants})64 }else if(data[i].booking_method == "Agency"){65 this.setState({agencyCustomer:data[i].participants})66 }67 }68 }69 getYearlyTheMostPopularTour(data){70 let tourname = 'N/A'71 let amt_customer = 072 if(typeof data[0] !== 'undefined' && typeof data[0].tour_name){73 tourname = data[0].tour_name74 }75 if(typeof data[0] !== 'undefined' && typeof data[0].participants){76 amt_customer = data[0].participants77 }78 let result = tourname+ ': '+amt_customer+ ' customers'79 this.setState({mostYearlyPopularTour:result})80 }81 checkTourTypeCustomer(data){82 for(let i=0;i<data.length;i++){83 if(data[i].tour_type == "Public"){84 this.setState({publicCustomers:data[i].participants})85 }else if(data[i].tour_type == "Private"){86 this.setState({privateCustomers:data[i].participants})87 }88 }89 }90 componentWillMount(){91 this.getYearlyBookingTypeCustomer(this.state.selectedyear)92 this.getYearlyTotalCustomer(this.state.selectedyear)93 this.getYearlyTourTypeCustomer(this.state.selectedyear)94 this.getMostPopularTour(this.state.selectedyear)95 }96 componentWillReceiveProps(nextProps){97 if(this.props.selectedYear !== nextProps.selectedYear){98 if(nextProps.selectedYear){99 this.setState({selectedYear:nextProps.selectedYear})100 this.getMostPopularTour(nextProps.selectedYear)101 this.getYearlyTourTypeCustomer(nextProps.selectedYear)102 this.getYearlyBookingTypeCustomer(nextProps.selectedYear)103 this.getYearlyTotalCustomer(nextProps.selectedYear)104 }105 }106 if(this.props.totalYearlyCustomer !== nextProps.totalYearlyCustomer){107 if(nextProps.totalYearlyCustomer){108 if(typeof nextProps.totalYearlyCustomer[0] !=='undefined'109 && typeof nextProps.totalYearlyCustomer[0].participants ){110 let totalCustomers = nextProps.totalYearlyCustomer[0].participants111 this.setState({netCustomers: totalCustomers})112 }113 }114 }115 if(this.props.totalYearlyBookingTypeCustomer !== nextProps.totalYearlyBookingTypeCustomer){116 if(nextProps.totalYearlyBookingTypeCustomer){117 this.checkBookingTypeCustomer(nextProps.totalYearlyBookingTypeCustomer)118 }119 }120 if(this.props.totalYearlyTourTypeCustomer !== nextProps.totalYearlyTourTypeCustomer){121 if(nextProps.totalYearlyTourTypeCustomer){122 this.checkTourTypeCustomer(nextProps.totalYearlyTourTypeCustomer)123 }124 }125 if(this.state.totalCustomerTourRanking !== nextProps.totalCustomerTourRanking){126 if(nextProps.totalCustomerTourRanking){127 this.getYearlyTheMostPopularTour(nextProps.totalCustomerTourRanking)128 }129 }130 }131 render() {132 return (133 <div className="customer-box-above" style={{backgroundColor:'#9B2F10'}}>134 <Row gutter={8}>135 <Col xs={24} lg={4} >136 <div className="total-customer" >137 <h3>Total customers</h3>138 <p>{this.state.netCustomers}</p>139 </div>140 </Col>141 <Col xs={12} lg={5}>142 <div className="individual-customer" >143 <h4>Direct Customer</h4>144 <p>{this.state.individualCustomers}</p>145 </div>146 <div className="agency-customer">147 <h4>Agency</h4>148 <p>{this.state.agencyCustomer}</p>149 </div>150 </Col>151 <Col xs={12} lg={5}>152 <div className="public-tour" >153 <h4>Public Tour</h4>154 <p>{this.state.publicCustomers}</p>155 </div>156 <div className="private-tour">157 <h4>Private Tour</h4>158 <p>{this.state.privateCustomers}</p>159 </div>160 </Col>161 <Col xs={24} lg={10}>162 <div className="popular-tour" >163 <h3>Most Popular Tour</h3>164 <p>{this.state.mostYearlyPopularTour}</p>165 </div>166 </Col>167 </Row>168 </div>169 );170 }171}172function mapStateToProps(state){173 return{174 selectedYear: state.updateYearDashBoard.selectedYear,175 totalYearlyCustomer: state.getYearlyTotalCustomer.totalYearlyCustomer,176 totalYearlyBookingTypeCustomer: state.getYearlyBookingTypeCustomer.totalYearlyBookingTypeCustomer,177 totalYearlyTourTypeCustomer: state.getYearlyTourTypeCustomer.totalYearlyTourTypeCustomer,178 totalCustomerTourRanking: state.getTourCustomerRanking.totalCustomerTourRanking179 }180}...
RightArea.js
Source:RightArea.js
1/* eslint react/prop-types: 0 */2import { Mark } from 'prosemirror-model';3import React, { useContext, useState, useMemo, useCallback } from 'react';4import useDeepCompareEffect from 'use-deep-compare-effect';5import { each, uniqBy, sortBy } from 'lodash';6import { WaxContext } from 'wax-prosemirror-core';7import { DocumentHelpers } from 'wax-prosemirror-utilities';8import BoxList from './BoxList';9export default ({ area }) => {10 const {11 pmViews,12 pmViews: { main },13 app,14 activeView,15 } = useContext(WaxContext);16 const commentPlugin = app.PmPlugins.get('commentPlugin');17 const trakChangePlugin = app.PmPlugins.get('trackChangePlugin');18 const [marksNodes, setMarksNodes] = useState([]);19 const [position, setPosition] = useState();20 const [isFirstRun, setFirstRun] = useState(true);21 const setTops = useCallback(() => {22 const result = [];23 let markNodeEl = null;24 let annotationTop = 0;25 let boxHeight = 0;26 let top = 0;27 let WaxSurface = {};28 const allCommentsTop = [];29 let panelWrapper = {};30 let panelWrapperHeight = {};31 if (main) {32 WaxSurface = main.dom.getBoundingClientRect();33 }34 each(marksNodes[area], (markNode, pos) => {35 const id =36 markNode instanceof Mark ? markNode.attrs.id : markNode.node.attrs.id;37 const activeComment = commentPlugin.getState(activeView.state).comment;38 const activeTrackChange = trakChangePlugin.getState(activeView.state)39 .trackChange;40 let isActive = false;41 if (42 (activeComment && id === activeComment.attrs.id) ||43 (activeTrackChange && id === activeTrackChange.attrs.id)44 )45 isActive = true;46 // annotation top47 if (area === 'main') {48 markNodeEl = document.querySelector(`[data-id="${id}"]`);49 if (markNodeEl)50 annotationTop =51 markNodeEl.getBoundingClientRect().top - WaxSurface.top;52 } else {53 // Notes54 panelWrapper = document.getElementsByClassName('panelWrapper');55 panelWrapperHeight = panelWrapper[0].getBoundingClientRect().height;56 markNodeEl = document57 .querySelector('#notes-container')58 .querySelector(`[data-id="${id}"]`);59 if (markNodeEl) {60 const WaxContainerTop = document61 .querySelector('#wax-container')62 .getBoundingClientRect().top;63 annotationTop =64 markNodeEl.getBoundingClientRect().top -65 panelWrapperHeight -66 WaxContainerTop -67 50;68 }69 }70 let boxEl = null;71 // get height of this markNode box72 if (markNodeEl) {73 boxEl = document.querySelector(`div[data-box="${id}"]`);74 }75 if (boxEl) {76 boxHeight = parseInt(boxEl.offsetHeight, 10);77 // where the box should move to78 top = annotationTop;79 }80 // if the above comment box has already taken up the height, move down81 if (pos > 0) {82 const previousBox = marksNodes[area][pos - 1];83 const previousEndHeight = previousBox.endHeight;84 if (annotationTop < previousEndHeight) {85 top = previousEndHeight + 2;86 }87 }88 // store where the box ends to be aware of overlaps in the next box89 markNode.endHeight = top + boxHeight + 4;90 result[pos] = top;91 allCommentsTop.push({ [id]: result[pos] });92 // if active, move as many boxes above as needed to bring it to the annotation's height93 if (isActive) {94 markNode.endHeight = annotationTop + boxHeight + 3;95 result[pos] = annotationTop;96 allCommentsTop[pos][id] = result[pos];97 let b = true;98 let i = pos;99 // first one active, none above100 if (i === 0) b = false;101 while (b) {102 const boxAbove = marksNodes[area][i - 1];103 const boxAboveEnds = boxAbove.endHeight;104 const currentTop = result[i];105 const doesOverlap = boxAboveEnds > currentTop;106 if (doesOverlap) {107 const overlap = boxAboveEnds - currentTop;108 result[i - 1] -= overlap;109 const previousMarkNode =110 marksNodes[area][i - 1] instanceof Mark111 ? marksNodes[area][i - 1].attrs.id112 : marksNodes[area][i - 1].node.attrs.id;113 allCommentsTop[i - 1][previousMarkNode] = result[i - 1];114 }115 if (!doesOverlap) b = false;116 if (i <= 1) b = false;117 i -= 1;118 }119 }120 });121 return allCommentsTop;122 });123 const recalculateTops = () => {124 setTimeout(() => {125 setPosition(setTops());126 });127 };128 useDeepCompareEffect(() => {129 setMarksNodes(updateMarks(pmViews));130 if (isFirstRun) {131 setTimeout(() => {132 setPosition(setTops());133 setFirstRun(false);134 }, 400);135 } else {136 setPosition(setTops());137 }138 }, [updateMarks(pmViews), setTops()]);139 const CommentTrackComponent = useMemo(140 () => (141 <BoxList142 area={area}143 commentsTracks={marksNodes[area] || []}144 position={position}145 recalculateTops={recalculateTops}146 view={main}147 />148 ),149 [marksNodes[area] || [], position],150 );151 return <>{CommentTrackComponent}</>;152};153const updateMarks = views => {154 if (views.main) {155 const allInlineNodes = [];156 Object.keys(views).forEach(eachView => {157 allInlineNodes.push(158 ...DocumentHelpers.findInlineNodes(views[eachView].state.doc),159 );160 });161 const allBlockNodes = DocumentHelpers.findBlockNodes(views.main.state.doc);162 const finalMarks = [];163 const finalNodes = [];164 allInlineNodes.map(node => {165 if (node.node.marks.length > 0) {166 node.node.marks.filter(mark => {167 if (168 mark.type.name === 'comment' ||169 mark.type.name === 'insertion' ||170 mark.type.name === 'deletion' ||171 mark.type.name === 'format_change'172 ) {173 mark.pos = node.pos;174 finalMarks.push(mark);175 }176 });177 }178 });179 allBlockNodes.map(node => {180 if (node.node.attrs.track && node.node.attrs.track.length > 0) {181 finalNodes.push(node);182 }183 });184 const nodesAndMarks = [...uniqBy(finalMarks, 'attrs.id'), ...finalNodes];185 const groupedMarkNodes = {};186 nodesAndMarks.forEach(markNode => {187 const markNodeAttrs = markNode.attrs188 ? markNode.attrs189 : markNode.node.attrs;190 if (!groupedMarkNodes[markNodeAttrs.group]) {191 groupedMarkNodes[markNodeAttrs.group] = [markNode];192 } else {193 groupedMarkNodes[markNodeAttrs.group].push(markNode);194 }195 });196 return {197 main: sortBy(groupedMarkNodes.main, ['pos']),198 notes: groupedMarkNodes.notes,199 };200 }201 return [];...
use-position-reorder.js
Source:use-position-reorder.js
1import { useState, useRef } from "react";2import { clamp } from "popmotion";3import move from "array-move";4export const usePositionReorder = (initialState) => {5 const [order, setOrder] = useState(initialState);6 // We need to collect an array of width and position data for all of this component's7 // `Item` children, so we can later us that in calculations to decide when a dragging8 // `Item` should swap places with its siblings.9 const positions = useRef([]).current;10 const updatePosition = (i, offset) => (positions[i] = offset);11 // Find the ideal index for a dragging item based on its position in the array, and its12 // current drag offset. If it's different to its current index, we swap this item with that13 // sibling.14 const updateOrder = (i, viewportBox) => {15 const targetIndex = findIndex(i, viewportBox, positions);16 if (targetIndex !== i) setOrder(move(order, i, targetIndex));17 };18 return [order, updatePosition, updateOrder];19};20// This margin needs to match space between cells exactly.21// TODO: Optimize for safer handling22const margin = 20;23export const findIndex = (i, currentBox, positions) => {24 let target = i;25 const { left, width, top, height } = positions[i];26 const bottom = top + height;27 currentBox.x.center = (currentBox.x.min + currentBox.x.max) / 2;28 currentBox.y.center = (currentBox.y.min + currentBox.y.max) / 2;29 // If current within same row30 if (31 currentBox.y.center > top - margin &&32 currentBox.y.center < bottom + margin33 ) {34 // Moving right35 if (currentBox.x.center > left + width / 2) {36 const nextItem = positions[i + 1];37 if (nextItem === undefined || nextItem.top !== top) return i; // If end of array or not in same row38 if (currentBox.x.center > nextItem.left + nextItem.width / 2) {39 target = i + 1;40 }41 // Moving left42 } else if (currentBox.x.center < left + width / 2) {43 const prevItem = positions[i - 1];44 if (prevItem === undefined || prevItem.top !== top) return i; // If beginning of array or not in same row45 if (currentBox.x.center < prevItem.left + prevItem.width / 2) {46 target = i - 1;47 }48 }49 return target;50 }51 // If current going to row above52 if (currentBox.y.center < top - margin) {53 // Add index to positions array54 const indexedPositions = positions.map((el, i) => {55 return { ...el, i };56 });57 // Get box directly above58 const boxesAbove = indexedPositions.filter(59 (el) => el.left === left && el.top < top60 );61 const boxAbove = boxesAbove[boxesAbove.length - 1];62 if (boxAbove === undefined) return target;63 // Return box to right if slightly right of center, else return box above64 if (boxAbove.left + boxAbove.width / 2 < currentBox.x.center) {65 return boxAbove.i + 1;66 } else if (boxAbove.left + boxAbove.width / 2 >= currentBox.x.center) {67 return boxAbove.i;68 }69 return target;70 }71 // If current going to row below72 if (currentBox.y.center > bottom + margin) {73 // Add index to positions array74 const indexedPositions = positions.map((el, i) => {75 return { ...el, i };76 });77 // Get box directly above78 const boxesBelow = indexedPositions.filter(79 (el) => el.left === left && el.top > top80 );81 const boxBelow = boxesBelow[0];82 if (boxBelow === undefined) return target;83 // Return box to left if slightly left of center, else return box below84 if (boxBelow.left + boxBelow.width / 2 <= currentBox.x.center) {85 return boxBelow.i;86 } else if (boxBelow.left + boxBelow.width / 2 > currentBox.x.center) {87 return boxBelow.i - 1;88 }89 return target;90 }91 return clamp(0, positions.length, target);...
spiral.js
Source:spiral.js
1import React, { useEffect, useRef, useState, useCallback } from 'react';2import styled from 'styled-components';3import { LoremIpsum } from "lorem-ipsum";4const Container = styled.div`5 position: relative;6 width: 100%;7 flex-grow: 1;8 flex-shrink: 1;9 overflow: hidden;10`11const BlockContainer = styled.div`12 position: absolute;13 width: 0;14 height: 0;15`16const BlockView = styled.div`17 font-size: 10pt;18 width: 200px;19 padding: 10px 0;20 transform: translate(-50%, -50%);21`22const Hint = styled.div`23 color: blue;24 position: absolute;25 left: 20px;26 bottom: 20px;27`28const lorem = new LoremIpsum({29 sentencesPerParagraph: { max: 6, min: 4 },30 wordsPerSentence: { max: 8, min: 4 }31});32const ipsum = [...new Array(100)].map(() => lorem.generateParagraphs(1));33const Block = ({ content, transform, reportSize }) => {34 const domRef = useRef(null);35 useEffect(() => {36 if (domRef.current) {37 reportSize(domRef.current.getBoundingClientRect());38 }39 }, []);40 return <BlockContainer style={{ transform }}>41 <BlockView ref={domRef}>{content}</BlockView>42 </BlockContainer>43}44const Spiral = () => {45 const [sizes, setSizes] = useState(new Array(ipsum.length));46 const [offset, setOffset] = useState(0);47 const [shape, setShape] = useState(null);48 const containerRef = useRef(null);49 const calculateSize = useCallback(() => {50 const { width, height } = containerRef.current.getBoundingClientRect()51 setShape({52 centreX: width / 2,53 centreY: height / 2,54 radius: (Math.min(width, height) / 2) - 10055 });56 });57 useEffect(() => {58 document.addEventListener('wheel', e => {59 setOffset(v => v - e.deltaY);60 });61 window.addEventListener('resize', calculateSize);62 calculateSize();63 }, []);64 function trackSizes(i, size) {65 sizes[i] = size;66 setSizes([...sizes]);67 }68 function calculateTop(i) {69 // Super inefficient - should precalculate and store70 if (i == 0) return offset;71 const box = sizes[i];72 const boxAbove = sizes[i - 1];73 if (!box || !boxAbove) return 0;74 return (box.height / 2) + (boxAbove.height / 2) + calculateTop(i - 1);75 }76 function buildTransform(i) {77 const { centreX, centreY, radius } = shape;78 const up = calculateTop(i);79 let left, top;80 let angle = 0;81 let scale = 1;82 if (up > 0) {83 // sliding84 left = centreX + radius;85 top = centreY + up;86 } else {87 // turning88 // https://mathworld.wolfram.com/LogarithmicSpiral.html89 angle = up / - 300;90 const r = Math.exp(up / (radius * 8)) * radius;91 scale = Math.exp(up / (radius * 8));92 left = centreX + (Math.cos(angle) * r);93 top = centreY - (Math.sin(angle) * r);94 }95 return `translate(${left}px, ${top}px) rotate(-${angle}rad) scale(${scale})`;96 }97 return <Container ref={containerRef}>98 <Hint>(Scroll the text up)</Hint>99 {shape && ipsum.map((p, i) => <Block100 key={i}101 transform={buildTransform(i)}102 content={p}103 reportSize={size => trackSizes(i, size)}104 />)}105 </Container>;106};...
Using AI Code Generation
1const { boxAbove } = require('playwright/lib/internal/frames');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.click('#docs');8 const box = await boxAbove(page, '#docs');9 console.log(box);10 await browser.close();11})();12{ x: 0, y: 0, width: 1280, height: 0 }
Using AI Code Generation
1const boxAbove = require('playwright/lib/internal/frames').boxAbove;2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 const logo = await page.$('#hplogo');8 const logoBox = await logo.boundingBox();9 const aboveBox = await boxAbove(page, logoBox);10 await page.mouse.click(aboveBox.x + aboveBox.width / 2, aboveBox.y + aboveBox.height / 2);11 await browser.close();12})();
Using AI Code Generation
1const { boxAbove } = require('playwright/lib/internal/boxModel');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch({ headless: false });5 const context = await browser.newContext();6 const page = await context.newPage();7 const elementHandle = await page.$('text=Documentation');8 const box = await boxAbove(elementHandle);9 console.log(box);10 await browser.close();11})();12const { boxModel } = require('playwright/lib/internal/boxModel');13const { chromium } = require('playwright');14(async () => {15 const browser = await chromium.launch({ headless: false });16 const context = await browser.newContext();17 const page = await context.newPage();18 await page.goto('
Using AI Code Generation
1const { boxAbove } = require('playwright/lib/internal/boxModel');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 const handle = await page.$('input#searchInput');8 const box = await handle.boundingBox();9 const aboveBox = await boxAbove(box, 10);10 console.log(aboveBox);11 await browser.close();12})();
Using AI Code Generation
1await page.boxAbove(selector, boxAboveOptions);2await page.boxBelow(selector, boxBelowOptions);3await page.boxLeft(selector, boxLeftOptions);4await page.boxRight(selector, boxRightOptions);5await page.boxAround(selector, boxAroundOptions);6await page.boxInside(selector, boxInsideOptions);7await page.boxOutside(selector, boxOutsideOptions);8await page.boxCenter(selector, boxCenterOptions);9await page.boxEnd(selector, boxEndOptions);10await page.boxStart(selector, boxStartOptions);11await page.boxTop(selector, boxTopOptions);12await page.boxBottom(selector, boxBottomOptions);13await page.boxLeftOf(selector, boxLeftOfOptions);14await page.boxRightOf(selector, boxRightOfOptions);15await page.boxAboveOf(selector, boxAboveOfOptions);16await page.boxBelowOf(selector, boxBelowOfOptions);17await page.boxInsideOf(selector, boxInsideOfOptions);18await page.boxOutsideOf(selector, boxOutsideOfOptions);19await page.boxCenterOf(selector, boxCenterOfOptions);20await page.boxEndOf(selector, boxEndOfOptions);21await page.boxStartOf(selector, boxStartOfOptions);
Using AI Code Generation
1const boxAbove = require('playwright/lib/internal/boxAbove.js');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.click('text=Get started');8 await page.click('text=Docs');9 await page.click('text=API');10 const element = await page.$('text=boxAbove');11 const box = await boxAbove(element);12 console.log(box);13 await browser.close();14})();15{ x: 0, y: 0, width: 0, height: 0 }16const boxAbove = require('playwright/lib/internal/boxAbove.js');17const { chromium } = require('playwright');18(async () => {19 const browser = await chromium.launch();20 const context = await browser.newContext();21 const page = await context.newPage();22 await page.click('text=Get started');23 await page.click('text=Docs');24 await page.click('text=API');25 const element = await page.$('text=boxAbove');26 const box = await page.evaluate(element => boxAbove(element), element);27 console.log(box);28 await browser.close();29})();30{ x: 0, y: 0, width: 0, height: 0 }
Using AI Code Generation
1const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');2const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');3const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');4const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');5const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');6const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');7const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');8const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');9const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');10const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');11const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');12const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');13const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');14const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');15const { boxAbove } = require('playwright-core/lib/server/trace/recorder/dom.js');16const {
Using AI Code Generation
1const { boxAbove } = require('@playwright/test');2const box = boxAbove({x: 100, y: 100}, 10, 10);3console.log(box);4const { boxBelow } = require('@playwright/test');5const box = boxBelow({x: 100, y: 100}, 10, 10);6console.log(box);7const { boxLeft } = require('@playwright/test');8const box = boxLeft({x: 100, y: 100}, 10, 10);9console.log(box);10const { boxRight } = require('@playwright/test');11const box = boxRight({x: 100, y: 100}, 10, 10);12console.log(box);13const { boxAround } = require('@playwright/test');14const box = boxAround({x: 100, y: 100}, 10, 10);15console.log(box);16const { boxCenter } = require('@playwright/test');17const box = boxCenter({x: 100, y: 100}, 10, 10);18console.log(box);19const { boxTransform } = require('@playwright/test');20const box = boxTransform({x: 100, y: 100}, 10, 10);21console.log(box);22const { boxScale } = require('@playwright/test');23const box = boxScale({x: 100, y: 100}, 10, 10);24console.log(box);25const { boxShift } = require('@playwright/test');26const box = boxShift({x: 100, y: 100}, 10, 10);27console.log(box);28const { boxFrom } = require('@playwright/test');29const box = boxFrom({x: 100, y: 100}, 10, 10);30console.log(box);
Using AI Code Generation
1import { boxAbove } from '@playwright/test';2const element = await boxAbove('text=Hello world');3await element.click();4await element.dblclick();5await element.hover();6await element.selectText();7await element.fill('Hello world');8await element.press('Enter');9await element.check();10await element.uncheck();11await element.selectOption('value=2');12await element.setInputFiles('/tmp/myfile.pdf');13await element.type('Hello world');14await element.selectText();15await element.type('Hello world');16await element.setInputFiles('/tmp/myfile.pdf');17await element.selectOption('value=2');18await element.check();19await element.uncheck();20await element.click();21await element.dblclick();22await element.hover();23await element.selectText();24await element.fill('Hello world');25await element.press('Enter');26await element.type('Hello world');27await element.setInputFiles('/tmp/myfile.pdf');28await element.selectOption('value=2');29await element.check();30await element.uncheck();31await element.click();32await element.dblclick();33await element.hover();34await element.selectText();35await element.fill('Hello world');36await element.press('Enter');37await element.type('Hello world');38await element.setInputFiles('/tmp/myfile.pdf');39await element.selectOption('value=2');40await element.check();41await element.uncheck();42await element.click();43await element.dblclick();44await element.hover();45await element.selectText();46await element.fill('Hello world');47await element.press('Enter');48await element.type('Hello world');49await element.setInputFiles('/tmp/myfile.pdf');50await element.selectOption('value=2');51await element.check();52await element.uncheck();53await element.click();54await element.dblclick();55await element.hover();56await element.selectText();57await element.fill('Hello world');58await element.press('Enter');59await element.type('Hello world');60await element.setInputFiles('/tmp/myfile.pdf');61await element.selectOption('value=2');62await element.check();63await element.uncheck();64await element.click();65await element.dblclick();66await element.hover();67await element.selectText();68await element.fill('Hello world');69await element.press('Enter');70await element.type('Hello world');71await element.setInputFiles('/tmp/myfile.pdf');72await element.selectOption('value=2');73await element.check();74await element.uncheck();75await element.click();76await element.dblclick();77await element.hover();78await element.selectText();79await element.fill('Hello world');80await element.press('Enter');
Using AI Code Generation
1async boxAbove(): Promise<Rect> {2 const { x, y, width, height } = await this._mainFrame._utilityWorld().evaluate((injected, node) => {3 const { x, y, width, height } = node.getBoundingClientRect();4 const element = document.elementFromPoint(x + width / 2, y + height / 2);5 const box = element && element.getBoundingClientRect();6 return box ? { x: box.x, y: box.y, width: box.width, height: box.height } : null;7 }, this);8 return { x, y, width, height };9}10async boxBelow(): Promise<Rect> {11 const { x, y, width, height } = await this._mainFrame._utilityWorld().evaluate((injected, node) => {12 const { x, y, width, height } = node.getBoundingClientRect();13 const element = document.elementFromPoint(x + width / 2, y - 1);14 const box = element && element.getBoundingClientRect();15 return box ? { x: box.x, y: box.y, width: box.width, height: box.height } : null;16 }, this);17 return { x, y, width, height };18}
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!