ui/lib/shared/addon/mixins/view-new-edit.js

75 lines
1.8 KiB
JavaScript

import Mixin from '@ember/object/mixin'
import NewOrEdit from './new-or-edit';
import { computed, get, set } from '@ember/object'
import { equal, or, alias } from '@ember/object/computed'
import { inject as service } from '@ember/service';
export const VIEW = 'view';
export const NEW = 'new';
export const EDIT = 'edit';
export default Mixin.create(NewOrEdit, {
intl: service(),
titleKey: null,
inlineEdit: false,
isView: equal('mode', VIEW),
isNew: equal('mode', NEW),
isEdit: equal('mode', EDIT),
notView: or('isNew', 'isEdit'),
editing: alias('notView'),
actions: {
inlineEdit() {
set(this, 'mode', EDIT);
set(this, 'inlineEdit', true);
},
viewEditCancel() {
if ( get(this, 'inlineEdit') ) {
set(this, 'inlineEdit', false);
set(this, 'mode', VIEW);
} else {
if (this.cancel) {
this.cancel();
}
}
},
},
isClone: computed('mode', 'primaryResource.{id,name}', function() {
const pr = get(this, 'primaryResource');
const created = pr.hasOwnProperty('created');
const tpof = typeof pr.created;
let isClone = false;
if (created && ( tpof !== null || tpof !== undefined )) {
isClone = true;
}
return isClone;
}),
title: computed('mode', 'originalModel.displayName', 'primaryResource.displayName', 'titleKey', function() {
const prefix = get(this, 'titleKey');
const mode = get(this, 'mode');
const intl = get(this, 'intl');
let name = get(this, 'originalModel.displayName')
|| get(this, 'primaryResource.displayName')
|| '';
return intl.t(`${ prefix }.${ mode }`, { name });
}),
doneSaving() {
if (this.done) {
this.done();
}
return this._super(...arguments);
},
});