npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@plantquest/assetmap-react

v8.0.6

Published

PlantQuest Asset Map

Downloads

27

Readme

@plantquest/assetmap-react

npm version

Logo_Plantquest_horizontal

PlantQuest is a supplier of asset mapping solutions and technology to the Life Science sector. The industry focused PlantQuest Asset Map allows users to intergrate the PlantQuest mapping technology into their technology stack. Upon doing so, users can manipulate maps and display asset information within the context of where it is generated helping workers to make smarter, quicker and more insightful decisions. In turn, increasing their operational effeciency.

Install

npm install --save @plantquest/assetmap-react

Usage

Debug Log

Set window.PLANTQUEST_ASSETMAP_LOG to true to enable logging.

Set window.PLANTQUEST_ASSETMAP_DEBUG.show_coords to true to display a small box where asset info is shown, and xco-yco of cursor when clicked on the map.

Options

  • width: Pixel width of map ( default: '600px' )
  • height: Pixel height of map ( default: '400px' )
  • mapImg: Map dimensions - very important for the polygons to fit the map
  • mapBounds: Pixel bounds of map
  • mapStart: Pixel start position of map ( e.g [y, x] ( default: [2925, 3900] ) )
  • mapStartZoom: Starting zoom level
  • mapRoomFocusZoom: Zoom level for room focus
  • mapMaxZoom: Maximum zoom
  • mapMinZoom: Minimum zoom
  • states: State definitions ( optional )
    • { [stateName]: { color: COLOR, name: STRING, marker: 'standard'|'alert'}, ...}
  • start.map: Starting map ( default: 0 )
  • start.level: Starting level ( default: 0 )
  • room.color: Room highlight color ( default: '#33f' )
  • mode: MAP MODE can either can 'live' or 'demo' - check out the code example below for details
  • apikey: Your project api key
  • tilesEndPoint: Endpoint to your maps ( note that use tilesets so we don't specify maps explicitly )
  • plant_id: Your plant ID
  • project_id: Your project ID
  • stage: Your stage

ReactJS: Quick Example


import { PlantQuestAssetMap } from '@plantquest/assetmap-react'

// enable logging - useful for debugging purposes
window.PLANTQUEST_ASSETMAP_LOG = true
// enable small info box for the current asset info shown, or for the position of your mouse on the map - such as xco, yco, etc.
window.PLANTQUEST_ASSETMAP_DEBUG.show_coords = true

const options = {
  data: 'https://demo.plantquest.app/sample-data.js', // not needed if using: `mode: 'live'`

  width: '100%',
  height: '100%',
  // this will enable dynamic resizing of the map widget
  // it will adjust to your node ( 100% will take 100% of your parent node, etc. )
  // but then the parent node of the component has to have its own width and height
  // like in the example below
  
  mapImg: [6140, 4602], // important: set the map [width, height]
  
  states: {
    up: { color: '#696', name: 'Up', marker: 'standard' },
    down: { color: '#666', name: 'Down', marker: 'standard' },
    missing: { color: '#f3f', name: 'Missing', marker: 'alert' },
    alarm: { color: '#f33', name: 'Alarm', marker: 'alert' },
    // "color" - color of the polygon of that state
    // "name" - name of the state
    // "marker" - type of marker ( 'standard' | 'alert' ) 
  },
  
  endpoint: ENDPOINT, // your endpoint: 'https://*'
  apikey: '<STRING>', // your api key
  tilesEndPoint: '<STRING>', // map tiles endpoint

  // mode can either can 'live' or 'demo'
  // if you want data to be loaded from the static demo js file (self.data here) - use 'demo' mode
  // if you want 'live' data from the endpoint - use 'live' mode
  mode: 'live',

  plant_id: '<STRING>', // your plant_id
  project_id: '<STRING>', // your project_id
  stage: '<STRING>', // your stage
  
  // room highlight color
  room: {
    color: 'red'
  },
  
}

// container when showing an asset
/*
// css example
div.plantquest-assetmap-asset-state-up {
    color: white;
    border: 2px solid #696;
    border-radius: 4px;
    background-color: #696;
    opacity: 0.7;
}
*/
class AssetInfo extends React.Component {
  constructor(props) {
    super(props)
    this.state = {}
  }
  
  render() {
    return <div>
         <h3>{this.props.asset.tag}</h3>
         <p><i>Building:</i> {this.props.asset.building}</p>
       </div>
  }
}

class App extends React.Component {
  
  constructor(props) {
    super(props)
    
    // to keep track of map's state
    // using listeners so we can reuse these in our app
    this.state = {
      map: -1,
      level: '',
      rooms: [],
      showRoom: null,
      showAsset: null,
    }
    

  }
  
  componentDidMount() {
    console.log("Mounting..")

    const PQAM = window.PlantQuestAssetMap
    
    // set up message listener
    PQAM.listen((msg) => {
      // put 'ready' listener to use
      if('ready' === msg.state) {
        // set 'rooms' for reuse
        this.setState({
          rooms: PQAM.data.rooms
        })
      }
      // when a user selects a room
      // "USER SELECT ROOM" example
      else if ('room' === msg.select) {
        // pick a room
        let item = PQAM.data.roomMap[msg.room]
        this.setState({ showRoom: item })
        this.selectRoom(item)
      }
      // "USER SELECT MAP" example
      else if('map' === msg.show) {
        this.setState({ level: msg.level })
        this.setState({ map: msg.map })
      }
      // Listen for "USER SHOW ASSET"
      else if('asset' === msg.show) {
        // use msg.asset
         this.showAsset(asset)
      }
      
    })
  
  }
  
  selectRoom(item) {
    const PQAM = window.PlantQuestAssetMap
    
    // "SEND A MESSAGE" example
    // "SHOW ROOM"
    PQAM.send({
      srv: 'plantquest',
      part: 'assetmap',
      show: 'room',
      room: item.room,
      focus: true,
    })
  
  }
  
  showAsset(asset) {
    const PQAM = window.PlantQuestAssetMap
    
    // "SHOW ASSET" example
    // when showing an asset
    // it's important to first show the room of that asset and then the asset
    PQAM.send({
      srv: 'plantquest',
      part: 'assetmap',
      show: 'room',
      room: asset.room,
      focus: true,
    })
    PQAM.send({
      srv: 'plantquest',
      part: 'assetmap',
      show: 'asset',
      asset: asset.id,
    })
    
    this.setState({ showRoom: asset.room })
    this.setState({ showAsset: asset })
    
  }
  

  render() {
    return (
      <div className="App">
        <div style={{width: '150vh', height: '100vh' }}>
          <PlantQuestAssetMap
            options={options}
            assetinfo={AssetInfo}
          />
        </div>
      </div>
    )
  }
  
}

Messages

// for example - take assets
const PQAM = window.PlantQuestAssetMap
// our listener
PQAM.listen((msg) => {
  if('asset' === msg.list) {
    // use msg.assets
    // where msg.assets is a list of all assets on the map
  }
})

PQAM.send({
  'srv': 'plantquest',
  'part': 'assetmap',
  'list': 'asset'
})

// the syntax is flexiable enough for us to just write:

PQAM.send('srv:plantquest,part:assetmap,list:asset') 
// for example
const PQAM = window.PlantQuestAssetMap
    
PQAM.send({
  srv: 'plantquest',
  part: 'assetmap',
  save: 'asset',
  asset: {
    id: 'e565b059-8633-460a-8171-903d38720c26',
    tag: 'asset001',
    xco: 10,
    yco: 10,
  },
})
    
PQAM.listen((msg) => {
  if('asset' === msg.save) {
    // use msg.asset
    // where msg.asset is the newly saved asset
  }
})
   

<ARRAY>: IDs (UUIDv4 format) of the assets to be shown on the map using clustering - note: if this is set to null, all assets will be rendered and displayed

// for example
const PQAM = window.PlantQuestAssetMap
PQAM.listen((msg) => {
  if('room-asset' === msg.relate) {
    // use msg.relation
  }
})

Licenses

MIT © Plantquest Ltd BSD 2-Clause © Vladimir Agafonkin, Cloudmade MIT © Justin Manley