@saltcorn/server 0.7.1-beta.3 → 0.7.2-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/locales/ru.json CHANGED
@@ -125,7 +125,7 @@
125
125
  "Install pack": "Установить пакет",
126
126
  "Instead of building, get up and running in no time with packs": "Вместо создания приложения с нуля руками, просто выберите подходящие пакеты, установите их и пользуйтесь созданным приложением.",
127
127
  "Packs are collections of tables, views and plugins that give you a full application which you can then edit to suit your needs.": "Пакеты - это коллекции таблиц, представлений и плагинов, поставляемые в виде готового приложения, которое вы затем можете редактировать в соответствии со своими потребностями.",
128
- "Name": "Название",
128
+ "Name": "Наименование",
129
129
  "Description": "Описание",
130
130
  "Go to pack store »": "Перейти в менеджер пакетов »",
131
131
  "Learn": "Изучайте",
@@ -144,7 +144,7 @@
144
144
  "Versions": "Версии",
145
145
  "Version": "Версия",
146
146
  "Saved": "Сохранено",
147
- "By user ID": "По ИД пользователя",
147
+ "By user ID": "ID пользователя",
148
148
  "%s History": " %s История",
149
149
  "back to table list": "возврат к списку таблиц",
150
150
  "Version %s restored": "Версия %s восстановлена",
@@ -273,7 +273,7 @@
273
273
  "View configuration": "Настройки представления",
274
274
  "Field %s deleted": "Поле %s удалено",
275
275
  "No tables defined": "Таблицы не определены",
276
- "Tables hold collections of similar data": "Tаблицы содержат коллекции похожих данных",
276
+ "Tables hold collections of similar data": "Таблицы содержат коллекции похожих данных",
277
277
  "Invalid form data, try again": "Форма содержит некорректные данные, попробуйте еще раз",
278
278
  "Role required to access added files": "Для доступа к добавленными полям требуется роль",
279
279
  "The user uploading the file has access irrespective of their role": "Пользователь, загружающий файл, имеет доступ независимо от своей роли",
@@ -294,7 +294,7 @@
294
294
  "new": "новый",
295
295
  "Password does not match": "Пароль не совпадает",
296
296
  "Not allowed to write to table %s": "Запрещена запись в таблицу %s",
297
- "Login sucessful": "Вход в систему выполнен",
297
+ "Login successful": "Вход в систему выполнен",
298
298
  "Welcome, %s!": "Добро пожаловать, %s!",
299
299
  "Error: missing name or file": "Ошибка: отсутствует имя или файл",
300
300
  "Restart server.": "Перезагрузить сервер.",
@@ -305,7 +305,7 @@
305
305
  "Duplicate": "Дублировать",
306
306
  "View %s duplicated as %s": "Представление %s задублировано в %s",
307
307
  "The view name will appear as the title of pop-ups showing this view, and in the URL when it is shown alone.": "Имя представления отображается как заголовок всплывающего окна или в URL, в зависимости от режима отображения.",
308
- "Saltcorn version": "версия Saltcorn",
308
+ "Saltcorn version": "версия платформы",
309
309
  "Node.js version": "версия Node.js",
310
310
  "Table not found": "Таблица не найдена",
311
311
  "No record selected": "Не выбрано ни одной записи",
@@ -456,7 +456,7 @@
456
456
  "Show on page": "Показать на странице",
457
457
  "Requests to render this view directly will instead show the chosen page, if any. The chosewn page should embed this view. Use this to decorate the view with additional elements.": "Запросы на рендеринг этого представления напрямую будут отображать выбранную страницу, если таковая имеется. Выбранная страница должна включать это представление. Используйте это, чтобы декорировать представление дополнительными элементами.",
458
458
  "Variable name": "Имя переменной",
459
- "Constraints": "Констрейнты",
459
+ "Constraints": "Ограничения",
460
460
  "Recalculate stored fields": "Перевычислить хранимые поля",
461
461
  "Delete all rows": "Удалить все строки",
462
462
  "Access Read/Write": "Доступ на Чтение/Запись",
@@ -535,7 +535,7 @@
535
535
  "Role to create tenants": "Роль, которой разрешено создание тенатов",
536
536
  "Minimum user role required to create a new tenant": "Минимальная роль для создания тенантов",
537
537
  "Create tenant warning": "Предупреждение при создании тенанта",
538
- "Show a warning to users creating a tenant disclaiming warranty of availability or security": "Показывать пользователям при создании тенанта предупреждение об ограничениях доступности и безопасности",
538
+ "Show a warning to users creating a tenant disclaiming warranty of availability or security": "Показывать пользователю, создающему тенант, предупреждения о доступности и безопасности",
539
539
  "Name of the field": "Название поля",
540
540
  "The type determines the kind of data that can be stored in the field": "Тип поля определяет состав данных, которые могут быть сохранены в полей",
541
541
  "Calculated from other fields with a formula": "Вычисляется по формуле. В формуле можно использовать другие поля для вычисления",
@@ -651,10 +651,10 @@
651
651
  "Email sent to %s with no errors": "Email отправлен %s без ошибок",
652
652
  "Action %s run successfully with no console output": "Действие (триггер) %s выполнено успешно без вывода результатов в консоль",
653
653
  "Edit trigger %s": "Изменить триггер %s",
654
- "%s constraints": "%s констрейнт(ов)",
655
- "Add constraint": "Добавить констрейнт",
654
+ "%s constraints": "Ограничения для таблицы %s",
655
+ "Add constraint": "Добавить ограничение",
656
656
  "Tick the boxes for the fields that should be jointly unique": "Установите флажки для полей, которые должны быть совместно уникальными",
657
- "Add constraint to %s": "Добавить констрейнт к %s",
657
+ "Add constraint to %s": "Добавить ограничение к %s",
658
658
  "New table name": "Новое имя таблицы",
659
659
  "Rename table %s": "Переименовать таблицу %s",
660
660
  "Started recalculating stored fields": "Начался перерасчет вычисляемых полей",
@@ -678,18 +678,18 @@
678
678
  "Home Timezone": "Домашняя Timezone",
679
679
  "2FA policy": "2FA policy",
680
680
  "Role to generate API keys": "Роль для API keys",
681
- "User should have this role or higher to generate API keys in their user settings": "User should have this role or higher to generate API keys in their user settings",
681
+ "User should have this role or higher to generate API keys in their user settings": "Минимальная роль для генерации API key",
682
682
  "Cookie duration (hours)": "Срок действия Cookie (в часах)",
683
- "Set to 0 for expiration at the end of browser session": "Если установить значение 0, Cookies будут действовать до окончания сессии браузера",
683
+ "Set to 0 for expiration at the end of browser session": "Установите значение 0 чтобы срок действия соответствовал окончанию сессии пользователя",
684
684
  "Cookie duration (hours) when remember ticked": "Срок действия Cookie (в часах), когда установлен флажок \"Запомнить\"",
685
- "Order field": "Order field",
686
- "Section field": "Section field",
687
- "Optional. String type with options, each of which will become a menu section": "Указывать необязательно. Строковый тип с набором значений, каждая из которых станет секцией меню",
688
- "Label formula": "Label формлуа",
689
- "URL formula": "URL формула",
690
- "Include formula": "Include formula",
691
- "If specified, only include in menu rows that evaluate to true": "Если указано, то в меню отображаются только секции (строки), для которых формула вычислилась со значением true",
692
- "Not all themes support all locations": "Некоторые темы могут не поддерживать все языки",
685
+ "Order field": "Order (поле)",
686
+ "Section field": "Section (поле))",
687
+ "Optional. String type with options, each of which will become a menu section": "Указывать необязательно. Строковый тип с набором значений, каждое из которых станет секцией меню",
688
+ "Label formula": "Label (формула)",
689
+ "URL formula": "URL (формула)",
690
+ "Include formula": "Include (формула)",
691
+ "If specified, only include in menu rows that evaluate to true": "Если флаг установлен, то в меню отображаются только те пункты меню (секции), для которых формула вычислилась со значением true",
692
+ "Not all themes support all locations": "Некоторые темы могут не поддерживать все варианты размещения виджета",
693
693
  "Library": "Библиотека",
694
694
  "Languages": "Языки",
695
695
  "Library: component assemblies that can be used in the builder": "Библиотека: компоненты для использования построителем интерфейсов",
@@ -700,7 +700,7 @@
700
700
  "Storage": "Хранилище",
701
701
  "Table or Channel": "Таблица или Канал",
702
702
  "Event types": "Типы событий",
703
- "Custom": "Custom",
703
+ "Custom": "Пользовательские события",
704
704
  "Log settings": "Настройки логов",
705
705
  "Event log": "Лог событий",
706
706
  "Custom Events": "Пользовательские События (Events)",
@@ -726,13 +726,13 @@
726
726
  "Use Amazon S3 Secure Connection.": "Использовать безопасное подключение к Amazon S3.",
727
727
  "Connect to Amazon S3 (or compatible) securely.": "Подключиться к сервису Amazon S3 (или совместимому) безопасно.",
728
728
  "Storage settings": "Настройки хранилища",
729
- "Two-factor authentication": "Двухфакторная аутентификация",
729
+ "Two-factor authentication": "Двухфакторная аутентификация (TWA)",
730
730
  "Two-factor authentication is disabled": "Двухфакторная аутентификация отключена",
731
731
  "Forget table": "Забыть таблицу",
732
- "Ownership formula": "Формула Владельца",
732
+ "Ownership formula": "Owner (формула)",
733
733
  "User is treated as owner if true. In scope: ": "Ownership formula. Пользователь воспринимается как владелец, если значение формулы true. В рамках: ",
734
- "This is a translation of a different field in a different language": "Это трансляция полей на разные языки",
735
- "Language locale of translation": "Language locale of translation",
734
+ "This is a translation of a different field in a different language": "Это трансляция перевода полей на разные языки",
735
+ "Language locale of translation": "Языковая локализация (locale) для перевода",
736
736
  "Slug": "Slug",
737
737
  "Field that can be used for a prettier URL structure": "Поле, которе используется для настройки структуры URL",
738
738
  "Column width": "Ширина столбца",
@@ -743,10 +743,55 @@
743
743
  "Display one column per line": "Отображать один столбец на одной строке",
744
744
  "Vertical column width": "Высота столбца",
745
745
  "Vertical width units": "Единицы измерения высоты столбца",
746
- "Preset %s": "Preset %s",
747
- "Edit properties": "Edit properties",
746
+ "Preset %s": "Установить %s",
747
+ "Edit properties": "Изменить свойства",
748
748
  "Yes": "Да",
749
749
  "Event type which runs the trigger": "Тип события, которое запускает триггер",
750
750
  "Leave blank for all channels": "Если не заполнено, используются все каналы",
751
- "User must have this role or higher to make API call for action (trigger)": "Пользователь должен иметь указанную роль и выше для выполнение вызова API действия (триггера)"
751
+ "User must have this role or higher to make API call for action (trigger)": "Пользователь должен иметь указанную роль и выше для выполнение вызова API действия (триггера)",
752
+ "New tenant template": "Шаблон нового тенанта",
753
+ "Copy site structure for new tenants from this tenant": "Создавать новые тенанты на основе структуры указанного тенанта",
754
+ "Strings": "Строки",
755
+ "In default language": "В языке по-умолчанию",
756
+ "In %s": "В %s языке",
757
+ "Is this the default language in which the application is built?": "Язык для использования по-умолчанию",
758
+ "Table %s forgotten. You can now discover it.": "Таблица %s забыта системой. Вы можете ее восстановить через механизм обнаружения.",
759
+ "Configuration check": "Проверка конфигурации",
760
+ "Check for updates": "Проверка обновления",
761
+ "Configuration errors": "Ошибки в конфигурации",
762
+ "Configuration checks passed": "Проверка конфигурации пройдена успешно",
763
+ "No errors detected during configuration check": "Не обнаружено ошибок при проверке конфигурации",
764
+ "Extra state Formula": "Extra state Formula",
765
+ "Place in dropdown": "Поместить в dropdown",
766
+ "Hide null columns": "Скрыть столбцы со значением null",
767
+ "Do not display a column if it contains entirely missing values": "Скрыть (не отображать) стоблцы, имеющие значение null",
768
+ "Finish": "Завершить",
769
+ "Versions refreshed": "Версии обновлены",
770
+ "Plugin name": "Имя плагина",
771
+ "Source of plugin for install. Few options:npm - download from npm repository,local - get from local file system,github - download from github,git - get from git": "Источник плагина:npm - загрузка из репозитория npm,local - из файловой системы сервера,github - загрузка github,git - загрузка из git",
772
+ "For npm - name of npm package, e.g. @saltcorn/html or saltcorn-gantt, check at npmjs.com, for local - absolute path to plugin folder in file system, e.g.C:\\gitsrc\\any-bootstrap-theme\\, for github - name of github project.": "Для npm пакета - наименование npm пакета, например, @saltcorn/html или saltcorn-gantt, точное название уточните на npmjs.com, при установки из локальной файловой системы сервера (local) - абсолютный путь к папке плагина в файловой системе, например, C:\\gitsrc\\any-bootstrap-theme\\, в случае github - название (name) проекта github.",
773
+ "Version of plugin, latest is default value": "Версия плагина, значение по-умолчанию - latest",
774
+ "Private SSH key": "Приватный ключ SSH",
775
+ "Setup two-factr authentication": "Настройть двухфакторную аутентификацию",
776
+ "Setup two-factor authentication with Time-based One-Time Password (TOTP)": "Настроить двухфакторную аутентфикацию с применением Time-based One-Time Password (TOTP)",
777
+ "1. Scan this QR code in your Authenticator app": "1. Отсканируйте данный QR код в удобном Вам приложении Аутентфикатор (Authenticator)",
778
+ "2. Enter the six-digit code generated in your Authenticator app": "2. Введите 6-ти значный секретный код, сгенерированный в приложении Аутентификатор (Authenticator)",
779
+ "Code": "Код",
780
+ "Or enter this code:": "Или введите этот код:",
781
+ "Two-factor authentication with Time-based One-Time Password enabled": "Двухфакторная аутентификаиця с использованием Time-based One-Time Password",
782
+ "Two-factor authentication is enabled": "Двухфакторная аутентификация включена",
783
+ "Disable TWA": "Отключить TWA",
784
+ "Enable TWA": "Включить TWA",
785
+ "Deleted all rows": "Удалены все строки",
786
+ "Use this link: <a href=\"%s\">%s</a> to revisit your application at any time.": "В дальнешем используйте ссылку: <a href=\"%s\">%s</a> для входа в созданное приложение.",
787
+ "To login to a previously created application, go to: ": "Чтобы авторизоваться в ранее созданном приложении, перейдите по ссылке: ",
788
+ "Has channels?": "Связано с каналом?",
789
+ "Menu, search, languages and tenants": "Меню, поиск, языки и подсайты(тенанты)",
790
+ "Images and other files for download": "Изображения и другие файлы для загрузки",
791
+ "Channels to create events for. Separate by comma; leave blank for all": "Каналы, для которых создаются собятия. Разделяются ; Не заполняйте, чтобы использовать события для всех каналов",
792
+ "Event Name": "Имя события",
793
+ "Plugins (Extensions) Store endpoint": "Plugins (Extensions) Store endpoint",
794
+ "Packs Store endpoint": "Packs Store endpoint",
795
+ "The endpoint of plugins store.": "The endpoint of plugins store.",
796
+ "The endpoint of packs store.": "The endpoint of packs store."
752
797
  }
package/locales/zh.json CHANGED
@@ -294,7 +294,7 @@
294
294
  "new": "新的",
295
295
  "Password does not match": "密码不匹配",
296
296
  "Not allowed to write to table %s": "不允许写入表 %s",
297
- "Login sucessful": "登录成功",
297
+ "Login successful": "登录成功",
298
298
  "Welcome, %s!": "欢迎,%s!",
299
299
  "Error: missing name or file": "错误:缺少名称或文件",
300
300
  "Restart server.": "重启服务器。",
@@ -871,8 +871,8 @@
871
871
  "Place in dropdown": "放置在下拉列表中",
872
872
  "Hide null columns": "隐藏空列",
873
873
  "Do not display a column if it contains entirely missing values": "如果列包含完全缺失的值,则不显示",
874
- "Show a warning to users creating a tenant disclaiming warrenty of availability or security": "向创建租户的用户显示警告,拒绝对可用性或安全性提供保证",
875
- "Set to 0 for expration at the end of browser session": "设置为 0 以在浏览器会话结束时进行扩展",
874
+ "Show a warning to users creating a tenant disclaiming warranty of availability or security": "向创建租户的用户显示警告,拒绝对可用性或安全性提供保证",
875
+ "Set to 0 for expiration at the end of browser session": "设置为 0 以在浏览器会话结束时进行扩展",
876
876
  "Could not verify code": "无法验证代码",
877
877
  "Disable two-factor authentication": "禁用双重身份验证",
878
878
  "Enter your two-factor code in order to disable it": "输入您的双因素代码以禁用它",
package/markup/admin.js CHANGED
@@ -1,4 +1,5 @@
1
1
  /**
2
+ * Admin Menu (Settings...)
2
3
  * @category server
3
4
  * @module markup/admin
4
5
  * @subcategory markup
@@ -6,7 +7,7 @@
6
7
 
7
8
  const {
8
9
  div,
9
- hr,
10
+ //hr,
10
11
  form,
11
12
  input,
12
13
  label,
@@ -18,10 +19,10 @@ const {
18
19
  } = require("@saltcorn/markup/tags");
19
20
  const db = require("@saltcorn/data/db");
20
21
  const {
21
- getConfig,
22
- setConfig,
23
- getAllConfigOrDefaults,
24
- deleteConfig,
22
+ //getConfig,
23
+ //setConfig,
24
+ //getAllConfigOrDefaults,
25
+ //deleteConfig,
25
26
  configTypes,
26
27
  isFixedConfig,
27
28
  } = require("@saltcorn/data/models/config");
@@ -33,6 +34,7 @@ const View = require("@saltcorn/data/models/view");
33
34
  const User = require("@saltcorn/data/models/user");
34
35
 
35
36
  /**
37
+ * Restore Backup
36
38
  * @param {*} csrf
37
39
  * @param {*} inner
38
40
  * @param {string} action
@@ -65,6 +67,7 @@ const restore_backup = (csrf, inner, action = `/admin/restore`) =>
65
67
  );
66
68
 
67
69
  /**
70
+ * Add Edit Bar
68
71
  * @param {object} opts
69
72
  * @param {*} opts.role
70
73
  * @param {*} opts.title
@@ -91,6 +94,7 @@ const add_edit_bar = ({ role, title, contents, what, url, req }) => {
91
94
  };
92
95
 
93
96
  /**
97
+ * Send Settings Page
94
98
  * @param {object} opts
95
99
  * @param {*} opts.req,
96
100
  * @param {*} opts.res,
@@ -140,6 +144,7 @@ const send_settings_page = ({
140
144
  ),
141
145
  },
142
146
  ];
147
+ // headers
143
148
  const title = headers
144
149
  ? {
145
150
  title: req.__(active_sub),
@@ -175,6 +180,7 @@ const send_settings_page = ({
175
180
  };
176
181
 
177
182
  /**
183
+ * Send InfoArch Page
178
184
  * @param {object} args
179
185
  * @returns {void}
180
186
  */
@@ -202,6 +208,7 @@ const send_infoarch_page = (args) => {
202
208
  };
203
209
 
204
210
  /**
211
+ * Send Users Page
205
212
  * @param {object} args
206
213
  * @returns {void}
207
214
  */
@@ -221,6 +228,7 @@ const send_users_page = (args) => {
221
228
  };
222
229
 
223
230
  /**
231
+ * Send Files Page
224
232
  * @param {object} args
225
233
  * @returns {void}
226
234
  */
@@ -237,6 +245,7 @@ const send_files_page = (args) => {
237
245
  };
238
246
 
239
247
  /**
248
+ * Send Events Page
240
249
  * @param {object} args
241
250
  * @returns {void}
242
251
  */
@@ -257,11 +266,12 @@ const send_events_page = (args) => {
257
266
  };
258
267
 
259
268
  /**
269
+ * Send Admin page
260
270
  * @param {object} args
261
271
  * @returns {void}
262
272
  */
263
273
  const send_admin_page = (args) => {
264
- const isRoot = db.getTenantSchema() === db.connectObj.default_schema;
274
+ //const isRoot = db.getTenantSchema() === db.connectObj.default_schema;
265
275
  return send_settings_page({
266
276
  main_section: "About application",
267
277
  main_section_href: "/admin",
@@ -276,6 +286,7 @@ const send_admin_page = (args) => {
276
286
  };
277
287
 
278
288
  /**
289
+ * View Attributes
279
290
  * @param {object} key
280
291
  * @returns {Promise<object>}
281
292
  */
@@ -292,6 +303,7 @@ const viewAttributes = async (key) => {
292
303
  };
293
304
 
294
305
  /**
306
+ * Flash start if required
295
307
  * @param {*} cfgForm
296
308
  * @param {*} req
297
309
  * @returns {void}
@@ -308,6 +320,7 @@ const flash_restart_if_required = (cfgForm, req) => {
308
320
  };
309
321
 
310
322
  /**
323
+ * Flash restart
311
324
  * @param {object} req
312
325
  * @returns {void}
313
326
  */
@@ -321,6 +334,7 @@ const flash_restart = (req) => {
321
334
  };
322
335
 
323
336
  /**
337
+ * Config fields form
324
338
  * @param {object} opts
325
339
  * @param {string[]} opts.field_names
326
340
  * @param {object} opts.req
@@ -335,6 +349,7 @@ const config_fields_form = async ({ field_names, req, ...formArgs }) => {
335
349
 
336
350
  for (const name of field_names) {
337
351
  values[name] = state.getConfig(name);
352
+ //console.log(`config field name: %s`,name);
338
353
  if (configTypes[name].root_only && tenant !== db.connectObj.default_schema)
339
354
  continue;
340
355
  const isView = (configTypes[name].type || "").startsWith("View ");
@@ -386,6 +401,7 @@ const config_fields_form = async ({ field_names, req, ...formArgs }) => {
386
401
  };
387
402
 
388
403
  /**
404
+ * Save config fields from page
389
405
  * @param {*} form
390
406
  * @returns {Promise<void>}
391
407
  */
@@ -400,17 +416,17 @@ const save_config_from_form = async (form) => {
400
416
  };
401
417
 
402
418
  /**
403
- * @returns {string}
419
+ * Get Base Domain
420
+ * @returns {string} base domain
404
421
  */
405
422
  const getBaseDomain = () => {
406
423
  const base_url = getState().getConfig("base_url");
407
424
  if (!base_url) return null;
408
- const domain = base_url
425
+ return base_url
409
426
  .toLowerCase()
410
427
  .replace("https://", "")
411
428
  .replace("http://", "")
412
429
  .replace(/\//g, "");
413
- return domain;
414
430
  };
415
431
 
416
432
  /**
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@saltcorn/server",
3
- "version": "0.7.1-beta.3",
3
+ "version": "0.7.2-beta.10",
4
4
  "description": "Server app for Saltcorn, open-source no-code platform",
5
5
  "homepage": "https://saltcorn.com",
6
6
  "main": "index.js",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
- "@saltcorn/base-plugin": "0.7.1-beta.3",
10
- "@saltcorn/builder": "0.7.1-beta.3",
11
- "@saltcorn/data": "0.7.1-beta.3",
12
- "@saltcorn/admin-models": "0.7.1-beta.3",
13
- "@saltcorn/markup": "0.7.1-beta.3",
14
- "@saltcorn/sbadmin2": "0.7.1-beta.3",
9
+ "@saltcorn/base-plugin": "0.7.2-beta.10",
10
+ "@saltcorn/builder": "0.7.2-beta.10",
11
+ "@saltcorn/data": "0.7.2-beta.10",
12
+ "@saltcorn/admin-models": "0.7.2-beta.10",
13
+ "@saltcorn/markup": "0.7.2-beta.10",
14
+ "@saltcorn/sbadmin2": "0.7.2-beta.10",
15
15
  "@socket.io/cluster-adapter": "^0.1.0",
16
16
  "@socket.io/sticky": "^1.0.1",
17
17
  "aws-sdk": "^2.1037.0",
@@ -32,6 +32,7 @@
32
32
  "greenlock-express": "^4.0.3",
33
33
  "helmet": "^3.23.3",
34
34
  "i18n": "^0.14.0",
35
+ "jsonwebtoken": "^8.5.1",
35
36
  "live-plugin-manager": "^0.16.0",
36
37
  "moment": "^2.27.0",
37
38
  "multer": "^1.4.3",
@@ -42,14 +43,17 @@
42
43
  "passport": "^0.4.1",
43
44
  "passport-custom": "^1.1.1",
44
45
  "passport-http-bearer": "^1.0.1",
46
+ "passport-jwt": "4.0.0",
45
47
  "passport-totp": "0.0.2",
46
48
  "pg": "^8.2.1",
47
49
  "pluralize": "^8.0.0",
48
50
  "qrcode": "1.5.0",
51
+ "sharp": "0.30.3",
49
52
  "socket.io": "4.2.0",
50
53
  "thirty-two": "1.0.2",
51
54
  "tmp-promise": "^3.0.2",
52
- "uuid": "^8.2.0"
55
+ "uuid": "^8.2.0",
56
+ "cors": "2.8.5"
53
57
  },
54
58
  "optionalDependencies": {
55
59
  "connect-sqlite3": "^0.9.11",
@@ -57,7 +61,8 @@
57
61
  },
58
62
  "repository": "github:saltcorn/saltcorn",
59
63
  "devDependencies": {
60
- "jest": "^25.1.0",
64
+ "jest": "26.6.3",
65
+ "jest-environment-jsdom": "^26.6.2",
61
66
  "supertest": "^4.0.2"
62
67
  },
63
68
  "scripts": {
@@ -117,6 +117,7 @@ function MenuEditor(e, t) {
117
117
  (n.prev("div").children(".sortableListsOpener").first().remove(),
118
118
  n.remove()),
119
119
  MenuEditor.updateButtons(s);
120
+ l.onUpdate();
120
121
  }
121
122
  }),
122
123
  $(document).on("click", ".btnEdit", function (e) {
@@ -145,11 +146,13 @@ function MenuEditor(e, t) {
145
146
  e.preventDefault();
146
147
  var t = $(this).closest("li");
147
148
  t.prev("li").before(t), MenuEditor.updateButtons(s);
149
+ l.onUpdate();
148
150
  }),
149
151
  s.on("click", ".btnDown", function (e) {
150
152
  e.preventDefault();
151
153
  var t = $(this).closest("li");
152
154
  t.next("li").after(t), MenuEditor.updateButtons(s);
155
+ l.onUpdate();
153
156
  }),
154
157
  s.on("click", ".btnOut", function (e) {
155
158
  e.preventDefault();
@@ -161,6 +164,7 @@ function MenuEditor(e, t) {
161
164
  t.remove()),
162
165
  MenuEditor.updateButtons(s),
163
166
  s.updateLevels();
167
+ l.onUpdate();
164
168
  }),
165
169
  s.on("click", ".btnIn", function (e) {
166
170
  e.preventDefault();
@@ -174,6 +178,7 @@ function MenuEditor(e, t) {
174
178
  l.append(n), n.append(t), l.addClass("sortableListsOpen"), f(l);
175
179
  }
176
180
  MenuEditor.updateButtons(s), s.updateLevels();
181
+ l.onUpdate();
177
182
  }),
178
183
  (this.setForm = function (e) {
179
184
  i = e;