diff --git a/app/components/button/upload.js b/app/components/button/upload.js index 1926025ae072ec998dbd186a6aa4bcdee3833fd8..9c383ab6eb15f92dd2d8f89265f4f0a320812487 100644 --- a/app/components/button/upload.js +++ b/app/components/button/upload.js @@ -13,6 +13,7 @@ export default class UploadButtonComponent extends Component { <Button::Upload @node={{@node}} /> */ @service store; + @service uploader; @action onClickProxyUpload() { @@ -38,61 +39,12 @@ export default class UploadButtonComponent extends Component { return; } - Array.from(files, (file) => { - /* 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: file, - node: this.args.node, - lang: "deu" - }).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}); - }); - + this.uploader.upload({ + files: files, + lang: this.args.lang, + node: this.args.node, + on_create_doc_callback: this.args.onCreateDocumentModel }); } - 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 diff --git a/app/components/commander/action_buttons.hbs b/app/components/commander/action_buttons.hbs index e21ae35e40076e2e7187fe2123638fdf83b8af25..99b100fac76ea0debecf14c505858926d6e44c57 100644 --- a/app/components/commander/action_buttons.hbs +++ b/app/components/commander/action_buttons.hbs @@ -38,6 +38,7 @@ {{! No nodes are currently selected }} <Button::Upload @node={{@node}} + @lang={{@lang}} @onCreateDocumentModel={{@onCreateDocumentModel}} /> <button diff --git a/app/components/commander/index.hbs b/app/components/commander/index.hbs index 0bfaa87b93d2a65e381b1f53ab6ffb2e0c89fc6c..7f6366a0dfb56b2ba32b6cf3dc34b0c13e348711 100644 --- a/app/components/commander/index.hbs +++ b/app/components/commander/index.hbs @@ -9,6 +9,7 @@ @openConfirmDeletionModal={{this.openConfirmDeletionModal}} @onCreateDocumentModel={{this.onCreateDocumentModel}} @selectedNodes={{this.selected_nodes}} + @lang={{this.lang}} @node={{@node}} /> <Commander::ActionModes diff --git a/app/components/commander/index.js b/app/components/commander/index.js index 7d2a9973fddfe12871bff789c950d852f43c86f0..0c5cb663bdd16efad18c81f407efe40004c4c98d 100644 --- a/app/components/commander/index.js +++ b/app/components/commander/index.js @@ -48,6 +48,7 @@ export default class CommanderComponent extends Component { this.websockets.addHandler(this.messageHandler, this); this.ws_nodes_move.addHandler(this.wsNodesMoveHandler, this); + this.preferences.load(); } wsNodesMoveHandler(message) { @@ -202,7 +203,7 @@ export default class CommanderComponent extends Component { } @action - onDrop(data) { + async onDrop(data) { /** * data is a dictionary of following format: * { @@ -247,15 +248,12 @@ export default class CommanderComponent extends Component { this.requests.nodesMove(nodes_move_data); } else if (data['application/x.desktop']) { - // dropping items from the Desktop file manager this.uploader.upload({ files: data['application/x.desktop'], - parent_id: this.args.node.id, - lang: this.preferences.get_value({ - key: 'ocr__lang', - default_value: 'deu' - }) + node: this.args.node, + lang: this.lang, + on_create_doc_callback: this.onCreateDocumentModel }); } @@ -285,6 +283,14 @@ export default class CommanderComponent extends Component { 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() { /** diff --git a/app/models/preferences.js b/app/models/preferences.js new file mode 100644 index 0000000000000000000000000000000000000000..57ceca083a401dbdc6714b2cf6662ce8d0ba2075 --- /dev/null +++ b/app/models/preferences.js @@ -0,0 +1,9 @@ +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 diff --git a/app/services/preferences.js b/app/services/preferences.js index 1cff4c0860a4ad6021923d67caf3f4fa280ab757..d509b03e03948370a8c841f5ac174f506931c0a2 100644 --- a/app/services/preferences.js +++ b/app/services/preferences.js @@ -5,33 +5,32 @@ import { service } from '@ember/service'; export default class Preferences extends Service { @service requests; + @service store; - constructor(owner, args) { - super(owner, args); + get_value({key, default_value}) { + 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( request => request.json() ).then(json_data => json_data.data).then( 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 diff --git a/app/services/requests.js b/app/services/requests.js index 9d426f46ba0e59ec48a7e11d82b11cf252c5b80d..c3825ce28cd1de05a40b75c0463393a9c90418a5 100644 --- a/app/services/requests.js +++ b/app/services/requests.js @@ -7,6 +7,7 @@ import { base_url } from 'papermerge/utils'; export default class Requests extends Service { @service session; + @service store; async runOCR({doc_id, lang}) { /* @@ -109,18 +110,37 @@ export default class Requests extends Service { } async preferencesUpdate(data) { - let url, headers_copy = {}; + let url, + headers_copy = {}, + response, + that = this; url = `${base_url()}/preferences/bulk/`; Object.assign(headers_copy, this.headers); // create a copy of `this.headers` headers_copy['Content-Type'] = 'application/json'; - return fetch(url, { + response = fetch(url, { method: 'POST', headers: headers_copy, 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}') diff --git a/app/services/session.js b/app/services/session.js index 07ff958fb3b8c4dc88e75d4dc673db08083981c1..dc1ba260e827cb47c31f20e112bbd58102df8c1b 100644 --- a/app/services/session.js +++ b/app/services/session.js @@ -1,14 +1,16 @@ -import { inject as service } from '@ember/service'; +import { service } from '@ember/service'; import BaseSessionService from 'ember-simple-auth/services/session'; export default class SessionService extends BaseSessionService { @service currentUser; + @service preferences; async handleAuthentication() { super.handleAuthentication("authenticated.index"); try { await this.currentUser.loadCurrentUser(); + await this.preferences.load(); } catch (err) { await this.invalidate(); } diff --git a/app/services/uploader.js b/app/services/uploader.js index 4080794d578992f6a956ce60bd853b7d9b5ce96d..83879ccf8f97a9499f66d238d6617779595a18ad 100644 --- a/app/services/uploader.js +++ b/app/services/uploader.js @@ -5,10 +5,62 @@ import { service } from '@ember/service'; export default class Uploader extends Service { @service requests; + @service store; - upload({files, lang, parent_id}) { - console.log( - `Uploading files=${files} lang=${lang} parent_id=${parent_id}` - ); + upload({files, lang, node, on_create_doc_callback}) { + Array.from(files, (file) => this.upload_file({ + 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