summaryrefslogtreecommitdiffstats
path: root/app/common/components/table/table-toolbar.js
blob: 830bbd190c9a26963bc8a64ce67b3940d233d18e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
window.angular && (function(angular) {
  'use strict';

  /**
   *
   * tableToolbar Component
   *
   * To use:
   * The <table-toolbar> component expects an 'actions' attribute
   * that should be an array of action objects.
   * Each action object should have 'type', 'label', and 'file'
   * properties.
   *
   * actions: [
   *  {type: 'Edit', label: 'Edit', file: 'icon-edit.svg'},
   *  {type: 'Delete', label: 'Edit', file: 'icon-trashcan.svg'}
   * ]
   *
   * The 'type' property is a string value that will be emitted to the
   * parent component when clicked.
   *
   * The 'label' property is a string value that will render as text in
   * the button
   *
   * The 'file' property is a string value of the filename of the svg icon
   * to provide <icon> directive.
   *
   */

  const controller = function() {
    /**
     * Set defaults if properties undefined
     * @param {[]} actions
     */
    const setActions = (actions = []) => {
      return actions
          .map((action) => {
            if (action.type === undefined) {
              return;
            }
            if (action.file === undefined) {
              action.file = null;
            }
            return action;
          })
          .filter((action) => action);
    };

    /**
     * Callback when button action clicked
     * Emits the action type to the parent component
     */
    this.onClick = (action) => {
      this.emitAction({action});
    };

    this.onClickClose = () => {
      this.emitClose();
    };

    /**
     * onInit Component lifecycle hook
     */
    this.$onInit = () => {
      this.actions = setActions(this.actions);
    };
  };

  /**
   * Component template
   */
  const template = `
    <div class="bmc-table__toolbar" ng-if="$ctrl.active">
      <p class="toolbar__selection-count">{{$ctrl.selectionCount}} selected</p>
      <div class="toolbar__batch-actions" ng-show="$ctrl.actions.length > 0">
        <button
          class="btn  btn-tertiary"
          type="button"
          aria-label="{{action.label}}"
          ng-repeat="action in $ctrl.actions"
          ng-click="$ctrl.onClick(action.type)">
          <icon ng-if="action.file !== null"
                ng-file="{{action.file}}"
                aria-hidden="true">
          </icon>
          {{action.label || action.type}}
        </button>
        <button
          class="btn  btn-tertiary  btn-close"
          type="button"
          aria-label="Cancel"
          ng-click="$ctrl.onClickClose()">
          Cancel
        </button>
      </div>
    </div>`

  /**
   * Register tableToolbar component
   */
  angular.module('app.common.components').component('tableToolbar', {
    controller,
    template,
    bindings: {
      actions: '<',
      selectionCount: '<',
      active: '<',
      emitAction: '&',
      emitClose: '&'
    }
  })
})(window.angular);
OpenPOWER on IntegriCloud