Skip to content
Snippets Groups Projects
GridController.js 42.3 KiB
Newer Older
  • Learn to ignore specific revisions
  •       if (newMultiselectedRows[row.id]) {
            delete newMultiselectedRows[row.id]
          } else {
            newMultiselectedRows[row.id] = true
          }
    
          await this.multiselectRows(Object.keys(newMultiselectedRows))
        }
      }
    
    
        const multiselectedRowIds = Object.keys(multiselectedRows)
    
        let newMultiselectedRowIds = null
        if (_.difference(rowIds, multiselectedRowIds).length === 0) {
          newMultiselectedRowIds = _.difference(multiselectedRowIds, rowIds)
        } else {
          newMultiselectedRowIds = _.union(multiselectedRowIds, rowIds)
        }
        this.multiselectRows(newMultiselectedRowIds)
      }
    
    
      async handleExecuteAction(action) {
        if (action && action.execute) {
          const { multiselectedRows } = this.context.getState()
          action.execute({ multiselectedRows })
        }
      }
    
    
        if (!exportable) {
          return
        } else if (exportable.fileFormat === GridExportOptions.TSV_FILE_FORMAT) {
          await this.handleExportTSV(exportable)
        } else if (exportable.fileFormat === GridExportOptions.XLS_FILE_FORMAT) {
          await this.handleExportXLS(exportable)
    
        const _this = this
        const state = this.context.getState()
        const props = this.context.getProps()
    
    
        function _stringToUtf16ByteArray(str) {
          var bytes = []
          bytes.push(255, 254)
          for (var i = 0; i < str.length; ++i) {
            var charCode = str.charCodeAt(i)
            bytes.push(charCode & 0xff) //low byte
            bytes.push((charCode & 0xff00) >>> 8) //high byte (might be 0)
          }
          return bytes
        }
    
    
        function _getFileName(prefix) {
          const now = new Date()
          const year = String(now.getFullYear()).padStart(4, '0')
          const month = String(now.getMonth() + 1).padStart(2, '0')
          const day = String(now.getDate()).padStart(2, '0')
          const hours = String(now.getHours()).padStart(2, '0')
          const minutes = String(now.getMinutes()).padStart(2, '0')
          const seconds = String(now.getSeconds()).padStart(2, '0')
          const millis = String(now.getMilliseconds()).padStart(3, '0')
    
          return (
            prefix +
            '.' +
            year +
            '-' +
            month +
            '-' +
            day +
            '-' +
            hours +
            '-' +
            minutes +
            '-' +
            seconds +
            '-' +
            millis +
            '.tsv'
          )
        }
    
    
        async function _getExportedRows() {
          const { exportOptions } = state
    
          var exportedRows = []
    
          if (exportOptions.rows === GridExportOptions.ALL_PAGES) {
            if (state.local) {
              exportedRows = state.sortedRows
            } else if (props.loadRows) {
              const loadedResult = await props.loadRows({
                filters: state.filters,
                globalFilter: state.globalFilter,
                page: 0,
                pageSize: 1000000,
                sortings: state.sortings
              })
              exportedRows = loadedResult.rows
            }
          } else if (exportOptions.rows === GridExportOptions.CURRENT_PAGE) {
            exportedRows = state.rows
          } else if (exportOptions.rows === GridExportOptions.SELECTED_ROWS) {
            exportedRows = Object.values(state.multiselectedRows).map(
              selectedRow => selectedRow.data
            )
          } else {
            throw Error('Unsupported rows option: ' + exportOptions.rows)
          }
    
          return exportedRows
        }
    
        async function _getExportedColumns(exportedRows) {
          const { exportOptions } = state
    
          var exportedColumns = []
    
          if (exportOptions.columns === GridExportOptions.ALL_COLUMNS) {
            exportedColumns = _this.getAllColumns()
          } else if (exportOptions.columns === GridExportOptions.VISIBLE_COLUMNS) {
    
            const { newAllColumns, newColumnsVisibility, newColumnsSorting } =
              await _this._loadColumns(
                exportedRows,
                state.columnsVisibility,
                state.columnsSorting
              )
    
            _this._sortColumns(newAllColumns, newColumnsSorting)
    
            exportedColumns = newAllColumns.filter(
              column => newColumnsVisibility[column.name]
            )
    
          } else {
            throw Error('Unsupported columns option: ' + exportOptions.columns)
          }
    
          return exportedColumns.filter(column => column.exportable)
        }
    
        function _exportTSV(rows, columns) {
          const { exportOptions } = state
    
          arrayOfRowArrays.push(headers)
    
          rows.forEach(row => {
            var rowAsArray = []
            columns.forEach(column => {
              var rowValue = column.getValue({
                row,
                column,
                operation: 'export',
                exportOptions
              })
              if (!rowValue) {
                rowValue = ''
              } else {
                var specialCharsRemover = document.createElement('textarea')
                specialCharsRemover.innerHTML = rowValue
                rowValue = specialCharsRemover.value //Removes special HTML Chars
                rowValue = String(rowValue).replace(/\r?\n|\r|\t/g, ' ') //Remove carriage returns and tabs
    
                if (exportOptions.values === GridExportOptions.RICH_TEXT) {
                  // do nothing with the value
                } else if (exportOptions.values === GridExportOptions.PLAIN_TEXT) {
                  rowValue = String(rowValue).replace(/<(?:.|\n)*?>/gm, '')
                } else {
                  throw Error('Unsupported values option: ' + exportOptions.values)
                }
              }
              rowAsArray.push(rowValue)
            })
            arrayOfRowArrays.push(rowAsArray)
          })
    
    
            {
              header: false,
              delimiter: '\t',
              quoted: false
            },
            arrayOfRowArrays,
            function (err, tsv) {
              var utf16bytes = _stringToUtf16ByteArray(tsv)
              var utf16bytesArray = new Uint8Array(utf16bytes.length)
              utf16bytesArray.set(utf16bytes, 0)
              var blob = new Blob([utf16bytesArray], {
                type: 'text/tsv;charset=UTF-16LE;'
              })
    
              FileSaver.saveAs(blob, _getFileName(exportable.filePrefix))
    
    
          const exportedRows = await _getExportedRows()
          const exportedColumns = await _getExportedColumns(exportedRows)
    
          _exportTSV(exportedRows, exportedColumns)
    
    
          this.context.setState({
            exportState: null
          })
        } catch (e) {
          this.context.setState({
            exportState: {
    
        const state = this.context.getState()
        const props = this.context.getProps()
    
    
            'Missing exportXLS callback function for grid with id: ' + props.id
    
        async function _getExportedRows() {
          const { exportOptions } = state
    
          if (exportOptions.rows === GridExportOptions.ALL_PAGES) {
    
            if (state.local) {
              exportedRows = state.sortedRows
            } else if (props.loadRows) {
              const columns = {}
    
              state.allColumns.forEach(column => {
                columns[column.name] = column
              })
    
              const loadedResult = await props.loadRows({
                columns: columns,
                filterMode: state.filterMode,
                filters: state.filters,
                globalFilter: state.globalFilter,
                page: 0,
                pageSize: 1000000,
                sortings: state.sortings
              })
              exportedRows = loadedResult.rows
            }
    
          } else if (exportOptions.rows === GridExportOptions.CURRENT_PAGE) {
    
          } else if (exportOptions.rows === GridExportOptions.SELECTED_ROWS) {
    
            exportedRows = Object.values(state.multiselectedRows).map(
              selectedRow => selectedRow.data
            )
          } else {
    
            throw Error('Unsupported rows option: ' + exportOptions.columns)
    
          if (exportedRows.some(row => _.isEmpty(row.exportableId))) {
            throw Error(
              "Some of the rows to be exported do not have 'exportableId' set."
            )
          }
    
        async function _getExportedFields(exportedRows) {
    
          if (exportOptions.columns === GridExportOptions.ALL_COLUMNS) {
    
          } else if (exportOptions.columns === GridExportOptions.VISIBLE_COLUMNS) {
    
    
            // find visible exportable columns for the exported rows
    
            const { newAllColumns, newColumnsVisibility, newColumnsSorting } =
    
            _this._sortColumns(newAllColumns, newColumnsSorting)
    
              if (column.exportableField && newColumnsVisibility[column.name]) {
                exportableFields.push(column.exportableField)
    
            // build exported fields map: { kind: { type: [{ type: "PROPERTY/ATTRIBUTE", id: "propertyCode/attributeCode"}, ...], ... }, ... }
    
            exportedRows.forEach(exportedRow => {
              const { exportable_kind, type_perm_id } = exportedRow.exportableId
    
                let exportedFieldsForKind = exportedFieldsMap[exportable_kind]
    
                if (!exportedFieldsForKind) {
                  exportedFieldsMap[exportable_kind] = exportedFieldsForKind = {}
    
                exportedFieldsForKind[type_perm_id] = exportableFields
    
            throw Error('Unsupported columns option: ' + exportOptions.columns)
    
        }
    
        try {
          this.context.setState({
            exportState: {
              loading: true
            }
          })
    
          const exportedRows = await _getExportedRows()
    
          const exportedFields = await _getExportedFields(exportedRows)
    
          const exportedIds = exportedRows.map(row => row.exportableId)
    
          const { sessionToken, exportResult } = await props.exportXLS({
            exportedFilePrefix: exportable.filePrefix,
    
            exportedFileContent: exportable.fileContent,
    
            exportedValues: state.exportOptions.values,
            exportedReferredMasterData:
    
              exportable.fileContent === GridExportOptions.TYPES_CONTENT &&
    
              state.exportOptions.includeDependencies
    
            const fileName = filePath.substring(filePath.lastIndexOf('/') + 1)
            const fileUrl =
    
              encodeURIComponent(sessionToken) +
              '&filePath=' +
              encodeURIComponent(filePath)
    
    
            } else {
              this.context.setState({
                exportState: null
              })
              this.handleExportDownload(fileName, fileUrl)
            }
          } else if (exportResult.status === 'error') {
            this.context.setState({
              exportState: {
                error: exportResult.message
              }
            })
          } else {
            this.context.setState({
              exportState: {
                error: JSON.stringify(exportResult)
              }
            })
          }
        } catch (e) {
          this.context.setState({
            exportState: {
    
      handleExportDownload(fileName, fileUrl) {
        this.context.setState({
          exportState: null
        })
        const link = document.createElement('a')
        link.href = fileUrl
        link.download = fileName
        link.click()
      }
    
      handleExportCancel() {
        this.context.setState({
          exportState: null
    
      async handleExportOptionsChange(exportOptions) {
        await this.context.setState(() => ({
          exportOptions
        }))
        await this._saveSettings()
      }
    
    
        if (this.measureTimeoutId) {
          clearTimeout(this.measureTimeoutId)
    
            const heights = state.heights
            let newHeights = heights
    
            this.measureQueue.forEach(measureItem => {
              const rowHeights = heights[measureItem.row.id]
              let newRowHeights = newHeights[measureItem.row.id] || rowHeights
    
              if (measureItem.cellRef.current) {
                const height = rowHeights
                  ? rowHeights[measureItem.column.name]
                  : null
                const newHeight = measureItem.cellRef.current.scrollHeight
    
                if (newHeight !== height) {
                  if (newHeights === heights) {
                    newHeights = {
                      ...heights
    
      getAllColumns() {
        const { allColumns, columnsSorting } = this.context.getState()
    
        let columns = [...allColumns]
        this._sortColumns(columns, columnsSorting)
    
      }
    
      getVisibleColumns() {
        const { allColumns, columnsSorting, columnsVisibility } =
          this.context.getState()
    
        let columns = [...allColumns]
        columns = columns.filter(column => columnsVisibility[column.name])
        this._sortColumns(columns, columnsSorting)
    
      getPage() {
        const { page } = this.context.getState()
        return page
      }
    
      getPageSize() {
        const { pageSize } = this.context.getState()
        return pageSize
      }
    
    
      getSortings() {
        const { sortings } = this.context.getState()
        return sortings
    
      }
    
      getFilters() {
        const { filters } = this.context.getState()
        return filters
      }
    
    
      getGlobalFilter() {
        const { globalFilter } = this.context.getState()
        return globalFilter
      }
    
    
      getRows() {
        const { rows } = this.context.getState()
        return rows
    
        const { selectedRow } = this.context.getState()
        return selectedRow
    
      getMultiselectedRows() {
        const { multiselectedRows } = this.context.getState()
        return multiselectedRows
      }
    
    
      getTotalCount() {
        const { totalCount } = this.context.getState()
        return totalCount
      }
    
      getExportable() {
        const { exportable } = this.context.getProps()
    
    
        if (exportable !== undefined) {
          return exportable
        } else {
          return null
        }
    
      _getCachedValue(key, newValue) {
        if (_.isEqual(this.cache[key], newValue)) {
          return this.cache[key]
        } else {
          this.cache[key] = newValue
          return newValue
        }
      }
    
    
      _getObjectValue(value) {
        return _.isObject(value) ? value : undefined
      }
    
      _getArrayValue(value) {
        return _.isArray(value) ? value : undefined
      }
    
      _getStringValue(value) {
        return _.isString(value) ? value : undefined
      }
    
      _getEnumValue(value, allowedValues) {
        return _.includes(allowedValues, value) ? value : undefined
      }
    
    
      _isEmpty(value) {
        return (
          value === null ||
          value === undefined ||
          (_.isString(value) && value.trim().length === 0)
        )
    
      }
    
      _split(str) {
        return str.split(' ').filter(token => !this._isEmpty(token))
      }
    
    
      _onError(error) {
        const { onError } = this.context.getProps()
        if (onError) {
          onError(error)
        }
        throw error
      }