list.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. const app = require('../../app')
  2. const {editIcon, createIcon, deleteIcon} = require('../../assets')
  3. /**
  4. * @param {CrudPagesOptions} opts
  5. */
  6. const list = (opts) => {
  7. const defaultHeader = column => html`<th md-column>${column.titleName}</th>`
  8. const defaultCell = column => html`<td md-cell>{{${raw(opts.camelName)}.${raw(column.camelName)}}}</td>`
  9. app.component(`app${opts.pascalPlural}Page`, {
  10. template: html`
  11. <app-user-area>
  12. <h1>${opts.titlePlural}</h1>
  13. <md-table-container>
  14. <table md-table md-row-select md-auto-select ng-model="ctrl.selected" md-progress="ctrl.promise">
  15. <thead md-head md-order="query.order" md-on-reorder="ctrl.getRecords">
  16. <tr md-row>
  17. ${opts.columns.filter(c => c.inList).map(c => c.header || defaultHeader(c))}
  18. <th md-column>Actions</th>
  19. </tr>
  20. </thead>
  21. <tbody md-body>
  22. <tr md-row md-select="${opts.camelName}" md-select-id="name" md-auto-select ng-repeat="${raw(opts.camelName)} in ctrl.data track by ${raw(opts.camelName)}.id">
  23. ${opts.columns.filter(c => c.inList).map(c => c.cell || defaultCell(c))}
  24. <td md-cell>
  25. <md-button ng-href="${opts.appPrefix}/{{${raw(opts.camelName)}.id}}">
  26. <md-icon md-svg-icon="${editIcon}"></md-icon>
  27. Edit
  28. </md-button>
  29. <md-button ng-click="ctrl.delete(${raw(opts.camelName)})">
  30. <md-icon md-svg-src="${deleteIcon}"></md-icon>
  31. Delete
  32. </md-button>
  33. </td>
  34. </tr>
  35. </tbody>
  36. </table>
  37. </md-table-container>
  38. <div layout="row" layout-align="end">
  39. <md-button class="md-fab" aria-label="Add ${opts.titleName}" ng-href="${opts.appPrefix}/new">
  40. <md-icon md-svg-src="${createIcon}"></md-icon>
  41. </md-button>
  42. </div>
  43. </app-user-area>
  44. `,
  45. controllerAs: 'ctrl',
  46. controller: function(api, $mdToast) {
  47. const crud = api.crud(opts.apiPrefix)
  48. this.selected = []
  49. this.data = []
  50. this.getRecords = () => {
  51. this.promise = crud.list().then(data => {
  52. this.data = data
  53. })
  54. }
  55. this.delete = async (record) => {
  56. try {
  57. await crud.delete(record.id)
  58. $mdToast.showSimple(`${opts.titleName} deleted.`)
  59. } catch (err) {
  60. console.error(err)
  61. $mdToast.showSimple(`Could not delete ${opts.titleName}: ${err.message || err}`)
  62. }
  63. }
  64. this.getRecords()
  65. }
  66. })
  67. }
  68. module.exports = list