Fix design on standard view (#3)

* Move notes above the fields
* Adding documentation
* Add documentation
* Fix design issue on standard view
This commit is contained in:
Sergiu Toporjinschi
2022-02-08 21:34:52 +02:00
committed by GitHub
parent 1401aa8252
commit a2751b96d6
15 changed files with 210 additions and 788 deletions
@@ -6,6 +6,14 @@ $(function () {
self.controlViewModel = parameters[2];
self.terminalViewModel = parameters[3];
self.access = parameters[4];
self.generalVM = parameters[5];
self.columnLabelCls = ko.computed(function () {
return self.generalVM.isSmall() ? "span4" : "span3";
});
self.columnFieldCls = ko.computed(function () {
return self.generalVM.isSmall() ? "span8" : "span9";
});
self.is_admin = ko.observable(false);
self.steps = ko.observable();
@@ -69,7 +77,6 @@ $(function () {
text: "<span style='font-weight:bold; color: red;'>Heating nuzzle has started!!!</span><br> When extrusion stops you have to fulfil <b>Length after extrusion</b> and save the new value ",
type: "warning"
});
console.log(response);
}).fail(function (response) {
new PNotify({
title: "Error on starting extrusion ",
@@ -109,7 +116,7 @@ $(function () {
// This is a list of dependencies to inject into the plugin, the order which you request
// here is the order in which the dependencies will be injected into your view model upon
// instantiation via the parameters argument
dependencies: ["loginStateViewModel", "settingsViewModel", "controlViewModel", "terminalViewModel", "accessViewModel"],
dependencies: ["loginStateViewModel", "settingsViewModel", "controlViewModel", "terminalViewModel", "accessViewModel", "calibrationToolsGeneralViewModel"],
// Finally, this is the list of selectors for all elements we want this view model to be bound to.
elements: ["#calibration_eSteps"]
});
@@ -9,6 +9,7 @@ $(function () {
}
}
}
this.isSmall = ko.observable($("#tab_plugin_CalibrationTools").width() < 800);
ko.extenders.numeric = function (target, options) {
var returnObs = ko.pureComputed({
read: target,
@@ -22,8 +23,11 @@ $(function () {
returnObs(target());
return returnObs;
};
this.onStartupComplete = function () {
this.isSmall($("#tabs_content").width() < 800);
}
}
// OCTOPRINT_VIEWMODELS.push([GeneralViewModel, ["loginStateViewModel"], []]);
OCTOPRINT_VIEWMODELS.push({
// This is the constructor to call for instantiating the plugin
construct: CalibrationToolsGeneralViewModel,
@@ -4,7 +4,13 @@ $(function () {
self.loginStateViewModel = parameters[0];
self.settingsViewModel = parameters[1];
self.controlViewModel = parameters[2];
self.generalVM = parameters[5];
self.columnLabelCls = ko.computed(function () {
return self.generalVM.isSmall() ? "span3" : "span3";
});
self.columnFieldCls = ko.computed(function () {
return self.generalVM.isSmall() ? "span9" : "span9";
});
self.pidCurrentValues = {
"hotEnd": {
"P": ko.observable(0),
@@ -79,7 +85,6 @@ $(function () {
text: "In progress",
type: "info"
});
console.log(response);
}).fail(function (response) {
new PNotify({
title: "Error on starting PID autotune ",
@@ -102,7 +107,6 @@ $(function () {
text: "In progress",
type: "info"
});
console.log(response);
}).fail(function (response) {
new PNotify({
title: "Error on starting PID autotune ",
@@ -119,7 +123,7 @@ $(function () {
// This is a list of dependencies to inject into the plugin, the order which you request
// here is the order in which the dependencies will be injected into your view model upon
// instantiation via the parameters argument
dependencies: ["loginStateViewModel", "settingsViewModel", "controlViewModel", "terminalViewModel", "accessViewModel"],
dependencies: ["loginStateViewModel", "settingsViewModel", "controlViewModel", "terminalViewModel", "accessViewModel", "calibrationToolsGeneralViewModel"],
// Finally, this is the list of selectors for all elements we want this view model to be bound to.
elements: ["#calibration_pid"]
});
@@ -4,28 +4,33 @@ $(function () {
self.loginStateViewModel = parameters[0];
self.settingsViewModel = parameters[1];
self.controlViewModel = parameters[2];
generalVM = parameters[5];
self.generalVM = parameters[5];
self.columnLabelCls = ko.computed(function () {
return self.generalVM.isSmall() ? "span2" : "span3";
});
self.columnFieldCls = ko.computed(function () {
return self.generalVM.isSmall() ? "span10" : "span9";
});
self.eStepsXYZ = {
currentSteps: {
X: ko.observable(0).extend(generalVM.decimal3(0.000)),
Y: ko.observable(0).extend(generalVM.decimal3(0.000)),
Z: ko.observable(0).extend(generalVM.decimal3(0.000))
X: ko.observable(0).extend(self.generalVM.decimal3(0.000)),
Y: ko.observable(0).extend(self.generalVM.decimal3(0.000)),
Z: ko.observable(0).extend(self.generalVM.decimal3(0.000))
},
gCodeCubeSize: {
X: ko.observable().extend(generalVM.decimal3(22.000)),
Y: ko.observable().extend(generalVM.decimal3(22.000)),
Z: ko.observable().extend(generalVM.decimal3(22.000))
X: ko.observable().extend(self.generalVM.decimal3(22.000)),
Y: ko.observable().extend(self.generalVM.decimal3(22.000)),
Z: ko.observable().extend(self.generalVM.decimal3(22.000))
},
printedCubeSize: {
X: ko.observable().extend(generalVM.decimal3(25.000)),
Y: ko.observable().extend(generalVM.decimal3(25.000)),
Z: ko.observable().extend(generalVM.decimal3(25.000))
X: ko.observable().extend(self.generalVM.decimal3(25.000)),
Y: ko.observable().extend(self.generalVM.decimal3(25.000)),
Z: ko.observable().extend(self.generalVM.decimal3(25.000))
},
newSteps: {
X: ko.observable().extend(generalVM.decimal3(0.000)),
Y: ko.observable().extend(generalVM.decimal3(0.000)),
Z: ko.observable().extend(generalVM.decimal3(0.000))
X: ko.observable().extend(self.generalVM.decimal3(0.000)),
Y: ko.observable().extend(self.generalVM.decimal3(0.000)),
Z: ko.observable().extend(self.generalVM.decimal3(0.000))
}
};
@@ -69,7 +74,9 @@ $(function () {
})
};
// self.labelColumnCss = viewModel.profitStatus = ko.pureComputed(function () {
// return "span3" $("#tab_plugin_CalibrationTools").width() < 800
// });
self.isAdmin = ko.observable(false);
@@ -1,694 +0,0 @@
$(function () {
function AccessViewModel(parameters) {
var access = this;
access.loginState = parameters[0];
var GROUP_ADMINS = "admins";
var GROUP_GUESTS = "guests";
access.users = (function () {
var self = {};
self.listHelper = new ItemListHelper("users", {
name: function (a, b) {
if (a["name"].toLocaleLowerCase() < b["name"].toLocaleLowerCase())
return -1;
if (a["name"].toLocaleLowerCase() > b["name"].toLocaleLowerCase())
return 1;
return 0;
}
}, {}, "name", [], [], CONFIG_USERSPERPAGE);
self.emptyUser = {
name: "",
active: false
};
self.currentUser = ko.observable(self.emptyUser).extend({
notify: "always"
});
self.editor = {
name: ko.observable(undefined),
groups: ko.observableArray([]),
permissions: ko.observableArray([]),
password: ko.observable(undefined),
repeatedPassword: ko.observable(undefined),
passwordMismatch: ko.pureComputed(function () {
return self.editor.password() !== self.editor.repeatedPassword();
}),
apikey: ko.observable(undefined),
active: ko.observable(undefined),
permissionSelectable: function (permission) {
return true;
},
permissionSelected: function (permission) {
var index = self.editor.permissions().indexOf(permission);
return index >= 0;
},
togglePermission: function (permission) {
var permissions = self.editor.permissions();
var index = permissions.indexOf(permission);
if (index < 0) {
permissions.push(permission);
} else {
permissions.splice(index, 1);
}
self.editor.permissions(permissions);
},
groupSelected: function (group) {
var index = self.editor.groups().indexOf(group);
return index >= 0;
},
toggleGroup: function (group) {
var groups = self.editor.groups();
var index = groups.indexOf(group);
if (index < 0) {
groups.push(group);
} else {
groups.splice(index, 1);
}
self.editor.groups(groups);
},
joinedGroupPermissions: function (group) {
return access.permissionList(group);
},
header: ko.observable(undefined),
new: ko.observable(true),
confirm: undefined,
valid: ko.pureComputed(function () {
return (self.editor.name() && self.editor.name().trim() && (!self.editor.new() || (self.editor.password() && self.editor.password().trim() && !self.editor.passwordMismatch())));
}),
dangerRestricted: function () {
return false;
},
dangerRestrictedText: gettext("This user may not have dangerous permissions.")
};
self.userEditorDialog = undefined;
self.changePasswordDialog = undefined;
self.currentUser.subscribe(function (newValue) {
if (newValue === undefined) {
self.editor.name(undefined);
self.editor.groups(access.groups.defaults.slice(0));
self.editor.permissions([]);
self.editor.active(true);
self.editor.apikey(undefined);
self.editor.header(gettext("Add user"));
self.editor.new(true);
self.editor.confirm = self.confirmAddUser;
} else {
self.editor.name(newValue.name);
self.editor.groups(newValue.groups.slice(0));
self.editor.permissions(newValue.permissions.slice(0));
self.editor.active(newValue.active);
self.editor.apikey(newValue.apikey);
self.editor.header(_.sprintf(gettext('Edit user "%(name)s"'), {
name: newValue.name
}));
self.editor.new(false);
self.editor.confirm = self.confirmEditUser;
}
self.editor.password(undefined);
self.editor.repeatedPassword(undefined);
});
self.requestData = function () {
if (!CONFIG_ACCESS_CONTROL)
return;
if (!access.loginState.hasPermissionKo(access.permissions.ADMIN))
return;
return OctoPrint.access.users.list().done(self.fromResponse);
}
;
self.fromResponse = function (response) {
self.listHelper.updateItems(response.users);
}
;
self.showAddUserDialog = function () {
if (!CONFIG_ACCESS_CONTROL)
return;
self.currentUser(undefined);
$('ul.nav-pills a[data-toggle="tab"]:first', self.userEditorDialog).tab("show");
self.userEditorDialog.modal({
minHeight: function () {
return Math.max($.fn.modal.defaults.maxHeight() - 80, 250);
}
}).css({
"margin-left": function () {
return -($(this).width() / 2);
}
});
}
;
self.confirmAddUser = function () {
if (!CONFIG_ACCESS_CONTROL)
return;
var user = {
name: self.editor.name(),
password: self.editor.password(),
groups: self.editor.groups(),
permissions: self.editor.permissions(),
active: self.editor.active()
};
self.addUser(user).done(function () {
self.currentUser(undefined);
self.userEditorDialog.modal("hide");
});
}
;
self.showEditUserDialog = function (user) {
if (!CONFIG_ACCESS_CONTROL)
return;
var process = function (user) {
self.currentUser(user);
$('ul.nav-pills a[data-toggle="tab"]:first', self.userEditorDialog).tab("show");
self.userEditorDialog.modal({
minHeight: function () {
return Math.max($.fn.modal.defaults.maxHeight() - 80, 250);
}
}).css({
"margin-left": function () {
return -($(this).width() / 2);
}
});
};
OctoPrint.users.get(user.name).done(function (data) {
process(data);
}).fail(function () {
log.warn("Could not fetch current user data, proceeding with client side data copy");
process(user);
});
}
;
self.confirmEditUser = function () {
if (!CONFIG_ACCESS_CONTROL)
return;
var user = self.currentUser();
user.active = self.editor.active();
user.groups = self.editor.groups();
user.permissions = self.editor.permissions();
self.updateUser(user).done(function () {
self.currentUser(undefined);
self.userEditorDialog.modal("hide");
});
}
;
self.showChangePasswordDialog = function (user) {
if (!CONFIG_ACCESS_CONTROL)
return;
self.currentUser(user);
self.changePasswordDialog.modal("show");
}
;
self.confirmChangePassword = function () {
if (!CONFIG_ACCESS_CONTROL)
return;
self.updatePassword(self.currentUser().name, self.editor.password()).done(function () {
self.currentUser(undefined);
self.changePasswordDialog.modal("hide");
});
}
;
self.confirmGenerateApikey = function () {
if (!CONFIG_ACCESS_CONTROL)
return;
self.generateApikey(self.currentUser().name).done(function (response) {
self._updateApikey(response.apikey);
});
}
;
self.copyApikey = function () {
copyToClipboard(self.editor.apikey());
}
;
self._updateApikey = function (apikey) {
self.editor.apikey(apikey);
self.requestData();
}
;
self.confirmDeleteApikey = function () {
if (!CONFIG_ACCESS_CONTROL)
return;
self.deleteApikey(self.currentUser().name).done(function () {
self._updateApikey(undefined);
});
}
;
self.onStartup = function () {
self.userEditorDialog = $("#settings-usersEditorDialog");
self.changePasswordDialog = $("#settings-usersDialogChangePassword");
}
;
self.addUser = function (user) {
if (!user) {
throw OctoPrint.InvalidArgumentError("user must be set");
}
if (!access.loginState.hasPermissionKo(access.permissions.ADMIN))
return $.Deferred().reject("You are not authorized to perform this action").promise();
return OctoPrint.access.users.add(user).done(self.fromResponse);
}
;
self.removeUser = function (user) {
if (!user) {
throw OctoPrint.InvalidArgumentError("user must be set");
}
if (!access.loginState.hasPermissionKo(access.permissions.ADMIN))
return $.Deferred().reject("You are not authorized to perform this action").promise();
if (user.name === access.loginState.username()) {
new PNotify({
title: gettext("Not possible"),
text: gettext("You may not delete your own account."),
type: "error"
});
return $.Deferred().reject("You may not delete your own account").promise();
}
showConfirmationDialog({
title: gettext("Are you sure?"),
message: _.sprintf(gettext('You are about to delete the user "%(name)s".'), {
name: user.name
}),
proceed: gettext("Delete"),
onproceed: function () {
OctoPrint.access.users.delete(user.name).done(self.fromResponse);
}
});
}
;
self.updateUser = function (user) {
if (!user) {
throw OctoPrint.InvalidArgumentError("user must be set");
}
return OctoPrint.access.users.update(user.name, user.active, user.admin, user.permissions, user.groups).done(self.fromResponse);
}
;
self.updatePassword = function (username, password) {
return OctoPrint.access.users.changePassword(username, password);
}
;
self.generateApikey = function (username) {
return OctoPrint.access.users.generateApiKey(username).done(function () {
self.requestData();
});
}
;
self.deleteApikey = function (username) {
return OctoPrint.access.users.resetApiKey(username);
}
;
return self;
}
)();
access.groups = (function () {
var self = {};
self.listHelper = new ItemListHelper("groups", {
name: function (a, b) {
if (a["name"].toLocaleLowerCase() < b["name"].toLocaleLowerCase())
return -1;
if (a["name"].toLocaleLowerCase() > b["name"].toLocaleLowerCase())
return 1;
return 0;
}
}, {}, "name", [], [], CONFIG_GROUPSPERPAGE);
self.groupsList = self.listHelper.items;
self.lookup = {};
self.defaults = [];
self.emptyGroup = {
name: ""
};
self.currentGroup = ko.observable(self.emptyGroup);
self.editor = {
key: ko.observable(undefined),
name: ko.observable(undefined),
description: ko.observable(undefined),
permissions: ko.observableArray([]),
subgroups: ko.observableArray([]),
default: ko.observable(false),
permissionSelectable: function (permission) {
return self.editor.key() !== GROUP_GUESTS || !permission.dangerous;
},
permissionSelected: function (permission) {
var index = self.editor.permissions().indexOf(permission);
return index >= 0;
},
togglePermission: function (permission) {
var permissions = self.editor.permissions();
var index = permissions.indexOf(permission);
if (index < 0) {
permissions.push(permission);
} else {
permissions.splice(index, 1);
}
self.editor.permissions(permissions);
},
subgroupSelectable: function (subgroup) {
return (self.editor.key() !== subgroup.key && (self.editor.key() !== GROUP_GUESTS || !subgroup.dangerous));
},
subgroupSelected: function (subgroup) {
var index = self.editor.subgroups().indexOf(subgroup);
return index >= 0;
},
toggleSubgroup: function (subgroup) {
var subgroups = self.editor.subgroups();
var index = subgroups.indexOf(subgroup);
if (index < 0) {
subgroups.push(subgroup);
} else {
subgroups.splice(index, 1);
}
self.editor.subgroups(subgroups);
},
joinedGroupPermissions: function (group) {
return access.permissionList(group);
},
header: ko.observable(undefined),
new: ko.observable(true),
confirm: undefined,
valid: ko.pureComputed(function () {
return self.editor.name() && self.editor.name().trim();
}),
dangerRestricted: function () {
return self.editor.key() === GROUP_GUESTS;
},
dangerRestrictedText: gettext("This group may not have dangerous permissions or subgroups.")
};
self.groupEditorDialog = undefined;
self.groupsList.subscribe(function (oldValue) {
if (oldValue === undefined || oldValue.length === 0)
return;
oldValue.forEach(function (p) {
delete self[p.key.toUpperCase()];
});
}, null, "beforeChange");
self.groupsList.subscribe(function (newValue) {
if (newValue === undefined)
return;
newValue.forEach(function (g) {
var needs = [];
g.permissions.forEach(function (p) {
for (var key in p.needs) {
p.needs[key].forEach(function (value) {
needs.push(access.permissions.need(key, value));
});
}
});
if (needs.length > 0) {
self.registerGroup(g.key.toUpperCase(), needs);
}
});
});
self.registerGroup = function (name, group) {
Object.defineProperty(self, name, {
value: group,
enumerable: true,
configurable: true
});
}
;
self.currentGroup.subscribe(function (newValue) {
if (newValue === undefined) {
self.editor.key(undefined);
self.editor.name(undefined);
self.editor.description(undefined);
self.editor.permissions([]);
self.editor.subgroups([]);
self.editor.default(false);
self.editor.header(gettext("Add group"));
self.editor.new(true);
self.editor.confirm = self.confirmAddGroup;
} else {
self.editor.key(newValue.key);
self.editor.name(newValue.name);
self.editor.description(newValue.description);
self.editor.permissions(newValue.permissions.slice(0));
self.editor.subgroups(newValue.subgroups.slice(0));
self.editor.default(newValue.default);
self.editor.header(_.sprintf(gettext('Edit group "%(name)s"'), {
name: newValue.name
}));
self.editor.new(false);
self.editor.confirm = self.confirmEditGroup;
}
});
self.requestData = function () {
return OctoPrint.access.groups.list().done(self.fromResponse);
}
;
self.fromResponse = function (response) {
var lookup = {};
var defaults = [];
_.each(response.groups, function (group) {
lookup[group.key] = group;
if (group.default) {
defaults.push(group.key);
}
});
self.lookup = lookup;
self.defaults = defaults;
self.listHelper.updateItems(response.groups);
}
;
self.showAddGroupDialog = function () {
self.currentGroup(undefined);
$('ul.nav-pills a[data-toggle="tab"]:first', self.groupEditorDialog).tab("show");
self.groupEditorDialog.modal({
minHeight: function () {
return Math.max($.fn.modal.defaults.maxHeight() - 80, 250);
}
}).css({
"margin-left": function () {
return -($(this).width() / 2);
}
});
}
;
self.confirmAddGroup = function () {
var group = {
key: self.editor.name().toLowerCase().replace(/[^a-z0-9_ ]/g, "").replace(/ /g, "_"),
name: self.editor.name(),
description: self.editor.description(),
permissions: self.editor.permissions(),
subgroups: self.editor.subgroups(),
default: self.editor.default()
};
self.addGroup(group).done(function () {
self.currentGroup(undefined);
self.groupEditorDialog.modal("hide");
});
}
;
self.showEditGroupDialog = function (group) {
if (!group.changeable)
return;
self.currentGroup(group);
$('ul.nav-pills a[data-toggle="tab"]:first', self.groupEditorDialog).tab("show");
self.groupEditorDialog.modal({
minHeight: function () {
return Math.max($.fn.modal.defaults.maxHeight() - 80, 250);
}
}).css({
"margin-left": function () {
return -($(this).width() / 2);
}
});
}
;
self.confirmEditGroup = function () {
var group = self.currentGroup();
var data = {
key: group.key,
name: group.name,
description: self.editor.description(),
permissions: self.editor.permissions(),
subgroups: self.editor.subgroups(),
default: self.editor.default()
};
self.updateGroup(data).done(function () {
self.currentGroup(undefined);
self.groupEditorDialog.modal("hide");
});
}
;
self.onStartup = function () {
self.groupEditorDialog = $("#settings-groupsEditorDialog");
}
;
self.addGroup = function (group) {
if (!group) {
throw OctoPrint.InvalidArgumentError("group must be set");
}
return OctoPrint.access.groups.add(group).done(self.fromResponse);
}
;
self.removeGroup = function (group) {
if (!group) {
throw OctoPrint.InvalidArgumentError("group must be set");
}
if (!group.removable)
return;
showConfirmationDialog({
title: gettext("Are you sure?"),
message: _.sprintf(gettext('You are about to delete the group "%(name)s".'), {
name: group.name
}),
proceed: gettext("Delete"),
onproceed: function () {
OctoPrint.access.groups.delete(group.key).done(function (response) {
self.fromResponse(response);
access.users.requestData();
});
}
});
}
;
self.updateGroup = function (group) {
if (!group) {
throw OctoPrint.InvalidArgumentError("group must be set");
}
return OctoPrint.access.groups.update(group).done(self.fromResponse);
}
;
return self;
}
)();
access.permissions = (function () {
var self = {};
self.need = function (method, value) {
return {
method: method,
value: value
};
}
;
self.roleNeed = function (value) {
return self.need("role", value);
}
;
self.permissionList = ko.observableArray([]);
self.lookup = {};
var registeredPermissions = [];
var registerPermission = function (key, permission) {
Object.defineProperty(self, key, {
value: permission,
enumerable: true,
configurable: true
});
registeredPermissions.push(key);
};
var clearAllRegisteredPermissions = function () {
_.each(registeredPermissions, function (key) {
delete self[key];
});
registeredPermissions = [];
};
self.initialize = function () {
clearAllRegisteredPermissions();
var permissionList = [];
var lookup = {};
_.each(PERMISSIONS, function (permission) {
var needs = [];
_.each(permission.needs, function (value, key) {
needs.push(self.need(key, value));
});
if (needs.length > 0) {
registerPermission(permission.key, needs);
}
if (!permission.combined) {
permissionList.push(permission);
}
lookup[permission.key] = permission;
});
permissionList.sort(access.permissionComparator);
self.permissionList(permissionList);
self.lookup = lookup;
}
;
return self;
}
)();
access.groupComparator = function (a, b) {
var nameA = a.name ? a.name.toUpperCase() : "";
var nameB = b.name ? b.name.toUpperCase() : "";
if (nameA < nameB) {
return -1;
} else if (nameA > nameB) {
return 1;
} else {
return 0;
}
}
;
access.permissionComparator = function (a, b) {
var nameA = a.name ? a.name.toUpperCase() : "";
var nameB = b.name ? b.name.toUpperCase() : "";
var pluginA = a.plugin || "";
var pluginB = b.plugin || "";
var compA = pluginA + ":" + nameA;
var compB = pluginB + ":" + nameB;
if (compA < compB) {
return -1;
} else if (compA > compB) {
return 1;
} else {
return 0;
}
}
;
access.groupList = function (data) {
if (data.groups === undefined)
return "";
var mappedGroups = _.filter(_.map(data.groups, function (g) {
return access.groups.lookup[g];
}), function (g) {
return g !== undefined;
});
mappedGroups.sort(access.groupComparator);
return _.map(mappedGroups, function (g) {
return g.name;
}).join(", ");
}
;
access.subgroupList = function (data) {
if (data.subgroups === undefined)
return "";
var mappedGroups = _.filter(_.map(data.subgroups, function (g) {
return access.groups.lookup[g];
}), function (g) {
return g !== undefined;
});
mappedGroups.sort(access.groupComparator);
return _.map(mappedGroups, function (g) {
return g.name;
}).join(", ");
}
;
access.permissionList = function (data) {
if (!data || data.permissions === undefined)
return "";
var mappedPermissions = _.filter(_.map(data.permissions, function (p) {
return access.permissions.lookup[p];
}), function (p) {
return p !== undefined;
});
mappedPermissions.sort(access.permissionComparator);
return _.map(mappedPermissions, function (p) {
return p.name;
}).join(", ");
}
;
access.onStartup = function () {
access.groups.onStartup();
access.users.onStartup();
}
;
access.onServerConnect = function () {
access.permissions.initialize();
}
;
access.onServerReconnect = function () {
access.permissions.initialize();
}
;
access.onUserPermissionsChanged = access.onUserLoggedIn = access.onUserLoggedOut = function (user) {
if (access.loginState.hasPermission(access.permissions.SETTINGS)) {
access.groups.requestData().done(function () {
access.users.requestData();
});
}
}
;
}
OCTOPRINT_VIEWMODELS.push([AccessViewModel, ["loginStateViewModel"], []]);
});