Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 58 additions & 36 deletions src/bundle/Resources/public/js/scripts/admin.content.edit.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(function (global, doc, ibexa, Translator, moment) {
(function (global, doc, ibexa, Translator, bootstrap, moment) {
const ENTER_KEY_CODE = 13;
const STATUS_ERROR = 'error';
const STATUS_OFF = 'off';
Expand Down Expand Up @@ -26,10 +26,12 @@
'time',
'url',
];
const { escapeHTML } = ibexa.helpers.text;
const form = doc.querySelector('.ibexa-form-validate');
const submitBtns = form.querySelectorAll('[type="submit"]:not([formnovalidate])');
const menuButtonsToValidate = doc.querySelectorAll('button[data-validate]');
const fields = doc.querySelectorAll('.ibexa-field-edit');
const autosaveNode = doc.querySelector('.ibexa-autosave');
const getValidationResults = (validator) => {
const isValid = validator.isValid();
const validatorName = validator.constructor.name;
Expand Down Expand Up @@ -130,31 +132,35 @@
return ibexa.adminUiConfig.autosave.enabled && form.querySelector('[name="ezplatform_content_forms_content_edit[autosave]"]');
};

if (isAutosaveEnabled()) {
const AUTOSAVE_SUBMIT_BUTTON_NAME = 'ezplatform_content_forms_content_edit[autosave]';
const autosave = doc.querySelector('.ibexa-autosave');
const autosaveStatusSavedNode = autosave.querySelector('.ibexa-autosave__status-saved');
let currentAutosaveStatus = autosave.classList.contains('ibexa-autosave--on') ? STATUS_ON : STATUS_OFF;
if (autosaveNode) {
let currentAutosaveStatus = autosaveNode.classList.contains('ibexa-autosave--on') ? STATUS_ON : STATUS_OFF;
let isAutosaveSimple = autosaveNode.classList.contains('ibexa-autosave--simple');
const tooltipInstance = bootstrap.Tooltip.getOrCreateInstance(autosaveNode);
const generateCssStatusClass = (status) => `ibexa-autosave--${status}`;
const setAutosaveStatus = (newStatus) => {
if (!autosave) {
return;
}

const oldCssStatusClass = generateCssStatusClass(currentAutosaveStatus);
const newCssStatusClass = generateCssStatusClass(newStatus);

autosave.classList.remove(oldCssStatusClass);
autosave.classList.remove('ibexa-autosave--saved');
autosave.classList.add(newCssStatusClass);
autosaveNode.classList.remove(oldCssStatusClass);
autosaveNode.classList.remove('ibexa-autosave--saved');
autosaveNode.classList.add(newCssStatusClass);

currentAutosaveStatus = newStatus;
setAutosaveTooltipContent();
};
const setDraftSavedMessage = () => {
if (!autosave) {
return;
}

const setAutosaveTooltipContent = () => {
const statusMsgFromNode = autosaveNode.querySelector(`.ibexa-autosave__status--${currentAutosaveStatus}`).innerText;
const tooltipContent = isAutosaveSimple
? escapeHTML(statusMsgFromNode)
: Translator.trans(
/*@Desc("You can turn autosave off in your user settings")*/ 'content.autosave.turn_off.message',
{},
'ibexa_content',
);

tooltipInstance.setContent({ '.tooltip-inner': tooltipContent });
};
const setDraftSavedMessage = (autosaveStatusSavedNode) => {
const userPreferredTimezone = ibexa.adminUiConfig.timezone;
const saveDate = ibexa.helpers.timezone.convertDateToTimezone(new Date(), userPreferredTimezone);
const saveTime = moment(saveDate).formatICU('HH:mm');
Expand All @@ -165,25 +171,41 @@
);

autosaveStatusSavedNode.innerHTML = saveMessage;
autosave.classList.add('ibexa-autosave--saved');
autosaveNode.classList.add('ibexa-autosave--saved');
};

setInterval(() => {
const formData = new FormData(form);

formData.set(AUTOSAVE_SUBMIT_BUTTON_NAME, true);
setAutosaveStatus(STATUS_SAVING);

fetch(form.target || window.location.href, { method: 'POST', body: formData })
.then(ibexa.helpers.request.getStatusFromResponse)
.then(() => {
setAutosaveStatus(STATUS_SAVED);
setDraftSavedMessage();
})
.catch(() => {
setAutosaveStatus(STATUS_ERROR);
});
}, ibexa.adminUiConfig.autosave.interval);
setAutosaveTooltipContent();

doc.body.addEventListener('ibexa:edit-content-change-header-size', ({ detail }) => {
isAutosaveSimple = detail.isHeaderSlim;
autosaveNode.classList.toggle('ibexa-autosave--simple', isAutosaveSimple);
setAutosaveTooltipContent();
});

if (isAutosaveEnabled()) {
const AUTOSAVE_SUBMIT_BUTTON_NAME = 'ezplatform_content_forms_content_edit[autosave]';
const autosaveStatusSavedNode = autosaveNode.querySelector('.ibexa-autosave__status--saved');

setInterval(() => {
const formData = new FormData(form);

formData.set(AUTOSAVE_SUBMIT_BUTTON_NAME, true);
setAutosaveStatus(STATUS_SAVING);

fetch(form.target || window.location.href, { method: 'POST', body: formData })
.then(ibexa.helpers.request.getStatusFromResponse)
.then(() => {
setAutosaveStatus(STATUS_SAVED);
setDraftSavedMessage(autosaveStatusSavedNode);
})
.catch(() => {
setAutosaveStatus(STATUS_ERROR);
})
.finally(() => {
setAutosaveTooltipContent();
});
}, ibexa.adminUiConfig.autosave.interval);
}
}

form.setAttribute('novalidate', true);
Expand All @@ -204,4 +226,4 @@
menuButtonsToValidate.forEach((btn) => {
btn.addEventListener('click', validateHandler, false);
});
})(window, window.document, window.ibexa, window.Translator, window.moment);
})(window, window.document, window.ibexa, window.Translator, window.bootstrap, window.moment);
30 changes: 7 additions & 23 deletions src/bundle/Resources/public/js/scripts/edit.header.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
(function (global, doc, ibexa) {
const SCROLL_POSITION_TO_FIT = 50;
const HEADER_RIGHT_MARGIN = 50;
const MIN_HEIGHT_DIFF_FOR_FITTING_HEADER = 150;
const headerNode = doc.querySelector('.ibexa-edit-header');
const contentNode = doc.querySelector('.ibexa-edit-content');
Expand All @@ -9,24 +8,10 @@
return;
}

const headerBottomRowNode = headerNode.querySelector('.ibexa-edit-header__row--bottom');
const detailsContainer = headerNode.querySelector('.ibexa-edit-header__container--details');
const { height: expandedHeaderHeight } = headerNode.getBoundingClientRect();
const scrolledContent = doc.querySelector('.ibexa-edit-content > :first-child');
const { controlManyZIndexes } = ibexa.helpers.modal;
const fitEllipsizedTitle = () => {
const titleNode = headerBottomRowNode.querySelector('.ibexa-edit-header__name--ellipsized');
const firstMenuEntryNode = headerNode.querySelector('.ibexa-context-menu .ibexa-context-menu__item');
const { left: titleNodeLeft, width: titleNodeWidth } = titleNode.getBoundingClientRect();
const { left: firstMenuEntryNodeLeft } = firstMenuEntryNode.getBoundingClientRect();
const bottomRowNodeWidthNew = firstMenuEntryNodeLeft - titleNodeLeft;
const titleNodeWidthNew = bottomRowNodeWidthNew - HEADER_RIGHT_MARGIN;

headerBottomRowNode.style.width = `${bottomRowNodeWidthNew}px`;

if (titleNodeWidth > titleNodeWidthNew) {
titleNode.style.width = `${titleNodeWidthNew}px`;
}
};
const fitHeader = (event) => {
const { height: formHeight } = scrolledContent.getBoundingClientRect();
const contentHeightWithExpandedHeader = formHeight + expandedHeaderHeight;
Expand All @@ -40,14 +25,13 @@
const shouldHeaderBeSlim = scrollTop > SCROLL_POSITION_TO_FIT;

headerNode.classList.toggle('ibexa-edit-header--slim', shouldHeaderBeSlim);

if (shouldHeaderBeSlim) {
fitEllipsizedTitle();
} else {
headerBottomRowNode.style.width = '100%';
}
doc.body.dispatchEvent(
new CustomEvent('ibexa:edit-content-change-header-size', {
detail: { isHeaderSlim: shouldHeaderBeSlim },
}),
);
};

contentNode.addEventListener('scroll', fitHeader, false);
controlManyZIndexes([{ container: headerNode }, { container: headerBottomRowNode }], headerNode);
controlManyZIndexes([{ container: headerNode }, { container: detailsContainer }], headerNode);
})(window, window.document, window.ibexa);
26 changes: 19 additions & 7 deletions src/bundle/Resources/public/scss/_autosave.scss
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,22 @@
$states: 'error', 'off', 'on', 'saved', 'saving';

@each $state in $states {
&__icon-#{$state} {
&__icon--#{$state} {
margin-right: calculateRem(8px);
}

&__status-#{$state} {
&__status--#{$state} {
white-space: nowrap;
}

&__icon-#{$state},
&__status-#{$state} {
&__icon--#{$state},
&__status--#{$state} {
display: none;
}

&--#{$state} {
.ibexa-autosave__icon-#{$state},
.ibexa-autosave__status-#{$state} {
.ibexa-autosave__icon--#{$state},
.ibexa-autosave__status--#{$state} {
display: initial;
}
}
Expand All @@ -42,8 +42,20 @@
&--error {
color: $ibexa-color-danger;

.ibexa-autosave__icon-error {
.ibexa-autosave__icon--error {
fill: $ibexa-color-danger;
}
}

&--simple {
.ibexa-autosave {
&__status {
display: none;
}

&__icon {
margin: 0;
}
}
}
}
Loading
Loading