0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-26 19:10:29 +01:00
discourse-custom-wizard/assets/javascripts/wizard/components/similar-topics-validator.js.es6
angusmcleod c45e51fcb6 Various fixes
* Code formatting
* Both "type" and "name" are used to refer to the validation type. Changed all to "type".
* Added proper abstraction of realtime validation classes on server
* UI improvements in admin and wizard
2021-02-16 11:43:00 +11:00

73 Zeilen
2,1 KiB
JavaScript

import WizardFieldValidator from "../../wizard/components/validator";
import { deepMerge } from "discourse-common/lib/object";
import { observes } from "discourse-common/utils/decorators";
import { cancel, later } from "@ember/runloop";
import { A } from "@ember/array";
import EmberObject, { computed } from "@ember/object";
import { notEmpty, and, equal, empty } from "@ember/object/computed";
export default WizardFieldValidator.extend({
classNames: ['similar-topics-validator'],
similarTopics: null,
hasInput: notEmpty('field.value'),
hasSimilarTopics: notEmpty('similarTopics'),
hasNotSearched: equal('similarTopics', null),
noSimilarTopics: computed('similarTopics', function() {
return this.similarTopics !== null && this.similarTopics.length == 0;
}),
showDefault: and('hasNotSearched', 'hasInput'),
validate() {},
@observes("field.value")
customValidate() {
const field = this.field;
if (!field.value) return;
const value = field.value;
if (value && value.length < 5) {
this.set('similarTopics', null);
return;
}
const lastKeyUp = new Date();
this._lastKeyUp = lastKeyUp;
// One second from now, check to see if the last key was hit when
// we recorded it. If it was, the user paused typing.
cancel(this._lastKeyTimeout);
this._lastKeyTimeout = later(() => {
if (lastKeyUp !== this._lastKeyUp) {
return;
}
this.updateSimilarTopics();
}, 1000);
},
updateSimilarTopics() {
this.set('updating', true);
this.backendValidate({
title: this.get("field.value"),
categories: this.get("validation.categories"),
date_after: this.get("validation.date_after"),
}).then((result) => {
const similarTopics = A(
deepMerge(result["topics"], result["similar_topics"])
);
similarTopics.forEach(function (topic, index) {
similarTopics[index] = EmberObject.create(topic);
});
this.set("similarTopics", similarTopics);
}).finally(() => this.set('updating', false));
},
actions: {
closeMessage() {
this.set("showMessage", false);
},
},
});