All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.blogs.js.blogs.js Maven / Gradle / Ivy

There is a newer version: 2.0.2
Show newest version
AUI.add(
	'liferay-blogs',
	function(A) {
		var Lang = A.Lang;

		var CSS_INVISIBLE = 'invisible';

		var STR_BLANK = '';

		var STR_CHANGE = 'change';

		var STR_CLICK = 'click';

		var STR_SUFFIX = '...';

		var Blogs = A.Component.create(
			{
				ATTRS: {
					constants: {
						validator: Lang.isObject
					},

					descriptionLength: {
						validator: Lang.isNumber,
						value: 400
					},

					editEntryURL: {
						validator: Lang.isString
					},

					entry: {
						validator: Lang.isObject
					},

					saveInterval: {
						value: 30000
					},

					strings: {
						validator: Lang.isObject,
						value: {
							confirmDiscardImages: Liferay.Language.get('uploads-are-in-progress-confirmation'),
							savedAtMessage: Liferay.Language.get('entry-saved-at-x'),
							savedDraftAtMessage: Liferay.Language.get('draft-saved-at-x'),
							saveDraftError: Liferay.Language.get('could-not-save-draft-to-the-server'),
							saveDraftMessage: Liferay.Language.get('saving-draft')
						}
					}
				},

				AUGMENTS: [Liferay.PortletBase],

				EXTENDS: A.Base,

				NAME: 'liferay-blogs',

				NS: 'liferay-blogs',

				prototype: {
					initializer: function(config) {
						var instance = this;

						instance._bindUI();

						var entry = instance.get('entry');

						var draftEntry = entry && entry.status === instance.get('constants').STATUS_DRAFT;

						var userEntry = entry && entry.userId === themeDisplay.getUserId();

						if (!entry || userEntry && draftEntry) {
							instance._initDraftSaveInterval();
						}

						var customDescriptionEnabled = entry && entry.customDescription;

						instance._customDescription = customDescriptionEnabled ? entry.description : STR_BLANK;
						instance._shortenDescription = !customDescriptionEnabled;

						instance.setDescription(window[instance.ns('contentEditor')].getText());
					},

					destructor: function() {
						var instance = this;

						if (instance._saveDraftTimer) {
							instance._saveDraftTimer.cancel();
						}

						(new A.EventHandle(instance._eventHandles)).detach();
					},

					setDescription: function(text) {
						var instance = this;

						var description = instance._customDescription;

						if (instance._shortenDescription) {
							description = instance._shorten(text);
						}

						window[instance.ns('descriptionEditor')].setHTML(description);

						instance._syncDescriptionEditorUI();
					},

					_bindUI: function() {
						var instance = this;

						instance._captionNode = instance.one('.cover-image-caption');

						var eventHandles = [
							Liferay.on('coverImageDeleted', instance._removeCaption, instance),
							Liferay.on(['coverImageUploaded', 'coverImageSelected'], instance._showCaption, instance)
						];

						var publishButton = instance.one('#publishButton');

						if (publishButton) {
							eventHandles.push(
								publishButton.on(STR_CLICK, A.bind('_checkImagesBeforeSave', instance, false, false))
							);
						}

						var saveButton = instance.one('#saveButton');

						if (saveButton) {
							eventHandles.push(
								saveButton.on(STR_CLICK, A.bind('_checkImagesBeforeSave', instance, true, false))
							);
						}

						var customAbstractOptions = instance.one('#entryAbstractOptions');

						if (customAbstractOptions) {
							eventHandles.push(
								customAbstractOptions.delegate(STR_CHANGE, instance._configureAbstract, 'input[type="radio"]', instance)
							);
						}

						instance._eventHandles = eventHandles;
					},

					_checkImagesBeforeSave: function(draft, ajax) {
						var instance = this;

						if (instance._hasTempImages()) {
							if (confirm(instance.get('strings').confirmDiscardImages)) {

								instance._getTempImages().each(
									function(node) {
										node.ancestor().remove();
									}
								);

								instance._saveEntry(draft, ajax);
							}
						}
						else {
							instance._saveEntry(draft, ajax);
						}
					},

					_configureAbstract: function(event) {
						var instance = this;

						var target = event.target;

						var description = instance._customDescription;

						instance._shortenDescription = target.val() === 'false';

						if (instance._shortenDescription) {
							instance._customDescription = window[instance.ns('descriptionEditor')].getHTML();

							description = window[instance.ns('contentEditor')].getText();
						}

						instance._setDescriptionReadOnly(instance._shortenDescription);

						instance.setDescription(description);
					},

					_getPrincipalForm: function(formName) {
						var instance = this;

						return instance.one('form[name=' + instance.ns(formName || 'fm') + ']');
					},

					_getTempImages: function() {
						var instance = this;

						return instance.all('img[data-random-id]');
					},

					_hasTempImages: function() {
						var instance = this;

						return instance._getTempImages().size() > 0;
					},

					_initDraftSaveInterval: function() {
						var instance = this;

						instance._saveDraftTimer = A.later(
							instance.get('saveInterval'),
							instance,
							function() {
								if (!instance._hasTempImages()) {
									instance._saveEntry(true, true);
								}
							},
							null,
							true
						);

						var entry = instance.get('entry');

						instance._oldContent = entry ? entry.content : STR_BLANK;
						instance._oldSubtitle = entry ? entry.subtitle : STR_BLANK;
						instance._oldTitle = entry ? entry.title : STR_BLANK;
					},

					_removeCaption: function() {
						var instance = this;

						var captionNode = instance._captionNode;

						if (captionNode) {
							captionNode.addClass(CSS_INVISIBLE);
						}

						window[instance.ns('coverImageCaptionEditor')].setHTML(STR_BLANK);
					},

					_saveEntry: function(draft, ajax) {
						var instance = this;

						var constants = instance.get('constants');

						var content = window[instance.ns('contentEditor')].getHTML();
						var coverImageCaption = window[instance.ns('coverImageCaptionEditor')].getHTML();
						var description = window[instance.ns('descriptionEditor')].getHTML();
						var subtitle = window[instance.ns('subtitleEditor')].getHTML();
						var title = window[instance.ns('titleEditor')].getText();

						var form = instance._getPrincipalForm();

						if (draft && ajax) {
							var hasData = content !== STR_BLANK && title !== STR_BLANK;

							var hasChanged = instance._oldContent !== content || instance._oldSubtitle !== subtitle || instance._oldTitle !== title;

							if (hasData && hasChanged) {
								var strings = instance.get('strings');

								var saveStatus = instance.one('#saveStatus');

								var allowPingbacks = instance.one('#allowPingbacks');
								var allowTrackbacks = instance.one('#allowTrackbacks');

								var data = instance.ns(
									{
										'allowPingbacks': allowPingbacks && allowPingbacks.val(),
										'allowTrackbacks': allowTrackbacks && allowTrackbacks.val(),
										'assetTagNames': instance.one('#assetTagNames').val(),
										'cmd': constants.ADD,
										'content': content,
										'coverImageCaption': coverImageCaption,
										'coverImageFileEntryCropRegion': instance.one('#coverImageFileEntryCropRegion').val(),
										'coverImageFileEntryId': instance.one('#coverImageFileEntryId').val(),
										'displayDateAmPm': instance.one('#displayDateAmPm').val(),
										'displayDateDay': instance.one('#displayDateDay').val(),
										'displayDateHour': instance.one('#displayDateHour').val(),
										'displayDateMinute': instance.one('#displayDateMinute').val(),
										'displayDateMonth': instance.one('#displayDateMonth').val(),
										'displayDateYear': instance.one('#displayDateYear').val(),
										'entryId': instance.one('#entryId').val(),
										'referringPortletResource': instance.one('#referringPortletResource').val(),
										'subtitle': subtitle,
										'title': title,
										'workflowAction': constants.ACTION_SAVE_DRAFT
									}
								);

								var customAttributes = form.all('[name^=' + instance.NS + 'ExpandoAttribute]');

								customAttributes.each(
									function(item, index, collection) {
										data[item.attr('name')] = item.val();
									}
								);

								A.io.request(
									instance.get('editEntryURL'),
									{
										data: data,
										dataType: 'JSON',
										on: {
											failure: function() {
												instance._updateStatus(strings.saveDraftError);
											},
											start: function() {
												Liferay.Util.toggleDisabled(instance.one('#publishButton'), true);

												instance._updateStatus(strings.saveDraftMessage);
											},
											success: function(event, id, obj) {
												instance._oldContent = content;
												instance._oldSubtitle = subtitle;
												instance._oldTitle = title;

												var message = this.get('responseData');

												if (message) {
													instance.one('#coverImageFileEntryId').val(message.coverImageFileEntryId);

													instance.one('#entryId').val(message.entryId);

													if (message.updateRedirect) {
														instance.one('#redirect').val(message.redirect);
													}

													if (message.blogsEntryAttachmentReferences) {
														instance._updateImages(message.blogsEntryAttachmentReferences);
													}

													var tabs1BackButton = instance.one('#tabs1TabsBack');

													if (tabs1BackButton) {
														tabs1BackButton.attr('href', message.redirect);
													}

													var cancelButton = instance.one('#cancelButton');

													if (cancelButton) {
														cancelButton.attr('href', message.redirect);
													}

													if (saveStatus) {
														var entry = instance.get('entry');

														var saveText = entry && entry.pending ? strings.savedAtMessage : strings.savedDraftAtMessage;

														var now = saveText.replace(/\{0\}/gim, (new Date()).toString());

														instance._updateStatus(now);
													}
												}
												else {
													saveStatus.hide();
												}

												Liferay.Util.toggleDisabled(instance.one('#publishButton'), false);
											}
										}
									}
								);
							}
						}
						else {
							instance.one('#' + constants.CMD).val(instance.get('entry') ? constants.UPDATE : constants.ADD);

							instance.one('#content').val(content);
							instance.one('#coverImageCaption').val(coverImageCaption);
							instance.one('#description').val(description);
							instance.one('#subtitle').val(subtitle);
							instance.one('#title').val(title);
							instance.one('#workflowAction').val(draft ? constants.ACTION_SAVE_DRAFT : constants.ACTION_PUBLISH);

							submitForm(form);
						}
					},

					_setDescriptionReadOnly: function(readOnly) {
						var instance = this;

						var descriptionEditorNode = instance.one('#descriptionEditor');

						descriptionEditorNode.attr('contenteditable', !readOnly);
						descriptionEditorNode.toggleClass('readonly', readOnly);
					},

					_shorten: function(text) {
						var instance = this;

						var descriptionLength = instance.get('descriptionLength');

						if (text.length > descriptionLength) {
							text = text.substring(0, descriptionLength);

							if (STR_SUFFIX.length < descriptionLength) {
								var spaceIndex = text.lastIndexOf(' ', descriptionLength - STR_SUFFIX.length);

								text = text.substring(0, spaceIndex).concat(STR_SUFFIX);
							}
						}

						return text;
					},

					_showCaption: function() {
						var instance = this;

						var captionNode = instance._captionNode;

						if (captionNode) {
							captionNode.removeClass(CSS_INVISIBLE);
						}
					},

					_syncDescriptionEditorUI: function() {
						var instance = this;

						var liferayDescriptionEditor = window[instance.ns('descriptionEditor')];

						if (liferayDescriptionEditor.instanceReady) {
							var nativeDescriptionEditor = liferayDescriptionEditor.getNativeEditor().get('nativeEditor');

							if (nativeDescriptionEditor && nativeDescriptionEditor.plugins && nativeDescriptionEditor.plugins.ae_placeholder) {
								var editorEvent = {
									editor: nativeDescriptionEditor
								};

								nativeDescriptionEditor.plugins.ae_placeholder._checkEmptyData(editorEvent);
							}
						}
					},

					_updateImages: function(persistentImages) {
						var instance = this;

						persistentImages.forEach(
							function(item, index) {
								var el = instance.one('img[' + item.attributeDataImageId + '="' + item.fileEntryId + '"]');

								if (el) {
									el.attr('src', item.fileEntryUrl);

									el.removeAttribute(item.attributeDataImageId);
								}
							}
						);
					},

					_updateStatus: function(text) {
						var instance = this;

						var saveStatus = instance.one('#saveStatus');

						if (saveStatus) {
							saveStatus.html(text);
						}
					}
				}
			}
		);

		Liferay.Blogs = Blogs;
	},
	'',
	{
		requires: ['aui-base', 'aui-io-request', 'liferay-portlet-base']
	}
);




© 2015 - 2025 Weber Informatics LLC | Privacy Policy