web cleanup
This commit is contained in:
parent
87a3d72a33
commit
decb2c133b
1
.gitignore
vendored
1
.gitignore
vendored
@ -30,7 +30,6 @@
|
|||||||
!.gitkeep
|
!.gitkeep
|
||||||
*.iml
|
*.iml
|
||||||
|
|
||||||
|
|
||||||
# ember-try
|
# ember-try
|
||||||
.node_modules.ember-try/
|
.node_modules.ember-try/
|
||||||
bower.json.ember-try
|
bower.json.ember-try
|
||||||
|
2
server/.gitignore
vendored
2
server/.gitignore
vendored
@ -7,4 +7,6 @@ target/
|
|||||||
bin/
|
bin/
|
||||||
crm/src/main/resources/static/
|
crm/src/main/resources/static/
|
||||||
crm/src/main/resources/application.properties
|
crm/src/main/resources/application.properties
|
||||||
|
crm/src/main/resources/application.yml
|
||||||
crm/src/main/resources/log4j2.xml
|
crm/src/main/resources/log4j2.xml
|
||||||
|
crm/src/main/resources/logback.xml
|
||||||
|
@ -69,6 +69,11 @@ public class ExportTaskServiceSupport
|
|||||||
val exportFile = customerService.exportCSV(employeeKey);
|
val exportFile = customerService.exportCSV(employeeKey);
|
||||||
val distDir = new File(new File(exportLocation),
|
val distDir = new File(new File(exportLocation),
|
||||||
DateFormatUtils.format(now, "yyyyMMdd"));
|
DateFormatUtils.format(now, "yyyyMMdd"));
|
||||||
|
|
||||||
|
if (!distDir.exists()) {
|
||||||
|
distDir.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
FileUtils.moveFileToDirectory(exportFile, distDir, true);
|
FileUtils.moveFileToDirectory(exportFile, distDir, true);
|
||||||
exportTask.setStatus(EnumExportTaskStatus.DONE);
|
exportTask.setStatus(EnumExportTaskStatus.DONE);
|
||||||
exportTask.setLocation(new File(distDir, exportFile.getName()).getPath());
|
exportTask.setLocation(new File(distDir, exportFile.getName()).getPath());
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
server:
|
|
||||||
port: 8088
|
|
||||||
|
|
||||||
spring:
|
|
||||||
jackson:
|
|
||||||
default-property-inclusion: NON_NULL
|
|
||||||
time-zone: GMT+8
|
|
||||||
serialization:
|
|
||||||
write-dates-as-timestamps: true
|
|
||||||
fail-on-empty-beans: false
|
|
||||||
servlet:
|
|
||||||
multipart:
|
|
||||||
max-file-size: 512MB
|
|
||||||
max-request-size: 512MB
|
|
||||||
|
|
||||||
datasource:
|
|
||||||
database-name: ambition-crm
|
|
||||||
host: 172.16.4.6
|
|
||||||
password: MySQL2b||!2b
|
|
||||||
port: 3306
|
|
||||||
username: root
|
|
||||||
|
|
||||||
database:
|
|
||||||
backup-dir: d:/data/database_backups
|
|
||||||
restore-shell: /data/program/mysql-backup/bin/mysql_restore.sh
|
|
||||||
|
|
||||||
file:
|
|
||||||
base-dir: /Users/donghuang/Documents/Workspaces/ambition-crm/files/
|
|
||||||
base-path: http://127.0.0.1:1217/lm-f/
|
|
||||||
|
|
||||||
export:
|
|
||||||
location: d:/data/export
|
|
||||||
|
|
||||||
tigon:
|
|
||||||
shiro:
|
|
||||||
session:
|
|
||||||
validation:
|
|
||||||
scheduler:
|
|
||||||
enabled: true
|
|
||||||
filter-chain: >
|
|
||||||
/auth/login=anon
|
|
||||||
/=anon
|
|
||||||
/index.html=anon
|
|
||||||
/assets/**=anon
|
|
||||||
/f/**=anon
|
|
||||||
/**=user
|
|
@ -32,12 +32,13 @@ file:
|
|||||||
base-dir: /data/program/lemo-crm/files
|
base-dir: /data/program/lemo-crm/files
|
||||||
base-path: http://116.62.189.211/f/
|
base-path: http://116.62.189.211/f/
|
||||||
|
|
||||||
shiro:
|
tigon:
|
||||||
session:
|
shiro:
|
||||||
timeout: 21600000
|
session:
|
||||||
validation:
|
timeout: 21600000
|
||||||
scheduler:
|
validation:
|
||||||
enabled: true
|
scheduler:
|
||||||
|
enabled: true
|
||||||
filter-chain: >
|
filter-chain: >
|
||||||
/auth/login=anon
|
/auth/login=anon
|
||||||
/=anon
|
/=anon
|
||||||
|
@ -1,18 +1,47 @@
|
|||||||
datasource:
|
|
||||||
database-name: ambition_crm
|
|
||||||
host: 127.0.0.1
|
|
||||||
password: 696@2^~)oZ@^#*Q
|
|
||||||
port: 3306
|
|
||||||
username: root
|
|
||||||
server:
|
server:
|
||||||
port: 80
|
port: 8100
|
||||||
shiro:
|
|
||||||
session:
|
|
||||||
validation:
|
|
||||||
scheduler:
|
|
||||||
enabled: true
|
|
||||||
spring:
|
spring:
|
||||||
http:
|
http:
|
||||||
multipart:
|
multipart:
|
||||||
max-file-size: 1024MB
|
max-file-size: 1024MB
|
||||||
max-request-size: 1024MB
|
max-request-size: 1024MB
|
||||||
|
jackson:
|
||||||
|
default-property-inclusion: NON_NULL
|
||||||
|
time-zone: GMT+8
|
||||||
|
serialization:
|
||||||
|
write-dates-as-timestamps: true
|
||||||
|
fail-on-empty-beans: false
|
||||||
|
servlet:
|
||||||
|
multipart:
|
||||||
|
max-file-size: 1024MB
|
||||||
|
max-request-size: 1024MB
|
||||||
|
|
||||||
|
datasource:
|
||||||
|
database-name: ambition_crm
|
||||||
|
host: 127.0.0.1
|
||||||
|
password: 696@2^~)oZ@^#*Q
|
||||||
|
port: 3306
|
||||||
|
username: root
|
||||||
|
|
||||||
|
database:
|
||||||
|
backup-dir: /data/program/mysql-backup/backup/ambition_crm
|
||||||
|
restore-shell: /data/program/mysql-backup/bin/mysql-restore.sh
|
||||||
|
|
||||||
|
file:
|
||||||
|
base-dir: /data/program/lemo-crm/files
|
||||||
|
base-path: http://116.62.189.211/f/
|
||||||
|
|
||||||
|
shiro:
|
||||||
|
session:
|
||||||
|
timeout: 21600000
|
||||||
|
validation:
|
||||||
|
scheduler:
|
||||||
|
enabled: true
|
||||||
|
filter-chain: >
|
||||||
|
/auth/login=anon
|
||||||
|
/=anon
|
||||||
|
/index.html=anon
|
||||||
|
/assets/**=anon
|
||||||
|
/f/**=anon
|
||||||
|
/**=user
|
||||||
|
@ -409,11 +409,11 @@
|
|||||||
<directory>src/main/resources</directory>
|
<directory>src/main/resources</directory>
|
||||||
<filtering>false</filtering>
|
<filtering>false</filtering>
|
||||||
<excludes>
|
<excludes>
|
||||||
<exclude>config_*.properties</exclude>
|
<exclude>application*.properties</exclude>
|
||||||
<exclude>application_*.properties</exclude>
|
<exclude>application*.yaml</exclude>
|
||||||
<exclude>application_*.yaml</exclude>
|
<exclude>application*.yml</exclude>
|
||||||
<exclude>application_*.yml</exclude>
|
<exclude>log4j2*.xml</exclude>
|
||||||
<exclude>log4j2_*.xml</exclude>
|
<exclude>logback*.xml</exclude>
|
||||||
</excludes>
|
</excludes>
|
||||||
</resource>
|
</resource>
|
||||||
<resource>
|
<resource>
|
||||||
@ -425,11 +425,11 @@
|
|||||||
<include>**/*.txt</include>
|
<include>**/*.txt</include>
|
||||||
</includes>
|
</includes>
|
||||||
<excludes>
|
<excludes>
|
||||||
<exclude>config_*.properties</exclude>
|
<exclude>application*.properties</exclude>
|
||||||
<exclude>application_*.properties</exclude>
|
<exclude>application*.yaml</exclude>
|
||||||
<exclude>application_*.yaml</exclude>
|
<exclude>application*.yml</exclude>
|
||||||
<exclude>application_*.yml</exclude>
|
<exclude>log4j2*.xml</exclude>
|
||||||
<exclude>log4j2_*.xml</exclude>
|
<exclude>logback*.xml</exclude>
|
||||||
</excludes>
|
</excludes>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
classNames: ['checkbox']
|
classNames: ['checkbox']
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
classNames: ['container-fluid'],
|
classNames: ['container-fluid'],
|
||||||
errors: {},
|
errors: {},
|
||||||
model: {
|
model: {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
import { alias } from '@ember/object/computed';
|
import { alias } from '@ember/object/computed';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
tagName: 'span',
|
tagName: 'span',
|
||||||
value: alias('model'),
|
value: alias('model'),
|
||||||
format: 'YYYY-MM-DD H:mm:ss'
|
format: 'YYYY-MM-DD H:mm:ss'
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
classNames: ['page-content']
|
classNames: ['page-content']
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
tagName: 'span'
|
tagName: 'span'
|
||||||
});
|
});
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
classNames: ['widget-header'],
|
classNames: ['widget-header'],
|
||||||
dropdownMenu: true,
|
dropdownMenu: true,
|
||||||
'search-box': true
|
'search-box': true
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
|
import Component from '@ember/component';
|
||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
classNames: ['page-content', 'no-padding', 'desktop'],
|
classNames: ['page-content', 'no-padding', 'desktop'],
|
||||||
init() {
|
init() {
|
||||||
let me = this;
|
let me = this;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
step: 1,
|
step: 1,
|
||||||
value: 0,
|
value: 0,
|
||||||
classNames: ['ace-spinner', 'middle'],
|
classNames: ['ace-spinner', 'middle'],
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
classNames: ['page-content']
|
classNames: ['page-content']
|
||||||
});
|
});
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
});
|
});
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
});
|
});
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import Ember from 'ember';
|
import { computed } from '@ember/object'
|
||||||
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
classNames: ['form-group'],
|
classNames: ['form-group'],
|
||||||
optionsKeyMapping: {
|
optionsKeyMapping: {
|
||||||
dateAdded: 'model.dateAddedList',
|
dateAdded: 'model.dateAddedList',
|
||||||
@ -12,7 +13,7 @@ export default Ember.Component.extend({
|
|||||||
salesperson: 'model.salespersonList',
|
salesperson: 'model.salespersonList',
|
||||||
status: 'model.statusList'
|
status: 'model.statusList'
|
||||||
},
|
},
|
||||||
valOptions: Ember.computed('criterion.col', function() {
|
valOptions: computed('criterion.col', function() {
|
||||||
let me = this;
|
let me = this;
|
||||||
let optionsKey = me.get('optionsKeyMapping.' + me.get('criterion.col'));
|
let optionsKey = me.get('optionsKeyMapping.' + me.get('criterion.col'));
|
||||||
optionsKey && me.set('criterion.val', '');
|
optionsKey && me.set('criterion.val', '');
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Component.extend({
|
||||||
tagName: 'li',
|
tagName: 'li',
|
||||||
classNames: ['clearfix'],
|
classNames: ['clearfix'],
|
||||||
classNameBindings: ['selected:selected'],
|
classNameBindings: ['selected:selected'],
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import Ember from 'ember';
|
import { computed } from '@ember/object'
|
||||||
|
import Component from '@ember/component';
|
||||||
|
|
||||||
const WeekGoalCompletionRateComponent = Ember.Component.extend({
|
const WeekGoalCompletionRateComponent = Component.extend({
|
||||||
rate: Ember.computed('goal', 'goal.goal', 'goal.done', function() {
|
rate: computed('goal', 'goal.goal', 'goal.done', function() {
|
||||||
let me = this;
|
let me = this;
|
||||||
let goal = me.get('goal.goal');
|
let goal = me.get('goal.goal');
|
||||||
let done = me.get('goal.done');
|
let done = me.get('goal.done');
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
import Ember from 'ember';
|
import { computed } from '@ember/object'
|
||||||
|
import Component from '@ember/component';
|
||||||
|
|
||||||
const WeekGoalCompletionRateComponent = Ember.Component.extend({
|
const WeekGoalCompletionRateComponent = Component.extend({
|
||||||
tagName: '',
|
tagName: '',
|
||||||
'completed-icon': true,
|
'completed-icon': true,
|
||||||
'timeout-icon': true,
|
'timeout-icon': true,
|
||||||
completed: Ember.computed('goal', 'goal.goal', 'goal.done', function() {
|
completed: computed('goal', 'goal.goal', 'goal.done', function() {
|
||||||
let me = this;
|
let me = this;
|
||||||
return me.get('goal.goal') > 0 && me.get('goal.goal') == me.get('goal.done');
|
return me.get('goal.goal') > 0 && me.get('goal.goal') == me.get('goal.done');
|
||||||
}),
|
}),
|
||||||
rate: Ember.computed('goal', 'goal.goal', 'goal.done', function() {
|
rate: computed('goal', 'goal.goal', 'goal.done', function() {
|
||||||
let me = this;
|
let me = this;
|
||||||
let goal = me.get('goal.goal');
|
let goal = me.get('goal.goal');
|
||||||
let done = me.get('goal.done');
|
let done = me.get('goal.done');
|
||||||
|
@ -1,19 +1,20 @@
|
|||||||
import Ember from 'ember';
|
import { computed } from '@ember/object'
|
||||||
|
import Component from '@ember/component';
|
||||||
|
|
||||||
const WeekGoalTotalCompletionRateComponent = Ember.Component.extend({
|
const WeekGoalTotalCompletionRateComponent = Component.extend({
|
||||||
tagName: '',
|
tagName: '',
|
||||||
goals: [],
|
goals: [],
|
||||||
completed: Ember.computed('goals', 'goals.@each.goal', 'goals.@each.done', function() {
|
completed: computed('goals', 'goals.@each.goal', 'goals.@each.done', function() {
|
||||||
let me = this;
|
let me = this;
|
||||||
return me.get('goal') > 0 && me.get('goal') == me.get('done');
|
return me.get('goal') > 0 && me.get('goal') == me.get('done');
|
||||||
}),
|
}),
|
||||||
goal: Ember.computed('goals.@each.goal', function() {
|
goal: computed('goals.@each.goal', function() {
|
||||||
return this.get('goals').map(it => it.goal).reduce((pv, g) => pv + parseInt(g), 0);
|
return this.get('goals').map(it => it.goal).reduce((pv, g) => pv + parseInt(g), 0);
|
||||||
}),
|
}),
|
||||||
done: Ember.computed('goals.@each.done', function() {
|
done: computed('goals.@each.done', function() {
|
||||||
return this.get('goals').map(it => it.done).reduce((pv, g) => pv + parseInt(g), 0);
|
return this.get('goals').map(it => it.done).reduce((pv, g) => pv + parseInt(g), 0);
|
||||||
}),
|
}),
|
||||||
totalRate: Ember.computed('goal', 'done', function() {
|
totalRate: computed('goal', 'done', function() {
|
||||||
let me = this;
|
let me = this;
|
||||||
let goal = me.get('goal');
|
let goal = me.get('goal');
|
||||||
let done = me.get('done');
|
let done = me.get('done');
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import Ember from 'ember';
|
import { computed } from '@ember/object'
|
||||||
|
import Component from '@ember/component';
|
||||||
|
|
||||||
const WeekGoalTotalGoalComponent = Ember.Component.extend({
|
const WeekGoalTotalGoalComponent = Component.extend({
|
||||||
tagName: '',
|
tagName: '',
|
||||||
totalDone: Ember.computed('goals.@each.done', function() {
|
totalDone: computed('goals.@each.done', function() {
|
||||||
return this.get('goals').mapBy('done').reduce((pv, g) => pv + parseInt(g), 0);
|
return this.get('goals').mapBy('done').reduce((pv, g) => pv + parseInt(g), 0);
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import Ember from 'ember';
|
import { computed } from '@ember/object'
|
||||||
|
import Component from '@ember/component';
|
||||||
|
|
||||||
const WeekGoalTotalGoalComponent = Ember.Component.extend({
|
const WeekGoalTotalGoalComponent = Component.extend({
|
||||||
tagName: '',
|
tagName: '',
|
||||||
totalGoal: Ember.computed('goals.@each.goal', function() {
|
totalGoal: computed('goals.@each.goal', function() {
|
||||||
return this.get('goals').mapBy('goal').reduce((pv, g) => pv + parseInt(g), 0);
|
return this.get('goals').mapBy('goal').reduce((pv, g) => pv + parseInt(g), 0);
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import Ember from 'ember';
|
import Component from '@ember/component';
|
||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
export function initialize(/* appInstance */) {
|
export function initialize(/* appInstance */) {
|
||||||
$(function() {
|
$(function() {
|
||||||
@ -6,7 +6,7 @@ export function initialize(/* appInstance */) {
|
|||||||
'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><pre class="tooltip-inner"></pre></div>';
|
'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><pre class="tooltip-inner"></pre></div>';
|
||||||
});
|
});
|
||||||
|
|
||||||
Ember.Component.reopen({
|
Component.reopen({
|
||||||
didInsertElement() {
|
didInsertElement() {
|
||||||
let me = this;
|
let me = this;
|
||||||
me._super(...arguments);
|
me._super(...arguments);
|
||||||
@ -29,7 +29,7 @@ export function initialize(/* appInstance */) {
|
|||||||
$('[data-rel=tooltip]', me.element).tooltip();
|
$('[data-rel=tooltip]', me.element).tooltip();
|
||||||
}
|
}
|
||||||
catch(e) {
|
catch(e) {
|
||||||
Ember.Logger.warn('Init tooltip error caused', e);
|
console.warn('Init tooltip error caused', e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import Ember from 'ember';
|
|
||||||
import BaseService from '../service';
|
import BaseService from '../service';
|
||||||
|
|
||||||
export default BaseService.extend({
|
export default BaseService.extend({
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
<th>
|
<th>
|
||||||
File Downloaded
|
File Downloaded
|
||||||
</th>
|
</th>
|
||||||
|
<th>
|
||||||
|
Note
|
||||||
|
</th>
|
||||||
<th style="min-width: 106px;">
|
<th style="min-width: 106px;">
|
||||||
<i class="ace-icon fa fa-cogs bigger-110"></i>
|
<i class="ace-icon fa fa-cogs bigger-110"></i>
|
||||||
Actions
|
Actions
|
||||||
@ -46,12 +49,17 @@
|
|||||||
</span>
|
</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
{{it.note}}
|
||||||
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
|
{{#if (eq it.status 'DONE')}}
|
||||||
<a {{on 'click' (route-action 'download' it)}} target="_blank" href="/export-task/download?id={{it.id}}" class="btn btn-xs btn-info" data-rel="tooltip" title="Download">
|
<a {{on 'click' (route-action 'download' it)}} target="_blank" href="/export-task/download?id={{it.id}}" class="btn btn-xs btn-info" data-rel="tooltip" title="Download">
|
||||||
<i class="ace-icon fa fa-download bigger-120"></i>
|
<i class="ace-icon fa fa-download bigger-120"></i>
|
||||||
Download
|
Download
|
||||||
</a>
|
</a>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
"author": "Shaun Chyxion",
|
"author": "Shaun Chyxion",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ember/jquery": "1.1.0",
|
|
||||||
"@ember/optional-features": "^1.3.0",
|
"@ember/optional-features": "^1.3.0",
|
||||||
"@ember/test-helpers": "^2.8.1",
|
"@ember/test-helpers": "^2.8.1",
|
||||||
"bootbox": "5.1.3",
|
"bootbox": "5.1.3",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user