Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
18c90cd36e | ||
|
|
47bb8ba641 | ||
|
|
830ce3d035 | ||
|
|
207846fa04 | ||
|
|
47433f3dc9 | ||
|
|
5d83212761 | ||
|
|
34306a3d05 | ||
|
|
cbd2f676e2 | ||
|
|
ada5c05aa7 | ||
|
|
eae2c68f29 | ||
|
|
54d7d41eb6 | ||
|
|
88ad17164c |
1976
package-lock.json
generated
1976
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "multi-render-blender",
|
"name": "multi-render-blender",
|
||||||
"version": "1.6.0",
|
"version": "1.8.0",
|
||||||
"description": "Application Electron pour piloter des rendus Blender multi-cameras",
|
"description": "Application Electron pour piloter des rendus Blender multi-cameras",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -11,8 +11,8 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"electron": "^34.0.0",
|
"electron": "^40.7.0",
|
||||||
"electron-builder": "^25.1.8"
|
"electron-builder": "^26.8.1"
|
||||||
},
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"appId": "com.multirender.blender",
|
"appId": "com.multirender.blender",
|
||||||
@@ -22,7 +22,8 @@
|
|||||||
"main.js",
|
"main.js",
|
||||||
"preload.js",
|
"preload.js",
|
||||||
"src/**/*",
|
"src/**/*",
|
||||||
"version.json"
|
"version.json",
|
||||||
|
"node_modules/nodemailer/**/*"
|
||||||
],
|
],
|
||||||
"linux": {
|
"linux": {
|
||||||
"target": "dir"
|
"target": "dir"
|
||||||
|
|||||||
@@ -1,4 +1,16 @@
|
|||||||
const nodemailer = require("nodemailer");
|
let _nodemailer = null;
|
||||||
|
|
||||||
|
const _get_nodemailer = () => {
|
||||||
|
if (!_nodemailer) {
|
||||||
|
try {
|
||||||
|
_nodemailer = require("nodemailer");
|
||||||
|
} catch (_err) {
|
||||||
|
console.error("[EmailNotifier] nodemailer non disponible :", _err.message);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _nodemailer;
|
||||||
|
};
|
||||||
|
|
||||||
const _SMTP = {
|
const _SMTP = {
|
||||||
str_host: "ssl0.ovh.net",
|
str_host: "ssl0.ovh.net",
|
||||||
@@ -28,7 +40,12 @@ const EmailNotifier = {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
EmailNotifier._obj_transporter = nodemailer.createTransport({
|
let obj_nm = _get_nodemailer();
|
||||||
|
if (!obj_nm) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EmailNotifier._obj_transporter = obj_nm.createTransport({
|
||||||
host: _SMTP.str_host,
|
host: _SMTP.str_host,
|
||||||
port: _SMTP.nb_port,
|
port: _SMTP.nb_port,
|
||||||
secure: true,
|
secure: true,
|
||||||
@@ -66,7 +83,12 @@ const EmailNotifier = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
test: (obj_config) => {
|
test: (obj_config) => {
|
||||||
let obj_transporter = nodemailer.createTransport({
|
let obj_nm = _get_nodemailer();
|
||||||
|
if (!obj_nm) {
|
||||||
|
return Promise.resolve({ is_success: false, str_error: "nodemailer non disponible" });
|
||||||
|
}
|
||||||
|
|
||||||
|
let obj_transporter = obj_nm.createTransport({
|
||||||
host: _SMTP.str_host,
|
host: _SMTP.str_host,
|
||||||
port: _SMTP.nb_port,
|
port: _SMTP.nb_port,
|
||||||
secure: true,
|
secure: true,
|
||||||
|
|||||||
@@ -6,12 +6,16 @@ const { app } = require("electron");
|
|||||||
const { execFile } = require("child_process");
|
const { execFile } = require("child_process");
|
||||||
|
|
||||||
const GITEA_HOST = "git.sorlinv.fr";
|
const GITEA_HOST = "git.sorlinv.fr";
|
||||||
const REPO_PATH = "/api/v1/repos/sorlinv/multi_render_blender/tags";
|
const GITEA_BASE = "https://git.sorlinv.fr";
|
||||||
const ARCHIVE_URL_BASE = "https://git.sorlinv.fr/sorlinv/multi_render_blender/archive/";
|
const REPO_OWNER = "sorlinv";
|
||||||
|
const REPO_NAME = "multi_render_blender";
|
||||||
|
const REPO_PATH = "/api/v1/repos/" + REPO_OWNER + "/" + REPO_NAME + "/tags";
|
||||||
|
const RELEASES_API = "/api/v1/repos/" + REPO_OWNER + "/" + REPO_NAME + "/releases/tags/";
|
||||||
|
const PRODUCT_NAME = "multi-render-blender";
|
||||||
const NB_TIMEOUT_API = 10000;
|
const NB_TIMEOUT_API = 10000;
|
||||||
const NB_TIMEOUT_DOWNLOAD = 60000;
|
const NB_TIMEOUT_DOWNLOAD = 300000;
|
||||||
const LIST_REQUIRED_FILES = ["main.js", "version.json"];
|
const LIST_REQUIRED_FILES = ["main.js", "version.json"];
|
||||||
const LIST_TARGETS = ["main.js", "preload.js", "src", "version.json", "package.json"];
|
const LIST_TARGETS = ["main.js", "preload.js", "src", "version.json", "package.json", "node_modules"];
|
||||||
|
|
||||||
const UpdateManager = {
|
const UpdateManager = {
|
||||||
obj_window: null,
|
obj_window: null,
|
||||||
@@ -208,9 +212,84 @@ const UpdateManager = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_download_zip: (str_tag_name, str_zip_path) => {
|
_fetch_release_asset_url: (str_tag_name) => {
|
||||||
let str_url = ARCHIVE_URL_BASE + str_tag_name + ".zip";
|
let str_platform = process.platform === "win32" ? "win-x64" : "linux-x64";
|
||||||
|
let str_expected_suffix = "-" + str_platform + ".zip";
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let obj_options = {
|
||||||
|
hostname: GITEA_HOST,
|
||||||
|
path: RELEASES_API + str_tag_name,
|
||||||
|
method: "GET",
|
||||||
|
timeout: NB_TIMEOUT_API,
|
||||||
|
headers: {
|
||||||
|
"Accept": "application/json",
|
||||||
|
"User-Agent": "MultiRenderBlender",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let obj_req = https.request(obj_options, (obj_res) => {
|
||||||
|
let str_data = "";
|
||||||
|
|
||||||
|
obj_res.on("data", (chunk) => {
|
||||||
|
str_data += chunk;
|
||||||
|
});
|
||||||
|
|
||||||
|
obj_res.on("end", () => {
|
||||||
|
if (obj_res.statusCode !== 200) {
|
||||||
|
reject(new Error("Release API status " + obj_res.statusCode));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
let obj_release = JSON.parse(str_data);
|
||||||
|
let list_assets = obj_release.assets || [];
|
||||||
|
let obj_asset = null;
|
||||||
|
|
||||||
|
for (let obj_a of list_assets) {
|
||||||
|
let str_name = obj_a.name || "";
|
||||||
|
if (str_name.endsWith(str_expected_suffix)) {
|
||||||
|
obj_asset = obj_a;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!obj_asset) {
|
||||||
|
reject(new Error("Asset build introuvable pour " + str_platform + " dans la release " + str_tag_name));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let str_url = obj_asset.browser_download_url || "";
|
||||||
|
if (!str_url) {
|
||||||
|
str_url = GITEA_BASE + "/" + REPO_OWNER + "/" + REPO_NAME + "/releases/download/" + str_tag_name + "/" + obj_asset.name;
|
||||||
|
}
|
||||||
|
resolve(str_url);
|
||||||
|
} catch (obj_err) {
|
||||||
|
reject(new Error("Reponse JSON release invalide"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
obj_req.on("timeout", () => {
|
||||||
|
obj_req.destroy();
|
||||||
|
reject(new Error("Timeout API release"));
|
||||||
|
});
|
||||||
|
|
||||||
|
obj_req.on("error", (obj_err) => {
|
||||||
|
reject(obj_err);
|
||||||
|
});
|
||||||
|
|
||||||
|
obj_req.end();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_download_zip: (str_tag_name, str_zip_path) => {
|
||||||
|
return UpdateManager._fetch_release_asset_url(str_tag_name)
|
||||||
|
.then((str_url) => {
|
||||||
|
return UpdateManager._download_file(str_url, str_zip_path);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_download_file: (str_url, str_zip_path) => {
|
||||||
let fn_download = (str_download_url, nb_redirects) => {
|
let fn_download = (str_download_url, nb_redirects) => {
|
||||||
if (nb_redirects > 5) {
|
if (nb_redirects > 5) {
|
||||||
return Promise.reject(new Error("Trop de redirections"));
|
return Promise.reject(new Error("Trop de redirections"));
|
||||||
@@ -311,39 +390,41 @@ const UpdateManager = {
|
|||||||
|
|
||||||
_find_extracted_root: (str_temp_dir) => {
|
_find_extracted_root: (str_temp_dir) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let list_entries = fs.readdirSync(str_temp_dir);
|
let fn_find_version_json = (str_dir, nb_depth) => {
|
||||||
let str_root = null;
|
if (nb_depth > 5) {
|
||||||
|
return null;
|
||||||
for (let str_entry of list_entries) {
|
|
||||||
if (str_entry === "update.zip") {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
let str_full = path.join(str_temp_dir, str_entry);
|
let str_version_check = path.join(str_dir, "version.json");
|
||||||
if (!fs.statSync(str_full).isDirectory()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let str_version_check = path.join(str_full, "version.json");
|
|
||||||
if (fs.existsSync(str_version_check)) {
|
if (fs.existsSync(str_version_check)) {
|
||||||
str_root = str_full;
|
return str_dir;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
let list_entries;
|
||||||
let list_sub = fs.readdirSync(str_full);
|
try {
|
||||||
for (let str_sub of list_sub) {
|
list_entries = fs.readdirSync(str_dir);
|
||||||
let str_sub_full = path.join(str_full, str_sub);
|
} catch (obj_err) {
|
||||||
if (fs.statSync(str_sub_full).isDirectory()) {
|
return null;
|
||||||
let str_nested_check = path.join(str_sub_full, "version.json");
|
}
|
||||||
if (fs.existsSync(str_nested_check)) {
|
for (let str_entry of list_entries) {
|
||||||
str_root = str_sub_full;
|
if (str_entry === "update.zip") {
|
||||||
break;
|
continue;
|
||||||
|
}
|
||||||
|
let str_full = path.join(str_dir, str_entry);
|
||||||
|
try {
|
||||||
|
if (!fs.statSync(str_full).isDirectory()) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
} catch (obj_err) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let str_found = fn_find_version_json(str_full, nb_depth + 1);
|
||||||
|
if (str_found) {
|
||||||
|
return str_found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (str_root) {
|
return null;
|
||||||
break;
|
};
|
||||||
}
|
|
||||||
}
|
let str_root = fn_find_version_json(str_temp_dir, 0);
|
||||||
|
|
||||||
if (!str_root) {
|
if (!str_root) {
|
||||||
reject(new Error("Dossier extrait introuvable (version.json absent)"));
|
reject(new Error("Dossier extrait introuvable (version.json absent)"));
|
||||||
|
|||||||
@@ -54,21 +54,22 @@ def apply_collections(list_collections: list) -> None:
|
|||||||
if not list_collections:
|
if not list_collections:
|
||||||
return
|
return
|
||||||
|
|
||||||
def _set_layer_collection(obj_lc: object, str_name: str, is_val: bool) -> None:
|
def _set_layer_collection(obj_lc: object, str_name: str, is_exclude: bool) -> None:
|
||||||
"""Parcourt recursivement les layer collections pour exclure/inclure."""
|
"""Parcourt recursivement les layer collections pour exclure/inclure."""
|
||||||
for obj_child in obj_lc.children:
|
for obj_child in obj_lc.children:
|
||||||
if obj_child.name == str_name:
|
if obj_child.name == str_name:
|
||||||
obj_child.exclude = is_val
|
obj_child.exclude = is_exclude
|
||||||
return
|
return
|
||||||
_set_layer_collection(obj_child, str_name, is_val)
|
_set_layer_collection(obj_child, str_name, is_exclude)
|
||||||
|
|
||||||
obj_view_layer_collection = bpy.context.view_layer.layer_collection
|
obj_view_layer_collection = bpy.context.view_layer.layer_collection
|
||||||
|
|
||||||
for obj_col in list_collections:
|
for obj_col in list_collections:
|
||||||
str_name: str = obj_col["str_name"]
|
str_name: str = obj_col["str_name"]
|
||||||
is_hide: bool = obj_col["is_hide_render"]
|
is_hide: bool = obj_col["is_hide_render"]
|
||||||
|
is_exclude: bool = obj_col.get("is_exclude", False)
|
||||||
bpy.data.collections[str_name].hide_render = is_hide
|
bpy.data.collections[str_name].hide_render = is_hide
|
||||||
_set_layer_collection(obj_view_layer_collection, str_name, is_hide)
|
_set_layer_collection(obj_view_layer_collection, str_name, is_exclude)
|
||||||
|
|
||||||
|
|
||||||
def process_render(obj_cmd: dict) -> None:
|
def process_render(obj_cmd: dict) -> None:
|
||||||
|
|||||||
@@ -153,7 +153,12 @@
|
|||||||
<div class="card bg-dark border-secondary">
|
<div class="card bg-dark border-secondary">
|
||||||
<div class="card-header border-secondary d-flex justify-content-between align-items-center">
|
<div class="card-header border-secondary d-flex justify-content-between align-items-center">
|
||||||
<span><i class="mdi mdi-camera-outline me-1"></i>Cameras</span>
|
<span><i class="mdi mdi-camera-outline me-1"></i>Cameras</span>
|
||||||
<span id="badge_camera_count" class="badge bg-secondary">0</span>
|
<div class="d-flex align-items-center gap-2">
|
||||||
|
<button id="btn_toggle_all_cameras" class="btn btn-outline-secondary btn-sm py-0 px-1" title="Tout cocher / decocher">
|
||||||
|
<i class="mdi mdi-checkbox-multiple-marked-outline"></i>
|
||||||
|
</button>
|
||||||
|
<span id="badge_camera_count" class="badge bg-secondary">0</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body p-0">
|
<div class="card-body p-0">
|
||||||
<div id="container_camera_list" class="list-group list-group-flush overflow-auto" style="max-height: 300px;">
|
<div id="container_camera_list" class="list-group list-group-flush overflow-auto" style="max-height: 300px;">
|
||||||
@@ -170,15 +175,19 @@
|
|||||||
<div class="card-header border-secondary d-flex justify-content-between align-items-center">
|
<div class="card-header border-secondary d-flex justify-content-between align-items-center">
|
||||||
<span><i class="mdi mdi-folder-multiple-outline me-1"></i>Collections</span>
|
<span><i class="mdi mdi-folder-multiple-outline me-1"></i>Collections</span>
|
||||||
<div class="d-flex align-items-center gap-2">
|
<div class="d-flex align-items-center gap-2">
|
||||||
|
<div class="form-check form-switch mb-0" title="Quand active, les collections du .blend ne sont pas modifiees">
|
||||||
|
<input class="form-check-input" type="checkbox" id="check_skip_collections" checked>
|
||||||
|
<label class="form-check-label small text-light" for="check_skip_collections">Ignorer</label>
|
||||||
|
</div>
|
||||||
<button id="btn_reset_collections" class="btn btn-sm btn-outline-secondary py-0 px-1"
|
<button id="btn_reset_collections" class="btn btn-sm btn-outline-secondary py-0 px-1"
|
||||||
title="Restaurer les valeurs originales">
|
title="Restaurer les valeurs originales" disabled>
|
||||||
<i class="mdi mdi-undo-variant" style="font-size: 0.75rem;"></i>
|
<i class="mdi mdi-undo-variant" style="font-size: 0.75rem;"></i>
|
||||||
</button>
|
</button>
|
||||||
<span id="badge_collection_count" class="badge bg-secondary">0</span>
|
<span id="badge_collection_count" class="badge bg-secondary">0</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body p-0">
|
<div class="card-body p-0">
|
||||||
<div id="container_collection_list" class="list-group list-group-flush overflow-auto" style="max-height: 250px;">
|
<div id="container_collection_list" class="list-group list-group-flush overflow-auto disabled-overlay" style="max-height: 250px; pointer-events: none; opacity: 0.4;">
|
||||||
<div class="text-center text-light-emphasis py-3">
|
<div class="text-center text-light-emphasis py-3">
|
||||||
<i class="mdi mdi-folder-off-outline d-block mb-2" style="font-size: 1.5rem;"></i>
|
<i class="mdi mdi-folder-off-outline d-block mb-2" style="font-size: 1.5rem;"></i>
|
||||||
Chargez un fichier .blend
|
Chargez un fichier .blend
|
||||||
|
|||||||
@@ -309,6 +309,7 @@ const App = {
|
|||||||
str_output_path: App.str_output_path,
|
str_output_path: App.str_output_path,
|
||||||
list_cameras: CameraList.list_cameras,
|
list_cameras: CameraList.list_cameras,
|
||||||
list_collections: CollectionList.list_collections,
|
list_collections: CollectionList.list_collections,
|
||||||
|
is_skip_collections: CollectionList.is_skip_collections,
|
||||||
obj_render_settings: RenderSettings.get_settings(),
|
obj_render_settings: RenderSettings.get_settings(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -375,9 +376,15 @@ const App = {
|
|||||||
obj_badge.textContent = String(obj_config.list_cameras.length);
|
obj_badge.textContent = String(obj_config.list_cameras.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (obj_config.is_skip_collections !== undefined) {
|
||||||
|
CollectionList.is_skip_collections = obj_config.is_skip_collections;
|
||||||
|
document.getElementById("check_skip_collections").checked = obj_config.is_skip_collections;
|
||||||
|
}
|
||||||
|
|
||||||
if (obj_config.list_collections && obj_config.list_collections.length > 0) {
|
if (obj_config.list_collections && obj_config.list_collections.length > 0) {
|
||||||
CollectionList.list_collections = obj_config.list_collections;
|
CollectionList.list_collections = obj_config.list_collections;
|
||||||
CollectionList.render();
|
CollectionList.render();
|
||||||
|
CollectionList._update_panel_state();
|
||||||
let obj_badge_col = document.getElementById("badge_collection_count");
|
let obj_badge_col = document.getElementById("badge_collection_count");
|
||||||
obj_badge_col.textContent = String(obj_config.list_collections.length);
|
obj_badge_col.textContent = String(obj_config.list_collections.length);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -5,6 +5,11 @@ const CameraList = {
|
|||||||
|
|
||||||
init: (fn_on_select) => {
|
init: (fn_on_select) => {
|
||||||
CameraList.fn_on_select = fn_on_select;
|
CameraList.fn_on_select = fn_on_select;
|
||||||
|
|
||||||
|
let obj_btn_toggle = document.getElementById("btn_toggle_all_cameras");
|
||||||
|
obj_btn_toggle.addEventListener("click", () => {
|
||||||
|
CameraList.toggle_all();
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
set_cameras: (list_names, obj_scene) => {
|
set_cameras: (list_names, obj_scene) => {
|
||||||
@@ -45,6 +50,27 @@ const CameraList = {
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
toggle_all: () => {
|
||||||
|
if (CameraList.list_cameras.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let is_any_enabled = false;
|
||||||
|
for (let obj_cam of CameraList.list_cameras) {
|
||||||
|
if (obj_cam.is_enabled) {
|
||||||
|
is_any_enabled = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let is_new_state = !is_any_enabled;
|
||||||
|
for (let obj_cam of CameraList.list_cameras) {
|
||||||
|
obj_cam.is_enabled = is_new_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraList.render();
|
||||||
|
},
|
||||||
|
|
||||||
get_enabled_cameras: () => {
|
get_enabled_cameras: () => {
|
||||||
let list_enabled = [];
|
let list_enabled = [];
|
||||||
for (let obj_cam of CameraList.list_cameras) {
|
for (let obj_cam of CameraList.list_cameras) {
|
||||||
|
|||||||
@@ -1,8 +1,29 @@
|
|||||||
const CollectionList = {
|
const CollectionList = {
|
||||||
list_collections: [],
|
list_collections: [],
|
||||||
|
is_skip_collections: true,
|
||||||
|
|
||||||
init: () => {
|
init: () => {
|
||||||
// Peuple lors du chargement du .blend
|
let obj_check = document.getElementById("check_skip_collections");
|
||||||
|
obj_check.checked = true;
|
||||||
|
CollectionList.is_skip_collections = true;
|
||||||
|
obj_check.addEventListener("change", () => {
|
||||||
|
CollectionList.is_skip_collections = obj_check.checked;
|
||||||
|
CollectionList._update_panel_state();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_update_panel_state: () => {
|
||||||
|
let obj_container = document.getElementById("container_collection_list");
|
||||||
|
let obj_btn_reset = document.getElementById("btn_reset_collections");
|
||||||
|
if (CollectionList.is_skip_collections) {
|
||||||
|
obj_container.style.pointerEvents = "none";
|
||||||
|
obj_container.style.opacity = "0.4";
|
||||||
|
obj_btn_reset.disabled = true;
|
||||||
|
} else {
|
||||||
|
obj_container.style.pointerEvents = "";
|
||||||
|
obj_container.style.opacity = "";
|
||||||
|
obj_btn_reset.disabled = false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
set_collections: (list_raw) => {
|
set_collections: (list_raw) => {
|
||||||
@@ -10,6 +31,7 @@ const CollectionList = {
|
|||||||
|
|
||||||
if (!list_raw || list_raw.length === 0) {
|
if (!list_raw || list_raw.length === 0) {
|
||||||
CollectionList.render();
|
CollectionList.render();
|
||||||
|
CollectionList._update_panel_state();
|
||||||
let obj_badge = document.getElementById("badge_collection_count");
|
let obj_badge = document.getElementById("badge_collection_count");
|
||||||
obj_badge.textContent = "0";
|
obj_badge.textContent = "0";
|
||||||
return;
|
return;
|
||||||
@@ -28,12 +50,16 @@ const CollectionList = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CollectionList.render();
|
CollectionList.render();
|
||||||
|
CollectionList._update_panel_state();
|
||||||
|
|
||||||
let obj_badge = document.getElementById("badge_collection_count");
|
let obj_badge = document.getElementById("badge_collection_count");
|
||||||
obj_badge.textContent = String(CollectionList.list_collections.length);
|
obj_badge.textContent = String(CollectionList.list_collections.length);
|
||||||
},
|
},
|
||||||
|
|
||||||
get_overrides: () => {
|
get_overrides: () => {
|
||||||
|
if (CollectionList.is_skip_collections) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
let list_overrides = [];
|
let list_overrides = [];
|
||||||
for (let obj_col of CollectionList.list_collections) {
|
for (let obj_col of CollectionList.list_collections) {
|
||||||
list_overrides.push({
|
list_overrides.push({
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"str_version": "1.6.0"
|
"str_version": "1.8.0"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user