Skip to content

05 SRS component

component template

  • component can use srs data
  • SRS => command can render compoenent

column template

Custom component can be used to display data in row.

Use case:

  • edit data in row
  • display context information for example document preview
XML
<srs>
  <def>
    <itm name="unicode" model="column" type="v_srs_column"></itm>
    <itm model="command" name="test">select 'Hello World'</itm>
    <itm model="command" name="test2"><![CDATA[
      /*XML reserved characters: > < require CDATA block*/
      select 'Hello <-_->' Smiley ,getdate() date  , 14 number
      ]]></itm>
    <itm model="command" name="test3" link="self">select 'Hello' txt , 2.45 dec, 4.4512 dec4, 123 int, 'śćß' unicode, date() date</itm>
    <itm model="command" name="test4" opts="server">select 'Hello' txt , 2.45 dec, 4.4512 dec4, 123 int, 'śćß' unicode, Getdate() date</itm>
    <itm model="command" name="test5" link="self" type="v_srs_component">select * from test3</itm>
  </def>
</srs>

Props:

  • table current command rendered to table
  • api current api
  • clipboard_items - selected items (only in option component)
  • row - current row data only in "column template"
  • column - column, only in "column template"
  • value - value, only in "column template"

Events:

  • @reload-event - event on reload, example @reload-event="fetchData()"
Bash
curl -L -o srs/examples/101.xml  https://jetquery.io/examples/srs/101.xml --create-dirs

Examples

XML
Vue.component('v_audit', {
  template: `
  <div :data-component="$options.name" class="xd-content">
    <template v-if="system.ready">

      <h2>{{table.name}}</h2>


      <table class="xd-table">
        <thead>
          <tr>
            <th v-for="key in tableHeaders" :key="key" :title="key">{{ key }}</th>

          </tr>
        </thead>

        <tbody>
          <tr v-for="(row, i) in lines" :key="i">
            <td v-for="key in tableHeaders" :key="key">
              {{ row[key] }}
            </td>
          </tr>
        </tbody>

      </table>

      <v_modal label="data">
        <pre>{{lines}}</pre>
      </v_modal>
    </template>
    <div class="xd-loading" v-else></div>
  </div>`,
  props: ['table', 'api'],
  data: function () {
    return {
      lines: [],
      system: {
        ready: false,
      },
    }
  },
  methods: {

    fetchData: function () {

      let lines = this.convertSRSTableToObject(this.table) || [];
      this.$set(this, 'lines', lines);
      this.system.ready = true;

    }
  },
  computed: {
    tableHeaders() {
      // Get unique keys from all objects (in case some rows have extra fields)
      const keys = new Set();
      this.lines.forEach(line => {
        Object.keys(line).forEach(key => keys.add(key));
      });
      return Array.from(keys);
    }
  },
  watch: {

    // Support for lazy loading opts contains pscope => on load is removed
    'table.opts': function () {
      this.fetchData();
    },
    //Important when multiple components on page
    'table.name': function () {
      this.fetchData();   
    } 

  },
  mounted: function () {
    if (this.table.opts?.includes('pscope')) {
      // Support for lazy loading opts contains pscope => on load is removed
      this.$emit('reload-event', 'view', this.table.name)
    }
    else
      this.fetchData();
  }
});

// 1. Optional add route
// routes.push({ path: '/xd', component: Vue.options.components['v_table_planlist'] });

// 2. Reload
// this.$emit('reload-event');


// 3. Convert to object
// let document = this.findSRSTableAndConvertToObject('view')[0] || {}; //read from props => api => find by name and assign first value to object
// this.$set(this, 'document', document);

// 4. Convert to array of obejcts
//let cooperationlines = this.findSRSTableAndConvertToObject('cooperation') || []; //find by name and convert to array of objects
//this.$set(this, 'cooperationlines', cooperationlines);
XML
Vue.component('v_srs_column',
  {
    template: `
<div :data-component="$options.name">

  <h1>column</h1>
  {{column}}

  <h1>value</h1>
  {{value}}

  <h1>row</h1>
  {{row}}

  <h1>model1</h1>

  {{model1}}

  <h1>model2</h1>

  {{model2}}
  <h1>model3</h1>

  {{model3}}

  <h1>model4</h1>
  {{model4}}

</div>`,
    // row selected row
    props: [ 'table', 'api', 'row','column','value','clipboard_items'],
    data () {
      return {
        model1:{},
        model2:{},
        model3:{},
        model4:{}
      };
    },
    methods: {

    },
    computed: {

    },
    mounted() {

      this.model1 =    this.convertSRSTableToObject(this.table)
      //return [{"key":"value","key":"value" }]

      this.model2 =    this.convertSRSTablesToObject(this.api.tables)
      //return { tablename: [{"key":"value","key":"value" },{"key":"value","key":"value" } ] }

      this.model3 =  this.convertSRSColumnsRowsToArray(this.table.columns,this.row);
      //return  [{"key":"value","key":"value" }]

      this.model4 =  this.convertSRSColumnsRowsToArray(this.table.columns,this.row)[0];
      //return  {"key":"value","key":"value" }

    }
  });
Bash
1
2
3
curl -L -o components/srs/v_srs_component.js  https://jetquery.io/examples/components-core/v_srs_component.js --create-dirs

curl -L -o components/srs/v_srs_component.js  https://jetquery.io/examples/components-core/v_srs_column.js --create-dirs