126 lines
2.9 KiB
JavaScript
126 lines
2.9 KiB
JavaScript
import I18n from "I18n";
|
|
import ModalFunctionality from "discourse/mixins/modal-functionality";
|
|
import { popupAjaxError } from "discourse/lib/ajax-error";
|
|
import InputValidation from "discourse/models/input-validation";
|
|
import {
|
|
default as computed,
|
|
observes,
|
|
on,
|
|
} from "discourse-common/utils/decorators";
|
|
|
|
export default Ember.Controller.extend(ModalFunctionality, {
|
|
@on("init")
|
|
setupKeydown() {
|
|
Ember.run.schedule("afterRender", () => {
|
|
$("#chat-integration-edit-channel-modal").keydown((e) => {
|
|
if (e.keyCode === 13) {
|
|
this.send("save");
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
// The validation property must be defined at runtime since the possible parameters vary by provider
|
|
@observes("model")
|
|
setupValidations() {
|
|
if (this.get("model.provider")) {
|
|
const theKeys = this.get("model.provider.channel_parameters").map(
|
|
(param) => param["key"]
|
|
);
|
|
Ember.defineProperty(
|
|
this,
|
|
"paramValidation",
|
|
Ember.computed(
|
|
`model.channel.data.{${theKeys.join(",")}}`,
|
|
this._paramValidation
|
|
)
|
|
);
|
|
}
|
|
},
|
|
|
|
validate(parameter) {
|
|
const regString = parameter.regex;
|
|
const regex = new RegExp(regString);
|
|
let val = this.get(`model.channel.data.${parameter.key}`);
|
|
|
|
if (val === undefined) {
|
|
val = "";
|
|
}
|
|
|
|
if (val === "") {
|
|
// Fail silently if field blank
|
|
return InputValidation.create({
|
|
failed: true,
|
|
});
|
|
} else if (!regString) {
|
|
// Pass silently if no regex available for provider
|
|
return InputValidation.create({
|
|
ok: true,
|
|
});
|
|
} else if (regex.test(val)) {
|
|
// Test against regex
|
|
return InputValidation.create({
|
|
ok: true,
|
|
reason: I18n.t(
|
|
"chat_integration.edit_channel_modal.channel_validation.ok"
|
|
),
|
|
});
|
|
} else {
|
|
// Failed regex
|
|
return InputValidation.create({
|
|
failed: true,
|
|
reason: I18n.t(
|
|
"chat_integration.edit_channel_modal.channel_validation.fail"
|
|
),
|
|
});
|
|
}
|
|
},
|
|
|
|
_paramValidation() {
|
|
const response = {};
|
|
const parameters = this.get("model.provider.channel_parameters");
|
|
|
|
parameters.forEach((parameter) => {
|
|
response[parameter.key] = this.validate(parameter);
|
|
});
|
|
|
|
return response;
|
|
},
|
|
|
|
@computed("paramValidation")
|
|
saveDisabled(paramValidation) {
|
|
if (!paramValidation) return true;
|
|
|
|
let invalid = false;
|
|
|
|
Object.keys(paramValidation).forEach((key) => {
|
|
if (!paramValidation[key]) {
|
|
invalid = true;
|
|
}
|
|
|
|
if (!paramValidation[key]["ok"]) {
|
|
invalid = true;
|
|
}
|
|
});
|
|
|
|
return invalid;
|
|
},
|
|
|
|
actions: {
|
|
cancel() {
|
|
this.send("closeModal");
|
|
},
|
|
|
|
save() {
|
|
if (this.get("saveDisabled")) return;
|
|
|
|
this.get("model.channel")
|
|
.save()
|
|
.then(() => {
|
|
this.send("closeModal");
|
|
})
|
|
.catch(popupAjaxError);
|
|
},
|
|
},
|
|
});
|