discourse-assign/assets/javascripts/discourse/components/assign-user-form.js

118 lines
2.7 KiB
JavaScript

import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
import { inject as service } from "@ember/service";
export default class AssignUserForm extends Component {
@service taskActions;
@service siteSettings;
@service capabilities;
@tracked assigneeError = false;
@tracked
assigneeName = this.args.model.username || this.args.model.group_name;
TOPIC_ID = 0;
constructor() {
super(...arguments);
this.args.formApi.submit = this.assign;
this.selectedTargetId = this.TOPIC_ID;
this.args.model.updatedPostAssignments = new Map();
}
get assignments() {
const topicAssignment = { id: this.TOPIC_ID, name: "Topic" };
return [topicAssignment, ...this.postAssignments];
}
get postAssignments() {
if (this.args.model.targetType !== "Topic") {
return [];
}
const topic = this.args.model.target;
if (
!topic.indirectly_assigned_to ||
!Object.keys(topic.indirectly_assigned_to).length
) {
return [];
}
return Object.values(topic.indirectly_assigned_to).map((value) => {
return { id: value.post_number, name: `Post #${value.post_number}` };
});
}
get availableStatuses() {
return this.siteSettings.assign_statuses
.split("|")
.map((status) => ({ id: status, name: status }));
}
get editingTopicAssignments() {
return this.args.model.targetType === "Topic" && this.args.model.reassign;
}
get status() {
return (
this.args.model.status || this.siteSettings.assign_statuses.split("|")[0]
);
}
@action
handleTextAreaKeydown(event) {
if ((event.ctrlKey || event.metaKey) && event.key === "Enter") {
this.assign();
}
}
@action
async assign() {
if (!this.assigneeName) {
this.assigneeError = true;
return;
}
await this.args.onSubmit();
}
@action
assignUsername([name]) {
this.assigneeName = name;
this.assigneeError = false;
let username, groupName;
if (this.taskActions.allowedGroupsForAssignment.includes(name)) {
username = null;
groupName = name;
} else {
username = name;
groupName = null;
}
this.args.model.username = username;
this.args.model.group_name = groupName;
if (this.editingTopicAssignments) {
// fixme andrei implement
}
}
@action
synchronizeAssignee(selectedTargetId) {
this.selectedTargetId = selectedTargetId;
const topic = this.args.model.target;
let assignee;
if (selectedTargetId === this.TOPIC_ID) {
assignee = topic.assigned_to_user;
} else {
const postNumber = selectedTargetId;
assignee = topic.postAssignee(postNumber);
}
this.assigneeName = assignee.username;
}
}