Jump to content
bernhard

RockGrid - powerful, performant and beautiful data listing tool

Recommended Posts

Crud will not be that easy. It's easier to open pages in a panel via the regular PW page editor. Linking the page title is very easy using cell renderers. See the aggrid docs.

  • Like 1

Share this post


Link to post
Share on other sites

I've been looking into External filter. There is a problem, though: rockgrid.js gets loaded in the head element, so we cannot use an external element rendered outside rockgrid.js. I am having trouble figuring out how I should go about using and rendering markup that goes outside the grid in rockgrid.js. Or should I just modify things so that rockgrid.js loads at the end of the document?

Share this post


Link to post
Share on other sites

Sorry @Beluga but I don't understand your question. What is the exact szenario? What is the exact problem? You have all the aggrid api available with all your RockGrids. The most important events are BeforeInit and AfterInit, then you have your RockGrid instances available for any further actions.

d3vecEG.png

Share this post


Link to post
Share on other sites

The idea is to have an additional dropdown to filter the items. It is not possible to have two filters in the same column, so I have to use the external filter feature. Thanks for nudging me in the right direction. I include a minimised version of my current code.

When I started writing this reply, I was stuck, but I continued banging my head against the wall. Now I have a solution, where the dropdown completely overrides the smart filter. This might actually be useful, as then you can filter further (by typing) the already filtered content, but I should turn it off by default and include a checkbox to control it.

Something that I don't understand is: why do I have to have both onchange="" in the select element and the addEventListener for the thing to work? I hope it will not be troublesome to create the checkbox solution to control the listener (tips welcome, I'm taking a break).

Edit: I added a checkbox and tied the isExternalFilterPresent function to it and now it is perfect to me!

document.addEventListener('RockGridItemBeforeInit', function(e) {
  if(e.target.id != 'RockGridItem_rockgrid') return;
  var grid = RockGrid.getGrid(e.target.id);
  grid.gridOptions.isExternalFilterPresent = isExternalFilterPresent;
  grid.gridOptions.doesExternalFilterPass = doesExternalFilterPass;
  
  var col = grid.getColDef('code');
  col.headerName = grid.js.code;

  var col = grid.getColDef('variation');
  col.headerName = grid.js.variation;

  col.filter = RockGrid.filters.smart;
  col.floatingFilterComponent = RockGrid.filters.smartFloating;

});

var grid = null;
var eFilterText = null;
var dropcheck = null;

document.addEventListener('RockGridItemAfterInit', function(e) {
  if(e.target.id != 'RockGridItem_rockgrid') return;
  var col;
  var colDef;
  grid = RockGrid.getGrid(e.target.id);
  grid.setColumns(['code', variation]);
  var selectoptions = '';
  // let's build the select element and its options by using a pre-populated object
  // with key:value pairs like A1a:"water and fire as natural elements"
  var codeskey = Object.keys(codesarray);
  Object.values(codesarray).forEach(function(item, index) {
      selectoptions += '<option value="' + codeskey[index] + '">' + item + '</option>';
  });
  var dropgui = document.createElement('div');
  dropgui.innerHTML = '<select id="filterText" onchange="externalFilterChanged(eFilterText, grid)">' + selectoptions + '</select><input id="dropcheck" type="checkbox" onchange="externalFilterChanged(eFilterText, grid)" />';
  e.target.prepend(dropgui);

  dropcheck = document.getElementById('dropcheck');
  eFilterText = document.getElementById('filterText');
  eFilterText.addEventListener("change", externalFilterChanged(eFilterText, grid));
});

var filterText = null;

// dropdown filter is present, if the checkbox is checked
function isExternalFilterPresent() {
  return (dropcheck !== null && dropcheck.checked);
}

// this is given a rowNode by ag-Grid
function doesExternalFilterPass(node) {
  var passed = true;  
  var filterWord = filterText.toLowerCase();
  var value = node.data.code;
  if (value === null) value = '';
  if (value.toString().toLowerCase().indexOf(filterWord) < 0) {
      passed = false;
  }
    
  return passed;
}

function externalFilterChanged(eFilterText, grid) {
  filterText = eFilterText.options[eFilterText.selectedIndex].value;
  grid.gridOptions.api.onFilterChanged();
}

 

Share this post


Link to post
Share on other sites

Glad my answer helped you somehow. I don't have time to look into that in detail. You can have a look at how I built the smartfilter. It's a 100% custom filter and you can build your very own filter as well.

I'd be happy to help you if you are building something like the https://www.ag-grid.com/javascript-grid-filter-set/ , because that's definitely something others (including me) would benefit of.

You might also want to use my debounce function so that the filter does not fire on every single key press.

Share this post


Link to post
Share on other sites
1 hour ago, Beluga said:

It is not possible to have two filters in the same column, so I have to use the external filter feature.

BTW: My smart filter does already support multiple filters (AND and OR)

>50 <100

would list all items that are above 50 and below 100

ber bau

would find Bernhard Baumrock, but not "Bernhard Muster"

bernhard | beluga

would find both "Bernhard Baumrock", "Bernhard Muster" AND "beluga"

 

PS: So maybe you could just create a custom button wherever you want that sets my smart filter to one of those options. Even Regex is possible.

Share this post


Link to post
Share on other sites

Just pushed v0.0.14 to github - caution, there is a BREAKING CHANGE (but a small one 😉 )

Initially I implemented a concept of column definition plugins to reuse column modifications ( for example you almost always want icons to show/edit/delete the row instead of showing the page id). Now that works with helper functions that are available through the RockGrid.colDefs object (and you can of course extend that with your own helper functions).

It's easy to create those functions:

document.addEventListener('RockGridReady', function(e) {
  RockGrid.colDefs.fixedWidth = function(col, width) {
    col.width = width || 100;
    col.suppressSizeToFit = true;
    return col;
  };
});

And using them is a lot easier than before:

// before
grid.addColDefPlugins({
	id: 'rowactions',
});

var col = grid.getColDef('id');
col.headerName = 'ID';
col.width = 70;
col.suppressSizeToFit = true;
col.suppressFilter = true;
col.pinned = 'left';


// after
var col = grid.getColDef('id');
col = RockGrid.colDefs.rowActions(col);
col.pinned = 'left';

It will replace your ID with those icons:

1kkWfRA.png

 

There are plugins available to add your custom actions to that column (or any other column) and you can even combine those plugins:

  col = grid.getColDef('title');
  col = RockGrid.colDefs.fixedWidth(col, 100);
  col = RockGrid.colDefs.addIcons(col, [{
    icon: 'file-pdf-o',
    cls: 'pw-panel',
    dataHref: function(params) {
      if(!params.data.pdfs) return;
      var pdfs = params.data.pdfs.split(',');
      if(!pdfs.length) return;
      return '/site/assets/files/' + params.data.id + '/' + pdfs[pdfs.length-1];
    },
    label: function(params) {
      return 'show invoice PDF ' + params.data.id;
    },
  }]);

 

  • Like 2

Share this post


Link to post
Share on other sites

I solved my external filter setup with a checkbox (edited the original code block with the changes) and I am happy! I can create a series of screenshots during the weekend to illustrate how it works 🙂

  • Like 1

Share this post


Link to post
Share on other sites

The latest version makes it possible to put your rockgrid files in a custom directory. That's handy (necessary) when you are developing modules that ship with rockgrids. A processmodule would be as simple as that:

  /**
   * manage all lists
   */
  public function executeLists() {
    $form = $this->modules->get("InputfieldForm");

    $form->add([
      'type' => 'RockGrid',
      'name' => 'lists',
      'assetsDir' => __DIR__."/grids",
    ]);
    
    return $form->render();
  }

 

  • Like 1

Share this post


Link to post
Share on other sites

Here is how I do linkifying, any tips for improvements or alternatives welcome:

In rockgrid.php I include 'name' as a column, but then in RockGridItemAfterInit I do grid.setColumns(['code', 'variation']); to make it hidden.

I have these to get the urls I want:

var url = document.URL;
// URL API's origin gets us a href of the hostname without the trailing slash (does not work with IE11)
var domain = new URL(url).origin;

For the 'variation' column I have a cellRenderer to link to the children of the page using the 'name' column data:

col.cellRenderer = function(params) {    
  if(params.value !== null) {
  return '<a href="' + url + params.data.name + '">' + params.value + '</a>';
  }
}

For the 'code' column I have a valueGetter to pull the human-readable name for the category from a JS object and stick it after the code. Then I use a cellRenderer to link the text to anywhere I want:

// let's combine the code with its meaning
col.valueGetter = function(params) {    
  return params.data.code + ' ' + codesarray[params.data.code];
}
col.cellRenderer = function(params) {    
  return '<a href="' + domain + '/clas2/">' + params.value + '</a>';
}

 

Share this post


Link to post
Share on other sites

Glad to see RockGrid in action, thx for the screenshots 🙂

21 minutes ago, Beluga said:

Here is how I do linkifying, any tips for improvements or alternatives welcome:

What kind of improvements do you mean? Only thing I can think of is that you use ActionIcons for that. You can add them before or after the cell content. And you can show them always or only on hover:

aggrid.gif.4989549327d0e551355ce20bb2af66b3.gif

Sample code is some posts above, see RockGrid.colDefs.addIcons()

PS: On non-fixed-width columns it's better to add icons BEFORE so that they are still visible even if the cell has more content than can be displayed.

 

Share this post


Link to post
Share on other sites

Pushed v0.0.16: Now you can also set a custom assets folder in the field's config:

w76z3Wn.png

Share this post


Link to post
Share on other sites
2 hours ago, bernhard said:

What kind of improvements do you mean?

Those kinds that I can't think of before I hear them 🙂

  • Haha 1

Share this post


Link to post
Share on other sites

I am having trouble with events. In my RockGridItemAfterInit block I have

grid.gridOptions.onFilterChanged = afterFilter();

Then outside it the function

function afterFilter() {
    console.info("filter changed");
}

The function fires exactly once - when the grid is initialised. It does not fire when the filters are changed.

If I instead use

grid.gridOptions.api.addEventListener('filterChanged', afterFilter());

It fires when the grid is initialised and when I change a filter, I get this in the console (the first time, on further tries I get nothing):

TypeError: t is not a function ag-grid.min.js:26:2395
    p</e.prototype.dispatchToListeners/</< http://0.0.0.0/site/modules/FieldtypeRockGrid/lib/ag-grid.min.js:26:2395
    p</e.prototype.flushAsyncQueue/< http://0.0.0.0/site/modules/FieldtypeRockGrid/lib/ag-grid.min.js:26:2814
    forEach self-hosted:262:13
    p</e.prototype.flushAsyncQueue http://0.0.0.0/site/modules/FieldtypeRockGrid/lib/ag-grid.min.js:26:2785
    <anonymous> self-hosted:973:17

What am I doing wrong?

Share this post


Link to post
Share on other sites

Sorry, I can't provide free support here for such specific problems atm. You might try to search the repository for "filterchanged" and see how I use it in different occations,

yVzw9X0.png

  • Thanks 1

Share this post


Link to post
Share on other sites

Thanks for the free support 😉 I got it working with the syntax

grid.gridOptions.api.addEventListener('filterChanged', function() { afterFilter() });

This allows me to pass the grid object to afterFilter and then do interesting stuff with grid.gridOptions.api.getModel().rootNode.childrenAfterFilter

I am going to mess around with dynamic charting!!

  • Like 1

Share this post


Link to post
Share on other sites
2 hours ago, Beluga said:

I am going to mess around with dynamic charting!!

Glad you got it working, seems you start having fun using it? 😉 What chart library are you using?

Share this post


Link to post
Share on other sites

The new concept of function for manipulating the columns really makes sense and is great to work with 🙂 Whenever you create useful coldef functions please let me know - maybe others can also benefit from it. Here is one new that I just added:

RockGrid.colDefs.yesNo()

Here a simple example showing the status of an E-Mail (sent yes or no):

  col = grid.getColDef('rockmailer_sent');
  col = RockGrid.colDefs.yesNo(col, {headerName: 'Status'});

l8Woi3J.png

And here a "more complex" example that splits a page reference field with a list of IDs and returns true if a page is part of that list and false if is not:

    col = RockGrid.colDefs.yesNo(col, {
      headerName: grid.js.listtitle,
      isYes: function(val) {
        if(!val) return false;
        val = val.split(",");
        return val.indexOf(String(grid.js.list)) > -1 ? true : false;
      }
    });

nGKWtt4.png 

  • Like 1

Share this post


Link to post
Share on other sites
On 11/4/2018 at 3:53 PM, bernhard said:

Glad you got it working, seems you start having fun using it? 😉 What chart library are you using?

I am using ApexCharts.js, which is kind of a spiritual successor to Chartist.js in that they both produce SVG charts. I am experimenting with what is possible, trying to figure out visualisations of the data that would be useful and attractive.

Here is a screenshot of ApexCharts playing together in real time with RockGrid filtering (edit: nevermind the incorrect/repeating data labels, I only noticed and corrected later):

a-t-chart.thumb.png.2234eb32c3e17f2f78e752e81327936b.png

We see a stacked bar chart representation of the number of literature references per filtered proverb type. I intend to split the thing into separate charts for each of the 13 top level categories (ApexCharts unfortunately does not support multiple series of stacked bars in a single chart). This will make it readable even with the unfiltered view of all 325 proverb types.

It was quite convoluted to get the libraries to play together - grid.gridOptions.api.getModel().rootNode.childrenAfterFilter did not want to yield its contents, but guarded it like a jealous dragon. To get access to the data, I had to brute-force dispatch an input event like so:

  var inputTarget = document.querySelector('.ag-floating-filter-full-body:first-child input');
  var inputEvent = new Event('input', {'bubbles': true, 'cancelable': true});
  // have to use delta timing to delay the input event - in
  // case of big existing CPU load, it will fire too soon!
  var start = new Date().getTime();
    setTimeout(function() {
    var now = new Date().getTime(), delta = now-start;
    inputTarget.dispatchEvent(inputEvent);
    },500);

Then, to initialise the Apex chart in proper order, I had to wrap its stuff into a function. I called the function from my afterFilter:

function afterFilter(grid) {
    var filterKids = grid.gridOptions.api.getModel().rootNode.childrenAfterFilter;
    var mapCodes = filterKids.map(x => x.data.code);
    var countedCodes = mapCodes.reduce((r,k)=>{r[k]=1+r[k]||1;return r},{});
    apexseries = Object.entries(countedCodes).map(([p, v]) => ({'name':p, 'data':[v]}));
    var apexdiv = document.querySelector("#chart");
    if(!apexdiv.hasChildNodes()) { apexi(); } else { ApexCharts.exec('proverbs', 'updateSeries', apexseries); }
}

 

  • Like 1

Share this post


Link to post
Share on other sites

Awesome to see that, need to look at that library as I've never heard about it...

30 minutes ago, Beluga said:

It was quite convoluted to get the libraries to play together - grid.gridOptions.api.getModel().rootNode.childrenAfterFilter did not want to yield its contents, but guarded it like a jealous dragon. To get access to the data, I had to brute-force dispatch an input event like so:

I've built a function to get data instantly very easily - have a look at the pluck() function in RockGridItem.js; It works similar to jQuery Datatables library that I've used before. And I found getting data there quite easier than with aggrid. That's why I built a similar replacement.

See this example where I can select selected or filtered items:

kMG8EFm.png


    // get items
    var rockmailer_to = $('input[name=rockmailer_to]:checked').val();
    var items;
    var testmail = false;
    if(rockmailer_to == 'selected') items = grid.pluck('id', {selected: true});
    else if(rockmailer_to == 'filtered') items = grid.pluck('id', {filter: true});
    else {
      // custom test address
      var testmail = $('#Inputfield_rockmailer_test').val();
      if(!testmail) {
        ProcessWire.alert('You need to specify a Test-Mail-Address!');
        return;
      }
      items = [testmail];
      testmail = true;
    }
    if(!items.length) ProcessWire.alert('No items selected/filtered');

 

Wow @Beluga just had a look at apex charts and that looks fantastic! I was short before creating a module for chartjs but then quite a lot of client work popped in... I'd be very happy to assist you in creating a charting module that plays well together with RockGrid, so if you are interested please drop me a line via PM 🙂 

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

v18 adds a plugin that can sync page fields with rockgrid columns:

Example Setup

Adding the asm in a processmodule. $fs is a fieldset where we add our InputField to. $gridname is the name of the grid that is connected.

    // which lists to show
    $this->wire->config->scripts->append($this->wire->urls($this) . "scripts/manageLists.js");
    $fs->add([
      'type' => 'InputfieldAsmSelect',
      'name' => 'listsToShow',
      'label' => __('Show list membership for...'),
      'attr' => ['data-grid' => $gridname],
      'asmOptions' => ['sortable'=>false],
    ]);
    $f = $fs->getChildByName('listsToShow');
    $f->setAsmSelectOption('sortable', false);
    foreach($pages->get('template=rockmailer_lists')->children as $item) {
      $f->addOption($item->id, $item->title);
    }

And the portion of the javascript file:

// sync ASM field with displayed lists in grid
// attach event listener when document is ready
$(document).ready(function() {
  var $select = $('#Inputfield_listsToShow');
  var colPrefix = 'rockmailer_list_';
  
  RockGrid.plugins.syncAsmSelect({
    asm: $('#Inputfield_listsToShow'),
    grid: RockGrid.getGrid($select.data('grid')),
    colName: function(pageId) { return colPrefix + pageId; },
    colDef: function(col) {
      col = RockGrid.colDefs.yesNo(col, {
        isYes: function(params) {
          var pageId = String(params.column.colId).replace(colPrefix, '');
          var lists = String(params.data.rockmailer_lists).split(',');
          return lists.indexOf(pageId) > -1 ? true : false;
        }
      });
      col.pinned = 'left';
      return col;
    }
  });
});

In this case we set a custom callback to modify the colDef for the column. It uses the yesNo plugin to show icons instead of true/false values:

screenshot

  • Like 4

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Mike Rockett
      Jumplinks for ProcessWire
      Release: 1.5.56
      Composer: rockett/jumplinks
      Jumplinks is an enhanced version of the original ProcessRedirects by Antti Peisa.
      The Process module manages your permanent and temporary redirects (we'll call these "jumplinks" from now on, unless in reference to redirects from another module), useful for when you're migrating over to ProcessWire from another system/platform. Each jumplink supports wildcards, shortening the time needed to create them.
      Unlike similar modules for other platforms, wildcards in Jumplinks are much easier to work with, as Regular Expressions are not fully exposed. Instead, parameters wrapped in curly braces are used - these are described in the documentation.
      Under Development: 2.0, to be powered by FastRoute
      As of version 1.5.0, Jumplinks requires at least ProcessWire 2.6.1 to run.
      View on GitLab
      Download via the Modules Directory
      Read the docs
      Features
      The most prominent features include:
      Basic jumplinks (from one fixed route to another) Parameter-based wildcards with "Smart" equivalents Mapping Collections (for converting ID-based routes to their named-equivalents without the need to create multiple jumplinks) Destination Selectors (for finding and redirecting to pages containing legacy location information) Timed Activation (activate and/or deactivate jumplinks at specific times) 404-Monitor (for creating jumplinks based on 404 hits) Additionally, the following features may come in handy:
      Stale jumplink management Legacy domain support for slow migrations An importer (from CSV or ProcessRedirects) Feedback & Feature Requests
      I’d love to know what you think of this module. Please provide some feedback on the module as a whole, or even regarding smaller things that make it whole. Also, please feel free to submit feature requests and their use-cases.
      Note: Features requested so far have been added to the to-do list, and will be added to 2.0, and not the current dev/master branches.
      Open Source

      Jumplinks is an open-source project, and is free to use. In fact, Jumplinks will always be open-source, and will always remain free to use. Forever. If you would like to support the development of Jumplinks, please consider making a small donation via PayPal.
      Enjoy! :)
    • By BitPoet
      As threatened in Ryan's announcement for 3.0.139, I built a little module for sliding toggles as a replacement for checkboxes. Styling of the input is CSS3 only (with all the usual caveats about older browsers), no JS necessary, and may still be a bit "rough around the edges", so to speak, since I didn't have much time for testing on different devices or brushing things up enough so I'd feel comfortable pushing it to the module directory. But here's the link to the GitHub repo for now:
      InputfieldSlideToggle
      Fieldtype and Inputfield that implements smartphone-style toggles as replacement for checkbox inputs. The visualization is CSS-only, no additional JS necessary.
      Status
      Still very alpha, use with caution!
      Features / Field Settings
      Size
      You can render the toggles in four different sizes: small, medium, large and extra large.
      Off Color
      Currently, "unchecked" toggles can be displayed either in grey (default) or red.
      On Color
      "Checked" toggles can be rendered in one of these colors: blue (default), black, green, grey, orange or red.
      Screenshots

      Some examples with checkbox label


      View all Size and Color Combinations
      Small toggles Medium toggles Big toggles Extra big toggles  









    • By Orkun
      Hi Guys
      I needed to add extended functionalities for the InputfieldDatetime Module (module is from processwire version 2.7.3) because of a Request of Customer.
      So I duplicated the module and placed it under /site/modules/.
      I have added 3 new Settings to the InputfieldDatetime Module.
      1. Day Restriction - Restrict different days based on weekdays selection (e.g. saturday, sunday) - WORKING

       
      2. Time Slots - Define Time slots based on custom Integer Value (max is 60 for 1 hour) - WORKING

       
      3. Time Range Rules per Weekday - Define a minTime and MaxTime per Weekday (e.g. Opening Hours of a Restaurant) - NOT WORKING PROPERLY

       
      The Problem
      Time Slots and Day Restriction working fine so far. But the Time Range Rules per Weekday doesn't work right.
      What should happen is, that when you click on a date, it should update the minTime and maxTime of the Time Select.
      But the change on the select only happens if you select a date 2 times or when you select a date 1 time and then close the datepicker and reopen it again.
      The time select doesn't get change when you select a date 1 time and don't close the picker.
      Here is the whole extended InputfieldDatetime Module.
      The Files that I have changed:
      InputfieldDatetime.module InputfieldDatetime.js jquery-ui-timepicker-addon.js (https://trentrichardson.com/examples/timepicker/) - updated it to the newest version, because minTime and maxTime Option was only available in the new version  
      Thats the Part of the JS that is not working correctly:
      if(datetimerules && datetimerules.length){ options.onSelect = function(date, inst) { var day = $(this).datetimepicker("getDate").getDay(); day = day.toString(); var mintime = $(this).attr('data-weekday'+day+'-mintime'); var maxtime = $(this).attr('data-weekday'+day+'-maxtime'); console.log("weekday: "+day); console.log("minTime: "+mintime); console.log("maxTime: "+maxtime); var optionsAll = $(this).datetimepicker( "option", "all" ); optionsAll.minTime = mintime; optionsAll.maxTime = maxtime; $(this).datetimepicker('destroy'); $(this).datetimepicker(optionsAll); $(this).datetimepicker('refresh'); //$.datepicker._selectDate($(this).attr("id"),date); //$.datepicker._base_getDateDatepicker(); // var inst = $.datepicker._getInst($(this)); // $.datepicker._updateDatepicker(inst); /*$(this).datetimepicker('destroy'); InputfieldDatetimeDatepicker($(this), mintime, maxtime); $(this).datetimepicker('refresh'); */ // $(this).datetimepicker('option', {minTime: mintime, maxTime: maxtime}); } } Can you have a look and find out what the Problem is?
      InputfieldDatetime.zip
       
      Kind Regards
      Orkun
    • By teppo
      This module tracks changes, additions, removals etc. of public (as in "not under admin") pages of your site. Like it's name says, it doesn't attempt to be a version control system or anything like that - just a log of what's happened.
      At the moment it's still a work in progress and will most likely be a victim of many ruthless this-won't-work-let's-try-that-instead cycles, but I believe I've nailed basic functionality well enough to post it here.. so, once again, I'll be happy to hear any comments you folks can provide
      https://modules.processwire.com/modules/process-changelog/
      https://github.com/teppokoivula/ProcessChangelog
      How does it work?
      Exactly like it's (sort of) predecessor, Process Changelog actually consists of two modules: Process Changelog and Process Changelog Hooks. Hooks module exists only to serve main module by hooking into various functions within Pages class, collecting data of performed operations, refining it and keeping up a log of events in it's own custom database table (process_changelog.) Visible part is managed by Process Changelog, which provides users a (relatively) pretty view of the contents of said log table.
      How do you use it?
      When installed this module adds new page called Changelog under Admin > Setup which provides you with a table view of collected data and basic filtering tools See attached screenshots to get a general idea about what that page should look like after a while.
      For detailed installation instructions etc. see README.md.
       


    • By Gadgetto
      Status update links (inside this thread) for SnipWire development will be always posted here:
      2019-08-08
      2019-06-15
      2019-06-02
      2019-05-25
      If you are interested, you can test the current state of development:
      https://github.com/gadgetto/SnipWire
      Please note that the software is not yet intended for use in a production system (alpha version).
      If you like, you can also submit feature requests and suggestions for improvement. I also accept pull requests.
      ---- INITIAL POST FROM 2019-05-25 ----
      I wanted to let you know that I am currently working on a new ProcessWire module that fully integrates the Snipcart Shopping Cart System into ProcessWire. (this is a customer project, so I had to postpone the development of my other module GroupMailer).
      The new module SnipWire offers full integration of the Snipcart Shopping Cart System into ProcessWire.
      Here are some highlights:
      simple setup with (optional) pre-installed templates, product fields, sample products (quasi a complete shop system to get started immediately) store dashboard with all data from the snipcart system (no change to the snipcart dashboard itself required) Integrated REST API for controlling and querying snipcart data webhooks to trigger events from Snipcart (new order, new customer, etc.) multi currency support self-defined/configurable tax rates etc. Development is already well advanced and I plan to release the module in the next 2-3 months.
      I'm not sure yet if this will be a "Pro" module or if it will be made available for free.
      I would be grateful for suggestions and hints!
      (please have a look at the screenshots to get an idea what I'm talking about)
       




×
×
  • Create New...