From 7c87aa0fd9b4ba3f175c5f417ea9a69524cc0af1 Mon Sep 17 00:00:00 2001 From: Donghuang Date: Sun, 5 Jun 2022 16:44:46 +0800 Subject: [PATCH] upgrade ember version to 3.28 --- web/app/app.js | 3 +- web/app/components/ace-login.js | 9 +- web/app/components/basic-component.js | 61 + web/app/components/breadcrumbs-bar.js | 2 +- web/app/components/editable-cell.js | 9 +- web/app/components/file-input.js | 8 +- web/app/components/form-field.js | 17 + web/app/components/form-footer-buttons.js | 5 +- web/app/components/form-input-color.js | 5 +- web/app/components/form-input-select.js | 30 +- web/app/components/form-input-select2.js | 107 - web/app/components/form-input-spinner.js | 6 +- web/app/components/form-input.js | 11 +- web/app/components/home-board.js | 5 +- web/app/components/image-input.js | 14 +- web/app/components/image-previews.js | 6 +- web/app/components/input-select.js | 150 ++ web/app/components/input-spinner.js | 4 +- web/app/components/issue-cell.js | 11 +- web/app/components/main-container.js | 9 +- web/app/components/modal-dialog.js | 7 +- web/app/components/pagination-bar.js | 4 +- web/app/components/qr-code.js | 9 +- web/app/components/query-criterion.js | 2 +- web/app/components/sortable-list.js | 11 +- web/app/components/th-filter.js | 48 +- web/app/components/top-navbar.js | 4 +- web/app/components/tree-view.js | 12 +- web/app/components/wysiwyg-editor.js | 6 +- web/app/helpers/array.js | 2 +- web/app/helpers/is-none.js | 8 + web/app/helpers/is-plain-val.js | 16 + web/app/helpers/json-str.js | 7 + web/app/helpers/local-product/has-perm.js | 2 +- web/app/helpers/obj-merge.js | 3 +- web/app/helpers/obj-query-params.js | 2 +- web/app/index.html | 15 +- web/app/instance-initializers/tooltip.js | 10 +- web/app/mixins/services/base-service.js | 23 +- web/app/routes/application.js | 11 +- web/app/routes/base-edit.js | 5 +- web/app/routes/base-list-select.js | 6 +- web/app/routes/base-list.js | 5 +- web/app/routes/base.js | 4 +- web/app/routes/customer-application/list.js | 2 +- web/app/routes/customer-issue/edit.js | 2 +- .../routes/customer/list/advanced-query.js | 4 +- web/app/routes/login.js | 3 +- web/app/routes/week-goal/list.js | 4 +- web/app/routes/week-goal/mine.js | 2 +- web/app/services/ajax.js | 2 +- web/app/services/dialog.js | 5 +- web/app/services/message.js | 7 +- web/app/services/store.js | 7 +- web/app/services/tool-service.js | 12 +- web/app/services/websocket.js | 12 +- web/app/templates/application.hbs | 4 +- .../templates/components/basic-component.hbs | 1 + .../templates/components/breadcrumbs-bar.hbs | 4 +- web/app/templates/components/form-field.hbs | 1 + .../components/form-input-select.hbs | 37 +- .../components/form-input-select2.hbs | 28 - web/app/templates/components/form-input.hbs | 2 +- web/app/templates/components/grid-header.hbs | 2 +- web/app/templates/components/input-select.hbs | 50 + .../templates/components/main-container.hbs | 56 +- web/app/templates/components/modal-dialog.hbs | 8 +- .../templates/components/pagination-bar.hbs | 18 +- web/app/templates/components/sortable-th.hbs | 2 +- web/app/templates/components/th-filter.hbs | 25 +- web/app/templates/components/top-navbar.hbs | 8 +- .../templates/customer-application/create.hbs | 2 +- .../templates/customer-application/edit.hbs | 2 +- web/app/templates/customer/edit.hbs | 4 +- web/app/templates/customer/list.hbs | 4 +- web/app/templates/customer/show.hbs | 4 +- web/app/templates/index.hbs | 2 +- web/bower.json | 34 - web/ember-cli-build.js | 195 +- web/package.json | 86 +- web/vendor/ace/css/ace.css | 34 + web/vendor/ace/css/font-awesome.css | 1672 ++++++++++++ web/vendor/ace/css/images/border.png | Bin 76 -> 0 bytes web/vendor/ace/css/images/controls.png | Bin 1261 -> 0 bytes web/vendor/ace/css/images/loading.gif | Bin 8685 -> 0 bytes .../ace/css/images/loading_background.png | Bin 131 -> 0 bytes web/vendor/ace/css/images/overlay.png | Bin 115 -> 0 bytes web/vendor/ace/css/less/bootstrap/alerts.less | 68 - web/vendor/ace/css/less/bootstrap/badges.less | 61 - .../ace/css/less/bootstrap/bootstrap.less | 50 - .../ace/css/less/bootstrap/breadcrumbs.less | 26 - .../ace/css/less/bootstrap/button-groups.less | 243 -- .../ace/css/less/bootstrap/buttons.less | 160 -- .../ace/css/less/bootstrap/carousel.less | 267 -- web/vendor/ace/css/less/bootstrap/close.less | 33 - web/vendor/ace/css/less/bootstrap/code.less | 69 - .../less/bootstrap/component-animations.less | 34 - .../ace/css/less/bootstrap/dropdowns.less | 213 -- web/vendor/ace/css/less/bootstrap/forms.less | 546 ---- .../ace/css/less/bootstrap/glyphicons.less | 234 -- web/vendor/ace/css/less/bootstrap/grid.less | 84 - .../ace/css/less/bootstrap/input-groups.less | 166 -- .../ace/css/less/bootstrap/jumbotron.less | 49 - web/vendor/ace/css/less/bootstrap/labels.less | 64 - .../ace/css/less/bootstrap/list-group.less | 124 - web/vendor/ace/css/less/bootstrap/media.less | 47 - web/vendor/ace/css/less/bootstrap/mixins.less | 39 - .../ace/css/less/bootstrap/mixins/alerts.less | 14 - .../bootstrap/mixins/background-variant.less | 8 - .../less/bootstrap/mixins/border-radius.less | 18 - .../css/less/bootstrap/mixins/buttons.less | 52 - .../less/bootstrap/mixins/center-block.less | 7 - .../css/less/bootstrap/mixins/clearfix.less | 22 - .../ace/css/less/bootstrap/mixins/forms.less | 85 - .../css/less/bootstrap/mixins/gradients.less | 59 - .../less/bootstrap/mixins/grid-framework.less | 91 - .../ace/css/less/bootstrap/mixins/grid.less | 122 - .../css/less/bootstrap/mixins/hide-text.less | 21 - .../ace/css/less/bootstrap/mixins/image.less | 33 - .../ace/css/less/bootstrap/mixins/labels.less | 12 - .../css/less/bootstrap/mixins/list-group.less | 29 - .../less/bootstrap/mixins/nav-divider.less | 10 - .../bootstrap/mixins/nav-vertical-align.less | 9 - .../css/less/bootstrap/mixins/opacity.less | 8 - .../css/less/bootstrap/mixins/pagination.less | 23 - .../ace/css/less/bootstrap/mixins/panels.less | 24 - .../less/bootstrap/mixins/progress-bar.less | 10 - .../less/bootstrap/mixins/reset-filter.less | 8 - .../ace/css/less/bootstrap/mixins/resize.less | 6 - .../mixins/responsive-visibility.less | 15 - .../ace/css/less/bootstrap/mixins/size.less | 10 - .../css/less/bootstrap/mixins/tab-focus.less | 9 - .../css/less/bootstrap/mixins/table-row.less | 28 - .../less/bootstrap/mixins/text-emphasis.less | 8 - .../less/bootstrap/mixins/text-overflow.less | 8 - .../bootstrap/mixins/vendor-prefixes.less | 227 -- web/vendor/ace/css/less/bootstrap/modals.less | 148 -- web/vendor/ace/css/less/bootstrap/navbar.less | 660 ----- web/vendor/ace/css/less/bootstrap/navs.less | 244 -- .../ace/css/less/bootstrap/normalize.less | 427 --- web/vendor/ace/css/less/bootstrap/pager.less | 54 - .../ace/css/less/bootstrap/pagination.less | 88 - web/vendor/ace/css/less/bootstrap/panels.less | 261 -- .../ace/css/less/bootstrap/popovers.less | 135 - web/vendor/ace/css/less/bootstrap/print.less | 107 - .../ace/css/less/bootstrap/progress-bars.less | 87 - .../css/less/bootstrap/responsive-embed.less | 35 - .../less/bootstrap/responsive-utilities.less | 194 -- .../ace/css/less/bootstrap/scaffolding.less | 150 -- web/vendor/ace/css/less/bootstrap/tables.less | 234 -- web/vendor/ace/css/less/bootstrap/theme.less | 272 -- .../ace/css/less/bootstrap/thumbnails.less | 36 - .../ace/css/less/bootstrap/tooltip.less | 103 - web/vendor/ace/css/less/bootstrap/type.less | 302 --- .../ace/css/less/bootstrap/utilities.less | 56 - .../ace/css/less/bootstrap/variables.less | 856 ------ web/vendor/ace/css/less/bootstrap/wells.less | 29 - web/vendor/ace/fonts/FontAwesome.otf | Bin 0 -> 85908 bytes web/vendor/ace/fonts/readme | 3 + web/vendor/ace/js/bootstrap.js | 2320 ----------------- web/vendor/jquery-pubsub/js/jquery.pubsub.js | 16 + 161 files changed, 2495 insertions(+), 10916 deletions(-) create mode 100644 web/app/components/basic-component.js create mode 100644 web/app/components/form-field.js delete mode 100644 web/app/components/form-input-select2.js create mode 100644 web/app/components/input-select.js create mode 100644 web/app/helpers/is-none.js create mode 100644 web/app/helpers/is-plain-val.js create mode 100644 web/app/helpers/json-str.js create mode 100644 web/app/templates/components/basic-component.hbs create mode 100644 web/app/templates/components/form-field.hbs delete mode 100644 web/app/templates/components/form-input-select2.hbs create mode 100644 web/app/templates/components/input-select.hbs delete mode 100644 web/bower.json create mode 100644 web/vendor/ace/css/font-awesome.css delete mode 100755 web/vendor/ace/css/images/border.png delete mode 100755 web/vendor/ace/css/images/controls.png delete mode 100755 web/vendor/ace/css/images/loading.gif delete mode 100755 web/vendor/ace/css/images/loading_background.png delete mode 100755 web/vendor/ace/css/images/overlay.png delete mode 100755 web/vendor/ace/css/less/bootstrap/alerts.less delete mode 100755 web/vendor/ace/css/less/bootstrap/badges.less delete mode 100755 web/vendor/ace/css/less/bootstrap/bootstrap.less delete mode 100755 web/vendor/ace/css/less/bootstrap/breadcrumbs.less delete mode 100755 web/vendor/ace/css/less/bootstrap/button-groups.less delete mode 100755 web/vendor/ace/css/less/bootstrap/buttons.less delete mode 100755 web/vendor/ace/css/less/bootstrap/carousel.less delete mode 100755 web/vendor/ace/css/less/bootstrap/close.less delete mode 100755 web/vendor/ace/css/less/bootstrap/code.less delete mode 100755 web/vendor/ace/css/less/bootstrap/component-animations.less delete mode 100755 web/vendor/ace/css/less/bootstrap/dropdowns.less delete mode 100755 web/vendor/ace/css/less/bootstrap/forms.less delete mode 100755 web/vendor/ace/css/less/bootstrap/glyphicons.less delete mode 100755 web/vendor/ace/css/less/bootstrap/grid.less delete mode 100755 web/vendor/ace/css/less/bootstrap/input-groups.less delete mode 100755 web/vendor/ace/css/less/bootstrap/jumbotron.less delete mode 100755 web/vendor/ace/css/less/bootstrap/labels.less delete mode 100755 web/vendor/ace/css/less/bootstrap/list-group.less delete mode 100755 web/vendor/ace/css/less/bootstrap/media.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/alerts.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/background-variant.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/border-radius.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/buttons.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/center-block.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/clearfix.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/forms.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/gradients.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/grid-framework.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/grid.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/hide-text.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/image.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/labels.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/list-group.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/nav-divider.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/nav-vertical-align.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/opacity.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/pagination.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/panels.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/progress-bar.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/reset-filter.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/resize.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/responsive-visibility.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/size.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/tab-focus.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/table-row.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/text-emphasis.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/text-overflow.less delete mode 100755 web/vendor/ace/css/less/bootstrap/mixins/vendor-prefixes.less delete mode 100755 web/vendor/ace/css/less/bootstrap/modals.less delete mode 100755 web/vendor/ace/css/less/bootstrap/navbar.less delete mode 100755 web/vendor/ace/css/less/bootstrap/navs.less delete mode 100755 web/vendor/ace/css/less/bootstrap/normalize.less delete mode 100755 web/vendor/ace/css/less/bootstrap/pager.less delete mode 100755 web/vendor/ace/css/less/bootstrap/pagination.less delete mode 100755 web/vendor/ace/css/less/bootstrap/panels.less delete mode 100755 web/vendor/ace/css/less/bootstrap/popovers.less delete mode 100755 web/vendor/ace/css/less/bootstrap/print.less delete mode 100755 web/vendor/ace/css/less/bootstrap/progress-bars.less delete mode 100755 web/vendor/ace/css/less/bootstrap/responsive-embed.less delete mode 100755 web/vendor/ace/css/less/bootstrap/responsive-utilities.less delete mode 100755 web/vendor/ace/css/less/bootstrap/scaffolding.less delete mode 100755 web/vendor/ace/css/less/bootstrap/tables.less delete mode 100755 web/vendor/ace/css/less/bootstrap/theme.less delete mode 100755 web/vendor/ace/css/less/bootstrap/thumbnails.less delete mode 100755 web/vendor/ace/css/less/bootstrap/tooltip.less delete mode 100755 web/vendor/ace/css/less/bootstrap/type.less delete mode 100755 web/vendor/ace/css/less/bootstrap/utilities.less delete mode 100755 web/vendor/ace/css/less/bootstrap/variables.less delete mode 100755 web/vendor/ace/css/less/bootstrap/wells.less create mode 100644 web/vendor/ace/fonts/FontAwesome.otf create mode 100644 web/vendor/ace/fonts/readme delete mode 100755 web/vendor/ace/js/bootstrap.js create mode 100644 web/vendor/jquery-pubsub/js/jquery.pubsub.js 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 @@ - + Lemo CRM {{content-for 'head'}} - + - + + + + {{content-for 'head-footer'}} {{content-for 'body'}} - - - {{content-for 'body-footer'}} diff --git a/web/app/instance-initializers/tooltip.js b/web/app/instance-initializers/tooltip.js index 9e606ee..4276251 100644 --- a/web/app/instance-initializers/tooltip.js +++ b/web/app/instance-initializers/tooltip.js @@ -1,8 +1,10 @@ import Ember from 'ember'; +import $ from 'jquery'; export function initialize(/* appInstance */) { - // appInstance.inject('route', 'foo', 'service:foo'); - Ember.$.fn.tooltip.Constructor.DEFAULTS.template = + $(function() { + $.fn.tooltip.Constructor.DEFAULTS.template = ''; + }); Ember.Component.reopen({ didInsertElement() { @@ -20,11 +22,11 @@ export function initialize(/* appInstance */) { if (!('ontouchstart' in document.documentElement)) { if ('tooltip' === me.get('data-rel') && me.get('title')) { - me.$().tooltip(); + $(me.element).tooltip(); } // may cause error try { - me.$('[data-rel=tooltip]').tooltip(); + $('[data-rel=tooltip]', me.element).tooltip(); } catch(e) { Ember.Logger.warn('Init tooltip error caused', e); diff --git a/web/app/mixins/services/base-service.js b/web/app/mixins/services/base-service.js index 5f05f89..f32afca 100644 --- a/web/app/mixins/services/base-service.js +++ b/web/app/mixins/services/base-service.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import $ from 'jquery' export default Ember.Mixin.create({ store: Ember.inject.service(), @@ -8,11 +9,11 @@ export default Ember.Mixin.create({ createConstraints: null, updateConstraints: null, find(params) { - Ember.Logger.debug('Find Model: ', params); + console.debug('Find Model: ', params); return this._getStore().find(this.get('modelName'), params); }, list(start, limit, params) { - Ember.Logger.debug('List Models Start: ', start, ', Limit: ', limit, ", Search: ", params); + console.debug('List Models Start: ', start, ', Limit: ', limit, ", Search: ", params); return this._getStore().list(this.get('modelName'), start, limit, params); }, listPage(page, params) { @@ -22,16 +23,16 @@ export default Ember.Mixin.create({ return me.list((page - 1) * pageSize, pageSize, params); }, create(model) { - Ember.Logger.debug('Create Model: ', model); + console.debug('Create Model: ', model); return this._getStore().create(this.get('modelName'), model); }, update(model, defaultPromise) { - Ember.Logger.debug('Update Model: ', model); + console.debug('Update Model: ', model); let me = this; let p = me._getStore().update(me.get('modelName'), model); if (defaultPromise) { p.then((m) => { - Ember.Logger.debug('After Update: ', m); + console.debug('After Update: ', m); !(model instanceof FormData) && Object.keys(m).forEach((prop) => { Ember.set(model, prop, m[prop]); @@ -42,7 +43,7 @@ export default Ember.Mixin.create({ return p; }, del(params) { - Ember.Logger.debug('Update Model: ', params); + console.debug('Update Model: ', params); return this._getStore().del(this.get('modelName'), params); }, ajaxGet(path, params) { @@ -53,12 +54,12 @@ export default Ember.Mixin.create({ }, validate(model, constraints) { let me = this; - Ember.Logger.debug('Validate Model: ', model); + console.debug('Validate Model: ', model); if (constraints) { - if (Ember.$.type(constraints) === 'string') { + if ($.type(constraints) === 'string') { constraints = me.get(constraints); } - else if (Ember.$.type(constraints) !== 'object') { + else if ($.type(constraints) !== 'object') { validation = me.get('constraints'); } } @@ -68,13 +69,13 @@ export default Ember.Mixin.create({ return validate(model, constraints || me.get('constraints')); }, createValidate(model) { - Ember.Logger.debug('Create Validate Model: ', model); + console.debug('Create Validate Model: ', model); let me = this; let constraints = me.get('createConstraints') || me.get('constraints') || null; return constraints && validate(model, constraints); }, updateValidate(model) { - Ember.Logger.debug('Update Validate Model: ', model); + console.debug('Update Validate Model: ', model); let me = this; let constraints = me.get('updateConstraints') || me.get('constraints') || null; return constraints && validate(model, constraints); diff --git a/web/app/routes/application.js b/web/app/routes/application.js index 3308d9a..60beb30 100644 --- a/web/app/routes/application.js +++ b/web/app/routes/application.js @@ -1,5 +1,6 @@ import Ember from 'ember'; import Route from '@ember/routing/route'; +import $ from 'jquery' export default Route.extend({ getLoginRoute() { @@ -11,18 +12,18 @@ export default Route.extend({ } }, beforeModel: function(transition) { - Ember.Logger.info('Before Application Model.', transition); + console.info('Before Application Model.', transition); this.transitionIntercept(transition); }, activate() { - Ember.Logger.info('Application Activate.'); - Ember.$('body').addClass('no-skin'); + console.info('Application Activate.'); + $('body').addClass('no-skin'); try{ace.settings.check('navbar', 'fixed');}catch(e){console.log(e)} try{ace.settings.check('main-container', 'fixed');}catch(e){console.log(e)} }, actions: { loading(transition, originRoute) { - Ember.Logger.info('Application Loading...'); + console.info('Application Loading...'); // var appCtrl = this.controllerFor('application'); this.router.one('didTransition', function() { // appCtrl.set('loading', false); @@ -30,7 +31,7 @@ export default Route.extend({ return true; }, willTransition(transition) { - Ember.Logger.info('Application Will Transition.', transition); + console.info('Application Will Transition.', transition); this.transitionIntercept(transition); }, goback() { diff --git a/web/app/routes/base-edit.js b/web/app/routes/base-edit.js index 23961b4..ee63d47 100644 --- a/web/app/routes/base-edit.js +++ b/web/app/routes/base-edit.js @@ -1,11 +1,12 @@ import Ember from 'ember'; import BaseRoute from './base'; +import $ from 'jquery' export default BaseRoute.extend({ model(params, transition) { let me = this; let extParams = null; - if (Ember.$.type(me.extraParams) === 'function') { + if ($.type(me.extraParams) === 'function') { extParams = me.extraParams(params, transition); } if (Object.getOwnPropertyNames(params).length === 0 && @@ -13,6 +14,6 @@ export default BaseRoute.extend({ params = transition.params[me.routeName.replace(/\.index$/, '')]; } return me.get('service').find( - extParams ? Ember.$.extend(true, params, extParams) : params); + extParams ? $.extend(true, params, extParams) : params); } }); diff --git a/web/app/routes/base-list-select.js b/web/app/routes/base-list-select.js index 840f13e..1f1caad 100644 --- a/web/app/routes/base-list-select.js +++ b/web/app/routes/base-list-select.js @@ -23,7 +23,7 @@ export default BaseListRoute.extend({ actions: { select(it, selected) { let me = this; - Ember.Logger.info('select: ', it, selected); + console.info('select: ', it, selected); if (selected) { me.set('controller.selectedId', it.id); me.set('controller.selectedModel', it); @@ -41,7 +41,7 @@ export default BaseListRoute.extend({ if (itId) { let it = me.get('controller.selectedModel'); if (it) { - Ember.Logger.info('select: ', it); + console.info('select: ', it); Ember.set(parentModel, me.get('controller.idField'), itId); Ember.set(parentModel, me.get('controller.nameField'), it.name); } @@ -51,7 +51,7 @@ export default BaseListRoute.extend({ Ember.set(parentModel, me.get('controller.idField'), ''); Ember.set(parentModel, me.get('controller.nameField'), ''); } - me.transitionTo(parentRouteName); + me.router.transitionTo(parentRouteName); } }, getParentRouteName() { diff --git a/web/app/routes/base-list.js b/web/app/routes/base-list.js index 7e9f353..270fa19 100644 --- a/web/app/routes/base-list.js +++ b/web/app/routes/base-list.js @@ -1,5 +1,6 @@ import Ember from 'ember'; import BaseRoute from './base'; +import $ from 'jquery' export default BaseRoute.extend({ queryParams: { @@ -20,10 +21,10 @@ export default BaseRoute.extend({ mergeParams(params, transition) { let me = this; let extParams = null; - if (Ember.$.type(me.extraParams) === 'function') { + if ($.type(me.extraParams) === 'function') { extParams = me.extraParams(params, transition); } - return extParams ? Ember.$.extend(true, params, extParams) : params; + return extParams ? $.extend(true, params, extParams) : params; }, getPage(params) { let page = params.page; diff --git a/web/app/routes/base.js b/web/app/routes/base.js index 21326cb..2183748 100644 --- a/web/app/routes/base.js +++ b/web/app/routes/base.js @@ -10,11 +10,11 @@ export default Route.extend({ const routeName = me.get('routeName'); let service = me.get('toolService').getServiceByRouteName(routeName); if (service) { - Ember.Logger.info(`Set Route [${routeName}] Service [${service}]`); + console.info(`Set Route [${routeName}] Service [${service}]`); me.set('service', service); } else { - Ember.Logger.info(`No Service Found For Route [${routeName}]`); + console.info(`No Service Found For Route [${routeName}]`); } } me._super(...arguments); diff --git a/web/app/routes/customer-application/list.js b/web/app/routes/customer-application/list.js index 50fc78d..1d843b0 100644 --- a/web/app/routes/customer-application/list.js +++ b/web/app/routes/customer-application/list.js @@ -6,6 +6,6 @@ export default BaseListRoute.extend({ const me = this; me._super(...arguments); const user = me.get('ajax.user'); - model.adminOrOwner = user.admin || model.data.filterBy('owner', user.id).length > 0; + model.adminOrOwner = (user && user.admin || model.data.filterBy('owner', user.id).length > 0); } }); diff --git a/web/app/routes/customer-issue/edit.js b/web/app/routes/customer-issue/edit.js index 4e7092a..06582fe 100644 --- a/web/app/routes/customer-issue/edit.js +++ b/web/app/routes/customer-issue/edit.js @@ -5,7 +5,7 @@ export default BaseEditRoute.extend({ afterModel(model) { let me = this; let customerId = model.customerId; - Ember.Logger.info('edit: ', model); + console.info('edit: ', model); me.set('breadcrumbs', [{route: 'customer.list', params: 1, text: 'Customers'}, {route: 'customer.show', params: customerId, text: 'Customer [' + customerId + ']'}, diff --git a/web/app/routes/customer/list/advanced-query.js b/web/app/routes/customer/list/advanced-query.js index b43f87e..5d8e40e 100644 --- a/web/app/routes/customer/list/advanced-query.js +++ b/web/app/routes/customer/list/advanced-query.js @@ -61,14 +61,14 @@ export default Ember.Route.extend({ }, actions: { addCriterion() { - Ember.Logger.info('Add Criterion.'); + console.info('Add Criterion.'); this.get('controller.model.criteria').pushObject({ col: 'name', op: 'eq' }); }, removeCriterion(criterion) { - Ember.Logger.info('Route Remove Criterion: ', criterion); + console.info('Route Remove Criterion: ', criterion); this.get('controller.model.criteria').removeObject(criterion); }, query() { diff --git a/web/app/routes/login.js b/web/app/routes/login.js index 2bdc275..9c81683 100644 --- a/web/app/routes/login.js +++ b/web/app/routes/login.js @@ -13,10 +13,9 @@ export default Ember.Route.extend({ let me = this; me.get('ajax').doPost('auth/login', model, function(user) { - Ember.Logger.debug(`User ${user} Loggedin`); + console.debug(`User ${user} Loggedin`); me.set('ajax.user', user); me.message.alert('Sign in successfully'); - // me.transitionTo('/'); window.location.href = '/'; $.trigger('LOGINED', true); }, function(msg) { diff --git a/web/app/routes/week-goal/list.js b/web/app/routes/week-goal/list.js index 781463b..3e7fce8 100644 --- a/web/app/routes/week-goal/list.js +++ b/web/app/routes/week-goal/list.js @@ -9,7 +9,7 @@ export default BaseListRoute.extend({ }, breadcrumbs: [{text: 'Week Goal'}], afterModel(model) { - Ember.Logger.info('after model: ', model); + console.info('after model: ', model); model.groupData = []; model.data.forEach(it => { let group = model.groupData.findBy('userId', it.userId); @@ -22,6 +22,6 @@ export default BaseListRoute.extend({ model.groupData.forEach(g => { g.data = g.data.sortBy('year').reverse(); }); - Ember.Logger.info('after model grouped: ', model); + console.info('after model grouped: ', model); } }); diff --git a/web/app/routes/week-goal/mine.js b/web/app/routes/week-goal/mine.js index 6ea07cc..4a147cc 100644 --- a/web/app/routes/week-goal/mine.js +++ b/web/app/routes/week-goal/mine.js @@ -33,7 +33,7 @@ export default BaseListRoute.extend({ }, actions: { onUpdated(ytdSum) { - Ember.Logger.info('on updated: ', ytdSum); + console.info('on updated: ', ytdSum); this.set('controller.model.ytdSum', ytdSum); } } diff --git a/web/app/services/ajax.js b/web/app/services/ajax.js index 5707ced..cab4748 100644 --- a/web/app/services/ajax.js +++ b/web/app/services/ajax.js @@ -73,7 +73,7 @@ export default Ember.Service.extend({ } } else if (r.errcode === 4011) { - $.trigger('NOT_LOGIN', true); + // $.trigger('NOT_LOGIN', true); Ember.getOwner(me).lookup('route:application').transitionTo('login'); } // ignore fail callback diff --git a/web/app/services/dialog.js b/web/app/services/dialog.js index 5707cd7..101abfd 100644 --- a/web/app/services/dialog.js +++ b/web/app/services/dialog.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import $ from 'jquery' export default Ember.Service.extend({ alert(msg) { @@ -11,7 +12,7 @@ export default Ember.Service.extend({ danger: { label: 'Close', className: 'btn-danger', - callback: fnClose || Ember.$.noop + callback: fnClose || $.noop } } }); @@ -28,7 +29,7 @@ export default Ember.Service.extend({ danger: { label: 'Cancel', className: 'btn-danger', - callback: fnNo || Ember.$.noop + callback: fnNo || $.noop } } }); diff --git a/web/app/services/message.js b/web/app/services/message.js index 8331463..a16b938 100644 --- a/web/app/services/message.js +++ b/web/app/services/message.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import $ from 'jquery' export default Ember.Service.extend({ alert(msg) { @@ -8,7 +9,7 @@ export default Ember.Service.extend({ this._show_alert_(msg, '#F6F0F0'); }, _show_alert_(msg, bg) { - Ember.$([ + $([ '
', '
', '
@@ -9,7 +9,7 @@
{{/if}} -{{#if login}} +{{#if this.login}} {{outlet}} {{else}} {{top-navbar}} diff --git a/web/app/templates/components/basic-component.hbs b/web/app/templates/components/basic-component.hbs new file mode 100644 index 0000000..fb5c4b1 --- /dev/null +++ b/web/app/templates/components/basic-component.hbs @@ -0,0 +1 @@ +{{yield}} \ No newline at end of file diff --git a/web/app/templates/components/breadcrumbs-bar.hbs b/web/app/templates/components/breadcrumbs-bar.hbs index b20aea7..daaa17c 100644 --- a/web/app/templates/components/breadcrumbs-bar.hbs +++ b/web/app/templates/components/breadcrumbs-bar.hbs @@ -2,8 +2,8 @@ Home -{{log breadcrumbs}} -{{#each breadcrumbs as |breadcrumb|}} +{{log this.breadcrumbs}} +{{#each this.breadcrumbs as |breadcrumb|}}
  • {{#if breadcrumb.icon}} diff --git a/web/app/templates/components/form-field.hbs b/web/app/templates/components/form-field.hbs new file mode 100644 index 0000000..fb5c4b1 --- /dev/null +++ b/web/app/templates/components/form-field.hbs @@ -0,0 +1 @@ +{{yield}} \ No newline at end of file diff --git a/web/app/templates/components/form-input-select.hbs b/web/app/templates/components/form-input-select.hbs index f13adbb..d944a84 100644 --- a/web/app/templates/components/form-input-select.hbs +++ b/web/app/templates/components/form-input-select.hbs @@ -1,19 +1,32 @@ {{#if label}} - + {{/if}} -
    + +
    -
    - {{#x-select class='form-control' - name=name - value=(mut (get dataModel name)) - action='onOptionChanged' - as |xs|}} - {{yield xs}} - {{/x-select}} +
    + {{input-select + model=model + name=name + multiple=multiple + nullable=nullable + readonly=readonly + placeholder=placeholder + options=options + value-field=value-field + text-field=text-field + enabled-field=enabled-field + hidden-input=hidden-input + loose=loose + fire-init-change=fire-init-change + on-change=on-change + values-as-string=values-as-string + values-splitter=values-splitter + }}
    -{{#if (get this 'error-msg')}} +{{#if error-msg}} {{form-input-errors-msg name=name}} -{{/if}} \ No newline at end of file +{{/if}} + diff --git a/web/app/templates/components/form-input-select2.hbs b/web/app/templates/components/form-input-select2.hbs deleted file mode 100644 index cdbfbab..0000000 --- a/web/app/templates/components/form-input-select2.hbs +++ /dev/null @@ -1,28 +0,0 @@ - -
    -
    -
    - - {{#each options as |option|}} - {{#if option.selected}} - - {{/if}} - {{/each}} -
    -
    -
    -{{#if (get this 'error-msg')}} - {{form-input-errors-msg name=name}} -{{/if}} \ No newline at end of file diff --git a/web/app/templates/components/form-input.hbs b/web/app/templates/components/form-input.hbs index 38317de..159cc69 100644 --- a/web/app/templates/components/form-input.hbs +++ b/web/app/templates/components/form-input.hbs @@ -1,7 +1,7 @@
    - {{#if hasBlock}} + {{#if (has-block)}} {{yield}} {{else}} {{#if (eq 'file' type)}} diff --git a/web/app/templates/components/grid-header.hbs b/web/app/templates/components/grid-header.hbs index 33f943d..2ecee3c 100644 --- a/web/app/templates/components/grid-header.hbs +++ b/web/app/templates/components/grid-header.hbs @@ -1,5 +1,5 @@
    - {{#if hasBlock}} + {{#if (has-block)}} {{#if dropdownMenu}}
    diff --git a/web/app/templates/components/input-select.hbs b/web/app/templates/components/input-select.hbs new file mode 100644 index 0000000..000c5c0 --- /dev/null +++ b/web/app/templates/components/input-select.hbs @@ -0,0 +1,50 @@ + + +{{#if (and name hidden-input)}} + {{#let (get model name) as |val|}} + {{#if val}} + {{#if (is-array val)}} + {{#each val as |v|}} + + {{/each}} + {{else}} + + {{/if}} + {{/if}} + {{/let}} +{{/if}} \ No newline at end of file diff --git a/web/app/templates/components/main-container.hbs b/web/app/templates/components/main-container.hbs index 3b3cfc6..6717cf1 100644 --- a/web/app/templates/components/main-container.hbs +++ b/web/app/templates/components/main-container.hbs @@ -4,21 +4,21 @@ {{#if ajax.user.admin}}