diff --git a/.eslintrc.js b/.eslintrc.js index bbd8352..b587fb5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,7 @@ module.exports = { + globals: { + server: true, + }, root: true, parserOptions: { ecmaVersion: 6, diff --git a/addon/components/user-filters-manager.coffee b/addon/components/user-filters-manager.coffee index 2b2a2e6..e13f640 100644 --- a/addon/components/user-filters-manager.coffee +++ b/addon/components/user-filters-manager.coffee @@ -2,4 +2,8 @@ import Ember from 'ember' export default Ember.Component.extend scope_key: null - user_filters: (-> @store.peekAll('dunlop/user-filter').filterBy('scope_key', @get('scope_key'))).property() + content: null + class: 'tiny black' + actions: + open_modal: -> + @modal 'user-filters-manager/modal', scope_key: @get('scope_key'), content: @get('content') diff --git a/addon/models/dunlop/user-filter.coffee b/addon/models/dunlop/user-filter.coffee index f4bb737..1d6f850 100644 --- a/addon/models/dunlop/user-filter.coffee +++ b/addon/models/dunlop/user-filter.coffee @@ -1,6 +1,8 @@ import DS from 'ember-data' export default DS.Model.extend - scope_key: DS.attr('string') - filters: DS.attr(defaultValue: -> {}) + scope_key: DS.attr('string') + name: DS.attr('string') + desription: DS.attr('string') + filters: DS.attr(defaultValue: -> {}) is_default: DS.attr('boolean', defaultValue: false) diff --git a/app/components/user-filters-manager/modal.coffee b/app/components/user-filters-manager/modal.coffee new file mode 100644 index 0000000..e97f93f --- /dev/null +++ b/app/components/user-filters-manager/modal.coffee @@ -0,0 +1,37 @@ +import ModalBase from 'ember-cli-dunlop/mixins/modal-base' +import Ember from 'ember' +{set} = Ember + +export default ModalBase.extend + scope_key: Ember.computed.alias 'modal_options.scope_key' + content: Ember.computed.alias 'modal_options.content' + error: '' + new_filter_name_blank: Ember.computed 'new_filter_name', -> + return true unless name = @get('new_filter_name') + return true unless typeof name is 'string' + return true if name.match /^\s*$/ + false + + + user_filters: Ember.computed 'scope_key', -> + return Ember.A() unless scope_key = @get('scope_key') + @store.peekAll('dunlop/user-filter').filterBy('scope_key', scope_key).sortBy('name') + actions: + apply_filter: (user_filter) -> + return @set('error', 'no content given') unless content = @get('content') + return @set('error', 'content has no filters object to manipulate') unless typeof content.filters is 'object' + Object.keys(content.filters).forEach (key) -> delete content.filters[key] + for key, value of user_filter.get('filters') + set content.filters, key, value + content.reload() if typeof content.reload is 'function' + @set 'globals.flash_message', "Filter #{user_filter.get('name')}" + @send 'close' + create_new_filter: -> + return @set('error', 'Current given content filters do not respond to toProperties method') unless filters = @get('content.filters').toProperties() + new_filter = @store.createRecord 'dunlop/user-filter', + name: @get('new_filter_name') + scope_key: @get('scope_key') + filters: filters + new_filter.save() + @send 'close' + diff --git a/app/templates/components/user-filters-manager.emblem b/app/templates/components/user-filters-manager.emblem index 0a90f09..52d0765 100644 --- a/app/templates/components/user-filters-manager.emblem +++ b/app/templates/components/user-filters-manager.emblem @@ -1 +1,3 @@ +button.ui.icon.button class=class click='open_modal' + i.filter.icon = yield diff --git a/app/templates/components/user-filters-manager/-modal.emblem b/app/templates/components/user-filters-manager/-modal.emblem new file mode 100644 index 0000000..b33e73d --- /dev/null +++ b/app/templates/components/user-filters-manager/-modal.emblem @@ -0,0 +1,19 @@ +/ https://semantic-ui.com/elements/list.html => Floated +if error + .ui.negative.message= error +.ui.middle.aligned.divided.list + each user_filters as |user_filter| + li.item + .right.floated.content + button.ui.tiny.secondary.button{action 'apply_filter' user_filter}= t 'general.apply' + .content + if user_filter.is_default + .header= user_filter.name + else + = user_filter.name + +.ui.horizontal.divider Create new from current selection +.ui.action.input + = input value=new_filter_name + button.ui.primary.button disabled=new_filter_name_blank click='create_new_filter' + span CREATE diff --git a/package.json b/package.json index 8970dba..56affb3 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "ember-cli-sass": ">=7.0.0" }, "devDependencies": { + "active-model-adapter": "^2.2.0", "broccoli-asset-rev": "^2.4.5", "ember-ajax": "^3.0.0", "ember-cli": "2.16.2", @@ -33,6 +34,7 @@ "ember-cli-eslint": "^4.2.3", "ember-cli-htmlbars-inline-precompile": "^1.0.2", "ember-cli-inject-live-reload": "^1.4.1", + "ember-cli-mirage": "^0.4.9", "ember-cli-moment-shim": "^3.5.0", "ember-cli-pagination": "^3.0.2", "ember-cli-qunit": "^4.3.0", diff --git a/tests/dummy/app/adapters/application.coffee b/tests/dummy/app/adapters/application.coffee new file mode 100644 index 0000000..40f00a9 --- /dev/null +++ b/tests/dummy/app/adapters/application.coffee @@ -0,0 +1,8 @@ +import DunlopAdapter from 'ember-cli-dunlop/adapters/application' + +## Override the default adapter with the `DS.ActiveModelAdapter` which +window.client_id ||= "client#{Math.round(Math.random() * 100000)}" +Ember.$.ajaxPrefilter (options, oriOpt, jqXHR)-> + jqXHR.setRequestHeader 'client-id', window.client_id + +export default DunlopAdapter.extend() diff --git a/tests/dummy/app/initializers/globals.coffee b/tests/dummy/app/initializers/globals.coffee index 307f80f..8f05cf1 100644 --- a/tests/dummy/app/initializers/globals.coffee +++ b/tests/dummy/app/initializers/globals.coffee @@ -103,7 +103,7 @@ initialize = (application) -> application.inject 'component', 'globals', 'service:globals' application.inject 'component', 'router', 'router:main' #application.inject 'component', 'store', 'store:main' - #application.inject 'component', 'store', 'service:store' + application.inject 'component', 'store', 'service:store' application.inject 'view', 'globals', 'service:globals' application.inject 'router', 'globals', 'service:globals' diff --git a/tests/dummy/app/routes/table-filters/user-filters-manager.coffee b/tests/dummy/app/routes/table-filters/user-filters-manager.coffee index ffde871..c02b572 100644 --- a/tests/dummy/app/routes/table-filters/user-filters-manager.coffee +++ b/tests/dummy/app/routes/table-filters/user-filters-manager.coffee @@ -1,11 +1,20 @@ import Ember from 'ember' -import PagedArray from 'ember-cli-pagination/local/paged-array' +#import PagedArray from 'ember-cli-pagination/local/paged-array' export default Ember.Route.extend model: (params) -> - Ember.A([ - @store.createRecord('dunlop/user-filter', scope_key: 'panda/action-list', filters: {a: 42}, is_default: true) - @store.createRecord('dunlop/user-filter', scope_key: 'panda/action-list', filters: {a: 44}, is_default: false) - @store.createRecord('dunlop/user-filter', scope_key: 'migration-adapter/blurp', filters: {a: 44}, is_default: true) + result = Ember.A([ + @store.createRecord('dunlop/user-filter', name: 'Filter1-2', scope_key: 'panda/action-list', filters: {a: 44}, is_default: false, desription: 'I describe
Filter1-2') + @store.createRecord('dunlop/user-filter', name: 'Filter1-1', scope_key: 'panda/action-list', filters: {a: 42}, is_default: true, desription: 'I describe
Filter1-1') + @store.createRecord('dunlop/user-filter', name: 'Filter2-1', scope_key: 'migration-adapter/blurp', filters: {a: 44}, is_default: true, desription: 'I describe
Filter2-1') ]) + filters = Ember.Object.create + key1_eq: 45 + key2_matches: 'blah%' + result.filters = filters + result.reload = -> + console.log "REALOADING FILTERS VIRTUALLY SINCE IT IS NOT AN ember-cli-dunlop/utils/paged-remote-array" + # the reference to filters should be kept intact, so outputting filters should work, the component should mutate it + console.log filters.toProperties() #TODO: console.log is not the eventual desired way of testing + result diff --git a/tests/dummy/app/templates/table-filters/user-filters-manager.emblem b/tests/dummy/app/templates/table-filters/user-filters-manager.emblem index 0a72761..e99db33 100644 --- a/tests/dummy/app/templates/table-filters/user-filters-manager.emblem +++ b/tests/dummy/app/templates/table-filters/user-filters-manager.emblem @@ -1 +1,2 @@ h1 user-filters-manager +.ui.segment= user-filters-manager scope_key='panda/action-list' content=model diff --git a/tests/dummy/mirage/config.coffee b/tests/dummy/mirage/config.coffee new file mode 100644 index 0000000..dec2ac2 --- /dev/null +++ b/tests/dummy/mirage/config.coffee @@ -0,0 +1,29 @@ +config = -> + @post '/dunlop/user_filters', (schema, request) -> + attributes = JSON.parse(request.requestBody)['dunlop/user_filter'] + schema.dunlopUserFilters.create(attributes) + + # These comments are here to help you get started. Feel free to delete them. + + ### + Config (with defaults). + + Note: these only affect routes defined *after* them! + ### + + # this.urlPrefix = ''; // make this `http://localhost:8080`, for example, if your API is on a different server + # this.namespace = ''; // make this `/api`, for example, if your API is namespaced + # this.timing = 400; // delay for each request, automatically set to 0 during testing + + ### + Shorthand cheatsheet: + + this.get('/posts'); + this.post('/posts'); + this.get('/posts/:id'); + this.put('/posts/:id'); // or this.patch + this.del('/posts/:id'); + + http://www.ember-cli-mirage.com/docs/v0.3.x/shorthands/ + ### +export default config diff --git a/tests/dummy/mirage/factories/dunlop-user-filter.js b/tests/dummy/mirage/factories/dunlop-user-filter.js new file mode 100644 index 0000000..8501897 --- /dev/null +++ b/tests/dummy/mirage/factories/dunlop-user-filter.js @@ -0,0 +1,4 @@ +import { Factory } from 'ember-cli-mirage'; + +export default Factory.extend({ +}); diff --git a/tests/dummy/mirage/models/dunlop-user-filter.coffee b/tests/dummy/mirage/models/dunlop-user-filter.coffee new file mode 100644 index 0000000..65f2e68 --- /dev/null +++ b/tests/dummy/mirage/models/dunlop-user-filter.coffee @@ -0,0 +1,4 @@ +import { Model } from 'ember-cli-mirage' + +export default Model.extend() + diff --git a/tests/dummy/mirage/scenarios/default.js b/tests/dummy/mirage/scenarios/default.js new file mode 100644 index 0000000..adb3af4 --- /dev/null +++ b/tests/dummy/mirage/scenarios/default.js @@ -0,0 +1,9 @@ +export default function(/* server */) { + + /* + Seed your development database using your factories. + This data will not be loaded in your tests. + */ + + // server.createList('post', 10); +} diff --git a/tests/dummy/mirage/serializers/application.coffee b/tests/dummy/mirage/serializers/application.coffee new file mode 100644 index 0000000..89feda1 --- /dev/null +++ b/tests/dummy/mirage/serializers/application.coffee @@ -0,0 +1,5 @@ +import { JSONAPISerializer } from 'ember-cli-mirage' + +export default JSONAPISerializer.extend + typeKeyForModel: (model) -> + model.modelName.replace(/^dunlop-/, 'dunlop/') diff --git a/tests/helpers/destroy-app.js b/tests/helpers/destroy-app.js index c3d4d1a..1807e21 100644 --- a/tests/helpers/destroy-app.js +++ b/tests/helpers/destroy-app.js @@ -2,4 +2,7 @@ import Ember from 'ember'; export default function destroyApp(application) { Ember.run(application, 'destroy'); + if (window.server) { + window.server.shutdown(); + } }