import AdminUser from "admin/models/admin-user"; import I18n from "I18n"; import RestModel from "discourse/models/rest"; import { ajax } from "discourse/lib/ajax"; import discourseComputed from "discourse-common/utils/decorators"; import { escapeExpression } from "discourse/lib/utilities"; function format(label, value, escape = true) { return value ? `${I18n.t(label)}: ${escape ? escapeExpression(value) : value}` : ""; } export default class StaffActionLog extends RestModel { static munge(json) { if (json.acting_user) { json.acting_user = AdminUser.create(json.acting_user); } if (json.target_user) { json.target_user = AdminUser.create(json.target_user); } return json; } static findAll(data) { return ajax("/admin/logs/staff_action_logs.json", { data }).then( (result) => { return { staff_action_logs: result.staff_action_logs.map((s) => StaffActionLog.create(s) ), user_history_actions: result.user_history_actions, }; } ); } showFullDetails = false; @discourseComputed("action_name") actionName(actionName) { return I18n.t(`admin.logs.staff_actions.actions.${actionName}`); } @discourseComputed( "email", "ip_address", "topic_id", "post_id", "category_id", "new_value", "previous_value", "details", "useCustomModalForDetails", "useModalForDetails" ) formattedDetails( email, ipAddress, topicId, postId, categoryId, newValue, previousValue, details, useCustomModalForDetails, useModalForDetails ) { const postLink = postId ? `${postId}` : null; const topicLink = topicId ? `${topicId}` : null; let lines = [ format("email", email), format("admin.logs.ip_address", ipAddress), format("admin.logs.topic_id", topicLink, false), format("admin.logs.post_id", postLink, false), format("admin.logs.category_id", categoryId), ]; if (!useCustomModalForDetails) { lines.push(format("admin.logs.staff_actions.new_value", newValue)); lines.push( format("admin.logs.staff_actions.previous_value", previousValue) ); } if (!useModalForDetails && details) { lines = [...lines, ...escapeExpression(details).split("\n")]; } const formatted = lines.filter((l) => l.length > 0).join("
"); return formatted.length > 0 ? formatted + "
" : ""; } @discourseComputed("details") useModalForDetails(details) { return details && details.length > 100; } @discourseComputed("action_name") useCustomModalForDetails(actionName) { return ["change_theme", "delete_theme"].includes(actionName); } }