378 lines
12 KiB
JavaScript
378 lines
12 KiB
JavaScript
(function () {
|
|
'use strict';
|
|
|
|
function t(app, text) {
|
|
if (window.OC && OC.L10N && typeof OC.L10N.translate === 'function') {
|
|
return OC.L10N.translate(app, text);
|
|
}
|
|
return text;
|
|
}
|
|
|
|
function byId(id) {
|
|
return document.getElementById(id);
|
|
}
|
|
|
|
function checked(id) {
|
|
var field = byId(id);
|
|
return !!(field && field.checked);
|
|
}
|
|
|
|
function value(id) {
|
|
var field = byId(id);
|
|
return field ? field.value : '';
|
|
}
|
|
|
|
function setStatus(root, message) {
|
|
var status = byId('nqs-save-status');
|
|
if (status) {
|
|
status.textContent = message;
|
|
}
|
|
}
|
|
|
|
function parseJsonResponse(response) {
|
|
return response.text().then(function (text) {
|
|
var data = {};
|
|
if (text) {
|
|
try {
|
|
data = JSON.parse(text);
|
|
} catch (_error) {
|
|
data = {};
|
|
}
|
|
}
|
|
if (!response.ok || (data && data.ok === false)) {
|
|
throw new Error((data && data.error) ? data.error : t('nuqloud_scrum', 'Request failed.'));
|
|
}
|
|
return data;
|
|
});
|
|
}
|
|
|
|
function postJson(url, data) {
|
|
return fetch(url, {
|
|
method: 'POST',
|
|
credentials: 'same-origin',
|
|
headers: csrfHeaders(),
|
|
body: JSON.stringify(data || {})
|
|
}).then(parseJsonResponse);
|
|
}
|
|
|
|
function getJson(url) {
|
|
return fetch(url, {
|
|
method: 'GET',
|
|
credentials: 'same-origin',
|
|
headers: csrfHeaders()
|
|
}).then(parseJsonResponse);
|
|
}
|
|
|
|
function payload() {
|
|
return {
|
|
enabled: checked('nqs-enabled'),
|
|
automationCredentialSource: value('nqs-automation-credential-source'),
|
|
talkServiceUser: value('nqs-talk-service-user'),
|
|
talkServiceAppPassword: value('nqs-talk-service-password'),
|
|
clearTalkServiceAppPassword: checked('nqs-clear-talk-service-password'),
|
|
workspaceFilterMode: value('nqs-workspace-filter-mode'),
|
|
workspaceAllowlist: value('nqs-workspace-allowlist'),
|
|
deckSyncEnabled: checked('nqs-deck-sync-enabled'),
|
|
fileMirrorEnabled: checked('nqs-file-mirror-enabled'),
|
|
fileMirrorMode: value('nqs-file-mirror-mode'),
|
|
reactionWorkflowEnabled: checked('nqs-reaction-workflow-enabled'),
|
|
botCommandsEnabled: checked('nqs-bot-commands-enabled'),
|
|
summaryEnabled: checked('nqs-summary-enabled'),
|
|
syncIntervalMinutes: value('nqs-sync-interval')
|
|
};
|
|
}
|
|
|
|
function csrfHeaders() {
|
|
var headers = {
|
|
'Content-Type': 'application/json',
|
|
'Accept': 'application/json'
|
|
};
|
|
if (window.OC && OC.requestToken) {
|
|
headers.requesttoken = OC.requestToken;
|
|
}
|
|
return headers;
|
|
}
|
|
|
|
function workspaceToggleUrl(root, workspaceId) {
|
|
var template = root.getAttribute('data-workspace-toggle-url') || '';
|
|
return template.replace('WORKSPACE_ID', encodeURIComponent(String(workspaceId)));
|
|
}
|
|
|
|
function workspaceTasksUrl(root, workspaceId) {
|
|
var template = root.getAttribute('data-workspace-tasks-url') || '';
|
|
return template.replace('WORKSPACE_ID', encodeURIComponent(String(workspaceId)));
|
|
}
|
|
|
|
function renderWorkspaces(root, workspaces) {
|
|
var list = byId('nqs-workspaces-list');
|
|
if (!list) {
|
|
return;
|
|
}
|
|
list.textContent = '';
|
|
if (!workspaces.length) {
|
|
var empty = document.createElement('p');
|
|
empty.className = 'nqs-note';
|
|
empty.textContent = root.getAttribute('data-no-conversations-message') || t('nuqloud_scrum', 'No Talk conversations have been discovered yet.');
|
|
list.appendChild(empty);
|
|
return;
|
|
}
|
|
workspaces.forEach(function (workspace) {
|
|
var row = document.createElement('div');
|
|
row.className = 'nqs-workspace-row';
|
|
row.setAttribute('role', 'listitem');
|
|
|
|
var meta = document.createElement('div');
|
|
meta.className = 'nqs-workspace-meta';
|
|
|
|
var name = document.createElement('strong');
|
|
name.textContent = workspace.talkRoomName || workspace.talkToken || t('nuqloud_scrum', 'Unnamed conversation');
|
|
|
|
var detail = document.createElement('span');
|
|
detail.textContent = workspace.talkToken || '';
|
|
|
|
meta.appendChild(name);
|
|
meta.appendChild(detail);
|
|
|
|
var status = document.createElement('span');
|
|
status.className = workspace.syncEnabled ? 'nqs-pill nqs-pill-enabled' : 'nqs-pill';
|
|
status.textContent = workspace.syncEnabled ? t('nuqloud_scrum', 'Scrum enabled') : t('nuqloud_scrum', 'Scrum disabled');
|
|
|
|
var button = document.createElement('button');
|
|
button.className = 'button';
|
|
button.type = 'button';
|
|
button.textContent = workspace.syncEnabled ? t('nuqloud_scrum', 'Disable Scrum') : t('nuqloud_scrum', 'Enable Scrum');
|
|
button.addEventListener('click', function () {
|
|
toggleWorkspace(root, Number(workspace.id), !workspace.syncEnabled, button);
|
|
});
|
|
|
|
var tasksButton = document.createElement('button');
|
|
tasksButton.className = 'button';
|
|
tasksButton.type = 'button';
|
|
tasksButton.textContent = t('nuqloud_scrum', 'View tasks');
|
|
tasksButton.addEventListener('click', function () {
|
|
toggleTasks(root, Number(workspace.id), row, tasksButton);
|
|
});
|
|
|
|
row.appendChild(meta);
|
|
row.appendChild(status);
|
|
row.appendChild(button);
|
|
row.appendChild(tasksButton);
|
|
list.appendChild(row);
|
|
});
|
|
}
|
|
|
|
function loadWorkspaces(root) {
|
|
var url = root.getAttribute('data-workspaces-url') || '';
|
|
if (!url) {
|
|
setStatus(root, t('nuqloud_scrum', 'Workspace list endpoint is missing.'));
|
|
return Promise.resolve();
|
|
}
|
|
return getJson(url).then(function (result) {
|
|
var data = result && result.data ? result.data : {};
|
|
var workspaces = Array.isArray(data.workspaces) ? data.workspaces : [];
|
|
renderWorkspaces(root, workspaces);
|
|
}).catch(function (error) {
|
|
setStatus(root, (root.getAttribute('data-workspace-list-error-message') || t('nuqloud_scrum', 'Unable to load conversations.')) + ' ' + error.message);
|
|
});
|
|
}
|
|
|
|
function toggleWorkspace(root, workspaceId, enabled, button) {
|
|
var url = workspaceToggleUrl(root, workspaceId);
|
|
if (!url || !workspaceId) {
|
|
setStatus(root, root.getAttribute('data-workspace-toggle-error-message') || t('nuqloud_scrum', 'Unable to update conversation Scrum status.'));
|
|
return;
|
|
}
|
|
button.disabled = true;
|
|
postJson(url, { enabled: enabled }).then(function () {
|
|
setStatus(root, enabled ? t('nuqloud_scrum', 'Scrum enabled.') : t('nuqloud_scrum', 'Scrum disabled.'));
|
|
return loadWorkspaces(root);
|
|
}).catch(function (error) {
|
|
setStatus(root, (root.getAttribute('data-workspace-toggle-error-message') || t('nuqloud_scrum', 'Unable to update conversation Scrum status.')) + ' ' + error.message);
|
|
}).finally(function () {
|
|
button.disabled = false;
|
|
});
|
|
}
|
|
|
|
function toggleTasks(root, workspaceId, row, button) {
|
|
var existing = row.querySelector('.nqs-task-list');
|
|
if (existing) {
|
|
existing.remove();
|
|
button.textContent = t('nuqloud_scrum', 'View tasks');
|
|
return;
|
|
}
|
|
|
|
var url = workspaceTasksUrl(root, workspaceId);
|
|
if (!url || !workspaceId) {
|
|
setStatus(root, root.getAttribute('data-task-list-error-message') || t('nuqloud_scrum', 'Unable to load tasks.'));
|
|
return;
|
|
}
|
|
|
|
button.disabled = true;
|
|
getJson(url).then(function (result) {
|
|
var data = result && result.data ? result.data : {};
|
|
var tasks = Array.isArray(data.tasks) ? data.tasks : [];
|
|
row.appendChild(renderTaskList(root, tasks));
|
|
button.textContent = t('nuqloud_scrum', 'Hide tasks');
|
|
}).catch(function (error) {
|
|
setStatus(root, (root.getAttribute('data-task-list-error-message') || t('nuqloud_scrum', 'Unable to load tasks.')) + ' ' + error.message);
|
|
}).finally(function () {
|
|
button.disabled = false;
|
|
});
|
|
}
|
|
|
|
function renderTaskList(root, tasks) {
|
|
var list = document.createElement('div');
|
|
list.className = 'nqs-task-list';
|
|
if (!tasks.length) {
|
|
var empty = document.createElement('p');
|
|
empty.className = 'nqs-note';
|
|
empty.textContent = root.getAttribute('data-no-tasks-message') || t('nuqloud_scrum', 'No tasks have been synced for this conversation yet.');
|
|
list.appendChild(empty);
|
|
return list;
|
|
}
|
|
|
|
tasks.forEach(function (task) {
|
|
var item = document.createElement('div');
|
|
item.className = 'nqs-task-item';
|
|
|
|
var title = document.createElement('strong');
|
|
title.textContent = task.title || t('nuqloud_scrum', 'Untitled task');
|
|
|
|
var meta = document.createElement('span');
|
|
meta.textContent = [
|
|
task.status || 'inbox',
|
|
task.folderPath || ''
|
|
].filter(Boolean).join(' | ');
|
|
|
|
item.appendChild(title);
|
|
item.appendChild(meta);
|
|
list.appendChild(item);
|
|
});
|
|
return list;
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
var root = byId('nqs-admin');
|
|
if (!root) {
|
|
return;
|
|
}
|
|
|
|
var saveButton = byId('nqs-save-settings');
|
|
if (!saveButton) {
|
|
return;
|
|
}
|
|
|
|
var loadButton = byId('nqs-load-workspaces');
|
|
if (loadButton) {
|
|
loadButton.addEventListener('click', function () {
|
|
loadButton.disabled = true;
|
|
loadWorkspaces(root).finally(function () {
|
|
loadButton.disabled = false;
|
|
});
|
|
});
|
|
}
|
|
loadWorkspaces(root);
|
|
|
|
saveButton.addEventListener('click', function () {
|
|
var url = root.getAttribute('data-settings-url') || '';
|
|
if (!url) {
|
|
setStatus(root, t('nuqloud_scrum', 'Settings endpoint is missing.'));
|
|
return;
|
|
}
|
|
|
|
saveButton.disabled = true;
|
|
setStatus(root, t('nuqloud_scrum', 'Saving settings...'));
|
|
|
|
postJson(url, payload()).then(function () {
|
|
var password = byId('nqs-talk-service-password');
|
|
var clearPassword = byId('nqs-clear-talk-service-password');
|
|
if (password) {
|
|
password.value = '';
|
|
}
|
|
if (clearPassword) {
|
|
clearPassword.checked = false;
|
|
}
|
|
setStatus(root, root.getAttribute('data-saved-message') || t('nuqloud_scrum', 'Settings saved.'));
|
|
}).catch(function (error) {
|
|
setStatus(root, (root.getAttribute('data-error-message') || t('nuqloud_scrum', 'Unable to save settings.')) + ' ' + error.message);
|
|
}).finally(function () {
|
|
saveButton.disabled = false;
|
|
});
|
|
});
|
|
|
|
var syncButton = byId('nqs-sync-workspaces');
|
|
if (!syncButton) {
|
|
return;
|
|
}
|
|
syncButton.addEventListener('click', function () {
|
|
var url = root.getAttribute('data-sync-workspaces-url') || '';
|
|
if (!url) {
|
|
setStatus(root, t('nuqloud_scrum', 'Workspace sync endpoint is missing.'));
|
|
return;
|
|
}
|
|
|
|
syncButton.disabled = true;
|
|
setStatus(root, t('nuqloud_scrum', 'Syncing workspaces...'));
|
|
postJson(url, {}).then(function (result) {
|
|
var data = result && result.data ? result.data : {};
|
|
var count = typeof data.createdOrUpdated === 'number' ? data.createdOrUpdated : 0;
|
|
loadWorkspaces(root);
|
|
setStatus(
|
|
root,
|
|
(root.getAttribute('data-sync-complete-message') || t('nuqloud_scrum', 'Workspace sync complete.'))
|
|
+ ' '
|
|
+ count
|
|
+ ' '
|
|
+ t('nuqloud_scrum', 'workspace(s) updated.')
|
|
);
|
|
}).catch(function (error) {
|
|
setStatus(root, (root.getAttribute('data-sync-error-message') || t('nuqloud_scrum', 'Unable to sync workspaces.')) + ' ' + error.message);
|
|
}).finally(function () {
|
|
syncButton.disabled = false;
|
|
});
|
|
});
|
|
|
|
var messageSyncButton = byId('nqs-sync-messages');
|
|
if (!messageSyncButton) {
|
|
return;
|
|
}
|
|
messageSyncButton.addEventListener('click', function () {
|
|
var url = root.getAttribute('data-sync-messages-url') || '';
|
|
if (!url) {
|
|
setStatus(root, t('nuqloud_scrum', 'Message sync endpoint is missing.'));
|
|
return;
|
|
}
|
|
|
|
messageSyncButton.disabled = true;
|
|
setStatus(root, t('nuqloud_scrum', 'Syncing messages...'));
|
|
postJson(url, {}).then(function (result) {
|
|
var data = result && result.data ? result.data : {};
|
|
var taskCount = typeof data.tasks === 'number' ? data.tasks : 0;
|
|
var messageCount = typeof data.messages === 'number' ? data.messages : 0;
|
|
var fileCount = typeof data.files === 'number' ? data.files : 0;
|
|
loadWorkspaces(root);
|
|
setStatus(
|
|
root,
|
|
(root.getAttribute('data-message-sync-complete-message') || t('nuqloud_scrum', 'Message sync complete.'))
|
|
+ ' '
|
|
+ taskCount
|
|
+ ' '
|
|
+ t('nuqloud_scrum', 'task(s),')
|
|
+ ' '
|
|
+ messageCount
|
|
+ ' '
|
|
+ t('nuqloud_scrum', 'message(s),')
|
|
+ ' '
|
|
+ fileCount
|
|
+ ' '
|
|
+ (root.getAttribute('data-files-updated-message') || t('nuqloud_scrum', 'file reference(s) updated.'))
|
|
);
|
|
}).catch(function (error) {
|
|
setStatus(root, (root.getAttribute('data-message-sync-error-message') || t('nuqloud_scrum', 'Unable to sync messages.')) + ' ' + error.message);
|
|
}).finally(function () {
|
|
messageSyncButton.disabled = false;
|
|
});
|
|
});
|
|
});
|
|
}());
|