angular-slickgrid 4.1.2 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/.browserslistrc +12 -0
  2. package/.codecov.yml +17 -0
  3. package/.editorconfig +18 -0
  4. package/.eslintrc.json +50 -0
  5. package/.github/CODE_OF_CONDUCT.md +76 -0
  6. package/.github/FUNDING.yml +8 -0
  7. package/.github/ISSUE_TEMPLATE/bug_report.yml +54 -0
  8. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  9. package/.github/ISSUE_TEMPLATE/feature_request.yml +44 -0
  10. package/.github/renovate.json5 +26 -0
  11. package/.github/stale.yml +7 -0
  12. package/.github/workflows/main.yml +83 -0
  13. package/.vscode/extensions.json +9 -0
  14. package/.vscode/launch.json +72 -0
  15. package/.vscode/settings.json +7 -0
  16. package/.vscode/tasks.json +77 -0
  17. package/CHANGELOG.md +1172 -0
  18. package/LICENSE +20 -20
  19. package/README.md +9 -7
  20. package/angular.json +148 -0
  21. package/dist/LICENSE +20 -0
  22. package/dist/README.md +182 -0
  23. package/{angular-slickgrid.d.ts → dist/angular-slickgrid.d.ts} +0 -0
  24. package/{app → dist/app}/modules/angular-slickgrid/components/angular-slickgrid.component.d.ts +0 -0
  25. package/{app → dist/app}/modules/angular-slickgrid/constants.d.ts +0 -0
  26. package/{app → dist/app}/modules/angular-slickgrid/extensions/index.d.ts +0 -0
  27. package/{app → dist/app}/modules/angular-slickgrid/extensions/slickRowDetailView.d.ts +0 -0
  28. package/{app → dist/app}/modules/angular-slickgrid/global-grid-options.d.ts +0 -0
  29. package/{app → dist/app}/modules/angular-slickgrid/index.d.ts +0 -0
  30. package/{app → dist/app}/modules/angular-slickgrid/models/angularComponentOutput.interface.d.ts +0 -0
  31. package/{app → dist/app}/modules/angular-slickgrid/models/angularGridInstance.interface.d.ts +0 -0
  32. package/{app → dist/app}/modules/angular-slickgrid/models/externalTestingDependencies.interface.d.ts +0 -0
  33. package/{app → dist/app}/modules/angular-slickgrid/models/gridOption.interface.d.ts +0 -0
  34. package/{app → dist/app}/modules/angular-slickgrid/models/index.d.ts +0 -0
  35. package/{app → dist/app}/modules/angular-slickgrid/models/rowDetailView.interface.d.ts +0 -0
  36. package/{app → dist/app}/modules/angular-slickgrid/models/slickGrid.interface.d.ts +0 -0
  37. package/{app → dist/app}/modules/angular-slickgrid/modules/angular-slickgrid.module.d.ts +0 -0
  38. package/{app → dist/app}/modules/angular-slickgrid/services/angularUtil.service.d.ts +0 -0
  39. package/{app → dist/app}/modules/angular-slickgrid/services/bsDropdown.service.d.ts +0 -0
  40. package/{app → dist/app}/modules/angular-slickgrid/services/container.service.d.ts +0 -0
  41. package/{app → dist/app}/modules/angular-slickgrid/services/index.d.ts +0 -0
  42. package/{app → dist/app}/modules/angular-slickgrid/services/translater.service.d.ts +0 -0
  43. package/{app → dist/app}/modules/angular-slickgrid/services/utilities.d.ts +0 -0
  44. package/{app → dist/app}/modules/angular-slickgrid/slickgrid-config.d.ts +0 -0
  45. package/{esm2020 → dist/esm2020}/angular-slickgrid.mjs +0 -0
  46. package/dist/esm2020/app/modules/angular-slickgrid/components/angular-slickgrid.component.mjs +1171 -0
  47. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/constants.mjs +1 -1
  48. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/extensions/index.mjs +1 -1
  49. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/extensions/slickRowDetailView.mjs +2 -2
  50. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/global-grid-options.mjs +1 -1
  51. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/index.mjs +1 -1
  52. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/models/angularComponentOutput.interface.mjs +1 -1
  53. package/dist/esm2020/app/modules/angular-slickgrid/models/angularGridInstance.interface.mjs +2 -0
  54. package/dist/esm2020/app/modules/angular-slickgrid/models/externalTestingDependencies.interface.mjs +2 -0
  55. package/dist/esm2020/app/modules/angular-slickgrid/models/gridOption.interface.mjs +2 -0
  56. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/models/index.mjs +1 -1
  57. package/dist/esm2020/app/modules/angular-slickgrid/models/rowDetailView.interface.mjs +2 -0
  58. package/dist/esm2020/app/modules/angular-slickgrid/models/slickGrid.interface.mjs +2 -0
  59. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/modules/angular-slickgrid.module.mjs +5 -5
  60. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/services/angularUtil.service.mjs +4 -4
  61. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/services/bsDropdown.service.mjs +4 -4
  62. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/services/container.service.mjs +4 -4
  63. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/services/index.mjs +1 -1
  64. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/services/translater.service.mjs +4 -4
  65. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/services/utilities.mjs +1 -1
  66. package/{esm2020 → dist/esm2020}/app/modules/angular-slickgrid/slickgrid-config.mjs +1 -1
  67. package/{esm2020 → dist/esm2020}/public_api.mjs +1 -1
  68. package/{fesm2015 → dist/fesm2015}/angular-slickgrid.mjs +25 -22
  69. package/dist/fesm2015/angular-slickgrid.mjs.map +1 -0
  70. package/{fesm2020 → dist/fesm2020}/angular-slickgrid.mjs +25 -22
  71. package/dist/fesm2020/angular-slickgrid.mjs.map +1 -0
  72. package/{i18n → dist/i18n}/en.json +89 -89
  73. package/{i18n → dist/i18n}/fr.json +90 -90
  74. package/dist/package.json +79 -0
  75. package/{public_api.d.ts → dist/public_api.d.ts} +0 -0
  76. package/global.d.ts +1 -0
  77. package/ngcc.config.js +13 -0
  78. package/package.json +124 -37
  79. package/screenshots/column-picker.png +0 -0
  80. package/screenshots/composite-editor.png +0 -0
  81. package/screenshots/draggable-grouping.png +0 -0
  82. package/screenshots/editors.png +0 -0
  83. package/screenshots/export-to-file.png +0 -0
  84. package/screenshots/filter_and_sort.png +0 -0
  85. package/screenshots/formatters.png +0 -0
  86. package/screenshots/frozen.png +0 -0
  87. package/screenshots/multipleSelectFilter.png +0 -0
  88. package/screenshots/pagination.png +0 -0
  89. package/screenshots/selectFilter.png +0 -0
  90. package/screenshots/singleFilter.png +0 -0
  91. package/src/app/app-routing.module.ts +83 -0
  92. package/src/app/app.component.html +160 -0
  93. package/src/app/app.component.scss +65 -0
  94. package/src/app/app.component.ts +10 -0
  95. package/src/app/app.module.ts +175 -0
  96. package/src/app/examples/custom-angularComponentEditor.ts +184 -0
  97. package/src/app/examples/custom-angularComponentFilter.ts +126 -0
  98. package/src/app/examples/custom-inputEditor.ts +124 -0
  99. package/src/app/examples/custom-inputFilter.ts +142 -0
  100. package/src/app/examples/custom-titleFormatter.component.ts +8 -0
  101. package/src/app/examples/editor-ng-select.component.ts +37 -0
  102. package/src/app/examples/filter-ng-select.component.ts +32 -0
  103. package/src/app/examples/grid-additem.component.html +48 -0
  104. package/src/app/examples/grid-additem.component.ts +272 -0
  105. package/src/app/examples/grid-angular.component.html +79 -0
  106. package/src/app/examples/grid-angular.component.scss +28 -0
  107. package/src/app/examples/grid-angular.component.ts +370 -0
  108. package/src/app/examples/grid-autoheight.component.html +52 -0
  109. package/src/app/examples/grid-autoheight.component.ts +147 -0
  110. package/src/app/examples/grid-basic.component.html +29 -0
  111. package/src/app/examples/grid-basic.component.ts +82 -0
  112. package/src/app/examples/grid-clientside.component.html +51 -0
  113. package/src/app/examples/grid-clientside.component.ts +293 -0
  114. package/src/app/examples/grid-colspan.component.html +39 -0
  115. package/src/app/examples/grid-colspan.component.scss +11 -0
  116. package/src/app/examples/grid-colspan.component.ts +155 -0
  117. package/src/app/examples/grid-composite-editor.component.html +79 -0
  118. package/src/app/examples/grid-composite-editor.component.scss +19 -0
  119. package/src/app/examples/grid-composite-editor.component.ts +948 -0
  120. package/src/app/examples/grid-contextmenu.component.html +62 -0
  121. package/src/app/examples/grid-contextmenu.component.scss +44 -0
  122. package/src/app/examples/grid-contextmenu.component.ts +473 -0
  123. package/src/app/examples/grid-custom-tooltip.component.html +25 -0
  124. package/src/app/examples/grid-custom-tooltip.component.scss +77 -0
  125. package/src/app/examples/grid-custom-tooltip.component.ts +483 -0
  126. package/src/app/examples/grid-draggrouping.component.html +93 -0
  127. package/src/app/examples/grid-draggrouping.component.ts +397 -0
  128. package/src/app/examples/grid-editor.component.html +88 -0
  129. package/src/app/examples/grid-editor.component.ts +699 -0
  130. package/src/app/examples/grid-formatter.component.html +26 -0
  131. package/src/app/examples/grid-formatter.component.ts +162 -0
  132. package/src/app/examples/grid-frozen.component.html +65 -0
  133. package/src/app/examples/grid-frozen.component.scss +11 -0
  134. package/src/app/examples/grid-frozen.component.ts +303 -0
  135. package/src/app/examples/grid-graphql-nopage.component.html +33 -0
  136. package/src/app/examples/grid-graphql-nopage.component.scss +9 -0
  137. package/src/app/examples/grid-graphql-nopage.component.ts +242 -0
  138. package/src/app/examples/grid-graphql.component.html +87 -0
  139. package/src/app/examples/grid-graphql.component.ts +304 -0
  140. package/src/app/examples/grid-grouping.component.html +80 -0
  141. package/src/app/examples/grid-grouping.component.ts +313 -0
  142. package/src/app/examples/grid-headerbutton.component.html +31 -0
  143. package/src/app/examples/grid-headerbutton.component.scss +10 -0
  144. package/src/app/examples/grid-headerbutton.component.ts +233 -0
  145. package/src/app/examples/grid-headermenu.component.html +31 -0
  146. package/src/app/examples/grid-headermenu.component.scss +25 -0
  147. package/src/app/examples/grid-headermenu.component.ts +159 -0
  148. package/src/app/examples/grid-localization.component.html +54 -0
  149. package/src/app/examples/grid-localization.component.ts +293 -0
  150. package/src/app/examples/grid-menu.component.html +37 -0
  151. package/src/app/examples/grid-menu.component.scss +28 -0
  152. package/src/app/examples/grid-menu.component.ts +229 -0
  153. package/src/app/examples/grid-odata.component.html +116 -0
  154. package/src/app/examples/grid-odata.component.ts +441 -0
  155. package/src/app/examples/grid-range.component.html +74 -0
  156. package/src/app/examples/grid-range.component.ts +291 -0
  157. package/src/app/examples/grid-remote.component.html +37 -0
  158. package/src/app/examples/grid-remote.component.ts +153 -0
  159. package/src/app/examples/grid-resize-by-content.component.html +62 -0
  160. package/src/app/examples/grid-resize-by-content.component.scss +19 -0
  161. package/src/app/examples/grid-resize-by-content.component.ts +780 -0
  162. package/src/app/examples/grid-rowdetail.component.html +35 -0
  163. package/src/app/examples/grid-rowdetail.component.ts +205 -0
  164. package/src/app/examples/grid-rowmove.component.html +49 -0
  165. package/src/app/examples/grid-rowmove.component.ts +234 -0
  166. package/src/app/examples/grid-rowselection.component.html +76 -0
  167. package/src/app/examples/grid-rowselection.component.ts +267 -0
  168. package/src/app/examples/grid-state.component.html +36 -0
  169. package/src/app/examples/grid-state.component.ts +259 -0
  170. package/src/app/examples/grid-tabs.component.html +35 -0
  171. package/src/app/examples/grid-tabs.component.ts +115 -0
  172. package/src/app/examples/grid-trading.component.html +58 -0
  173. package/src/app/examples/grid-trading.component.scss +49 -0
  174. package/src/app/examples/grid-trading.component.ts +319 -0
  175. package/src/app/examples/grid-tree-data-hierarchical.component.html +79 -0
  176. package/src/app/examples/grid-tree-data-hierarchical.component.scss +47 -0
  177. package/src/app/examples/grid-tree-data-hierarchical.component.ts +311 -0
  178. package/src/app/examples/grid-tree-data-parent-child.component.html +108 -0
  179. package/src/app/examples/grid-tree-data-parent-child.component.scss +10 -0
  180. package/src/app/examples/grid-tree-data-parent-child.component.ts +351 -0
  181. package/src/app/examples/home.component.html +41 -0
  182. package/src/app/examples/home.component.ts +9 -0
  183. package/src/app/examples/rowdetail-preload.component.ts +10 -0
  184. package/src/app/examples/rowdetail-view.component.html +36 -0
  185. package/src/app/examples/rowdetail-view.component.ts +54 -0
  186. package/src/app/examples/swt-common-grid-pagination.component.ts +156 -0
  187. package/src/app/examples/swt-common-grid-test.component.html +30 -0
  188. package/src/app/examples/swt-common-grid-test.component.ts +219 -0
  189. package/src/app/examples/swt-common-grid.component.ts +436 -0
  190. package/src/app/examples/swt-logger.service.ts +165 -0
  191. package/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.html +4 -0
  192. package/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts +1395 -0
  193. package/src/app/modules/angular-slickgrid/constants.ts +97 -0
  194. package/src/app/modules/angular-slickgrid/extensions/index.ts +1 -0
  195. package/src/app/modules/angular-slickgrid/extensions/slickRowDetailView.ts +375 -0
  196. package/src/app/modules/angular-slickgrid/global-grid-options.ts +245 -0
  197. package/src/app/modules/angular-slickgrid/index.ts +11 -0
  198. package/src/app/modules/angular-slickgrid/models/angularComponentOutput.interface.ts +6 -0
  199. package/src/app/modules/angular-slickgrid/models/angularGridInstance.interface.ts +68 -0
  200. package/src/app/modules/angular-slickgrid/models/externalTestingDependencies.interface.ts +37 -0
  201. package/src/app/modules/angular-slickgrid/models/gridOption.interface.ts +12 -0
  202. package/src/app/modules/angular-slickgrid/models/index.ts +6 -0
  203. package/src/app/modules/angular-slickgrid/models/rowDetailView.interface.ts +33 -0
  204. package/src/app/modules/angular-slickgrid/models/slickGrid.interface.ts +7 -0
  205. package/src/app/modules/angular-slickgrid/modules/angular-slickgrid.module.ts +37 -0
  206. package/src/app/modules/angular-slickgrid/services/angularUtil.service.ts +48 -0
  207. package/src/app/modules/angular-slickgrid/services/bsDropdown.service.ts +142 -0
  208. package/src/app/modules/angular-slickgrid/services/container.service.ts +24 -0
  209. package/src/app/modules/angular-slickgrid/services/index.ts +5 -0
  210. package/src/app/modules/angular-slickgrid/services/translater.service.ts +38 -0
  211. package/src/app/modules/angular-slickgrid/services/utilities.ts +19 -0
  212. package/src/app/modules/angular-slickgrid/slickgrid-config.ts +10 -0
  213. package/src/app/slickgrid-custom-variables.scss +10 -0
  214. package/src/assets/.gitkeep +0 -0
  215. package/src/assets/data/collection_100_numbers.json +12 -0
  216. package/src/assets/data/collection_500_numbers.json +52 -0
  217. package/src/assets/data/countries.json +245 -0
  218. package/src/assets/data/country_names.json +245 -0
  219. package/src/assets/data/customers_100.json +102 -0
  220. package/src/assets/i18n/en.json +90 -0
  221. package/src/assets/i18n/fr.json +91 -0
  222. package/src/environments/environment.prod.ts +3 -0
  223. package/src/environments/environment.ts +8 -0
  224. package/src/favicon.ico +0 -0
  225. package/src/index.html +18 -0
  226. package/src/main.ts +13 -0
  227. package/src/polyfills.ts +52 -0
  228. package/src/public_api.ts +1 -0
  229. package/src/styles.scss +66 -0
  230. package/src/typings.d.ts +10 -0
  231. package/tsconfig.app.json +25 -0
  232. package/tsconfig.json +40 -0
  233. package/tsconfig.spec.json +23 -0
  234. package/docs/assets/lib/multiple-select/README.md +0 -17
  235. package/esm2020/app/modules/angular-slickgrid/components/angular-slickgrid.component.mjs +0 -1168
  236. package/esm2020/app/modules/angular-slickgrid/models/angularGridInstance.interface.mjs +0 -2
  237. package/esm2020/app/modules/angular-slickgrid/models/externalTestingDependencies.interface.mjs +0 -2
  238. package/esm2020/app/modules/angular-slickgrid/models/gridOption.interface.mjs +0 -2
  239. package/esm2020/app/modules/angular-slickgrid/models/rowDetailView.interface.mjs +0 -2
  240. package/esm2020/app/modules/angular-slickgrid/models/slickGrid.interface.mjs +0 -2
  241. package/fesm2015/angular-slickgrid.mjs.map +0 -1
  242. package/fesm2020/angular-slickgrid.mjs.map +0 -1
@@ -0,0 +1,126 @@
1
+ import { ComponentRef } from '@angular/core';
2
+ import { Subscription } from 'rxjs';
3
+ import {
4
+ AngularUtilService,
5
+ Column,
6
+ ColumnFilter,
7
+ Filter,
8
+ FilterArguments,
9
+ FilterCallback,
10
+ GridOption,
11
+ OperatorType,
12
+ OperatorString,
13
+ SearchTerm,
14
+ SlickGrid,
15
+ unsubscribeAllObservables,
16
+ } from './../modules/angular-slickgrid';
17
+
18
+ // using external non-typed js libraries
19
+ declare const $: any;
20
+
21
+ export class CustomAngularComponentFilter implements Filter {
22
+ private _shouldTriggerQuery = true;
23
+ private _subscriptions: Subscription[] = [];
24
+
25
+ /** Angular Component Reference */
26
+ componentRef!: ComponentRef<any>;
27
+
28
+ grid!: SlickGrid;
29
+ searchTerms: SearchTerm[] = [];
30
+ columnDef!: Column;
31
+ callback!: FilterCallback;
32
+ operator: OperatorType | OperatorString = OperatorType.equal;
33
+
34
+ constructor() { }
35
+
36
+ /** Angular Util Service (could be inside the Grid Options Params or the Filter Params ) */
37
+ get angularUtilService(): AngularUtilService {
38
+ let angularUtilService = this.gridOptions && this.gridOptions.params && this.gridOptions.params.angularUtilService;
39
+ if (!angularUtilService || !(angularUtilService instanceof AngularUtilService)) {
40
+ angularUtilService = this.columnFilter && this.columnFilter.params && this.columnFilter.params.angularUtilService;
41
+ }
42
+ return angularUtilService;
43
+ }
44
+
45
+ /** Get the Collection */
46
+ get collection(): any[] {
47
+ return this.columnFilter && this.columnFilter.collection || [];
48
+ }
49
+
50
+ /** Getter for the Column Filter */
51
+ get columnFilter(): ColumnFilter {
52
+ return this.columnDef && this.columnDef.filter || {};
53
+ }
54
+
55
+ /** Getter for the Grid Options pulled through the Grid Object */
56
+ get gridOptions(): GridOption {
57
+ return this.grid?.getOptions?.() as GridOption;
58
+ }
59
+
60
+ /**
61
+ * Initialize the Filter
62
+ */
63
+ init(args: FilterArguments) {
64
+ this.grid = args.grid as SlickGrid;
65
+ this.callback = args.callback;
66
+ this.columnDef = args.columnDef;
67
+ this.searchTerms = (args.hasOwnProperty('searchTerms') ? args.searchTerms : []) || [];
68
+
69
+ if (!this.columnFilter || !this.columnFilter.params.component || !(this.angularUtilService instanceof AngularUtilService)) {
70
+ throw new Error(`[Angular-Slickgrid] For Filter with Angular Component to work properly, you need to provide your component to the "component" property and make sure to add it to your "entryComponents" array.
71
+ You also need to provide the "AngularUtilService" via the Filter Params OR the Grid Options Params
72
+ Example: this.columnDefs = [{ id: 'title', field: 'title', filter: { model: CustomAngularComponentFilter, collection: [...], params: { component: MyComponent, angularUtilService: this.angularUtilService }}];
73
+ OR this.columnDefs = [{ id: 'title', field: 'title', filter: { model: CustomAngularComponentFilter, collection: [...] }]; this.gridOptions = { params: { angularUtilService: this.angularUtilService }}`);
74
+ }
75
+
76
+ if (this.columnFilter && this.columnFilter.params.component) {
77
+ // use a delay to make sure Angular ran at least a full cycle and it finished rendering the Component before hooking onto it
78
+ // else we get the infamous error "ExpressionChangedAfterItHasBeenCheckedError"
79
+ setTimeout(() => {
80
+ const $headerElm = this.grid.getHeaderRowColumn(this.columnDef.id);
81
+ $($headerElm).empty();
82
+ const componentOuput = this.angularUtilService.createAngularComponentAppendToDom(this.columnFilter.params.component, $headerElm);
83
+ this.componentRef = componentOuput.componentRef;
84
+
85
+ // here we override the collection object of the Angular Component
86
+ // but technically you can pass any values you wish to your Component
87
+ Object.assign(componentOuput.componentRef.instance, { collection: this.collection });
88
+
89
+ this._subscriptions.push(
90
+ componentOuput.componentRef.instance.onItemChanged.subscribe((item: any) => {
91
+ this.callback(undefined, { columnDef: this.columnDef, operator: this.operator, searchTerms: [item.id], shouldTriggerQuery: this._shouldTriggerQuery });
92
+ // reset flag for next use
93
+ this._shouldTriggerQuery = true;
94
+ })
95
+ );
96
+ });
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Clear the filter value
102
+ */
103
+ clear(shouldTriggerQuery = true) {
104
+ this._shouldTriggerQuery = shouldTriggerQuery;
105
+ if (this.componentRef && this.componentRef.instance && this.componentRef.instance.hasOwnProperty('selectedId')) {
106
+ this.componentRef.instance.selectedId = 0;
107
+ }
108
+ }
109
+
110
+ /** destroy the Angular Component & Subscription */
111
+ destroy() {
112
+ if (this.componentRef && this.componentRef.destroy) {
113
+ this.componentRef.destroy();
114
+ }
115
+
116
+ // also unsubscribe all Angular Subscriptions
117
+ this._subscriptions = unsubscribeAllObservables(this._subscriptions);
118
+ }
119
+
120
+ /** Set value(s) on the DOM element */
121
+ setValues(values: SearchTerm[] | SearchTerm) {
122
+ if (this.componentRef && this.componentRef.instance && this.componentRef.instance.hasOwnProperty('selectedId')) {
123
+ this.componentRef.instance.selectedId = values;
124
+ }
125
+ }
126
+ }
@@ -0,0 +1,124 @@
1
+ import { Column, ColumnEditor, Editor, EditorValidator, EditorValidationResult, KeyCode } from './../modules/angular-slickgrid';
2
+
3
+ // using external non-typed js libraries
4
+ declare const $: any;
5
+
6
+ /*
7
+ * An example of a 'detached' editor.
8
+ * KeyDown events are also handled to provide handling for Tab, Shift-Tab, Esc and Ctrl-Enter.
9
+ */
10
+ export class CustomInputEditor implements Editor {
11
+ private _lastInputEvent?: JQuery.Event;
12
+ $input: any;
13
+ defaultValue: any;
14
+
15
+ constructor(private args: any) {
16
+ this.init();
17
+ }
18
+
19
+ /** Get Column Definition object */
20
+ get columnDef(): Column {
21
+ return this.args && this.args.column || {};
22
+ }
23
+
24
+ /** Get Column Editor object */
25
+ get columnEditor(): ColumnEditor {
26
+ return this.columnDef && this.columnDef.internalColumnEditor || {};
27
+ }
28
+
29
+ get hasAutoCommitEdit(): boolean {
30
+ return this.args.grid.getOptions().autoCommitEdit ?? false;
31
+ }
32
+
33
+ /** Get the Validator function, can be passed in Editor property or Column Definition */
34
+ get validator(): EditorValidator | undefined {
35
+ return this.columnEditor.validator || this.columnDef.validator;
36
+ }
37
+
38
+ init(): void {
39
+ const placeholder = this.columnEditor && this.columnEditor.placeholder || '';
40
+ const title = this.columnEditor && this.columnEditor.title || '';
41
+
42
+ this.$input = $(`<input type="text" class="editor-text" placeholder="${placeholder}" title="${title}" />`)
43
+ .appendTo(this.args.container)
44
+ .on('keydown.nav', (event: JQuery.Event) => {
45
+ this._lastInputEvent = event;
46
+ if (event.keyCode === KeyCode.LEFT || event.keyCode === KeyCode.RIGHT) {
47
+ event.stopImmediatePropagation();
48
+ }
49
+ });
50
+
51
+ // the lib does not get the focus out event for some reason
52
+ // so register it here
53
+ if (this.hasAutoCommitEdit) {
54
+ this.$input.on('focusout', () => this.save());
55
+ }
56
+
57
+ setTimeout(() => {
58
+ this.$input.focus().select();
59
+ }, 50);
60
+ }
61
+
62
+ destroy() {
63
+ this.$input.off('keydown.nav').remove();
64
+ }
65
+
66
+ focus() {
67
+ this.$input.focus();
68
+ }
69
+
70
+ getValue() {
71
+ return this.$input.val();
72
+ }
73
+
74
+ setValue(val: string) {
75
+ this.$input.val(val);
76
+ }
77
+
78
+ loadValue(item: any) {
79
+ this.defaultValue = item[this.args.column.field] || '';
80
+ this.$input.val(this.defaultValue);
81
+ this.$input[0].defaultValue = this.defaultValue;
82
+ this.$input.select();
83
+ }
84
+
85
+ serializeValue() {
86
+ return this.$input.val();
87
+ }
88
+
89
+ applyValue(item: any, state: any) {
90
+ const validation = this.validate(state);
91
+ item[this.args.column.field] = (validation && validation.valid) ? state : '';
92
+ }
93
+
94
+ isValueChanged() {
95
+ const lastEvent = this._lastInputEvent && this._lastInputEvent.keyCode;
96
+ if (this.columnEditor && this.columnEditor.alwaysSaveOnEnterKey && lastEvent === KeyCode.ENTER) {
97
+ return true;
98
+ }
99
+ return (!(this.$input.val() === '' && this.defaultValue === null)) && (this.$input.val() !== this.defaultValue);
100
+ }
101
+
102
+ save() {
103
+ const validation = this.validate();
104
+ if (validation && validation.valid) {
105
+ if (this.hasAutoCommitEdit) {
106
+ this.args.grid.getEditorLock().commitCurrentEdit();
107
+ } else {
108
+ this.args.commitChanges();
109
+ }
110
+ }
111
+ }
112
+
113
+ validate(inputValue?: any): EditorValidationResult {
114
+ if (this.validator) {
115
+ const value = (inputValue !== undefined) ? inputValue : this.$input && this.$input.val && this.$input.val();
116
+ return this.validator(value, this.args);
117
+ }
118
+
119
+ return {
120
+ valid: true,
121
+ msg: null
122
+ };
123
+ }
124
+ }
@@ -0,0 +1,142 @@
1
+ import {
2
+ Column,
3
+ ColumnFilter,
4
+ Filter,
5
+ FilterArguments,
6
+ FilterCallback,
7
+ GridOption,
8
+ OperatorType,
9
+ OperatorString,
10
+ SearchTerm,
11
+ SlickGrid,
12
+ } from './../modules/angular-slickgrid';
13
+
14
+ // using external non-typed js libraries
15
+ declare const $: any;
16
+
17
+ export class CustomInputFilter implements Filter {
18
+ private _clearFilterTriggered = false;
19
+ private _shouldTriggerQuery = true;
20
+ private $filterElm: any;
21
+ grid!: SlickGrid;
22
+ searchTerms: SearchTerm[] = [];
23
+ columnDef!: Column;
24
+ callback!: FilterCallback;
25
+ operator: OperatorType | OperatorString = OperatorType.equal;
26
+
27
+ constructor() { }
28
+
29
+ /** Getter for the Column Filter */
30
+ get columnFilter(): ColumnFilter {
31
+ return this.columnDef && this.columnDef.filter || {};
32
+ }
33
+
34
+ /** Getter for the Grid Options pulled through the Grid Object */
35
+ get gridOptions(): GridOption {
36
+ return this.grid?.getOptions?.() as GridOption;
37
+ }
38
+
39
+ /**
40
+ * Initialize the Filter
41
+ */
42
+ init(args: FilterArguments) {
43
+ this.grid = args.grid as SlickGrid;
44
+ this.callback = args.callback;
45
+ this.columnDef = args.columnDef;
46
+ this.searchTerms = (args.hasOwnProperty('searchTerms') ? args.searchTerms : []) || [];
47
+
48
+ // filter input can only have 1 search term, so we will use the 1st array index if it exist
49
+ const searchTerm = (Array.isArray(this.searchTerms) && this.searchTerms.length >= 0) ? this.searchTerms[0] : '';
50
+
51
+ // step 1, create HTML string template
52
+ const filterTemplate = this.buildTemplateHtmlString();
53
+
54
+ // step 2, create the DOM Element of the filter & initialize it if searchTerm is filled
55
+ this.$filterElm = this.createDomElement(filterTemplate, searchTerm);
56
+
57
+ // step 3, subscribe to the keyup event and run the callback when that happens
58
+ this.$filterElm.keyup((e: any) => {
59
+ let value = e && e.target && e.target.value || '';
60
+ const enableWhiteSpaceTrim = this.gridOptions.enableFilterTrimWhiteSpace || this.columnFilter.enableTrimWhiteSpace;
61
+ if (typeof value === 'string' && enableWhiteSpaceTrim) {
62
+ value = value.trim();
63
+ }
64
+
65
+ if (this._clearFilterTriggered) {
66
+ this.callback(e, { columnDef: this.columnDef, clearFilterTriggered: this._clearFilterTriggered, shouldTriggerQuery: this._shouldTriggerQuery });
67
+ this.$filterElm.removeClass('filled');
68
+ } else {
69
+ value === '' ? this.$filterElm.removeClass('filled') : this.$filterElm.addClass('filled');
70
+ this.callback(e, { columnDef: this.columnDef, searchTerms: [value], shouldTriggerQuery: this._shouldTriggerQuery });
71
+ }
72
+ // reset both flags for next use
73
+ this._clearFilterTriggered = false;
74
+ this._shouldTriggerQuery = true;
75
+ });
76
+ }
77
+
78
+ /**
79
+ * Clear the filter value
80
+ */
81
+ clear(shouldTriggerQuery = true) {
82
+ if (this.$filterElm) {
83
+ this._clearFilterTriggered = true;
84
+ this._shouldTriggerQuery = shouldTriggerQuery;
85
+ this.$filterElm.val('');
86
+ this.$filterElm.trigger('keyup');
87
+ }
88
+ }
89
+
90
+ /**
91
+ * destroy the filter
92
+ */
93
+ destroy() {
94
+ if (this.$filterElm) {
95
+ this.$filterElm.off('keyup').remove();
96
+ }
97
+ }
98
+
99
+ /** Set value(s) on the DOM element */
100
+ setValues(values: SearchTerm | SearchTerm[]) {
101
+ if (values) {
102
+ this.$filterElm.val(values);
103
+ }
104
+ }
105
+
106
+ //
107
+ // private functions
108
+ // ------------------
109
+
110
+ /**
111
+ * Create the HTML template as a string
112
+ */
113
+ private buildTemplateHtmlString() {
114
+ let placeholder = (this.gridOptions) ? (this.gridOptions.defaultFilterPlaceholder || '') : '';
115
+ if (this.columnFilter && this.columnFilter.placeholder) {
116
+ placeholder = this.columnFilter.placeholder;
117
+ }
118
+ return `<input type="text" class="form-control search-filter" placeholder="${placeholder}">`;
119
+ }
120
+
121
+ /**
122
+ * From the html template string, create a DOM element
123
+ * @param filterTemplate
124
+ */
125
+ private createDomElement(filterTemplate: string, searchTerm?: SearchTerm) {
126
+ const $headerElm = this.grid.getHeaderRowColumn(this.columnDef.id);
127
+ $($headerElm).empty();
128
+
129
+ // create the DOM element & add an ID and filter class
130
+ const $filterElm = $(filterTemplate);
131
+
132
+ $filterElm.val(searchTerm);
133
+ $filterElm.data('columnId', this.columnDef.id);
134
+
135
+ // append the new DOM element to the header row
136
+ if ($filterElm && typeof $filterElm.appendTo === 'function') {
137
+ $filterElm.appendTo($headerElm);
138
+ }
139
+
140
+ return $filterElm;
141
+ }
142
+ }
@@ -0,0 +1,8 @@
1
+ import { Component } from '@angular/core';
2
+
3
+ @Component({
4
+ template: `<b>{{item?.assignee?.name}}</b>`
5
+ })
6
+ export class CustomTitleFormatterComponent {
7
+ item: any;
8
+ }
@@ -0,0 +1,37 @@
1
+ import { Component } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+
4
+ // the appendTo="body" (necessary for SlickGrid filter) requires the body to be position relative like so
5
+ // <body style="position: relative">
6
+ @Component({
7
+ template: `
8
+ <ng-select class="no-style-select"
9
+ [items]="collection"
10
+ autofocus
11
+ bindValue="id"
12
+ bindLabel="name"
13
+ appendTo="body"
14
+ [clearable]="false"
15
+ (change)="onChange($event)"
16
+ [(ngModel)]="selectedId"
17
+ >
18
+ <ng-template ng-label-tmp ng-option-tmp let-item="item">
19
+ {{ item?.name }}
20
+ </ng-template>
21
+ </ng-select>`
22
+ })
23
+ export class EditorNgSelectComponent {
24
+ selectedId = '';
25
+ selectedItem: any;
26
+ collection?: any[]; // this will be filled by the collection of your column definition
27
+ onItemChanged = new Subject<any>(); // object
28
+
29
+ onChange(item: any) {
30
+ this.selectedItem = item;
31
+ this.onItemChanged.next(item);
32
+ }
33
+
34
+ focus() {
35
+ // do a focus
36
+ }
37
+ }
@@ -0,0 +1,32 @@
1
+ import { Component } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+
4
+ // the appendTo="body" (necessary for SlickGrid filter) requires the body to be position relative like so
5
+ // <body style="position: relative">
6
+ @Component({
7
+ template: `
8
+ <ng-select class="custom no-style-select"
9
+ [items]="collection"
10
+ bindValue="id"
11
+ bindLabel="name"
12
+ appendTo="body"
13
+ [clearable]="false"
14
+ (change)="onChange($event)"
15
+ [(ngModel)]="selectedId"
16
+ >
17
+ <ng-template ng-label-tmp ng-option-tmp let-item="item">
18
+ {{ item?.name }}
19
+ </ng-template>
20
+ </ng-select>`
21
+ })
22
+ export class FilterNgSelectComponent {
23
+ selectedId = '';
24
+ selectedItem: any;
25
+ collection?: any[]; // this will be filled by the collection of your column definition
26
+ onItemChanged = new Subject<any>(); // object
27
+
28
+ onChange(item: any) {
29
+ this.selectedItem = item;
30
+ this.onItemChanged.next(item);
31
+ }
32
+ }
@@ -0,0 +1,48 @@
1
+ <div id="demo-container" class="container-fluid">
2
+ <h2>
3
+ {{title}}
4
+ <span class="float-end">
5
+ <a style="font-size: 18px"
6
+ target="_blank"
7
+ href="https://github.com/ghiscoding/Angular-Slickgrid/blob/master/src/app/examples/grid-additem.component.ts">
8
+ <span class="fa fa-link"></span> code
9
+ </a>
10
+ </span>
11
+ </h2>
12
+ <div class="subtitle"
13
+ [innerHTML]="subTitle"></div>
14
+
15
+ <div class="col-sm-12">
16
+ <span>
17
+ <label>Scroll: </label>
18
+ <div class="btn-group" role="group">
19
+ <button class="btn btn-sm btn-outline-secondary" data-test="scroll-top-btn" (click)="scrollGridTop()">
20
+ <i class="fa fa-arrow-up"></i>
21
+ </button>
22
+ <button class="btn btn-sm btn-outline-secondary" data-test="scroll-bottom-btn" (click)="scrollGridBottom()">
23
+ <i class="fa fa-arrow-down"></i>
24
+ </button>
25
+ </div>
26
+ <button class="btn btn-sm btn-outline-secondary" data-test="add-new-item-top-btn"
27
+ (click)="addNewItem()">Add New Mocked Item</button>
28
+ <button class="btn btn-sm btn-outline-secondary" data-test="add-new-item-bottom-btn"
29
+ (click)="addNewItem('bottom')">Add New Mocked Item (bottom)</button>
30
+ <button class="btn btn-sm btn-outline-secondary" data-test="update-second-item-btn"
31
+ (click)="updateSecondItem()">Update 2nd Row Item with Random Duration</button>
32
+ <button class="btn btn-sm btn-outline-secondary" data-test="highlight-row5-btn"
33
+ (click)="highlighFifthRow()">Highlight 5th Row</button>
34
+ <button class="btn btn-sm btn-outline-secondary" data-test="highlight-duration40-btn"
35
+ (click)="changeDurationBackgroundColor()">Highlight Rows with Duration over 40</button>
36
+ </span>
37
+ <hr />
38
+ </div>
39
+
40
+ <div class="col-sm-12">
41
+ <angular-slickgrid gridId="grid11"
42
+ [columnDefinitions]="columnDefinitions"
43
+ [gridOptions]="gridOptions"
44
+ [dataset]="dataset"
45
+ (onAngularGridCreated)="angularGridReady($event.detail)">
46
+ </angular-slickgrid>
47
+ </div>
48
+ </div>