diff --git a/app/controllers/model-types.js b/app/controllers/model-types.js index 2de365019c..70a09da509 100644 --- a/app/controllers/model-types.js +++ b/app/controllers/model-types.js @@ -1,7 +1,5 @@ -/* eslint-disable ember/no-computed-properties-in-native-classes */ import Controller from '@ember/controller'; -import { action, computed } from '@ember/object'; -import { sort } from '@ember/object/computed'; +import { action } from '@ember/object'; import { inject as service } from '@ember/service'; const HIDE_EMPTY_MODELS_KEY = 'are-model-types-hidden'; @@ -14,12 +12,6 @@ export default class ModelTypesController extends Controller { navWidth = 180; - constructor() { - super(...arguments); - this.sortByNameProp = ['name']; - this.sortByDescCountProp = ['count:desc']; - } - get hideEmptyModelTypes() { return getStoredPropertyValue(this.storage, HIDE_EMPTY_MODELS_KEY); } @@ -36,13 +28,14 @@ export default class ModelTypesController extends Controller { handleSettingProperty(this.storage, ORDER_MODELS_BY_COUNT_KEY, value); } - @sort('filtered', 'sortByNameProp') - sortByName; + get sortByName() { + return this.filtered.toSorted((a, b) => a.name.localeCompare(b.name)); + } - @sort('filtered', 'sortByDescCountProp') - sortByDescCount; + get sortByDescCount() { + return this.filtered.toSorted((a, b) => b.count - a.count); + } - @computed('model.@each.count', 'hideEmptyModelTypes') get filtered() { return this.model.filter((item) => { let hideEmptyModels = this.hideEmptyModelTypes; diff --git a/app/services/storage.ts b/app/services/storage.ts index c9c61540cd..afa359c3b1 100644 --- a/app/services/storage.ts +++ b/app/services/storage.ts @@ -2,6 +2,7 @@ import Service, { inject as service } from '@ember/service'; import { LOCAL_STORAGE_SUPPORTED } from './storage/local'; import type LocalStorageService from './storage/local'; import type MemoryStorageService from './storage/memory'; +import { tracked } from '@glimmer/tracking'; /** * Service that wraps either the LocalStorageService or @@ -12,6 +13,18 @@ import type MemoryStorageService from './storage/memory'; export default class StorageService extends Service { @service(LOCAL_STORAGE_SUPPORTED ? 'storage/local' : 'storage/memory') declare backend: LocalStorageService | MemoryStorageService; + @tracked trackedBackend = { + setItem: (k: keyof object, v: string) => { + this.backend.setItem(k, v); + this.trackedBackend = { ...this.trackedBackend }; + }, + removeItem: (k: keyof object) => { + this.backend.removeItem(k); + this.trackedBackend = { ...this.trackedBackend }; + }, + getItem: (k: keyof object) => this.backend.getItem(k), + keys: () => this.backend.keys(), + }; /** * Reads a stored object for a give key, if any. @@ -19,7 +32,7 @@ export default class StorageService extends Service { * @return {Option} The value, if found */ getItem(key: keyof object) { - const serialized = this.backend.getItem(key); + const serialized = this.trackedBackend.getItem(key); if (serialized === null) { // Actual `null` values would have been serialized as `"null"` @@ -37,7 +50,7 @@ export default class StorageService extends Service { this.removeItem(key); } else { const serialized = JSON.stringify(value); - this.backend.setItem(key, serialized); + this.trackedBackend.setItem(key, serialized); } } @@ -45,7 +58,7 @@ export default class StorageService extends Service { * Deletes the stored string for a given key. */ removeItem(key: keyof object) { - this.backend.removeItem(key); + this.trackedBackend.removeItem(key); } /** @@ -54,6 +67,6 @@ export default class StorageService extends Service { * @return {Array} The array of keys */ keys() { - return this.backend.keys(); + return this.trackedBackend.keys(); } } diff --git a/tests/acceptance/data-test.js b/tests/acceptance/data-test.js index f2b1c0afd9..3fd27b67bc 100644 --- a/tests/acceptance/data-test.js +++ b/tests/acceptance/data-test.js @@ -91,11 +91,16 @@ module('Data Tab', function (outer) { test('Model types are successfully listed and bound', async function (assert) { respondWith('data:getModelTypes', { type: 'data:modelTypesAdded', - modelTypes: getModelTypes(), + modelTypes: [], }); await visit('/data/model-types'); + await sendMessage({ + type: 'data:modelTypesAdded', + modelTypes: getModelTypes(), + }); + assert.dom('.js-model-type').exists({ count: 2 }); // they should be sorted alphabetically