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

preference are now working !

parent cdfa7344
Branches
Tags
No related merge requests found
...@@ -13,6 +13,7 @@ export default class UploadButtonComponent extends Component { ...@@ -13,6 +13,7 @@ export default class UploadButtonComponent extends Component {
<Button::Upload @node={{@node}} /> <Button::Upload @node={{@node}} />
*/ */
@service store; @service store;
@service uploader;
@action @action
onClickProxyUpload() { onClickProxyUpload() {
...@@ -38,61 +39,12 @@ export default class UploadButtonComponent extends Component { ...@@ -38,61 +39,12 @@ export default class UploadButtonComponent extends Component {
return; return;
} }
Array.from(files, (file) => { this.uploader.upload({
/* Upload of documents to the server side is two stage process: files: files,
(1.) create document model on the server side lang: this.args.lang,
(2.) upload file and associated it with model created in (1.)
*/
this._createDocumentModel({
file: file,
node: this.args.node, node: this.args.node,
lang: "deu" on_create_doc_callback: this.args.onCreateDocumentModel
}).then((doc) => {
// notify commander component so that it
// can already show new document model to the user
this.args.onCreateDocumentModel(doc);
// continue with actual file upload
this._uploadFile({doc, file});
});
}); });
} }
async _createDocumentModel({file, node, lang}) {
/*
Creates document model on the server side.
This will create, on the server side, the document model
with specified `lang`, `title`, `parent_id` attribute.
Server side will take care of associating it to the correct user.
It is important to understand that NO FILE UPLOAD happens
in this method. Because there is no file uploaded at this stage,
server side document model will be created with
`size` and `page_count` attributes set to zero i.e.
size = 0
page_count = 0
*/
let new_doc;
new_doc = this.store.createRecord('document');
new_doc.title = file.name;
new_doc.parent = node;
new_doc.lang = lang;
return new_doc.save();
}
_uploadFile({file, doc}) {
/*
Uploads given file for given document model.
Document model ``doc`` should exist on the server side.
*/
let doc_adapter = this.store.adapterFor('document');
doc_adapter.uploadFile({file, doc});
}
} }
\ No newline at end of file
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
{{! No nodes are currently selected }} {{! No nodes are currently selected }}
<Button::Upload <Button::Upload
@node={{@node}} @node={{@node}}
@lang={{@lang}}
@onCreateDocumentModel={{@onCreateDocumentModel}} /> @onCreateDocumentModel={{@onCreateDocumentModel}} />
<button <button
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
@openConfirmDeletionModal={{this.openConfirmDeletionModal}} @openConfirmDeletionModal={{this.openConfirmDeletionModal}}
@onCreateDocumentModel={{this.onCreateDocumentModel}} @onCreateDocumentModel={{this.onCreateDocumentModel}}
@selectedNodes={{this.selected_nodes}} @selectedNodes={{this.selected_nodes}}
@lang={{this.lang}}
@node={{@node}} /> @node={{@node}} />
<Commander::ActionModes <Commander::ActionModes
......
...@@ -48,6 +48,7 @@ export default class CommanderComponent extends Component { ...@@ -48,6 +48,7 @@ export default class CommanderComponent extends Component {
this.websockets.addHandler(this.messageHandler, this); this.websockets.addHandler(this.messageHandler, this);
this.ws_nodes_move.addHandler(this.wsNodesMoveHandler, this); this.ws_nodes_move.addHandler(this.wsNodesMoveHandler, this);
this.preferences.load();
} }
wsNodesMoveHandler(message) { wsNodesMoveHandler(message) {
...@@ -202,7 +203,7 @@ export default class CommanderComponent extends Component { ...@@ -202,7 +203,7 @@ export default class CommanderComponent extends Component {
} }
@action @action
onDrop(data) { async onDrop(data) {
/** /**
* data is a dictionary of following format: * data is a dictionary of following format:
* { * {
...@@ -247,15 +248,12 @@ export default class CommanderComponent extends Component { ...@@ -247,15 +248,12 @@ export default class CommanderComponent extends Component {
this.requests.nodesMove(nodes_move_data); this.requests.nodesMove(nodes_move_data);
} else if (data['application/x.desktop']) { } else if (data['application/x.desktop']) {
// dropping items from the Desktop file manager // dropping items from the Desktop file manager
this.uploader.upload({ this.uploader.upload({
files: data['application/x.desktop'], files: data['application/x.desktop'],
parent_id: this.args.node.id, node: this.args.node,
lang: this.preferences.get_value({ lang: this.lang,
key: 'ocr__lang', on_create_doc_callback: this.onCreateDocumentModel
default_value: 'deu'
})
}); });
} }
...@@ -285,6 +283,14 @@ export default class CommanderComponent extends Component { ...@@ -285,6 +283,14 @@ export default class CommanderComponent extends Component {
console.log(`onDragendSuccess on ${this.args.hint}: id=${model.id} type=${model.nodeType}`); console.log(`onDragendSuccess on ${this.args.hint}: id=${model.id} type=${model.nodeType}`);
} }
get lang() {
let _lang = this.preferences.get_value({
key: 'ocr__language',
default_value: 'deu'
});
return _lang;
}
get children() { get children() {
/** /**
......
import Model, { attr } from '@ember-data/model';
export default class PreferenceModel extends Model {
@attr name;
@attr value;
@attr section;
@attr identifier;
}
\ No newline at end of file
...@@ -5,33 +5,32 @@ import { service } from '@ember/service'; ...@@ -5,33 +5,32 @@ import { service } from '@ember/service';
export default class Preferences extends Service { export default class Preferences extends Service {
@service requests; @service requests;
@service store;
constructor(owner, args) { get_value({key, default_value}) {
super(owner, args); let found_item, prefs;
let that = this; prefs = this.store.peekAll('preferences');
found_item = prefs.filterBy('identifier',key);
if (found_item && found_item.length == 1) {
return found_item[0]['value'];
}
this.preferences = []; return default_value;
}
async load() {
let that = this;
this.requests.preferences().then( this.requests.preferences().then(
request => request.json() request => request.json()
).then(json_data => json_data.data).then( ).then(json_data => json_data.data).then(
list_of_attrs => { list_of_attrs => {
that.preferences = list_of_attrs.map(attr => attr.attributes); that.store.push({
data: list_of_attrs
});
}); });
}
get_value({key, default_value}) {
let found_item;
found_item = this.preferences.find(
item => item.idendifier == key
);
if (found_item) {
return found_item['value'];
}
return default_value;
} }
} }
\ No newline at end of file
...@@ -7,6 +7,7 @@ import { base_url } from 'papermerge/utils'; ...@@ -7,6 +7,7 @@ import { base_url } from 'papermerge/utils';
export default class Requests extends Service { export default class Requests extends Service {
@service session; @service session;
@service store;
async runOCR({doc_id, lang}) { async runOCR({doc_id, lang}) {
/* /*
...@@ -109,18 +110,37 @@ export default class Requests extends Service { ...@@ -109,18 +110,37 @@ export default class Requests extends Service {
} }
async preferencesUpdate(data) { async preferencesUpdate(data) {
let url, headers_copy = {}; let url,
headers_copy = {},
response,
that = this;
url = `${base_url()}/preferences/bulk/`; url = `${base_url()}/preferences/bulk/`;
Object.assign(headers_copy, this.headers); // create a copy of `this.headers` Object.assign(headers_copy, this.headers); // create a copy of `this.headers`
headers_copy['Content-Type'] = 'application/json'; headers_copy['Content-Type'] = 'application/json';
return fetch(url, { response = fetch(url, {
method: 'POST', method: 'POST',
headers: headers_copy, headers: headers_copy,
body: JSON.stringify(data) body: JSON.stringify(data)
}); });
response.then(response => response.json()).then(
list_of_attrs => {
list_of_attrs.data.map(item => {
that.store.push({data: {
id: item.id,
type: "preferences",
attributes: {
name: item.name,
value: item.value,
section: item.section,
identifier: item.identifier
}
}});
});
});
} }
@computed('session.{data.authenticated.token,isAuthenticated}') @computed('session.{data.authenticated.token,isAuthenticated}')
......
import { inject as service } from '@ember/service'; import { service } from '@ember/service';
import BaseSessionService from 'ember-simple-auth/services/session'; import BaseSessionService from 'ember-simple-auth/services/session';
export default class SessionService extends BaseSessionService { export default class SessionService extends BaseSessionService {
@service currentUser; @service currentUser;
@service preferences;
async handleAuthentication() { async handleAuthentication() {
super.handleAuthentication("authenticated.index"); super.handleAuthentication("authenticated.index");
try { try {
await this.currentUser.loadCurrentUser(); await this.currentUser.loadCurrentUser();
await this.preferences.load();
} catch (err) { } catch (err) {
await this.invalidate(); await this.invalidate();
} }
......
...@@ -5,10 +5,62 @@ import { service } from '@ember/service'; ...@@ -5,10 +5,62 @@ import { service } from '@ember/service';
export default class Uploader extends Service { export default class Uploader extends Service {
@service requests; @service requests;
@service store;
upload({files, lang, parent_id}) { upload({files, lang, node, on_create_doc_callback}) {
console.log( Array.from(files, (file) => this.upload_file({
`Uploading files=${files} lang=${lang} parent_id=${parent_id}` file, node, lang, on_create_doc_callback
); }));
}
upload_file({file, lang, node, on_create_doc_callback}) {
/* Upload of documents to the server side is two stage process:
(1.) create document model on the server side
(2.) upload file and associated it with model created in (1.)
*/
this._createDocumentModel({file, node, lang}).then((doc) => {
// notify commander component so that it
// can already show new document model to the user
on_create_doc_callback(doc);
// continue with actual file upload
this._uploadFile({doc, file});
});
}
async _createDocumentModel({file, node, lang}) {
/*
Creates document model on the server side.
This will create, on the server side, the document model
with specified `lang`, `title`, `parent_id` attribute.
Server side will take care of associating it to the correct user.
It is important to understand that NO FILE UPLOAD happens
in this method. Because there is no file uploaded at this stage,
server side document model will be created with
`size` and `page_count` attributes set to zero i.e.
size = 0
page_count = 0
*/
let new_doc;
new_doc = this.store.createRecord('document');
new_doc.title = file.name;
new_doc.parent = node;
new_doc.lang = lang;
return new_doc.save();
}
_uploadFile({file, doc}) {
/*
Uploads given file for given document model.
Document model ``doc`` should exist on the server side.
*/
let doc_adapter = this.store.adapterFor('document');
doc_adapter.uploadFile({file, doc});
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment