forked from UKSOURCE/cms.hailearning.edu.vn
feat: Improve home and contact CMS field guidance
This commit is contained in:
@@ -48,7 +48,8 @@
|
||||
<label class="form-label fw-medium">Brand Image</label>
|
||||
<div class="input-group mb-2">
|
||||
<input type="text" class="form-control" id="floatingContactBrandImage"
|
||||
value="<%= data.floatingContact?.brand?.imageSrc || '' %>" placeholder="/assets/img/logo/black-logo.svg" />
|
||||
value="<%= data.floatingContact?.brand?.imageSrc || '' %>" placeholder="/assets/img/logo/black-logo.svg"
|
||||
maxlength="255" data-maxlength="255" />
|
||||
<button type="button" class="btn btn-outline-primary btn-upload-image"
|
||||
data-target-input="floatingContactBrandImage" data-image-type="home/floating-contact"
|
||||
data-resize-preset="floatingContactBrandImage">
|
||||
@@ -63,7 +64,7 @@
|
||||
style="height: 120px; width: 120px; object-fit: contain; background: #fff;"
|
||||
alt="Brand preview" />
|
||||
</div>
|
||||
<small class="text-muted d-block mt-2">Raster logo uploads are normalized to 104x104 WebP to match the homepage widget.</small>
|
||||
<small class="text-muted d-block mt-2">Hiển thị thực tế khoảng 35x35px. Raster uploads are normalized to 104x104 WebP to match the homepage widget.</small>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<label class="form-label fw-medium">Fallback Trigger Image</label>
|
||||
@@ -73,7 +74,8 @@
|
||||
class="form-control"
|
||||
id="floatingContactTriggerImage"
|
||||
value="<%= data.floatingContact?.trigger?.imageSrc || '' %>"
|
||||
placeholder="/uploads/home/floating-contact/floating-trigger-icon.webp" />
|
||||
placeholder="/uploads/home/floating-contact/floating-trigger-icon.webp"
|
||||
maxlength="255" data-maxlength="255" />
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-outline-primary btn-upload-image"
|
||||
@@ -93,7 +95,7 @@
|
||||
</div>
|
||||
<input type="hidden" id="floatingContactTriggerIconFallback"
|
||||
value="<%= data.floatingContact?.trigger?.icon || 'fa-comments' %>" />
|
||||
<small class="text-muted d-block mt-2">Shown only when the trigger slideshow cannot use the brand image and action icons. Raster uploads are normalized to 96x96 WebP.</small>
|
||||
<small class="text-muted d-block mt-2">Hiển thị thực tế khoảng 26x26px. Shown only when the trigger slideshow cannot use the brand image and action icons. Raster uploads are normalized to 96x96 WebP.</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -322,12 +324,12 @@
|
||||
|
||||
<div class="col-lg-9 col-md-8">
|
||||
<label class="form-label fw-medium">Link</label>
|
||||
<input type="text" class="form-control floating-contact-action-href" value="${escapeFloatingContactHtml(defaults.href)}" placeholder="https://example.com" />
|
||||
<input type="text" class="form-control floating-contact-action-href" value="${escapeFloatingContactHtml(defaults.href)}" placeholder="https://example.com" maxlength="255" data-maxlength="255" />
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label class="form-label fw-medium">Icon Image</label>
|
||||
<div class="input-group mb-2">
|
||||
<input type="text" class="form-control floating-contact-action-icon-image" id="${escapeFloatingContactHtml(iconInputId)}" value="${escapeFloatingContactHtml(normalizedIconImage)}" placeholder="/uploads/home/floating-contact/floating-action-icon.webp" />
|
||||
<input type="text" class="form-control floating-contact-action-icon-image" id="${escapeFloatingContactHtml(iconInputId)}" value="${escapeFloatingContactHtml(normalizedIconImage)}" placeholder="/uploads/home/floating-contact/floating-action-icon.webp" maxlength="255" data-maxlength="255" />
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-outline-primary btn-upload-image"
|
||||
@@ -363,38 +365,10 @@
|
||||
});
|
||||
};
|
||||
|
||||
const ensureLengthHint = (input) => {
|
||||
if (!input || !input.dataset.maxlength) {
|
||||
return;
|
||||
}
|
||||
|
||||
let hint = input.parentElement?.querySelector(".floating-contact-length-hint");
|
||||
if (!hint) {
|
||||
hint = document.createElement("small");
|
||||
hint.className = "text-muted d-block mt-1 floating-contact-length-hint";
|
||||
input.parentElement?.appendChild(hint);
|
||||
}
|
||||
|
||||
const max = Number(input.dataset.maxlength);
|
||||
const length = input.value.length;
|
||||
hint.textContent = `${length}/${max} characters`;
|
||||
hint.classList.toggle("text-danger", length >= max);
|
||||
};
|
||||
|
||||
const bindLengthHints = (scope = document) => {
|
||||
scope.querySelectorAll("input[data-maxlength]").forEach((input) => {
|
||||
ensureLengthHint(input);
|
||||
if (input.dataset.lengthBound === "true") {
|
||||
return;
|
||||
}
|
||||
|
||||
input.addEventListener("input", () => ensureLengthHint(input));
|
||||
input.dataset.lengthBound = "true";
|
||||
});
|
||||
};
|
||||
|
||||
const bindActionCard = (card) => {
|
||||
bindLengthHints(card);
|
||||
if (typeof initHomeCharacterCounters === "function") {
|
||||
initHomeCharacterCounters(card);
|
||||
}
|
||||
bindImageField(
|
||||
card.querySelector(".floating-contact-action-icon-image"),
|
||||
card.querySelector(".floating-contact-action-icon-preview"),
|
||||
@@ -475,7 +449,6 @@
|
||||
}
|
||||
|
||||
renderInitialActions();
|
||||
bindLengthHints(document);
|
||||
});
|
||||
|
||||
window.homeScrapers.floatingContact = () => {
|
||||
|
||||
Reference in New Issue
Block a user