Blame view

build/Table/Table.js 8.33 KB
3a3ecabe   Imshann   init
1
2
  import template from "./Table.html";
  import style from "antd/lib/table/style/index.css";
81f8a467   Imshann   调整组件前缀
3
  angular.module("esNgAntd").directive("antdTable", function (esNgAntd) {
3a3ecabe   Imshann   init
4
      return {
81f8a467   Imshann   调整组件前缀
5
          controllerAs: "antdTable",
3a3ecabe   Imshann   init
6
7
8
9
10
11
12
13
14
          restrict: "E",
          transclude: true,
          replace: true,
          scope: {
              columns: "=",
              dSource: "=",
              rowSelection: "=",
              rowKey: "@",
              loading: "@",
dd962f77   Imshann   优化
15
              onChange: "&",
710b4ac0   Imshann   优化
16
              size: "@",
3a3ecabe   Imshann   init
17
18
          },
          template: template,
710b4ac0   Imshann   优化
19
          controller: function ($scope, $element, $attrs) {
3a3ecabe   Imshann   init
20
21
22
23
24
              this.getContext = function () {
                  return $scope;
              };
  
              $scope.state = {
710b4ac0   Imshann   优化
25
                  size: $scope.size || "default",
3a3ecabe   Imshann   init
26
27
28
29
30
                  dataSource: [],
                  selectedrecordKeys: [],
                  selectedrecords: [],
                  isSelectAll: false,
                  rowKey: $scope.rowKey || "id",
dd962f77   Imshann   优化
31
32
33
34
35
                  sortDirections: ["ascend", "descend"],
                  sorter: {
                      field: null,
                      order: null,
                  },
3a3ecabe   Imshann   init
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
              };
              $scope.watch = {
                  dSource: (newValue) => {
                      if (newValue !== undefined) {
                          let dataSource = [];
                          newValue.forEach((record, index) => {
                              let row = {};
  
                              if ($scope.rowSelection) {
                                  row.checked = false;
                                  row.disabled = false;
                              }
  
                              if (
                                  $scope.rowSelection &&
                                  typeof $scope.rowSelection.getCheckboxProps ===
                                      "function"
                              ) {
                                  let extraAttr =
                                      $scope.rowSelection.getCheckboxProps(
                                          record
                                      );
                                  row = Object.assign(row, extraAttr);
                              }
  
                              $scope.columns.forEach((column) => {
3a3ecabe   Imshann   init
62
                                  row[column.key] = column.render
cc35f3f0   Imshann   feat(table): 优化组件
63
                                      ? $scope.getRender(column, record, index)
3a3ecabe   Imshann   init
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
                                      : record[column.key];
                              }); // 主键
  
                              if ($scope.rowKey !== undefined) {
                                  row[$scope.state.rowKey] =
                                      record[$scope.state.rowKey];
                              } else {
                                  row[$scope.state.rowKey] = index + 1;
                              }
  
                              dataSource[index] = row;
                          });
                          $scope.state.dataSource = dataSource;
                      }
                  },
3fe10ef1   Imshann   优化
79
80
                  "rowSelection.selectedRowKeys": (newVal) => {
                      if (Array.isArray(newVal)) {
fe4cf8e2   Imshann   修复BUG
81
82
83
84
                          $scope.state.selectedrecordKeys = newVal;
                          $scope.state.dataSource.map(function (row, key) {
                              row.checked = newVal.includes(key);
                          });
3fe10ef1   Imshann   优化
85
86
                      }
                  },
3a3ecabe   Imshann   init
87
88
89
90
91
92
              };
  
              for (const key in $scope.watch) {
                  $scope.$watch(key, $scope.watch[key], true);
              }
  
cc35f3f0   Imshann   feat(table): 优化组件
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
              $scope.getParameterName = function (fn) {
                  if (typeof fn !== "object" && typeof fn !== "function") return;
                  const COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;
                  const DEFAULT_PARAMS = /=[^,)]+/gm;
                  const FAT_ARROWS = /=>.*$/gm;
                  let code = fn.prototype
                      ? fn.prototype.constructor.toString()
                      : fn.toString();
                  code = code
                      .replace(COMMENTS, "")
                      .replace(FAT_ARROWS, "")
                      .replace(DEFAULT_PARAMS, "");
                  let result = code
                      .slice(code.indexOf("(") + 1, code.indexOf(")"))
                      .match(/([^\s,]+)/g);
                  return result === null ? [] : result;
              };
  
              $scope.getRender = function (column, record, index) {
                  let params = $scope.getParameterName(column.render);
45883b16   Imshann   feat(table): 优化组件
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
                  let render = column.render(record[column.key], record, index);
  
                  if ($attrs.dSource) {
                      if (params[0]) {
                          render = render.replace(
                              new RegExp(`(\{\{.*?)${params[0]}(.*?\}\})`, "g"),
                              `$1${$attrs.dSource}[${index}].${column.key}$2`
                          );
                      }
  
                      if (params[1]) {
                          render = render.replace(
                              new RegExp(`(\{\{.*?)${params[1]}(.*?\}\})`, "g"),
                              `$1${$attrs.dSource}[${index}]$2`
                          );
                      }
  
                      if (params[2]) {
                          render = render.replace(
                              new RegExp(`(\{\{.*?)${params[2]}(.*?\}\})`, "g"),
                              `$1${index}$2`
                          );
                      }
                  }
  
                  return render;
cc35f3f0   Imshann   feat(table): 优化组件
139
140
              };
  
3a3ecabe   Imshann   init
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
              $scope.handleSelectAll = function (event) {
                  $scope.state.isSelectAll = event.target.checked;
                  $scope.state.selectedrecordKeys = [];
                  $scope.state.selectedrecords = [];
                  $scope.state.dataSource.map((record, key) => {
                      if (record.disabled === false) {
                          record.checked = event.target.checked;
                      }
  
                      if (record.checked) {
                          $scope.state.selectedrecordKeys.push(key);
                          $scope.state.selectedrecords.push($scope.dSource[key]);
                      }
  
                      return record;
                  });
3fe10ef1   Imshann   优化
157
158
159
160
161
162
163
  
                  if (typeof $scope.rowSelection.onChange === "function") {
                      $scope.rowSelection.onChange(
                          $scope.state.selectedrecordKeys,
                          $scope.state.selectedrecords
                      );
                  }
3a3ecabe   Imshann   init
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
              };
  
              $scope.handleSelect = function (event, index) {
                  let pos = $scope.state.selectedrecordKeys.findIndex(
                      (value) => value === index
                  );
  
                  if (event.target.checked && pos === -1) {
                      $scope.state.selectedrecordKeys.push(index);
                      $scope.state.selectedrecords.push($scope.dSource[index]);
                  } else {
                      $scope.state.selectedrecordKeys.splice(pos, 1);
                      $scope.state.selectedrecords.splice(pos, 1);
                  }
  
                  if ($scope.state.selectedrecordKeys.length === 0) {
                      $scope.state.isSelectAll = false;
                  }
  
3fe10ef1   Imshann   优化
183
184
185
186
187
188
                  if (typeof $scope.rowSelection.onChange === "function") {
                      $scope.rowSelection.onChange(
                          $scope.state.selectedrecordKeys,
                          $scope.state.selectedrecords
                      );
                  }
3a3ecabe   Imshann   init
189
              };
dd962f77   Imshann   优化
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
  
              $scope.handleSorter = function (key) {
                  $scope.state.sorter.field = key;
  
                  if ($scope.state.sorter.order === null) {
                      $scope.state.sorter.order = "ascend";
                  } else if ($scope.state.sorter.order === "ascend") {
                      $scope.state.sorter.order = "descend";
                  } else if ($scope.state.sorter.order === "descend") {
                      $scope.state.sorter.order = null;
                      $scope.state.sorter.field = null;
                  }
  
                  $scope.onChange({
                      sorter: $scope.state.sorter,
                  });
              };
3a3ecabe   Imshann   init
207
208
          },
          link: function ($scope, $element, $attrs, $controllers, $transclude) {
5b248282   Imshann   优化
209
210
211
212
213
214
215
216
              esNgAntd.createStyle("ant-table", style); // 初始化默认排序
  
              $scope.columns.forEach((column) => {
                  if (column.sortOrder) {
                      $scope.state.sorter.field = column.key;
                      $scope.state.sorter.order = column.sortOrder;
                  }
              });
3a3ecabe   Imshann   init
217
218
219
          },
      };
  });