mirror of
				https://github.com/pierre42100/ComunicWeb
				synced 2025-11-03 19:54:14 +00:00 
			
		
		
		
	Create post target picker
This commit is contained in:
		@@ -122,6 +122,13 @@ ComunicWeb.components.posts.interface = {
 | 
			
		||||
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Get the list of available targets where user can create posts
 | 
			
		||||
	 */
 | 
			
		||||
	getAvailableTargets: function(){
 | 
			
		||||
		return api("posts/getAvailableTargets", null, true);
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Change post visibility level
 | 
			
		||||
	 * 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										162
									
								
								assets/js/components/posts/targetPicker.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								assets/js/components/posts/targetPicker.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,162 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Posts target picker
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Pierre HUBERT
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
class SelectedPostTarget {
 | 
			
		||||
	constructor(user, group){
 | 
			
		||||
		/** @type {User} */
 | 
			
		||||
		this.user = user;
 | 
			
		||||
 | 
			
		||||
		/** @type {Group} */
 | 
			
		||||
		this.group = group
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	get isUser() {
 | 
			
		||||
		return this.user != null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	get isGroup() {
 | 
			
		||||
		return this.group != null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class PostTargetPicker {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Show post target picker
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @returns {Promise} Promise with information about the selected target
 | 
			
		||||
	 */
 | 
			
		||||
	static async show() {
 | 
			
		||||
		
 | 
			
		||||
		const dialog = ComunicWeb.common.messages.createDialogSkeleton({
 | 
			
		||||
			title: "Choose post destination",
 | 
			
		||||
		});
 | 
			
		||||
		$(dialog.modal).modal("show");
 | 
			
		||||
 | 
			
		||||
		const closeFunction = () => {
 | 
			
		||||
			$(dialog.modal).modal("hide");
 | 
			
		||||
			emptyElem(dialog.modal);
 | 
			
		||||
			dialog.modal.remove();
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		const loadErrorFunction = () => {
 | 
			
		||||
			closeFunction();
 | 
			
		||||
			notify("Could not get the list of possible targets !", "danger");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		dialog.cancelButton.addEventListener("click", closeFunction);
 | 
			
		||||
		dialog.closeModal.addEventListener("click", closeFunction);
 | 
			
		||||
 | 
			
		||||
		//Show loading message
 | 
			
		||||
		const loadingMessage = 
 | 
			
		||||
			ComunicWeb.common.messages.createLoadingCallout(dialog.modalBody);
 | 
			
		||||
 | 
			
		||||
		// Get the list of posts
 | 
			
		||||
		const list = await ComunicWeb.components.posts.interface.getAvailableTargets().catch(e => {});
 | 
			
		||||
 | 
			
		||||
		loadingMessage.remove();
 | 
			
		||||
 | 
			
		||||
		// Check for errors
 | 
			
		||||
		if(!list)
 | 
			
		||||
			return loadErrorFunction();	
 | 
			
		||||
 | 
			
		||||
		//Get information about related users and groups
 | 
			
		||||
		const users = await getUsers(list.friends).catch(e => {});
 | 
			
		||||
		const groups = await getGroups(list.groups).catch(e => {});
 | 
			
		||||
 | 
			
		||||
		if(!users || !groups)
 | 
			
		||||
			return loadErrorFunction();
 | 
			
		||||
 | 
			
		||||
		// Display the list of option and wait for user response
 | 
			
		||||
		const result = await this._showResults(dialog.modalBody, list, users, groups);
 | 
			
		||||
		closeFunction();
 | 
			
		||||
		return result;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	static _showResults(target, list, users, groups) {
 | 
			
		||||
 | 
			
		||||
		return new Promise((resolve, reject) => {
 | 
			
		||||
		
 | 
			
		||||
		// Apply the list of targets
 | 
			
		||||
		target.className += " posts-target-picker";
 | 
			
		||||
 | 
			
		||||
		// Friends
 | 
			
		||||
		createElem2({
 | 
			
		||||
			appendTo: target,
 | 
			
		||||
			type: "strong",
 | 
			
		||||
			class: "title",
 | 
			
		||||
			innerHTML: "Friends"
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		list.friends.forEach(id => {
 | 
			
		||||
			
 | 
			
		||||
			const user = users.get(id);
 | 
			
		||||
 | 
			
		||||
			createElem2({
 | 
			
		||||
				appendTo: target,
 | 
			
		||||
				type: "div",
 | 
			
		||||
				class: "friend-elem",
 | 
			
		||||
				children: [
 | 
			
		||||
					
 | 
			
		||||
					// Account image
 | 
			
		||||
					createElem2({
 | 
			
		||||
						type: "img",
 | 
			
		||||
						class: "img-circle user-image",
 | 
			
		||||
						src: user.image
 | 
			
		||||
					}),
 | 
			
		||||
 | 
			
		||||
					// User name
 | 
			
		||||
					createElem2({
 | 
			
		||||
						type: "span",
 | 
			
		||||
						innerHTML: user.fullName
 | 
			
		||||
					}),
 | 
			
		||||
				],
 | 
			
		||||
				onclick: (e) => resolve(new SelectedPostTarget(user, null))
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		// Groups
 | 
			
		||||
		createElem2({
 | 
			
		||||
			appendTo: target,
 | 
			
		||||
			type: "strong",
 | 
			
		||||
			class: "title",
 | 
			
		||||
			innerHTML: "Groups"
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		list.groups.forEach(id => {
 | 
			
		||||
			
 | 
			
		||||
			const group = groups.get(id);
 | 
			
		||||
 | 
			
		||||
			createElem2({
 | 
			
		||||
				appendTo: target,
 | 
			
		||||
				type: "div",
 | 
			
		||||
				class: "group-elem",
 | 
			
		||||
				children: [
 | 
			
		||||
					
 | 
			
		||||
					// Account image
 | 
			
		||||
					createElem2({
 | 
			
		||||
						type: "img",
 | 
			
		||||
						class: "user-image",
 | 
			
		||||
						src: group.icon_url
 | 
			
		||||
					}),
 | 
			
		||||
 | 
			
		||||
					// User name
 | 
			
		||||
					createElem2({
 | 
			
		||||
						type: "span",
 | 
			
		||||
						innerHTML: group.name
 | 
			
		||||
					}),
 | 
			
		||||
				],
 | 
			
		||||
				onclick: (e) => resolve(new SelectedPostTarget(null, group))
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
	});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user