Skip to content

Commit 9a44225

Browse files
authored
feat(core): add loading spinner to AutoComplete Editor/Filter (#556)
* feat(filters): add loading spinner to AutoComplete Editor/Filter - add SASS styling to use the jQuery UI loading styling (internally jQuery UI will automatically add the CSS class "ui-autocomplete-loading" whenever processing) which shows up after few milliseconds (when using remote calls)
1 parent a8b9248 commit 9a44225

8 files changed

+531
-272
lines changed

src/app/modules/angular-slickgrid/editors/autoCompleteEditor.ts

+3
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,9 @@ export class AutoCompleteEditor implements Editor {
265265
}
266266
});
267267

268+
// add a <span> in order to add spinner styling
269+
$(`<span></span>`).appendTo(this.args.container);
270+
268271
// user might pass his own autocomplete options
269272
const autoCompleteOptions: AutocompleteOption = this.columnEditor.editorOptions;
270273

src/app/modules/angular-slickgrid/filters/autoCompleteFilter.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,12 @@ export class AutoCompleteFilter implements Filter {
368368

369369
// append the new DOM element to the header row
370370
if ($filterElm && typeof $filterElm.appendTo === 'function') {
371-
$filterElm.appendTo($headerElm);
371+
const $container = $(`<div class="autocomplete-container"></div>`);
372+
$container.appendTo($headerElm);
373+
$filterElm.appendTo($container);
374+
375+
// add a <span> in order to add spinner styling
376+
$(`<span></span>`).appendTo($container);
372377
}
373378

374379
return $filterElm;

src/app/modules/angular-slickgrid/styles/_variables.scss

+7-1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ $autocomplete-border-radius: 4px !default;
145145
$autocomplete-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175) !default;
146146
$autocomplete-hover-color: #262626 !default;
147147
$autocomplete-hover-bg-color: darken($row-mouse-hover-color, 3%) !default;
148+
$autocomplete-loading-icon: "\f021" !default;
149+
$autocomplete-loading-icon-color: $icon-color !default;
150+
$autocomplete-loading-icon-width: inherit !default;
151+
$autocomplete-loading-icon-margin-left: -16px !default;
152+
$autocomplete-loading-icon-line-height: 0px !default;
153+
$autocomplete-loading-icon-vertical-align: inherit !default;
148154
$autocomplete-max-height: 25vh !default;
149155
$autocomplete-min-height: 75px !default;
150156
$autocomplete-min-width: 50px !default;
@@ -363,7 +369,7 @@ $header-menu-button-border: $header-menu-border !default;
363369
$header-menu-button-border-width: 0px !default;
364370
$header-menu-button-height: 35px !default;
365371
$header-menu-button-icon: "\f13a" !default;
366-
$header-menu-button-icon-color: inherit !default;
372+
$header-menu-button-icon-color: $icon-color !default;
367373
$header-menu-button-icon-font-size: 14px !default;
368374
$header-menu-button-icon-font-weight: normal !default;
369375
$header-menu-button-icon-width: 14px !default;

src/app/modules/angular-slickgrid/styles/bootstrap-jquery-ui-autocomplete.scss

+22
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
// jQuery UI AutoComplete for Bootstrap
55
// ---------------------------------------------------------
66

7+
.autocomplete-container {
8+
display: flex;
9+
}
710
.ui-autocomplete {
811
position: absolute;
912
z-index: $autocomplete-z-index;
@@ -33,6 +36,25 @@
3336
}
3437
}
3538

39+
/* jquery ui loading spinner */
40+
@keyframes md-spin {
41+
0% { transform: rotate(0deg); }
42+
100% { transform: rotate(360deg); }
43+
}
44+
.ui-autocomplete-loading {
45+
& + span:after {
46+
animation: md-spin 2s infinite linear;
47+
display: inline-block;
48+
font-family: $icon-font-family;
49+
color: $autocomplete-loading-icon-color;
50+
content: $autocomplete-loading-icon !important; /* important is required to override default jquery-ui styling */
51+
width: $autocomplete-loading-icon-width;
52+
margin-left: $autocomplete-loading-icon-margin-left;
53+
line-height: $autocomplete-loading-icon-line-height;
54+
vertical-align: $autocomplete-loading-icon-vertical-align;
55+
}
56+
}
57+
3658
.ui-state-hover,
3759
.ui-state-active,
3860
.ui-state-focus {

src/app/modules/angular-slickgrid/styles/material-svg-icons.scss

+175-7
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
@-webkit-keyframes md-spin {
2+
0% { transform: rotate(0deg); }
3+
100% { transform: rotate(360deg); }
4+
}
5+
@keyframes md-spin {
6+
0% { transform: rotate(0deg); }
7+
100% { transform: rotate(360deg); }
8+
}
9+
@mixin md-icon-rotate($degrees, $rotation) {
10+
transform: rotate($degrees);
11+
}
12+
13+
.mdi {
14+
&.mdi-flip-h {
15+
transform: scaleX(-1);
16+
}
17+
&.mdi-flip-v {
18+
transform: scaleY(-1);
19+
}
20+
&.mdi-pulse {
21+
animation: md-spin 1s infinite steps(8);
22+
}
23+
&.mdi-spin {
24+
animation: md-spin 2s infinite linear;
25+
}
26+
&.mdi-rotate-45 { @include md-icon-rotate(45deg, 1); }
27+
&.mdi-rotate-90 { @include md-icon-rotate(90deg, 1); }
28+
&.mdi-rotate-135 { @include md-icon-rotate(135deg, 2); }
29+
&.mdi-rotate-180 { @include md-icon-rotate(180deg, 2); }
30+
&.mdi-rotate-220 { @include md-icon-rotate(220deg, 3); }
31+
&.mdi-rotate-270 { @include md-icon-rotate(270deg, 3); }
32+
&.mdi-rotate-315 { @include md-icon-rotate(315deg, 3); }
33+
&.mdi-rotate-45, .mdi-rotate-90, .mdi-rotate-135, .mdi-rotate-180, .mdi-rotate-220 .mdi-rotate-270, .mdi-rotate-315 {
34+
filter: none;
35+
}
36+
}

src/app/modules/angular-slickgrid/styles/slickgrid-theme-material.scss

+128-118
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)