diff --git a/front/salix/components/log/index.html b/front/salix/components/log/index.html index 8b33c811bc..eaa9262de3 100644 --- a/front/salix/components/log/index.html +++ b/front/salix/components/log/index.html @@ -25,7 +25,8 @@ ng-click="$ctrl.showWorkerDescriptor($event, log)"> + ng-src="/api/Images/user/160x160/{{::log.userFk}}/download?access_token={{::$ctrl.vnToken.token}}" + ng-click="::$ctrl.showDescriptor('Worker', $event, log.userFk)">
@@ -212,5 +213,4 @@ - - +
diff --git a/front/salix/components/log/index.js b/front/salix/components/log/index.js index 8aea255a2f..6682536acb 100644 --- a/front/salix/components/log/index.js +++ b/front/salix/components/log/index.js @@ -8,6 +8,8 @@ const validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[ export default class Controller extends Section { constructor($element, $) { super($element, $); + this.descriptors = new Map(); + this.activeDescriptors = []; this.hashToColor = hashToColor; this.actionsText = { insert: 'Creates', @@ -70,6 +72,9 @@ export default class Controller extends Section { const castJsonValue = this.castJsonValue; for (const log of value) { + if (log.changedModel && !this.descriptors.get(log.changedModel)) + this.fillDescriptorsMap(log.changedModel); + const notDelete = log.action != 'delete'; const olds = (notDelete ? log.oldInstance : null) || empty; const vals = (notDelete ? log.newInstance : log.oldInstance) || empty; @@ -78,23 +83,37 @@ export default class Controller extends Section { let props = Object.keys(olds).concat(Object.keys(vals)); props = [...new Set(props)]; - log.props = []; for (const prop of props) { + const descriptor = this.descriptors.get(log.changedModel).get(prop); if (prop.endsWith('$')) continue; log.props.push({ name: prop, nameI18n: firstUpper(locale.columns?.[prop]) || prop, old: getVal(olds, prop), - val: getVal(vals, prop) + val: getVal(vals, prop), + descriptor }); + if (descriptor && !this.activeDescriptors.includes(descriptor)) + this.activeDescriptors.push(descriptor); } log.props.sort( (a, b) => a.nameI18n.localeCompare(b.nameI18n)); } + let innerHTML = ''; + for (const descriptor of this.activeDescriptors) + innerHTML += `\n`; + + document.getElementById('descriptors').innerHTML = innerHTML; + } + + toKebabCase(str) { + return str.replace(/\s+/g, '-') + .replace(/([a-z])([A-Z])/g, '$1-$2') + .toLowerCase(); function getVal(vals, prop) { - let val, id; + let val; let id; const showProp = `${prop}$`; if (vals[showProp] != null) { @@ -121,6 +140,15 @@ export default class Controller extends Section { } } + fillDescriptorsMap(changedModel) { + const relations = new Map(); + Object.values(window.validations[changedModel].relations).forEach(relation => { + if (relation.type == 'belongsTo') + relations.set(relation.keyFrom, relation.modelTo); + }); + this.descriptors.set(changedModel, relations); + } + get showModelName() { return !(this.changedModel && this.changedModelId); } @@ -192,9 +220,9 @@ export default class Controller extends Section { } return inq.length ? {action: {inq}} : null; case 'from': - if (filter.to) { + if (filter.to) return {creationDate: {gte: value}}; - } else { + else { const to = new Date(value); to.setHours(23, 59, 59, 999); return {creationDate: {between: [value, to]}}; @@ -230,19 +258,30 @@ export default class Controller extends Section { } searchUser(search) { - if (/^[0-9]+$/.test(search)) { + if (/^[0-9]+$/.test(search)) return {id: search}; - } else { + else { return {or: [ {name: search}, {nickname: {like: `%${search}%`}} - ]} + ]}; } } - showWorkerDescriptor(event, log) { - if (log.user?.worker) - this.$.workerDescriptor.show(event.target, log.userFk); + userBgColor(user) { + if (!user) return; + const name = user.name || ''; + let hash = 0; + for (let i = 0; i < name.length; i++) + hash += name.charCodeAt(i); + return { + backgroundColor: '#' + colors[hash % colors.length] + }; + } + + showDescriptor(descriptor, event, id) { + if (!descriptor || !this.$[descriptor]) return; + this.$[descriptor].show(event.target, id); } } @@ -250,6 +289,8 @@ function firstUpper(str) { return str && str.charAt(0).toUpperCase() + str.substr(1); } +Controller.$inject = ['$element', '$scope', '$compile']; + ngModule.vnComponent('vnLog', { controller: Controller, template: require('./index.html'), diff --git a/loopback/common/methods/schema/model-info.js b/loopback/common/methods/schema/model-info.js index 6a4db033d5..4601b1ed5e 100644 --- a/loopback/common/methods/schema/model-info.js +++ b/loopback/common/methods/schema/model-info.js @@ -93,6 +93,7 @@ module.exports = Self => { json[modelName] = { properties: model.definition.rawProperties, + relations: model.relations, validations: jsonValidations, locale };