Skip to content

Commit 7b5201a

Browse files
committed
More WIP
1 parent e88b695 commit 7b5201a

57 files changed

Lines changed: 1584 additions & 2285 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/api-umbrella/admin-ui/app/components/api-users/record-form.js

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,20 +72,6 @@ export default class RecordForm extends Component.extend(Save) {
7272

7373
return message;
7474
},
75-
messageHide(model) {
76-
if(isNew && model.get('apiKey')) {
77-
return false;
78-
} else {
79-
return true;
80-
}
81-
},
82-
messageWidth(model) {
83-
if(isNew && model.get('apiKey')) {
84-
return '500px';
85-
} else {
86-
return undefined;
87-
}
88-
},
8975
});
9076
}
9177
}

src/api-umbrella/admin-ui/app/components/config/publish-form.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// eslint-disable-next-line ember/no-classic-components
22
import Component from '@ember/component';
33
import { action, computed } from '@ember/object';
4-
import { success } from '@pnotify/core';
4+
import { service } from '@ember/service';
55
import LoadingButton from 'api-umbrella-admin-ui/utils/loading-button';
66
import bootbox from 'bootbox';
77
import Diff from 'diff';
@@ -12,6 +12,8 @@ import $ from 'jquery';
1212
export default class PublishForm extends Component {
1313
tagName = '';
1414

15+
@service pendingFlashMessages;
16+
1517
@action
1618
didInsert(element) {
1719
this.publishButton = element.querySelector('.publish-button');
@@ -121,10 +123,11 @@ export default class PublishForm extends Component {
121123
data: form.serialize(),
122124
}).then(() => {
123125
LoadingButton.reset(this.publishButton);
124-
success({
126+
127+
this.pendingFlashMessages.add({
128+
type: 'success',
125129
title: 'Published',
126-
text: 'Successfully published the configuration<br>Changes should be live in a few seconds...',
127-
textTrusted: true,
130+
message: 'Successfully published the configuration<br>Changes should be live in a few seconds...',
128131
});
129132

130133
this.refreshCurrentRouteController();
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import Component from '@glimmer/component';
2+
import { service } from '@ember/service';
3+
4+
export default class FlashMessages extends Component {
5+
@service currentFlashMessages;
6+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import Component from '@glimmer/component';
2+
import { action } from '@ember/object';
3+
import { service } from '@ember/service';
4+
import { tracked } from '@glimmer/tracking';
5+
import {DragDropManager} from '@dnd-kit/dom';
6+
import {RestrictToVerticalAxis} from '@dnd-kit/abstract/modifiers';
7+
import {Sortable} from '@dnd-kit/dom/sortable';
8+
9+
export default class ReorderTable extends Component {
10+
@tracked isReordering = false;
11+
12+
constructor(owner, args) {
13+
super(...arguments);
14+
15+
// this.addObserver('args.collection', this, () => {
16+
// console.info('COLLECTION CHANGES');
17+
// });
18+
}
19+
20+
get isReorderable() {
21+
console.info('isReorderable');
22+
const length = this.args.collection.length;
23+
return (length > 1);
24+
}
25+
26+
@action
27+
toggleReordering() {
28+
this.isReordering = !this.isReordering;
29+
console.info('toggleReordering');
30+
const length = this.args.collection.length;
31+
console.info('length: ', length);
32+
33+
34+
const observer = new MutationObserver((mutationList) => {
35+
console.info('MUTATION: ', mutationList);
36+
console.info('MUTATION: ', mutationList[0]);
37+
});
38+
observer.observe(document.querySelector(`#${this.args.tableId} tbody`), {
39+
childList: true,
40+
});
41+
42+
this.makeSortable();
43+
}
44+
45+
makeSortable() {
46+
const container = document.getElementById(this.args.tableId);
47+
48+
if (this.isReordering) {
49+
container.classList.add('reorder-active');
50+
} else {
51+
container.classList.remove('reorder-active');
52+
}
53+
54+
const manager = new DragDropManager({
55+
modifiers: (defaults) => [...defaults, RestrictToVerticalAxis],
56+
});
57+
const tableRowEls = container.querySelectorAll('tbody tr');
58+
for (const [index, tableRowEl] of tableRowEls.entries()) {
59+
console.info(tableRowEl);
60+
const sortable = new Sortable({
61+
id: tableRowEl.dataset.guid,
62+
index,
63+
element: tableRowEl,
64+
handle: tableRowEl.querySelector('.reorder-handle'),
65+
}, manager);
66+
}
67+
}
68+
}

src/api-umbrella/admin-ui/app/components/stats/drilldown/results-table.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ export default class ResultsTable extends Component {
3030
render: (name, type, data) => {
3131
if(type === 'display' && name && name !== '-') {
3232
if(data.terminal) {
33-
return '<i class="far fa-file fa-fw me-1"></i>' + escape(name);
33+
return '<i class="far fa-file me-1"></i>' + escape(name);
3434
} else {
3535
let params = clone(this.presentQueryParamValues);
3636
params.prefix = data.descendent_prefix;
3737
let link = '#/stats/drilldown?' + $.param(params);
3838

39-
return '<a href="' + link + '"><i class="far fa-folder fa-fw me-1"></i>' + escape(name) + '</a>';
39+
return '<a href="' + link + '"><i class="far fa-folder me-1"></i>' + escape(name) + '</a>';
4040
}
4141
}
4242

src/api-umbrella/admin-ui/app/initializers/fontawesome.js

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,66 @@
1-
import { dom } from '@fortawesome/fontawesome-svg-core';
1+
import { config, dom, library } from '@fortawesome/fontawesome-svg-core';
2+
import '@fortawesome/fontawesome-svg-core/styles.css';
3+
import {
4+
faArrowDown,
5+
faArrowRight,
6+
faBars,
7+
faCalendar,
8+
faCaretDown,
9+
faCog,
10+
faGrip,
11+
faGripVertical,
12+
faLock,
13+
faMapMarkerAlt,
14+
faPencilAlt,
15+
faPlus,
16+
faPlusCircle,
17+
faQuestionCircle,
18+
faSignal,
19+
faSitemap,
20+
faSort,
21+
faSortDown,
22+
faSortUp,
23+
faSyncAlt,
24+
faTimes,
25+
faUpload,
26+
faUser,
27+
faUsers,
28+
} from '@fortawesome/free-solid-svg-icons';
29+
import {
30+
faFile,
31+
faFolder,
32+
} from '@fortawesome/free-regular-svg-icons';
33+
34+
config.autoAddCss = false;
35+
36+
library.add(
37+
faArrowDown,
38+
faArrowRight,
39+
faBars,
40+
faCalendar,
41+
faCaretDown,
42+
faCog,
43+
faFile,
44+
faFolder,
45+
faGrip,
46+
faGripVertical,
47+
faLock,
48+
faMapMarkerAlt,
49+
faPencilAlt,
50+
faPlus,
51+
faPlusCircle,
52+
faQuestionCircle,
53+
faSignal,
54+
faSitemap,
55+
faSort,
56+
faSortDown,
57+
faSortUp,
58+
faSyncAlt,
59+
faTimes,
60+
faUpload,
61+
faUser,
62+
faUsers,
63+
);
264

365
export function initialize() {
466
dom.watch();

src/api-umbrella/admin-ui/app/initializers/pnotify.js

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/api-umbrella/admin-ui/app/initializers/test-pnotify.js

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/api-umbrella/admin-ui/app/mixins/save.js

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import Mixin from '@ember/object/mixin'
2-
import { inject } from '@ember/service';
3-
import { success } from '@pnotify/core';
2+
import { inject as service } from '@ember/service';
43
import LoadingButton from 'api-umbrella-admin-ui/utils/loading-button';
54
import bootbox from 'bootbox';
65
import scrollTo from 'jquery.scrollto';
76
import isFunction from 'lodash-es/isFunction';
87

98
// eslint-disable-next-line ember/no-new-mixins
109
export default Mixin.create({
11-
router: inject(),
10+
router: service(),
11+
12+
pendingFlashMessages: service(),
1213

1314
scrollToErrors(button) {
1415
LoadingButton.reset(button);
@@ -17,12 +18,10 @@ export default Mixin.create({
1718

1819
afterSaveComplete(options, button) {
1920
LoadingButton.reset(button);
20-
success({
21-
title: 'Saved',
22-
text: (isFunction(options.message)) ? options.message(this.model) : options.message,
23-
hide: (isFunction(options.messageHide)) ? options.messageHide(this.model) : options.messageHide,
24-
width: (isFunction(options.messageWidth)) ? options.messageWidth(this.model) : options.messageWidth,
25-
textTrusted: true,
21+
22+
this.pendingFlashMessages.add({
23+
type: 'success',
24+
message: (isFunction(options.message)) ? options.message(this.model) : options.message,
2625
});
2726

2827
this.router.transitionTo(options.transitionToRoute);
@@ -72,10 +71,10 @@ export default Mixin.create({
7271
bootbox.confirm(options.prompt, (result) => {
7372
if(result) {
7473
this.model.destroyRecord().then(() => {
75-
success({
74+
this.pendingFlashMessages.add({
75+
type: 'success',
7676
title: 'Deleted',
77-
text: (isFunction(options.message)) ? options.message(this.model) : options.message,
78-
textTrusted: true,
77+
message: (isFunction(options.message)) ? options.message(this.model) : options.message,
7978
});
8079

8180
this.router.transitionTo(options.transitionToRoute);

src/api-umbrella/admin-ui/app/routes/application.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ export default class ApplicationRoute extends Route {
99

1010
@service busy;
1111

12+
@service currentFlashMessages;
13+
@service pendingFlashMessages;
14+
1215
async beforeModel() {
1316
await this.session.setup();
1417
}
@@ -59,6 +62,7 @@ export default class ApplicationRoute extends Route {
5962
@action
6063
refreshCurrentRoute() {
6164
this.refresh();
65+
window.scrollTo(0, 0);
6266
}
6367

6468
@action
@@ -79,4 +83,25 @@ export default class ApplicationRoute extends Route {
7983
return this.intermediateTransitionTo('error');
8084
}
8185
}
86+
87+
@action
88+
didTransition() {
89+
// On each route change, clear any currently visible flash messages, since
90+
// we only want the flash messages to be visible on one page, but not
91+
// persistent otherwise.
92+
this.currentFlashMessages.empty();
93+
94+
// Next, copy any "pending" flash messages that were set just before this
95+
// route change to the "current" messages to display. In this way, the
96+
// "pending" changes can be shown just once.
97+
for (const item of this.pendingFlashMessages.items) {
98+
this.currentFlashMessages.add(item);
99+
}
100+
101+
// Clear the pending messages that have now been copied for one-time
102+
// display to the current area.
103+
this.pendingFlashMessages.empty();
104+
105+
return true;
106+
}
82107
}

0 commit comments

Comments
 (0)