Skip to content
Snippets Groups Projects
Commit b7bea4ef authored by Eugen Ciur's avatar Eugen Ciur
Browse files

pagination and polymorphic models in the store

parent 2b91b9be
Branches
No related tags found
No related merge requests found
...@@ -11,7 +11,7 @@ export default class ApplicationAdapter extends JSONAPIAdapter { ...@@ -11,7 +11,7 @@ export default class ApplicationAdapter extends JSONAPIAdapter {
buildURL(...args) { buildURL(...args) {
return `${super.buildURL(...args)}/`; return `${super.buildURL(...args)}/`;
} }
/*
pathForType(modelName) { pathForType(modelName) {
let ret = super.pathForType(modelName); let ret = super.pathForType(modelName);
...@@ -26,6 +26,7 @@ export default class ApplicationAdapter extends JSONAPIAdapter { ...@@ -26,6 +26,7 @@ export default class ApplicationAdapter extends JSONAPIAdapter {
return ret; return ret;
} }
*/
@computed('session.data.authenticated.token', 'session.isAuthenticated') @computed('session.data.authenticated.token', 'session.isAuthenticated')
get headers() { get headers() {
... ...
......
import ApplicationAdapter from './application';
export default class FolderAdapter extends ApplicationAdapter {
findFolder(folder_id) {
let url, ret;
if (!folder_id) {
console.log('FolderAdapter: folder_id is empty.');
return;
}
url = this.buildURL('folders', folder_id);
return this.ajax(url, 'GET').then((folder) => {
this.store.pushPayload('folder', folder);
ret = this.store.peekRecord('folder', folder.data.id);
return ret;
});
}
}
import ApplicationAdapter from './application'; import ApplicationAdapter from './application';
import { inject as service } from '@ember/service';
export default class NodeAdapter extends ApplicationAdapter { export default class NodeAdapter extends ApplicationAdapter {
findNode(node_id) { @service store;
let url, ret;
async getChildren(node_id) {
let url, nodes, folders, docs;
url = this.buildURL('nodes', node_id); url = this.buildURL('nodes', node_id);
return this.ajax(url, 'GET', {data: {include: 'children'}}).then((node) => { nodes = await fetch(url, {
this.store.pushPayload('folder', node); method: 'GET',
ret = this.store.peekRecord('folder', node.data.id); headers: this.headers
return ret; }).then(response => response.json());
nodes.data.map(node => {
let normalized_node = this.store.normalize('node', node);
this.store.push(normalized_node);
}); });
folders = this.store.peekAll('folder').filter(folder => folder.parent.get('id') == node_id);
docs = this.store.peekAll('document').filter(folder => folder.parent.get('id') == node_id);
return folders.concat(docs);
} }
} }
...@@ -4,13 +4,16 @@ import { inject as service } from '@ember/service'; ...@@ -4,13 +4,16 @@ import { inject as service } from '@ember/service';
export default class BaseRoute extends Route { export default class BaseRoute extends Route {
@service session; @service session;
@service store;
@service currentUser; @service currentUser;
async beforeModel(transition) { async beforeModel(transition) {
this.session.requireAuthentication(transition, 'login'); this.session.requireAuthentication(transition, 'login');
await this.currentUser.loadCurrentUser(); await this.currentUser.loadCurrentUser();
if (this.currentUser.user) { if (this.currentUser.user) {
await this.currentUser.user.home_folder; return this.currentUser.user.getHomeFolder();
} }
} }
...@@ -19,7 +22,7 @@ export default class BaseRoute extends Route { ...@@ -19,7 +22,7 @@ export default class BaseRoute extends Route {
let app_controller = this.controllerFor('authenticated'); let app_controller = this.controllerFor('authenticated');
this.currentUser.user.home_folder.then((home_folder) => { this.currentUser.user.getHomeFolder().then((home_folder) => {
app_controller.set('home_folder', home_folder); app_controller.set('home_folder', home_folder);
}); });
... ...
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
@hint={{@hint}} /> @hint={{@hint}} />
<div class="view-mode-{{this.view_mode}}"> <div class="view-mode-{{this.view_mode}}">
{{#each @node.children as |node|}} {{#each @children as |node|}}
{{#let (component node.nodeType) as |NodeType|}} {{#let (component node.nodeType) as |NodeType|}}
{{! NodeType is either <Folder /> or <Document />}} {{! NodeType is either <Folder /> or <Document />}}
<NodeType <NodeType
... ...
......
<div class="d-flex flex-column flex-shrink-0 p-3 text-white bg-dark sidebar-open" > <div class="d-flex flex-column flex-shrink-0 p-3 text-white bg-dark sidebar-open" >
{{this.args.homeFolder}}
<LinkTo <LinkTo
@route="authenticated.nodes" @route="authenticated.nodes"
@model="{{@home_folder.id}}" @model="{{@home_folder.id}}"
... ...
......
import { attr } from '@ember-data/model';
import NodeModel from './node'; import NodeModel from './node';
export default class FolderModel extends NodeModel { export default class FolderModel extends NodeModel {
get nodeType() { get nodeType() {
... ...
......
import Model, { attr, belongsTo } from '@ember-data/model'; import Model, { attr, belongsTo } from '@ember-data/model';
class UserModel extends Model { class UserModel extends Model {
@attr username; @attr username;
@attr email; @attr email;
...@@ -12,14 +13,23 @@ class UserModel extends Model { ...@@ -12,14 +13,23 @@ class UserModel extends Model {
@attr created_at; @attr created_at;
@attr updated_at; @attr updated_at;
@belongsTo('role') role; @belongsTo('role') role;
@belongsTo('node') home_folder; @belongsTo('folder') home_folder;
@belongsTo('node') inbox_folder; @belongsTo('folder') inbox_folder;
changePassword(new_password) { changePassword(new_password) {
const adapter = this.store.adapterFor('user'); const adapter = this.store.adapterFor('user');
return adapter.changePassword(this, new_password); return adapter.changePassword(this, new_password);
} }
async getHomeFolder() {
let home_id, folder_adapter;
home_id = this.home_folder.get('id');
folder_adapter = this.store.adapterFor('folder');
return folder_adapter.findFolder(home_id);
}
} }
export default UserModel; export default UserModel;
...@@ -7,8 +7,7 @@ export default class ApplicationRoute extends BaseRoute { ...@@ -7,8 +7,7 @@ export default class ApplicationRoute extends BaseRoute {
async model() { async model() {
if (this.currentUser.isAuthenticated) { if (this.currentUser.isAuthenticated) {
console.log("ApplicationRoute: current user is authenticated"); return this.currentUser.user.getHomeFolder();
return this.currentUser.user.home_folder;
} }
} }
... ...
......
...@@ -11,11 +11,9 @@ export default class IndexRoute extends Route { ...@@ -11,11 +11,9 @@ export default class IndexRoute extends Route {
/* Redirects to user's home folder /* Redirects to user's home folder
*/ */
let that = this; let that = this;
this.session.requireAuthentication(transition, 'login'); this.session.requireAuthentication(transition, 'login');
await this.currentUser.loadCurrentUser(); await this.currentUser.loadCurrentUser();
this.currentUser.user.getHomeFolder().then((home_folder) => {
this.currentUser.user.home_folder.then((home_folder) => {
that.replaceWith("authenticated.nodes", home_folder.id); that.replaceWith("authenticated.nodes", home_folder.id);
}); });
} }
... ...
......
...@@ -20,12 +20,17 @@ export default class FolderRoute extends Route { ...@@ -20,12 +20,17 @@ export default class FolderRoute extends Route {
let adapter, let adapter,
doc_adapter, doc_adapter,
page_adapter, page_adapter,
folder_adapter,
pages, pages,
current_node,
pages_with_url, pages_with_url,
document_version; document_version,
children,
home_folder;
adapter = this.store.adapterFor('node'); adapter = this.store.adapterFor('node');
page_adapter = this.store.adapterFor('page'); page_adapter = this.store.adapterFor('page');
folder_adapter = this.store.adapterFor('folder');
doc_adapter = this.store.adapterFor('document'); doc_adapter = this.store.adapterFor('document');
await this.currentUser.loadCurrentUser(); await this.currentUser.loadCurrentUser();
...@@ -51,13 +56,16 @@ export default class FolderRoute extends Route { ...@@ -51,13 +56,16 @@ export default class FolderRoute extends Route {
}); });
} }
return RSVP.hash({ children = await adapter.getChildren(params.node_id);
node: adapter.findNode(params.node_id), home_folder = await this.currentUser.user.getHomeFolder();
home_folder: this.currentUser.user.home_folder current_node = await this.store.findRecord('folder', params.node_id);
});
return {current_node, home_folder, children};
} }
setupController(controller, model) { setupController(controller, model) {
let _controller = this.controllerFor('authenticated.nodes'), let _controller = this.controllerFor('authenticated.nodes'),
_auth_controller = this.controllerFor('authenticated'); _auth_controller = this.controllerFor('authenticated');
...@@ -73,8 +81,8 @@ export default class FolderRoute extends Route { ...@@ -73,8 +81,8 @@ export default class FolderRoute extends Route {
_controller.set('dualpanel_mode', false); _controller.set('dualpanel_mode', false);
_controller.set('extranode', undefined); _controller.set('extranode', undefined);
} }
_controller.set('mainnode', model.current_node);
_controller.set('mainnode', model.node);
_auth_controller.set('home_folder', model.home_folder); _auth_controller.set('home_folder', model.home_folder);
_controller.set('children', model.children);
} }
} }
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<Commander <Commander
@node={{this.mainnode}} @node={{this.mainnode}}
@extranode={{this.extranode}} @extranode={{this.extranode}}
@children={{this.children}}
@onPanelToggle={{this.onPanelToggle}} @onPanelToggle={{this.onPanelToggle}}
@dualPanelMode={{this.dualpanel_mode}} @dualPanelMode={{this.dualpanel_mode}}
@hint="left" /> @hint="left" />
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment