function DatasetPopulatePlugin()

in analysis/webservice/apidocs/dataset-populate.js [17:121]


function DatasetPopulatePlugin(system) {
  const DS_PATH = '/cdmslist'
  const ACTION_UPDATE_DATASETS = 'UPDATE_DATASETS'
  const ACTION_UPDATE_ERROR = 'UPDATE_ERROR'

  async function loadDatasets() {
    try {
      let response = await fetch(DS_PATH)
      if (!response.ok) {
        system.dsPopulateActions.updateError(true)
        console.error(`[DatasetPopulate] Unable to load dataset list from: ${DS_PATH}; Status: ${response.status}`)
      }

      let results = await response.json()
      let satellite = results.data.satellite
      let insitu = results.data.insitu

      let total = 0
      let datasets = {
        satellite: [],
        insitu: []
      }

      for (const ds of satellite) {
        datasets['satellite'].push(ds.shortName)
        total++
      }

      for (const ds of insitu) {
        datasets['insitu'].push(ds.name)
        total++
      }

      datasets['satellite'].sort()
      datasets['insitu'].sort()

      system.dsPopulateActions.updateDatasets(datasets)
      console.debug(`[DatasetPopulate] Lists populated; count: ${total}`)
    } catch (err) {
      system.dsPopulateActions.updateError(true)
      console.error(`[DatasetPopulate] Error retreiving dataset list: ${err.message}`);
    }
  }

  return {
    statePlugins: {
      dsPopulate: {
        actions: {
          updateDatasets: (list) => {
            return {
              type: ACTION_UPDATE_DATASETS,
              payload: list
            }
          },
          updateError: (error) => {
            return {
              type: ACTION_UPDATE_ERROR,
              payload: error
            }
          }
        },
        reducers: {
          [ACTION_UPDATE_DATASETS]: (state, action) => state.set('datasets', action.payload),
          [ACTION_UPDATE_ERROR]: (state, action) => state.set('error', action.payload)
        },
        selectors: {
          datasets: (state) => state.get('datasets'),
          hasError: (state) => state.get('error')
        }
      }
    },
    wrapComponents: {
      JsonSchemaForm: (Original, system) => (props) => {
        let dsPopulate = props.schema.get('x-dspopulate') ? props.schema.get('x-dspopulate') : false

        if (!dsPopulate || system.dsPopulateSelectors.hasError())
          return system.React.createElement(Original, props)

        let datasetMap = system.dsPopulateSelectors.datasets()
        if (!datasetMap)
          return system.React.createElement(Original, props) 

        let datasets = []
        for (const datasetName of dsPopulate.toArray()) {
          datasets.push(...datasetMap[datasetName])
        }

        datasets.sort()

        props.schema = props.schema.set('enum', datasets)

        if (!(datasets.includes(props.value))) {
          props.value = ""
          props.onChange("")
        }

        return system.React.createElement(Original, props)
      }
    },
    afterLoad: (system) => {
      system.dsPopulateActions.updateError(false)
      loadDatasets()
    }
  }
}