<!--
      Licensed to the Apache Software Foundation (ASF) under one or more
      contributor license agreements. See the NOTICE file distributed with
      this work for additional information regarding copyright ownership.
      The ASF licenses this file to You under the Apache License, Version
      2.0 (the "License"); you may not use this file except in compliance
      with the License. You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0 Unless required by
      applicable law or agreed to in writing, software distributed under the
      License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
      CONDITIONS OF ANY KIND, either express or implied. See the License for
      the specific language governing permissions and limitations under the
      License.
  -->
<script>
  export default {
    name: 'e-record',
    props: {
      record: {
        type: Object
      },
      styleClass: {
        type: String,
        default: 'eRecord'
      }
    },
    render (createElement) {
      if (this.record === undefined) {
        // render nothing
        return
      }
      // render div
      return createElement('div', {class: this.styleClass}, this.$slots.default)
    }
  }
</script>
