2021-08-03 22:29:33 +12:00
|
|
|
(function (window) {
|
|
|
|
"use strict";
|
|
|
|
window.ls.container.get("view").add({
|
|
|
|
selector: "data-custom-id",
|
2021-08-03 23:23:13 +12:00
|
|
|
controller: function (element, sdk, console) {
|
2021-08-04 20:36:37 +12:00
|
|
|
let prevData = "";
|
2021-08-04 18:39:23 +12:00
|
|
|
let idType = element.dataset["id-type"];
|
2021-08-03 22:29:33 +12:00
|
|
|
|
2021-08-04 20:36:37 +12:00
|
|
|
const div = window.document.createElement("div");
|
2021-08-03 22:29:33 +12:00
|
|
|
div.className = "input-copy";
|
|
|
|
|
2021-08-04 20:36:37 +12:00
|
|
|
const button = window.document.createElement("i");
|
2021-08-03 22:29:33 +12:00
|
|
|
button.type = "button";
|
|
|
|
button.style.cursor = "pointer";
|
|
|
|
|
2021-08-04 20:36:37 +12:00
|
|
|
const writer = document.createElement("input");
|
2021-08-03 22:29:33 +12:00
|
|
|
writer.type = "text";
|
|
|
|
writer.className = "";
|
|
|
|
writer.setAttribute("maxlength", element.getAttribute("maxlength"));
|
2021-08-04 20:36:37 +12:00
|
|
|
const placeholder = element.getAttribute("placeholder");
|
2021-08-03 22:29:33 +12:00
|
|
|
if (placeholder) {
|
|
|
|
writer.setAttribute("placeholder", placeholder);
|
|
|
|
}
|
|
|
|
|
2021-08-04 20:36:37 +12:00
|
|
|
const info = document.createElement("div");
|
2021-08-03 22:29:33 +12:00
|
|
|
info.className = "text-fade text-size-xs margin-top-negative-small margin-bottom";
|
|
|
|
|
|
|
|
div.appendChild(writer);
|
|
|
|
div.appendChild(button);
|
|
|
|
element.parentNode.insertBefore(div, element);
|
|
|
|
element.parentNode.insertBefore(info, div.nextSibling);
|
2021-07-26 19:24:29 +12:00
|
|
|
|
2021-08-04 20:36:37 +12:00
|
|
|
const switchType = function (event) {
|
2021-08-03 22:29:33 +12:00
|
|
|
if (idType == "custom") {
|
|
|
|
idType = "auto";
|
|
|
|
setIdType(idType);
|
|
|
|
} else {
|
|
|
|
idType = "custom";
|
|
|
|
setIdType(idType);
|
2021-07-26 19:24:29 +12:00
|
|
|
}
|
2021-08-03 22:29:33 +12:00
|
|
|
}
|
2021-07-26 19:24:29 +12:00
|
|
|
|
2021-08-04 20:36:37 +12:00
|
|
|
const validate = function (event) {
|
|
|
|
const [service, method] = element.dataset["validator"].split('.');
|
2021-08-03 23:23:13 +12:00
|
|
|
const value = event.target.value;
|
|
|
|
if (value.length < 1) {
|
|
|
|
event.target.setCustomValidity("ID is required");
|
|
|
|
} else {
|
2021-08-04 20:36:37 +12:00
|
|
|
switch(service) {
|
|
|
|
case 'projects':
|
|
|
|
if (method == 'getPlatform') {
|
|
|
|
const projectId = element.form.elements.namedItem("projectId").value;
|
|
|
|
setValidity(console[service][method](projectId, value), event.target);
|
|
|
|
} else {
|
|
|
|
setValidity(console[service][method](value), event.target);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'teams':
|
|
|
|
if (method == 'getMembership') {
|
|
|
|
const teamId = element.form.elements.namedItem("teamId").value;
|
|
|
|
setValidity(sdk[service][method](teamId, value), event.target);
|
2021-08-04 18:39:23 +12:00
|
|
|
} else {
|
2021-08-04 20:36:37 +12:00
|
|
|
setValidity(sdk[service][method](teamId, value), event.target);
|
2021-08-04 18:39:23 +12:00
|
|
|
}
|
2021-08-04 20:36:37 +12:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
setValidity(sdk[service][method](value), event.target);
|
2021-08-04 18:39:23 +12:00
|
|
|
}
|
2021-08-03 23:23:13 +12:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-04 20:36:37 +12:00
|
|
|
const setValidity = async function (promise, target) {
|
|
|
|
try {
|
|
|
|
await promise;
|
|
|
|
target.setCustomValidity("ID already exists");
|
|
|
|
} catch (e) {
|
|
|
|
target.setCustomValidity("");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const setIdType = function (idType) {
|
2021-08-04 19:29:10 +12:00
|
|
|
element.setAttribute("data-id-type", idType);
|
2021-08-03 22:29:33 +12:00
|
|
|
if (idType == "custom") {
|
2021-08-04 18:39:23 +12:00
|
|
|
info.innerHTML = "Allowed Characters A-Z, a-z, 0-9, and non-leading underscore";
|
2021-08-03 22:29:33 +12:00
|
|
|
writer.value = prevData;
|
|
|
|
writer.disabled = false;
|
|
|
|
element.value = prevData;
|
|
|
|
writer.focus();
|
2021-08-03 23:23:13 +12:00
|
|
|
writer.addEventListener('blur', validate);
|
2021-08-03 22:29:33 +12:00
|
|
|
} else {
|
2021-08-04 18:39:23 +12:00
|
|
|
info.innerHTML = "Appwrite will generate a unique ID";
|
2021-08-03 22:29:33 +12:00
|
|
|
prevData = writer.value;
|
|
|
|
writer.disabled = true;
|
|
|
|
writer.value = 'auto-generated';
|
|
|
|
element.value = 'unique()';
|
2021-07-26 22:05:31 +12:00
|
|
|
}
|
2021-08-04 20:53:05 +12:00
|
|
|
button.className = idType == "custom" ? "icon-shuffle copy" : "icon-edit copy";
|
2021-08-03 22:29:33 +12:00
|
|
|
}
|
2021-07-26 19:24:29 +12:00
|
|
|
|
2021-08-04 21:01:24 +12:00
|
|
|
const syncEditorWithID = function (event) {
|
2021-08-03 22:29:33 +12:00
|
|
|
if (element.value !== 'unique()') {
|
|
|
|
writer.value = element.value;
|
2021-08-03 21:49:41 +12:00
|
|
|
}
|
2021-08-03 22:29:33 +12:00
|
|
|
}
|
|
|
|
|
2021-08-04 21:01:24 +12:00
|
|
|
const syncIDWithWriter = function (event) {
|
2021-08-03 22:29:33 +12:00
|
|
|
element.value = writer.value;
|
|
|
|
}
|
2021-08-03 21:49:41 +12:00
|
|
|
|
2021-08-04 20:36:37 +12:00
|
|
|
const keypress = function (e) {
|
2021-08-03 22:29:33 +12:00
|
|
|
// which key is pressed, keyPressed = e.which || e.keyCode;
|
|
|
|
const key = e.which || e.keyCode;
|
|
|
|
const ZERO = 48;
|
|
|
|
const NINE = 57;
|
|
|
|
const SMALL_A = 97;
|
|
|
|
const SMALL_Z = 122;
|
|
|
|
const CAPITAL_A = 65;
|
|
|
|
const CAPITAL_Z = 90;
|
|
|
|
const UNDERSCORE = 95;
|
2021-07-26 19:24:29 +12:00
|
|
|
|
2021-08-03 22:29:33 +12:00
|
|
|
const isNotValidDigit = key < ZERO || key > NINE;
|
|
|
|
const isNotValidSmallAlphabet = key < SMALL_A || key > SMALL_Z;
|
|
|
|
const isNotValidCapitalAlphabet = key < CAPITAL_A || key > CAPITAL_Z;
|
|
|
|
|
|
|
|
//Leading underscore is prevented
|
|
|
|
if (key == UNDERSCORE && e.target.value.length == 0) {
|
|
|
|
e.preventDefault();
|
|
|
|
}
|
|
|
|
if (key != UNDERSCORE && isNotValidDigit && isNotValidSmallAlphabet && isNotValidCapitalAlphabet) {
|
|
|
|
e.preventDefault();
|
|
|
|
}
|
2021-07-26 19:24:29 +12:00
|
|
|
}
|
2021-08-03 22:29:33 +12:00
|
|
|
|
|
|
|
sync();
|
|
|
|
setIdType(idType);
|
|
|
|
writer.addEventListener("change", syncE);
|
|
|
|
writer.addEventListener('keypress', keypress);
|
|
|
|
button.addEventListener("click", switchType);
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
})(window);
|