ember-emeis
Version:
The frontend for the emeis user management service
67 lines (57 loc) • 1.78 kB
JavaScript
import { assert } from "@ember/debug";
import { action } from "@ember/object";
import { inject as service } from "@ember/service";
import Component from "@glimmer/component";
import { task } from "ember-concurrency";
import { trackedTask } from "ember-resources/util/ember-concurrency";
export default class MetaFieldComponent extends Component {
intl;
constructor(...args) {
super(...args);
assert("Must pass a valid field argument", this.args.field);
assert("Must pass a valid model argument", this.args.model);
}
async evaluateToBoolean(expression) {
if (typeof expression === "boolean") {
return expression;
}
if (typeof expression === "function") {
return await expression(this.args.model);
}
if (typeof expression === "string") {
return expression === "true";
}
return false;
}
visible = trackedTask(this, this.evalVisible, () => [
this.args.field.visible,
]);
readOnly = trackedTask(this, this.evalReadOnly, () => [
this.args.field.readOnly,
]);
options = trackedTask(this, this.evalOptions, () => [
this.args.field.options,
]);
*evalVisible(visible) {
return yield this.evaluateToBoolean(visible);
}
*evalReadOnly(readOnly) {
return yield this.evaluateToBoolean(readOnly);
}
*evalOptions(options) {
// options may be a (async) function or a complex property
if (typeof options !== "function") {
return options;
}
return yield options(this.args.model);
}
updateMetaField(field, model, optionOrEvent) {
const value = optionOrEvent?.target?.value ?? optionOrEvent?.value;
model.metainfo = { ...model.metainfo, [field.slug]: value };
model.notifyPropertyChange("metainfo");
}
}