diff --git a/web/app/app.js b/web/app/app.js
index 010680e..ebed86a 100644
--- a/web/app/app.js
+++ b/web/app/app.js
@@ -2,6 +2,7 @@ import Ember from 'ember';
import Resolver from './resolver';
import loadInitializers from 'ember-load-initializers';
import config from './config/environment';
+import $ from 'jquery';
let App;
@@ -14,7 +15,7 @@ App = Ember.Application.extend({
});
if (config.environment === 'production') {
- Ember.$.ajaxSetup({
+ $.ajaxSetup({
beforeSend(jqXHR, opt) {
opt.url = '/crm-api/' + opt.url;
}
diff --git a/web/app/components/ace-login.js b/web/app/components/ace-login.js
index a6461ff..d4f034a 100644
--- a/web/app/components/ace-login.js
+++ b/web/app/components/ace-login.js
@@ -1,4 +1,5 @@
import Ember from 'ember';
+import $ from 'jquery';
export default Ember.Component.extend({
classNames: ['container-fluid'],
@@ -24,10 +25,10 @@ export default Ember.Component.extend({
didInsertElement() {
let me = this;
me._super(...arguments);
- Ember.$('body').removeClass().addClass('login-layout blur-login');
+ $('body').removeClass().addClass('login-layout blur-login');
},
willDestroy() {
- Ember.$('body').removeClass('login-layout blur-login').addClass('no-skin');
+ $('body').removeClass('login-layout blur-login').addClass('no-skin');
},
actions: {
login() {
@@ -35,14 +36,14 @@ export default Ember.Component.extend({
me.validate() || me.get('onLogin')(me.get('model'));
},
loginIdInsertNewline(loginId) {
- Ember.Logger.info('Login Id Insert Newline', loginId);
+ console.info('Login Id Insert Newline', loginId);
this.send('login');
},
loginIdKeyPress(loginId) {
loginId && this.set('errors.loginId', null);
},
passwordInsertNewline(password) {
- // Ember.Logger.info('Password Insert Newline', password);
+ // console.info('Password Insert Newline', password);
this.send('login');
},
passwordKeyPress(password) {
diff --git a/web/app/components/basic-component.js b/web/app/components/basic-component.js
new file mode 100644
index 0000000..58bb158
--- /dev/null
+++ b/web/app/components/basic-component.js
@@ -0,0 +1,61 @@
+import Component from '@ember/component';
+import { getOwner } from '@ember/application';
+import { inject as service } from '@ember/service';
+import { computed } from '@ember/object';
+import { alias } from '@ember/object/computed';
+
+export default Component.extend({
+ toolService: service('tool-service'),
+ routeName: alias('router.currentRouteName'),
+ 'trim-index': true,
+ route: computed('routeName', function() {
+ let me = this;
+ let routeName = me.get('routeName');
+ return me.getRoute(me.get('trim-index') ?
+ routeName.replace(/\.index$/, '') : routeName);
+ }),
+ service: computed('routeName', function() {
+ return this.getService();
+ }),
+ params: computed('router.location.lastSetURL', function() {
+ const me = this;
+ const routeName = me.get('routeName');
+ return me.getRouteParams(me.get('trim-index') ?
+ routeName.replace(/\.index$/, '') : routeName);
+ }),
+ getRouteParams(routeName) {
+ return this.get('route').paramsFor(routeName ||
+ this.get('trim-index') ?
+ this.get('routeName').replace(/\.index$/, '')
+ : this.get('routeName'));
+ },
+ getRoute(routeName) {
+ return getOwner(this).lookup(
+ 'route:' + (routeName || this.get('routeName')));
+ },
+ getParentRouteName(routeName) {
+ return routeName.replace(/\.[^.]+$/, '');
+ },
+ getService(name) {
+ const me = this;
+ return name ? me.get('toolService').getServiceByRouteName(name) :
+ me.getRoute().get('service') ||
+ me.get('toolService').getServiceByRouteName(me.get('routeName'));
+ },
+ didReceiveAttrs() {
+ const me = this;
+ me._super(...arguments);
+ me.get('model') ||
+ me.set('model', me.get('route.controller.model'));
+ },
+ getVal() {
+ const me = this;
+ const name = me.get('name');
+ return me.get(name ? 'model.' + name : '__value__');
+ },
+ setVal(val) {
+ const me = this;
+ const name = me.get('name');
+ me.set(name ? 'model.' + name : '__value__', val);
+ }
+});
diff --git a/web/app/components/breadcrumbs-bar.js b/web/app/components/breadcrumbs-bar.js
index 8e4dfc5..cc9fcf0 100644
--- a/web/app/components/breadcrumbs-bar.js
+++ b/web/app/components/breadcrumbs-bar.js
@@ -15,7 +15,7 @@ export default Ember.Component.extend(BaseComponentMixin, {
}
}
}
- Ember.Logger.info('Breadcrumbs: ', breadcrumbs);
+ console.info('Breadcrumbs: ', breadcrumbs);
return breadcrumbs;
}),
tabName: 'ul',
diff --git a/web/app/components/editable-cell.js b/web/app/components/editable-cell.js
index a591b50..bc232e6 100644
--- a/web/app/components/editable-cell.js
+++ b/web/app/components/editable-cell.js
@@ -1,5 +1,6 @@
import Ember from 'ember';
import BaseComponent from './base-component';
+import $ from 'jquery';
export default BaseComponent.extend({
'allow-blank': true,
@@ -10,17 +11,17 @@ export default BaseComponent.extend({
'on-updated': false,
actions: {
doEdit() {
- var me = this;
+ const me = this;
me.set('oldValue', me.getFieldValue());
me.set('isEditing', true)
Ember.run.later(() => {
- Ember.$('input[type="text"][name="' + me.get('model.id') + '"]').focus();
+ $('input[type="text"][name="' + me.get('model.id') + '"]', me.element).focus();
}, 320);
},
doUpdate() {
let me = this;
if (me.get('isUpdating')) {
- Ember.Logger.info('Cell Is Updating, Ignore.');
+ console.info('Cell Is Updating, Ignore.');
return;
}
me.set('isUpdating', true);
@@ -49,7 +50,7 @@ export default BaseComponent.extend({
}
}
else {
- Ember.Logger.info('Editable cell field value not changed.')
+ console.info('Editable cell field value not changed.')
me.set('isUpdating', false);
}
me.set('isEditing', false);
diff --git a/web/app/components/file-input.js b/web/app/components/file-input.js
index 6e1391e..1e63c6d 100644
--- a/web/app/components/file-input.js
+++ b/web/app/components/file-input.js
@@ -1,6 +1,7 @@
import Ember from 'ember';
import Component from '@ember/component';
import { computed } from '@ember/object';
+import $ from 'jquery'
export default Component.extend({
file: {},
@@ -15,7 +16,7 @@ export default Component.extend({
let me = this;
me._super(...arguments);
- me.$('input[type=file]').ace_file_input({
+ $('input[type=file]', me.element).ace_file_input({
no_file: me.get('no-file'),
btn_choose: me.get('btn-choose'),
btn_change: null,
@@ -28,17 +29,16 @@ export default Component.extend({
// allowMime: ['image/jpg', 'image/jpeg', 'image/png', 'image/gif'],
before_change: function() {
- let filename = me.$(this).val();
+ const filename = $(this).val();
me.set('value', filename);
return true;
},
before_remove: function() {
- let filename = me.$(this).val();
me.set('value', null);
return true;
}
}).on('file.error.ace', function(e, info) {
- if (me.$(this)[0] === e.target) {
+ if ($(this)[0] === e.target) {
if (info.error_count['ext'] > 0 || info.error_count['mime'] > 0) {
me.get('message').warn('Invalid file');
}
diff --git a/web/app/components/form-field.js b/web/app/components/form-field.js
new file mode 100644
index 0000000..82ea3ca
--- /dev/null
+++ b/web/app/components/form-field.js
@@ -0,0 +1,17 @@
+import BasicComponent from './basic-component';
+import { computed } from '@ember/object';
+import { alias } from '@ember/object/computed';
+
+export default BasicComponent.extend({
+ 'col-width': 6,
+ classNames: ['form-group'],
+ classNameBindings: ['has-error:has-error'],
+ errors: alias('route.controller.errors'),
+ 'has-error': computed('errors', function() {
+ return this.get('errors.' + this.get('name'));
+ }),
+ hasError: alias('has-error'),
+ 'error-msg': true,
+ 'label-class': 'col-xs-12 col-sm-3 col-md-3',
+ 'input-class': 'col-xs-12 col-sm-5 col-md-5'
+});
diff --git a/web/app/components/form-footer-buttons.js b/web/app/components/form-footer-buttons.js
index e7adc1c..7deaf36 100644
--- a/web/app/components/form-footer-buttons.js
+++ b/web/app/components/form-footer-buttons.js
@@ -2,6 +2,7 @@ import Ember from 'ember';
import BaseComponent from './base-component';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';
+import $ from 'jquery'
export default BaseComponent.extend({
classNames: ['wizard-actions'],
@@ -60,7 +61,7 @@ export default BaseComponent.extend({
if (!me.validate()) {
me.dialog.confirm('Are you sure to submit?', () => {
me.postData().then((m) => {
- Ember.Logger.info('Post Model Result: ', m);
+ console.info('Post Model Result: ', m);
// write back
Ember.setProperties(me.getModel(), m);
me.alertMessage();
@@ -83,7 +84,7 @@ export default BaseComponent.extend({
postData() {
let me = this;
let data = me.get('form') ?
- new FormData(me.$().closest('form')[0]) :
+ new FormData($(me.element).closest('form')[0]) :
me.getModel();
let postUrl = me.get('postUrl');
if (postUrl) {
diff --git a/web/app/components/form-input-color.js b/web/app/components/form-input-color.js
index f849b5b..f33aeaf 100644
--- a/web/app/components/form-input-color.js
+++ b/web/app/components/form-input-color.js
@@ -1,5 +1,6 @@
import Ember from 'ember';
import BaseFormInput from './base-form-input';
+import $ from 'jquery'
export default BaseFormInput.extend({
classNames: ['form-group'],
@@ -41,7 +42,7 @@ export default BaseFormInput.extend({
if (hexColor && (hexColor = hexColor.trim())) {
let rgb = me.hexToRgb(hexColor);
if (rgb) {
- Ember.Logger.info('Hex Color Changed.', rgb);
+ console.info('Hex Color Changed.', rgb);
me.set('lockColor', true);
me.set(me.getFieldPath(), `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 1)`);
me.set('lockColor', false);
@@ -53,7 +54,7 @@ export default BaseFormInput.extend({
return 'model.' + this.get('name');
},
getInputEl() {
- return this.$('.colorpicker-component');
+ return $('.colorpicker-component', this.element);
},
rgbaRegex: /\s*rgba\s*\(\s*([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*,\s*([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*,\s*([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*,\s*(0(?:\.\d+)?|1(?:\.0+)?)\s*\)\s*/i,
rgbaStr2hex(rgba) {
diff --git a/web/app/components/form-input-select.js b/web/app/components/form-input-select.js
index 3b7f8e9..efa43ae 100644
--- a/web/app/components/form-input-select.js
+++ b/web/app/components/form-input-select.js
@@ -1,13 +1,25 @@
-import Ember from 'ember';
-import BaseFormInput from './base-form-input';
+import BaseFormInput from './form-field';
+import { computed } from '@ember/object';
export default BaseFormInput.extend({
- classNames: ['form-group'],
- classNameBindings: ['hasError:has-error'],
- actions: {
- onOptionChanged(val) {
- let me = this;
- me.setVal(val);
+ options: [],
+ 'value-field': 'value',
+ 'text-field': 'text',
+ 'enabled-field': null,
+ 'hidden-input': true,
+ loose: true,
+ 'fire-init-change': true,
+ 'values-as-string': true,
+ 'values-splitter': ',',
+ 'col-width': computed('multiple', {
+ get() {
+ if (this._col_width) {
+ return this._col_width;
+ }
+ return this.get('multiple') ? 12 : 7;
+ },
+ set(key, value) {
+ return this._col_width = value;
}
- }
+ })
});
diff --git a/web/app/components/form-input-select2.js b/web/app/components/form-input-select2.js
deleted file mode 100644
index 4dc6c6b..0000000
--- a/web/app/components/form-input-select2.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import BaseFormInput from './base-form-input';
-import { set, observer } from '@ember/object'
-import { isNone } from '@ember/utils'
-import { uniqBy } from '@ember/object/computed';
-import { isArray } from '@ember/array';
-
-export default BaseFormInput.extend({
- classNames: ['form-group'],
- classNameBindings: ['hasError:has-error'],
- uniqueSelected: uniqBy('options', 'selected'),
- 'value-field': 'value',
- 'text-field': 'text',
- onSelectionChanged: observer('options.@each.selected', function() {
- const me = this;
- const options = me.get('options');
- me.setVal(me.getSelected());
- const onChange = me.get('on-change');
- onChange && onChange(me.getVal(), options);
- }),
- didReceiveAttrs() {
- const me = this;
- me._super(...arguments);
- isNone(me.get('options')) && me.set('options', []);
- },
- didInsertElement() {
- const me = this;
- me._super(...arguments);
- me.prependEmpty();
- me.initSelect();
-
- me.$('select.select2').select2({
- allowClear: me.get('nullable'),
- placeholder: me.get('placeholder') || me.get('label') || 'Please select...'
- }).on('change', function(e) {
- console.log('select2 change: ', e);
- if (e.removed) {
- me.unselect(me.findOption(e.removed.id));
- }
- if (e.added) {
- me.select(me.findOption(e.added.id));
- }
- });
- },
- didUpdate() {
- const me = this;
- me._super(...arguments);
- me.prependEmpty();
- me.$('select.select2').select2('val', me.getSelected());
- },
- prependEmpty() {
- const me = this;
- // prepend empty object for nullable
- if (me.get('nullable')) {
- const firstObject = me.get('options.firstObject');
- if (firstObject
- && firstObject[me.get('value-field')]
- && firstObject[me.get('text-field')]) {
- me.get('options').unshiftObject({});
- }
- }
- },
- initSelect() {
- const me = this;
- // init select
- if (me.get('multiple')) {
- const vals = me.getVal();
- if (isArray(vals)) {
- vals.forEach(v => me.select(me.findOption(v)));
- }
- else {
- me.setVal(me.getSelected());
- }
- }
- else {
- const val = me.getVal();
- if (!isNone(val)) {
- me.select(me.findOption(val));
- }
- else {
- const selected = me.get('options').find(o => o.selected);
- if (selected) {
- me.setVal(selected[me.get('value-field')]);
- }
- else {
- me.select(me.get('options.firstObject'))
- }
- }
- }
- },
- findOption(val) {
- const me = this;
- // val may empty of nullable option
- return val ? me.get('options').find(op => op[me.get('value-field')] == val)
- : me.get('options.firstObject');
- },
- select(op) {
- op && set(op, 'selected', true);
- },
- unselect(op) {
- op && set(op, 'selected', false);
- },
- getSelected() {
- const me = this;
- const selected = me.get('options').filter(o => o.selected).mapBy(me.get('value-field'));
- return selected.length > 1 ? selected : selected.length == 1 ? selected[0] : null;
- }
-});
diff --git a/web/app/components/form-input-spinner.js b/web/app/components/form-input-spinner.js
index 146e982..c24996b 100644
--- a/web/app/components/form-input-spinner.js
+++ b/web/app/components/form-input-spinner.js
@@ -1,5 +1,5 @@
-import Ember from 'ember';
import BaseFormInput from './base-form-input';
+import $ from 'jquery'
export default BaseFormInput.extend({
classNames: ['form-group'],
@@ -12,7 +12,7 @@ export default BaseFormInput.extend({
},
didInsertElement() {
let me = this;
- me.$('input[type=text]').ace_spinner({
+ $('input[type=text]', me.element).ace_spinner({
value: me.getVal(),
min: me.get('min'),
max: me.get('max'),
@@ -21,7 +21,7 @@ export default BaseFormInput.extend({
btn_down_class: 'btn-info'})
.closest('.ace-spinner')
.on('changed.fu.spinbox', function() {
- me.setVal(me.$('input[type=text]').val());
+ me.setVal($('input[type=text]', me.element).val());
});
}
});
diff --git a/web/app/components/form-input.js b/web/app/components/form-input.js
index 6d473bf..990fde6 100644
--- a/web/app/components/form-input.js
+++ b/web/app/components/form-input.js
@@ -1,5 +1,6 @@
import Ember from 'ember';
import BaseFormInput from './base-form-input';
+import $ from 'jquery';
export default BaseFormInput.extend({
classNames: ['form-group'],
@@ -27,20 +28,20 @@ export default BaseFormInput.extend({
let me = this;
me._super(...arguments);
me.get('type') === 'file' &&
- me.$('input[type=file]').ace_file_input({
+ $('input[type=file]', me.element).ace_file_input({
no_file: 'No File Choosed...',
btn_choose: 'Choose',
btn_change: 'Change',
droppable: true,
before_change: function() {
- let filename = Ember.$(this).val();
- Ember.Logger.info('Before File [' + filename + '] Changed.');
+ const filename = $(this.element).val();
+ console.info('Before File [' + filename + '] Changed.');
me.setFilename(filename);
return true;
},
before_remove: function() {
- let filename = Ember.$(this).val();
- Ember.Logger.info('Before File [' + filename + '] Removed.');
+ const filename = $(this.element).val();
+ console.info('Before File [' + filename + '] Removed.');
me.setFilename(null);
return true;
},
diff --git a/web/app/components/home-board.js b/web/app/components/home-board.js
index 52bb342..33f867b 100644
--- a/web/app/components/home-board.js
+++ b/web/app/components/home-board.js
@@ -1,11 +1,12 @@
import Ember from 'ember';
+import $ from 'jquery';
export default Ember.Component.extend({
classNames: ['page-content', 'no-padding', 'desktop'],
init() {
let me = this;
me._super(...arguments);
- Ember.$(window).on('resize', Ember.run.bind(me, me.onWindowResize));
+ $(window).on('resize', Ember.run.bind(me, me.onWindowResize));
},
didInsertElement() {
let me = this;
@@ -13,6 +14,6 @@ export default Ember.Component.extend({
me.onWindowResize();
},
onWindowResize() {
- this.$().height(Ember.$(window).height() - 86 - 60);
+ $(this.element).height($(window).height() - 86 - 60);
}
});
diff --git a/web/app/components/image-input.js b/web/app/components/image-input.js
index 0a3e6b8..a0d08b3 100644
--- a/web/app/components/image-input.js
+++ b/web/app/components/image-input.js
@@ -1,6 +1,6 @@
-import Ember from 'ember';
import Component from '@ember/component';
import { computed } from '@ember/object';
+import $ from 'jquery'
export default Component.extend({
image: {},
@@ -13,7 +13,7 @@ export default Component.extend({
let me = this;
me._super(...arguments);
- me.$('input[type=file]').ace_file_input({
+ $('input[type=file]', me.element).ace_file_input({
no_file: 'Choose Image',
btn_choose: 'Choose Image',
btn_change: null,
@@ -26,19 +26,19 @@ export default Component.extend({
allowMime: ['image/jpg', 'image/jpeg', 'image/png', 'image/gif'],
before_change: function() {
- let filename = me.$(this).val();
- Ember.Logger.info('Before image [' + filename + '] changed.');
+ let filename = $(this).val();
+ console.info('Before image [' + filename + '] changed.');
me.set('value', filename);
return true;
},
before_remove: function() {
- let filename = me.$(this).val();
- Ember.Logger.info('Before image [' + filename + '] removed.');
+ let filename = $(this).val();
+ console.info('Before image [' + filename + '] removed.');
me.set('value', null);
return true;
}
}).on('file.error.ace', function(e, info) {
- if (me.$(this)[0] === e.target) {
+ if ($(this)[0] === e.target) {
if (info.error_count['ext'] > 0 || info.error_count['mime'] > 0) {
me.get('message').warn('Invalid image');
}
diff --git a/web/app/components/image-previews.js b/web/app/components/image-previews.js
index d180e02..0d23ef8 100644
--- a/web/app/components/image-previews.js
+++ b/web/app/components/image-previews.js
@@ -15,7 +15,7 @@ export default Component.extend({
didReceiveAttrs() {
let me = this;
let images = me.get('images');
- if (Ember.$.type(images) === 'string') {
+ if ($.type(images) === 'string') {
let sep = me.get('separator');
me.set('images', sep ? images.split(sep) : [images]);
}
@@ -26,7 +26,7 @@ export default Component.extend({
let rel = me.get('elementId') + '_preview';
let $overflow = '';
- me.$('a[data-rel="' + rel + '"]').colorbox({
+ $('a[data-rel="' + rel + '"]', me.element).colorbox({
rel: rel,
reposition: true,
// scalePhotos: true,
@@ -46,7 +46,7 @@ export default Component.extend({
document.body.style.overflow = $overflow;
},
onComplete: function() {
- Ember.$.colorbox.resize();
+ $.colorbox.resize();
}
});
diff --git a/web/app/components/input-select.js b/web/app/components/input-select.js
new file mode 100644
index 0000000..bd1de56
--- /dev/null
+++ b/web/app/components/input-select.js
@@ -0,0 +1,150 @@
+import BasicComponent from './basic-component';
+import { observer } from '@ember/object';
+import { A } from '@ember/array';
+import $ from 'jquery';
+
+export default BasicComponent.extend({
+ tagName: 'x-fake-el',
+ options: [],
+ 'value-field': 'value',
+ 'text-field': 'text',
+ 'enabled-field': null,
+ 'hidden-input': true,
+ loose: true,
+ 'fire-init-change': true,
+ 'values-as-string': true,
+ 'values-splitter': ',',
+ didReceiveAttrs() {
+ const me = this;
+ me._super(...arguments);
+
+ // select first
+ if (!me.get('multiple') &&
+ !me.get('nullable')) {
+ const options = me.get('options');
+ if (options && options.length) {
+ const val = me._getVal();
+ // no val or val not in options
+ if (!val || !options.any(o => me.opEq(o, val))) {
+ me._setVal(me.getOpVal(options[0]));
+ }
+ }
+ }
+ },
+ didInsertElement() {
+ const me = this;
+ me._super(...arguments);
+
+ $(me.element).children('select.select2').select2({
+ multiple: me.get('multiple'),
+ disabled: me.get('readonly'),
+ allowClear: me.get('nullable'),
+ placeholder: me.get('placeholder') ||
+ me.get('label') || 'Please select...',
+ templateResult: me.get('tplResult'),
+ templateSelection: me.get('tplSelection')
+ }).on('change', function(e) {
+ console.log('selection change: ', e);
+ const selected = $(this).select2('data');
+ if (me.get('multiple')) {
+ me._setVal(selected ? selected.map(o => o.id) : []);
+ }
+ else {
+ const o = selected ? selected[0] : null;
+ me._setVal(o ? o.id : null);
+ }
+ me.notifyChange();
+ })
+ // init val, trigger change required
+ .val(me._getVal()).trigger('change');
+
+ if (me.get('fire-init-change')) {
+ me.notifyChange();
+ }
+ },
+ optionsChanged: observer('options', function() {
+ const me = this;
+ me.set('optionsUpdated', true);
+ }),
+ didUpdate() {
+ const me = this;
+ me._super(...arguments);
+
+ if (me.get('optionsUpdated')) {
+ me.set('optionsUpdated', false);
+ const options = me.get('options');
+ const jqEl = $(me.element).children('select.select2');
+ if (me.get('multiple')) {
+ me._setVal([]);
+ // clear selection
+ jqEl.val(null).trigger('change');
+ }
+ else {
+ const val = me._getVal();
+ // reset old val
+ if (val && me.findOption(val)) {
+ jqEl.val(val).trigger('change');
+ }
+ else {
+ const firstOption = options[0];
+ if (firstOption && !me.get('nullable')) {
+ me._setVal(me.getOptVal(firstOption));
+ jqEl.val(val).trigger('change');
+ }
+ else {
+ me._setVal(null);
+ jqEl.val(null).trigger('change');
+ }
+ }
+ }
+ }
+ },
+ findOption(val) {
+ const me = this;
+ return me.get('options').find(op => me.opEq(op, val));
+ },
+ notifyChange() {
+ const me = this;
+ const options = me.get('options');
+ const onChange = me.get('on-change');
+ onChange && onChange(me._getVal(), options);
+ },
+ _getVal() {
+ const me = this;
+ const val = me.getVal();
+ if (me.get('multiple')
+ && typeof val === 'string'
+ && me.get('values-as-string')) {
+ return A(val ? val.split(me.get('values-splitter')) : []);
+ }
+ return val;
+ },
+ _setVal(val) {
+ const me = this;
+ me.setVal(me.get('multiple')
+ && me.get('values-as-string') ?
+ (val.length ? val.join(me.get('values-splitter')) : null) :
+ val);
+ },
+ isPlainVal(val) {
+ return typeof val === 'string' ||
+ typeof val === 'number' ||
+ typeof val === 'boolean' ||
+ (
+ (!!val && typeof val === 'object') &&
+ ['[object String]',
+ '[object Number]',
+ '[object Boolean]'
+ ].includes(Object.prototype.toString.call(val))
+ )
+ },
+ getOpVal(op) {
+ const me = this;
+ return me.isPlainVal(op) ? op : op[me.get('value-field')];
+ },
+ opEq(op, val) {
+ const me = this;
+ let opv = me.getOpVal(op);
+ return me.get('loose') ? opv == val : opv === val;
+ }
+});
diff --git a/web/app/components/input-spinner.js b/web/app/components/input-spinner.js
index 759dbd6..09b4712 100644
--- a/web/app/components/input-spinner.js
+++ b/web/app/components/input-spinner.js
@@ -9,7 +9,7 @@ export default Ember.Component.extend({
let me = this;
let max = me.get('max');
if (!Ember.isNone(max) && me.get('value') == max) {
- Ember.Logger.info('Spinner increase to max: ', max);
+ console.info('Spinner increase to max: ', max);
return;
}
this.incrementProperty('value');
@@ -18,7 +18,7 @@ export default Ember.Component.extend({
let me = this;
let min = me.get('min');
if (!Ember.isNone(min) && me.get('value') == min) {
- Ember.Logger.info('Spinner decrease to min: ', min);
+ console.info('Spinner decrease to min: ', min);
return;
}
this.decrementProperty('value');
diff --git a/web/app/components/issue-cell.js b/web/app/components/issue-cell.js
index fa89db3..7ba0297 100644
--- a/web/app/components/issue-cell.js
+++ b/web/app/components/issue-cell.js
@@ -1,18 +1,19 @@
-import Ember from 'ember';
+import Component from '@ember/component';
+import $ from 'jquery'
-export default Ember.Component.extend({
+export default Component.extend({
classNames: ['issue-cell'],
didReceiveAttrs() {
- let me = this;
+ const me = this;
me._super(...arguments);
const issue = me.get('issue').replace(/\r?\n/g, '
');
me.set('issuePopover', issue);
me.set('issueHtml', Ember.String.htmlSafe(issue));
},
didInsertElement() {
- let me = this;
+ const me = this;
me._super(...arguments);
- me.$('[data-rel=popover]').popover({
+ $('[data-rel=popover]', me.element).popover({
html: true,
trigger: 'hover',
delay: { show: 300, hide: 100 }
diff --git a/web/app/components/main-container.js b/web/app/components/main-container.js
index 6435f21..96a40b2 100644
--- a/web/app/components/main-container.js
+++ b/web/app/components/main-container.js
@@ -1,13 +1,14 @@
-import Ember from 'ember';
+import Component from '@ember/component';
+import $ from 'jquery'
-export default Ember.Component.extend({
+export default Component.extend({
elementId: 'main-container',
classNames: ['main-container'],
sidebarCollapsed: false,
didInsertElement() {
let me = this;
me._super(...arguments);
- // Ember.$('body').removeClass().addClass('login-layout blur-login');
+ // $('body').removeClass().addClass('login-layout blur-login');
(function($) {
basics();
enableSidebar();
@@ -427,6 +428,6 @@ export default Ember.Component.extend({
}
}
- })(Ember.$); //jQuery document ready
+ })($); //jQuery document ready
},
});
diff --git a/web/app/components/modal-dialog.js b/web/app/components/modal-dialog.js
index 570e080..b50cf05 100644
--- a/web/app/components/modal-dialog.js
+++ b/web/app/components/modal-dialog.js
@@ -1,5 +1,6 @@
import Component from '@ember/component'
import BaseComponentMixin from '../mixins/components/base-component';
+import $ from 'jquery'
export default Component.extend(BaseComponentMixin, {
classNames: ['modal', 'fade'],
@@ -12,11 +13,11 @@ export default Component.extend(BaseComponentMixin, {
let me = this;
me._super(...arguments);
if (me.get('init-modal')) {
- me.$().modal({
+ $(me.element).modal({
backdrop: me.get('backdrop'),
keyboard: me.get('keyboard')
}).on('hidden.bs.modal', ()=> {
- me.$() && me.get('close-to-parent') &&
+ $(me.element) && me.get('close-to-parent') &&
me.get('router').transitionTo(
me.get('parentRouteName') ||
me.get('routeName').replace(/\.[^.]+$/, ''));
@@ -29,6 +30,6 @@ export default Component.extend(BaseComponentMixin, {
}
},
willDestroyElement() {
- this.$().modal('hide');
+ $(this.element).modal('hide');
}
});
diff --git a/web/app/components/pagination-bar.js b/web/app/components/pagination-bar.js
index c8f02b0..3af7aa3 100644
--- a/web/app/components/pagination-bar.js
+++ b/web/app/components/pagination-bar.js
@@ -16,7 +16,7 @@ export default BaseComponent.extend({
currPage: computed('params.page', function() {
let me = this;
let currPage = parseInt(me.get('params.page'));
- Ember.Logger.info('Get current page [' + currPage + ']');
+ console.info('Get current page [' + currPage + ']');
return currPage;
}),
pages: computed('total', function() {
@@ -77,7 +77,7 @@ export default BaseComponent.extend({
let me = this;
let router = me.get('router');
let params = me.get('params');
- Ember.Logger.info('Go to page [' + page + '], params: ', params);
+ console.info('Go to page [' + page + '], params: ', params);
router.transitionTo(me.get('routeName'), page, {queryParams: params});
}
}
diff --git a/web/app/components/qr-code.js b/web/app/components/qr-code.js
index 2738ca0..b586e11 100644
--- a/web/app/components/qr-code.js
+++ b/web/app/components/qr-code.js
@@ -1,6 +1,7 @@
-import Ember from 'ember';
+import Component from '@ember/component';
+import $ from 'jquery'
-export default Ember.Component.extend({
+export default Component.extend({
classNames: ['btn-group'],
didReceiveAttrs() {
let me = this;
@@ -13,7 +14,7 @@ export default Ember.Component.extend({
}
// let label = me.get('label');
let label = null;
- me.set('qrConfigMerged', Ember.$.extend({
+ me.set('qrConfigMerged', $.extend({
// render method: 'canvas', 'image' or 'div'
render: 'canvas',
@@ -74,6 +75,6 @@ export default Ember.Component.extend({
}
},
renderQrCode() {
- this.$('.qr-code').qrcode(this.get('qrConfigMerged'));
+ $('.qr-code', this.element).qrcode(this.get('qrConfigMerged'));
}
});
diff --git a/web/app/components/query-criterion.js b/web/app/components/query-criterion.js
index 4940f6b..674da41 100644
--- a/web/app/components/query-criterion.js
+++ b/web/app/components/query-criterion.js
@@ -22,7 +22,7 @@ export default Ember.Component.extend({
remove() {
let me = this;
let criterion = me.get('criterion');
- Ember.Logger.info('Remove Criterion: ', criterion);
+ console.info('Remove Criterion: ', criterion);
let removeAction = me.get('removeCriterion');
removeAction && removeAction(criterion);
},
diff --git a/web/app/components/sortable-list.js b/web/app/components/sortable-list.js
index c670718..a32b899 100644
--- a/web/app/components/sortable-list.js
+++ b/web/app/components/sortable-list.js
@@ -1,13 +1,14 @@
-import Ember from 'ember';
+import Component from '@ember/component';
+import $ from 'jquery'
-export default Ember.Component.extend({
+export default Component.extend({
tagName: 'ul',
classNames: ['item-list'],
didInsertElement() {
let me = this;
me._super(...arguments);
me.set('prevIds', me.get('model').mapBy('id'));
- me.$().sortable({
+ $(me.element).sortable({
opacity: 0.8,
revert: true,
forceHelperSize: true,
@@ -21,8 +22,8 @@ export default Ember.Component.extend({
if (me.get('onSortStopped')) {
let prevIds = me.get('prevIds');
let changed = false;
- let ids = Array.prototype.map.call(me.$('li'), (li, i) => {
- let id = Ember.$(li).data('item-id');
+ let ids = Array.prototype.map.call($('li', me.element), (li, i) => {
+ let id = $(li).data('item-id');
if (id !== prevIds[i] && !changed) {
changed = true;
}
diff --git a/web/app/components/th-filter.js b/web/app/components/th-filter.js
index 5d132d2..cfd65c1 100644
--- a/web/app/components/th-filter.js
+++ b/web/app/components/th-filter.js
@@ -1,25 +1,30 @@
-import Ember from 'ember';
-import { set, computed } from '@ember/object';
-import BaseComponentMixin from '../mixins/components/base-component';
+import BaseComponent from './basic-component';
-export default Ember.Component.extend(BaseComponentMixin, {
+export default BaseComponent.extend({
tagName: 'span',
classNames: ['cursor-pointer'],
- 'dialog-title': 'Data Filter',
+ 'dialog-title': null,
'full-width': false,
'value-field': 'value',
'text-field': 'text',
- filtered: computed('options.@each.selected', function() {
- const options = this.get('options');
- return options && options.filterBy('selected', 'selected').length > 0;
- }),
+ 'values-as-string': false,
+ loose: true,
+ filtered: [],
didReceiveAttrs() {
- let me = this;
- let filters = me.getFilters()[me.get('name')];
+ const me = this;
+ me._super(...arguments);
+ const filters = me.getFilters()[me.get('name')];
+
if (filters && filters.length) {
- const valField = me.get('value-field');
- me.get('options').forEach(option => {
- filters.find(val => val == option[valField]) && set(option, 'selected', 'selected');
+ me.setProperties({
+ filtered: filters,
+ hasFilter: true
+ });
+ }
+ else {
+ me.setProperties({
+ filtered: [],
+ hasFilter: false
});
}
},
@@ -41,13 +46,16 @@ export default Ember.Component.extend(BaseComponentMixin, {
me.set('showModal', false);
},
onModalSubmit() {
- let me = this;
+ const me = this;
me.set('showModal', false);
- let filters = me.getFilters();
- const valField = me.get('value-field');
- filters[me.get('name')] = me.get('options').filter(f => f.selected).map(f => f[valField]);
- me.set('route.controller.filters', JSON.stringify(filters));
- me.get('router').transitionTo(me.get('routeName'), 1);
+ const filters = me.getFilters();
+ const filtered = me.get('filtered');
+ filters[me.get('name')] = filtered;
+ me.set('hasFilter', !!filtered.length);
+ me.get('route.controller').setProperties({
+ page: 1,
+ filters: JSON.stringify(filters)
+ });
}
}
});
diff --git a/web/app/components/top-navbar.js b/web/app/components/top-navbar.js
index c93e542..7e99cf6 100644
--- a/web/app/components/top-navbar.js
+++ b/web/app/components/top-navbar.js
@@ -2,14 +2,14 @@ import Ember from 'ember';
import BaseComponent from './base-component';
export default BaseComponent.extend({
- elementId: 'navbar',
+ // elementId: 'navbar',
classNames: ['navbar', 'navbar-default', 'navbar-collapse'],
user: Ember.computed.alias('ajax.user'),
didReceiveAttrs() {
let me = this;
let user = me.get('user');
if (!user) {
- Ember.Logger.info('No User Found In Session Storage, Try To Load From Cloud');
+ console.info('No User Found In Session Storage, Try To Load From Cloud');
me.ajax.doGet(false, 'auth/info', (u) => {
me.set('user', u);
});
diff --git a/web/app/components/tree-view.js b/web/app/components/tree-view.js
index 4f4b72e..b8be799 100644
--- a/web/app/components/tree-view.js
+++ b/web/app/components/tree-view.js
@@ -1,14 +1,12 @@
-import Ember from 'ember';
+import Component from '@ember/component';
+import $ from 'jquery'
-export default Ember.Component.extend({
+export default Component.extend({
classNames: ['widget-box', 'widget-color-blue2'],
- didReceiveAttrs() {
- let me = this;
- },
didInsertElement() {
- let me = this;
+ const me = this;
me._super(...arguments);
- me.$('div.widget-main > div').treeview({
+ $('div.widget-main > div', me.element).treeview({
data: me.get('data')
});
}
diff --git a/web/app/components/wysiwyg-editor.js b/web/app/components/wysiwyg-editor.js
index 3d37b5a..3bebc3f 100644
--- a/web/app/components/wysiwyg-editor.js
+++ b/web/app/components/wysiwyg-editor.js
@@ -1,12 +1,12 @@
-import Ember from 'ember';
import BaseFormInput from './base-form-input';
+import $ from 'jquery'
export default BaseFormInput.extend({
didInsertElement() {
const me = this;
me._super(...arguments);
//intialize wysiwyg editor
- me.$('.wysiwyg-editor').ace_wysiwyg({
+ $('.wysiwyg-editor', me.element).ace_wysiwyg({
toolbar: [
'font',
null,
@@ -38,7 +38,7 @@ export default BaseFormInput.extend({
'redo'
]
}).on('DOMSubtreeModified propertychange', function() {
- me.setVal(Ember.$(this).html());
+ me.setVal($(this).html());
}).html(me.getVal()).prev().addClass('wysiwyg-style2');
}
});
diff --git a/web/app/helpers/array.js b/web/app/helpers/array.js
index b673901..9df61af 100644
--- a/web/app/helpers/array.js
+++ b/web/app/helpers/array.js
@@ -1,7 +1,7 @@
import Ember from 'ember';
export function array(params/*, hash*/) {
- Ember.Logger.info('Array: ', params);
+ console.info('Array: ', params);
return params;
}
diff --git a/web/app/helpers/is-none.js b/web/app/helpers/is-none.js
new file mode 100644
index 0000000..7881a36
--- /dev/null
+++ b/web/app/helpers/is-none.js
@@ -0,0 +1,8 @@
+import { helper } from '@ember/component/helper';
+import { isNone as isN } from '@ember/utils';
+
+export function isNone([param]) {
+ return isN(param);
+}
+
+export default helper(isNone);
diff --git a/web/app/helpers/is-plain-val.js b/web/app/helpers/is-plain-val.js
new file mode 100644
index 0000000..5973853
--- /dev/null
+++ b/web/app/helpers/is-plain-val.js
@@ -0,0 +1,16 @@
+import { helper } from '@ember/component/helper';
+
+export function isPlainVal([val]) {
+ return typeof val === 'string' ||
+ typeof val === 'number' ||
+ typeof val === 'boolean' ||
+ (
+ (!!val && typeof val === 'object') &&
+ ['[object String]',
+ '[object Number]',
+ '[object Boolean]'
+ ].includes(Object.prototype.toString.call(val))
+ );
+}
+
+export default helper(isPlainVal);
diff --git a/web/app/helpers/json-str.js b/web/app/helpers/json-str.js
new file mode 100644
index 0000000..c54d2d0
--- /dev/null
+++ b/web/app/helpers/json-str.js
@@ -0,0 +1,7 @@
+import { helper } from '@ember/component/helper';
+
+export function jsonStr([param]) {
+ return JSON.stringify(param);
+}
+
+export default helper(jsonStr);
diff --git a/web/app/helpers/local-product/has-perm.js b/web/app/helpers/local-product/has-perm.js
index e87c8e2..83768c8 100644
--- a/web/app/helpers/local-product/has-perm.js
+++ b/web/app/helpers/local-product/has-perm.js
@@ -2,7 +2,7 @@ import { helper } from '@ember/component/helper';
export function localProductHasPerm(params/*, hash*/) {
const user = params[0];
- return user.admin || ['leli', 'chyxion'].includes(user.account);
+ return user.admin || ['leli', 'donghuang'].includes(user.account);
}
export default helper(localProductHasPerm);
diff --git a/web/app/helpers/obj-merge.js b/web/app/helpers/obj-merge.js
index eae2edf..c00e64e 100644
--- a/web/app/helpers/obj-merge.js
+++ b/web/app/helpers/obj-merge.js
@@ -1,7 +1,8 @@
import Ember from 'ember';
+import $ from 'jquery'
export function objMerge(params) {
- return Ember.$.extend(true, {}, ...params);
+ return $.extend(true, {}, ...params);
}
export default Ember.Helper.helper(objMerge);
diff --git a/web/app/helpers/obj-query-params.js b/web/app/helpers/obj-query-params.js
index b69c8dd..24ead47 100644
--- a/web/app/helpers/obj-query-params.js
+++ b/web/app/helpers/obj-query-params.js
@@ -1,7 +1,7 @@
import Ember from 'ember';
export function objQueryParams(params, hash) {
- Ember.Logger.debug('Obj Query Params: ', params, hash);
+ console.debug('Obj Query Params: ', params, hash);
return Ember.Object.create({
isQueryParams: true,
values: hash.length > 0 ? hash : params[0]
diff --git a/web/app/index.html b/web/app/index.html
index d798772..4ef6bcd 100644
--- a/web/app/index.html
+++ b/web/app/index.html
@@ -2,16 +2,18 @@