From: Bill Erickson Date: Mon, 13 Aug 2018 15:08:14 +0000 (-0400) Subject: LP#1775466 Translation widget; apply OpenSRF.locale X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=a8d8ab83e68acd8002b35c8141ff6a6a73a89b0e;p=working%2FEvergreen.git LP#1775466 Translation widget; apply OpenSRF.locale Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/src/eg2/src/app/resolver.service.ts b/Open-ILS/src/eg2/src/app/resolver.service.ts index ac5c381d5d..faa6038973 100644 --- a/Open-ILS/src/eg2/src/app/resolver.service.ts +++ b/Open-ILS/src/eg2/src/app/resolver.service.ts @@ -3,6 +3,10 @@ import {Router, Resolve, RouterStateSnapshot, ActivatedRouteSnapshot} from '@angular/router'; import {IdlService} from '@eg/core/idl.service'; import {OrgService} from '@eg/core/org.service'; +import {LocaleService} from '@eg/core/locale.service'; + +// For locale application +declare var OpenSRF; @Injectable() export class BaseResolver implements Resolve> { @@ -11,6 +15,7 @@ export class BaseResolver implements Resolve> { private router: Router, private idl: IdlService, private org: OrgService, + private locale: LocaleService ) {} /** @@ -22,6 +27,8 @@ export class BaseResolver implements Resolve> { route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { + OpenSRF.locale = this.locale.currentLocaleCode(); + this.idl.parseIdl(); return this.org.fetchOrgs(); // anonymous PCRUD. diff --git a/Open-ILS/src/eg2/src/app/staff/common.module.ts b/Open-ILS/src/eg2/src/app/staff/common.module.ts index 6780b81a2b..e83143c9a3 100644 --- a/Open-ILS/src/eg2/src/app/staff/common.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/common.module.ts @@ -18,6 +18,7 @@ import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component'; import {DateSelectComponent} from '@eg/share/date-select/date-select.component'; import {RecordBucketDialogComponent} from '@eg/staff/share/buckets/record-bucket-dialog.component'; import {BibSummaryComponent} from '@eg/staff/share/bib-summary/bib-summary.component'; +import {TranslateComponent} from '@eg/staff/share/translate/translate.component'; import {AdminPageComponent} from '@eg/staff/share/admin-page/admin-page.component'; /** @@ -39,6 +40,7 @@ import {AdminPageComponent} from '@eg/staff/share/admin-page/admin-page.componen DateSelectComponent, RecordBucketDialogComponent, BibSummaryComponent, + TranslateComponent, AdminPageComponent ], imports: [ @@ -61,6 +63,7 @@ import {AdminPageComponent} from '@eg/staff/share/admin-page/admin-page.componen DateSelectComponent, RecordBucketDialogComponent, BibSummaryComponent, + TranslateComponent, AdminPageComponent ] }) diff --git a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html index 0f76d51086..289ed50268 100644 --- a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html +++ b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.html @@ -100,6 +100,15 @@ Hello, {{context.world}}!

+HERasdfE +
+
+ + +
+
+

diff --git a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts index 9314e709cc..7b74516c19 100644 --- a/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/sandbox/sandbox.component.ts @@ -51,6 +51,8 @@ export class SandboxComponent implements OnInit { this.testStr = str; } + oneBtype: IdlObject; + name = 'Jane'; constructor( @@ -101,11 +103,10 @@ export class SandboxComponent implements OnInit { }).pipe(map(cbt => { // example of inline fleshing cbt.owner(this.org.get(cbt.owner())); + this.oneBtype = cbt; return cbt; })); }; - - } btGridRowClassCallback(row: any): string { diff --git a/Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.html b/Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.html new file mode 100644 index 0000000000..a57ca17164 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.html @@ -0,0 +1,51 @@ + + + + + diff --git a/Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.ts b/Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.ts new file mode 100644 index 0000000000..a165afee50 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/translate/translate.component.ts @@ -0,0 +1,128 @@ +import {Component, OnInit, Input, Renderer2} from '@angular/core'; +import {IdlService, IdlObject} from '@eg/core/idl.service'; +import {ToastService} from '@eg/share/toast/toast.service'; +import {LocaleService} from '@eg/core/locale.service'; +import {AuthService} from '@eg/core/auth.service'; +import {PcrudService} from '@eg/core/pcrud.service'; +import {DialogComponent} from '@eg/share/dialog/dialog.component'; +import {NgbModal} from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'eg-translate', + templateUrl: 'translate.component.html' +}) + +export class TranslateComponent + extends DialogComponent implements OnInit { + + idlClassDef: any; + locales: IdlObject[]; + selectedLocale: string; + translatedValue: string; + existingTranslation: IdlObject; + + idlObj: IdlObject; + @Input() set idlObject(o: IdlObject) { + if (o) { + this.idlObj = o; + this.idlClassDef = this.idl.classes[o.classname]; + this.fetchTranslation(); + } + } + + field: string; + @Input() set fieldName(n: string) { + this.field = n; + } + + constructor( + private modal: NgbModal, // required for passing to parent + private renderer: Renderer2, + private idl: IdlService, + private toast: ToastService, + private locale: LocaleService, + private pcrud: PcrudService, + private auth: AuthService) { + super(modal); + } + + ngOnInit() { + // Default to the login locale + this.selectedLocale = this.locale.currentLocaleCode(); + this.locales = []; + this.locale.supportedLocales().subscribe(l => this.locales.push(l)); + + this.onOpen$.subscribe(() => { + const elm = this.renderer.selectRootElement('#translation-input'); + if (elm) { + elm.focus(); + elm.select(); + } + }); + } + + localeChanged(code: string) { + this.fetchTranslation(); + } + + fetchTranslation() { + const exist = this.existingTranslation; + + if (exist + && exist.fq_field() === this.fqField() + && exist.identity_value() === this.identValue()) { + // Already have the current translation object. + return; + } + + this.translatedValue = ''; + this.existingTranslation = null; + + this.pcrud.search('i18n', { + translation: this.selectedLocale, + fq_field : this.fqField(), + identity_value: this.identValue() + }).subscribe(tr => { + this.existingTranslation = tr; + this.translatedValue = tr.string(); + console.debug('found existing translation ', tr); + }); + } + + fqField(): string { + return this.idlClassDef.classname + '.' + this.field; + } + + identValue(): string { + return this.idlObj[this.idlClassDef.pkey || 'id'](); + } + + translate() { + if (!this.translatedValue) return; + + if (this.existingTranslation) { + const entry = this.existingTranslation; + entry.string(this.translatedValue); + + this.pcrud.update(entry).toPromise().then( + ok => this.close('Translation updated'), + err => console.error(err) + ); + + return; + } + + const entry = this.idl.create('i18n'); + entry.fq_field(this.fqField()); + entry.identity_value(this.identValue()); + entry.translation(this.selectedLocale); + entry.string(this.translatedValue); + + this.pcrud.create(entry).toPromise().then( + ok => this.close('Translation created'), + err => console.error('Translation creation failed') + ); + } +} + +