218 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
| 	<div
 | |
| 		class="marketplace-page"
 | |
| 		:data-page-name="page_name"
 | |
| 	>
 | |
| 		<notification-message
 | |
| 			v-if="last_sync_message"
 | |
| 			:message="last_sync_message"
 | |
| 			@remove-message="clear_last_sync_message"
 | |
| 		></notification-message>
 | |
| 
 | |
| 		<div class="flex justify-between align-flex-end margin-bottom">
 | |
| 			<h5>{{ page_title }}</h5>
 | |
| 
 | |
| 			<button class="btn btn-primary btn-sm publish-items"
 | |
| 				:disabled="no_selected_items"
 | |
| 				@click="publish_selected_items"
 | |
| 			>
 | |
| 				<span>{{ publish_button_text }}</span>
 | |
| 			</button>
 | |
| 		</div>
 | |
| 
 | |
| 		<item-cards-container
 | |
| 			:container_name="page_title"
 | |
| 			:items="selected_items"
 | |
| 			:item_id_fieldname="item_id_fieldname"
 | |
| 			:is_local="true"
 | |
| 			:editable="true"
 | |
| 			@remove-item="remove_item_from_selection"
 | |
| 
 | |
| 			:empty_state_message="empty_state_message"
 | |
| 			:empty_state_bordered="true"
 | |
| 			:empty_state_height="80"
 | |
| 		>
 | |
| 		</item-cards-container>
 | |
| 
 | |
| 		<p class="text-muted">{{ valid_items_instruction }}</p>
 | |
| 
 | |
| 		<search-input
 | |
| 			:placeholder="search_placeholder"
 | |
| 			:on_search="get_valid_items"
 | |
| 			v-model="search_value"
 | |
| 		>
 | |
| 		</search-input>
 | |
| 
 | |
| 		<item-cards-container
 | |
| 			:items="valid_items"
 | |
| 			:item_id_fieldname="item_id_fieldname"
 | |
| 			:is_local="true"
 | |
| 			:on_click="show_publishing_dialog_for_item"
 | |
| 		>
 | |
| 		</item-cards-container>
 | |
| 	</div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import NotificationMessage from '../components/NotificationMessage.vue';
 | |
| import { ItemPublishDialog } from '../components/item_publish_dialog';
 | |
| 
 | |
| export default {
 | |
| 	name: 'publish-page',
 | |
| 	components: {
 | |
| 		NotificationMessage
 | |
| 	},
 | |
| 	data() {
 | |
| 		return {
 | |
| 			page_name: frappe.get_route()[1],
 | |
| 			valid_items: [],
 | |
| 			selected_items: [],
 | |
| 			items_data_to_publish: {},
 | |
| 			search_value: '',
 | |
| 			item_id_fieldname: 'item_code',
 | |
| 
 | |
| 			// Constants
 | |
| 			// TODO: multiline translations don't work
 | |
| 			page_title: __('Publish Items'),
 | |
| 			search_placeholder: __('Search Items ...'),
 | |
| 			empty_state_message: __(`No Items selected yet. Browse and click on items below to publish.`),
 | |
| 			valid_items_instruction: __(`Only items with an image and description can be published. Please update them if an item in your inventory does not appear.`),
 | |
| 			last_sync_message: (hub.settings.last_sync_datetime)
 | |
| 				? __(`Last sync was
 | |
| 				<a href="#marketplace/profile">
 | |
| 					${comment_when(hub.settings.last_sync_datetime)}</a>.
 | |
| 				<a href="#marketplace/published-items">
 | |
| 					See your Published Items</a>.`)
 | |
| 				: ''
 | |
| 		};
 | |
| 	},
 | |
| 	computed: {
 | |
| 		no_selected_items() {
 | |
| 			return this.selected_items.length === 0;
 | |
| 		},
 | |
| 
 | |
| 		publish_button_text() {
 | |
| 			const number = this.selected_items.length;
 | |
| 			let text = __('Publish');
 | |
| 			if(number === 1) {
 | |
| 				text = __('Publish 1 Item');
 | |
| 			}
 | |
| 			if(number > 1) {
 | |
| 				text = __('Publish {0} Items', [number]);
 | |
| 			}
 | |
| 			return text;
 | |
| 		},
 | |
| 
 | |
| 		items_dict() {
 | |
| 			let items_dict = {};
 | |
| 			this.valid_items.map(item => {
 | |
| 				items_dict[item[this.item_id_fieldname]] = item
 | |
| 			})
 | |
| 
 | |
| 			return items_dict;
 | |
| 		},
 | |
| 	},
 | |
| 	created() {
 | |
| 		this.get_valid_items();
 | |
| 		this.make_publishing_dialog();
 | |
| 	},
 | |
| 	methods: {
 | |
| 		get_valid_items() {
 | |
| 			frappe.call(
 | |
| 				'erpnext.hub_node.api.get_valid_items',
 | |
| 				{
 | |
| 					search_value: this.search_value
 | |
| 				}
 | |
| 			)
 | |
| 			.then((r) => {
 | |
| 				this.valid_items = r.message;
 | |
| 			})
 | |
| 		},
 | |
| 
 | |
| 		publish_selected_items() {
 | |
| 			frappe.call(
 | |
| 			'erpnext.hub_node.api.publish_selected_items',
 | |
| 				{
 | |
| 					items_to_publish: this.selected_items
 | |
| 				}
 | |
| 			)
 | |
| 			.then((r) => {
 | |
| 				this.selected_items = [];
 | |
| 				return frappe.db.get_doc('Marketplace Settings');
 | |
| 			})
 | |
| 			.then(doc => {
 | |
| 				hub.settings = doc;
 | |
| 				this.add_last_sync_message();
 | |
| 			});
 | |
| 		},
 | |
| 
 | |
| 		add_last_sync_message() {
 | |
| 			this.last_sync_message = __(`Last sync was
 | |
| 				<a href="#marketplace/profile">
 | |
| 					${comment_when(hub.settings.last_sync_datetime)}</a>.
 | |
| 				<a href="#marketplace/published-items">
 | |
| 					See your Published Items</a>.`);
 | |
| 		},
 | |
| 
 | |
| 		clear_last_sync_message() {
 | |
| 			this.last_sync_message = '';
 | |
| 		},
 | |
| 
 | |
| 		remove_item_from_selection(item_code) {
 | |
| 			this.selected_items = this.selected_items
 | |
| 				.filter(item => item.item_code !== item_code);
 | |
| 		},
 | |
| 
 | |
| 		make_publishing_dialog() {
 | |
| 			this.item_publish_dialog = ItemPublishDialog(
 | |
| 				{
 | |
| 					fn: (values) => {
 | |
| 						this.add_item_to_publish(values);
 | |
| 						this.item_publish_dialog.hide();
 | |
| 					}
 | |
| 				},
 | |
| 				{
 | |
| 					fn: () => {
 | |
| 						const values = this.item_publish_dialog.get_values(true);
 | |
| 						this.update_items_data_to_publish(values);
 | |
| 					}
 | |
| 				}
 | |
| 			);
 | |
| 		},
 | |
| 
 | |
| 		add_item_to_publish(values) {
 | |
| 			this.update_items_data_to_publish(values);
 | |
| 
 | |
| 			const item_code  = values.item_code;
 | |
| 			let item_doc = this.items_dict[item_code];
 | |
| 
 | |
| 			const item_to_publish = Object.assign({}, item_doc, values);
 | |
| 			this.selected_items.push(item_to_publish);
 | |
| 		},
 | |
| 
 | |
| 		update_items_data_to_publish(values) {
 | |
| 			this.items_data_to_publish[values.item_code] = values;
 | |
| 		},
 | |
| 
 | |
| 		show_publishing_dialog_for_item(item_code) {
 | |
| 			let item_data = this.items_data_to_publish[item_code];
 | |
| 			if(!item_data) { item_data = { item_code }; };
 | |
| 
 | |
| 			this.item_publish_dialog.clear();
 | |
| 
 | |
| 			const item_doc = this.items_dict[item_code];
 | |
| 			if(item_doc) {
 | |
| 				this.item_publish_dialog.fields_dict.image_list.set_data(
 | |
| 					item_doc.attachments.map(attachment => attachment.file_url)
 | |
| 				);
 | |
| 			}
 | |
| 
 | |
| 			this.item_publish_dialog.set_values(item_data);
 | |
| 			this.item_publish_dialog.show();
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| </script>
 | |
| 
 | |
| <style scoped></style>
 |