Merge branch 'documents-fix' into 'development'

Handle documents upload

See merge request saburly/wiaas/new-wiaas!64
This commit was merged in pull request #64.
This commit is contained in:
Bilal Catic
2018-11-15 13:44:55 +00:00
10 changed files with 216 additions and 108 deletions

View File

@@ -8,4 +8,50 @@ jQuery(document).ready(function($) {
$('#general_product_data').find('.pricing').addClass('hide_if_wiaastemplate hide_if_bundle'); $('#general_product_data').find('.pricing').addClass('hide_if_wiaastemplate hide_if_bundle');
$('#general_product_data').find('.pricing').removeClass('show_if_bundle show_if_wiaastemplate'); $('#general_product_data').find('.pricing').removeClass('show_if_bundle show_if_wiaastemplate');
$( '.wiaas-search-documents' ).each(function() {
var element = $( this );
var searchTarget = $('#' + element.data('target'));
element.autocomplete({
source: function(request, response) {
$.get( window.ajaxurl, {
action: 'wiaas_json_search_documents',
query: request.term,
_ajax_nonce: element.data('search-nonce')
} ).done( function( documents ) {
response( documents || []);
}
);
},
select: function(event, ui) {
if (!searchTarget || $('#wiaas_attached_document_' + ui.item.id).length) {
return;
}
$.get(window.ajaxurl, {
action: 'wiaas_link_document',
_ajax_nonce: element.data('link-nonce'),
id: ui.item.id
}).done( function (document) {
searchTarget.find('tbody').append(document);
});
}
})
.autocomplete( 'instance' )._renderItem = function( ul, item ) {
return $( '<li role="option" id="wiaas-document-autocomplete-' + item.id + '">' )
.text( item.name )
.appendTo( ul );
};
});
$('#wiaas_attached_documents').delegate('.wiaas-remove-attached-document', 'click', function (e) {
e.preventDefault();
var id = $(this).data('id');
$('#wiaas_attached_document_' + id).remove();
});
}); });

View File

@@ -152,18 +152,29 @@ $insert_new_document = $post->post_type !== 'wiaas_doc';
response = response.response; response = response.response;
var infoContainer = jQuery('#wiaas_upload_info');
if (response.substring(0, 6) === 'ERROR:') { if (response.substring(0, 6) === 'ERROR:') {
jQuery('#wiaas_upload_errors').html('<span class="text-danger">' + infoContainer.html('<span style="color: darkred;">' +
'<i class="fa fa-exclamation-triangle"></i>' + '<i class="dashicons dashicons-warning"></i>' +
' &nbsp; ' + response.substring(6, response.length) + ' &nbsp; ' + response.substring(6, response.length) +
'</span>'); '</span>');
return; return;
} }
infoContainer.html('<span style="color: darkgreen;">' +
'<i class="dashicons dashicons-yes"></i>' +
' &nbsp; ' + 'Document uploaded and linked' +
'</span>');
<?php <?php
if ($insert_new_document) { if ($insert_new_document) {
?> ?>
$('#wiaas_attached_documents').find('tbody').append(response); $('#wiaas_attached_documents').find('tbody').append(response);
$('.wiaas_documents_tab a').click();
<?php <?php
} else { } else {
?> ?>
@@ -252,7 +263,8 @@ $insert_new_document = $post->post_type !== 'wiaas_doc';
</div> </div>
</div> </div>
<div id="wiaas_upload_errors" style="color: darkred;"> <div id="wiaas_upload_info">
</div> </div>
</div> </div>

View File

@@ -8,62 +8,17 @@ if ( ! defined( 'ABSPATH' ) ) {
} }
?> ?>
<script type="text/javascript">
jQuery(document).ready(function ($) {
$( '.wiaas-search-documents' ).each(function() {
var element = $( this );
var searchTarget = $('#' + element.data('target'));
element.autocomplete({
source: function(request, response) {
$.get( window.ajaxurl, {
action: 'wiaas_json_search_documents',
query: request.term,
_ajax_nonce: '<?php echo wp_create_nonce('wiaas_json_search_documents') ?>'
} ).done( function( documents ) {
response( documents || []);
}
);
},
select: function(event, ui) {
if (!searchTarget || $('#wiaas_attached_document_' + ui.item.id).length) {
return;
}
$.get(window.ajaxurl, {
action: 'wiaas_link_document',
_ajax_nonce: '<?php echo wp_create_nonce('wiaas_link_document') ?>',
id: ui.item.id
}).done( function (document) {
searchTarget.find('tbody').append(document);
});
}
})
.autocomplete( 'instance' )._renderItem = function( ul, item ) {
return $( '<li role="option" id="wiaas-document-autocomplete-' + item.id + '">' )
.text( item.name )
.appendTo( ul );
};
});
$('#wiaas_attached_documents').delegate('.wiaas-remove-attached-document', 'click', function (e) {
e.preventDefault();
var id = $(this).data('id');
$('#wiaas_attached_document_' + id).remove();
});
});
</script>
<div id="wiaas_documents" class="panel woocommerce_options_panel"> <div id="wiaas_documents" class="panel woocommerce_options_panel">
<div class="options_group"> <div class="options_group">
<p class="form-field"> <p class="form-field">
<label style="font-weight: bold;" for="wiaas_addon_packages"><?php esc_html_e( 'Search documents:', 'wiaas' ); ?></label> <label style="font-weight: bold;" for="wiaas_addon_packages"><?php esc_html_e( 'Search documents:', 'wiaas' ); ?></label>
<input type="text" data-target="wiaas_attached_documents" class="wiaas-search-documents"/> <input
type="text"
data-target="wiaas_attached_documents"
data-search-nonce="<?php echo wp_create_nonce('wiaas_json_search_documents') ?>"
data-link-nonce="<?php echo wp_create_nonce('wiaas_link_document') ?>"
class="wiaas-search-documents"
/>
</p> </p>
</div> </div>
<div class="options_group"> <div class="options_group">

View File

@@ -5,7 +5,6 @@ if ( ! defined( 'ABSPATH' ) ) {
} }
/** /**
* TODO: This is temporary implemetation and will probably be changed during work on pending wiaas cart task
* Class Wiaas_Document_API * Class Wiaas_Document_API
*/ */
class Wiaas_Document_API { class Wiaas_Document_API {
@@ -30,30 +29,26 @@ class Wiaas_Document_API {
) )
) ); ) );
register_rest_route( self::$namespace, 'documents/order/(?P<id>\d+)/(?P<type>[\w-]+)', array( register_rest_route( self::$namespace, 'order/(?P<id>\d+)/item/(?P<item_id>\d+)/document/(?P<key>[\w-]+)', array(
'args' => array( 'args' => array(
'id' => array( 'id' => array(
'description' => __( 'Order ID.', 'wiaas' ), 'description' => __( 'Order ID.', 'wiaas' ),
'type' => 'integer', 'type' => 'integer',
'sanitize_callback' => 'absint', 'sanitize_callback' => 'absint',
), )
'type' => array(
'description' => __( 'Order document type.', 'wiaas' ),
'type' => 'string',
'sanitize_callback' => 'sanitize_key',
),
), ),
array( array(
'methods' => 'GET', 'methods' => 'GET',
'permission_callback' => 'is_user_logged_in', 'permission_callback' => 'is_user_logged_in',
'callback' => array(__CLASS__, 'download_order_document'), 'callback' => array(__CLASS__, 'download_order_item_document'),
'args' => array( 'args' => array(
'item_id' => array( 'item_id' => array(
'description' => __( 'Package Order Item ID.', 'wiaas' ), 'description' => __( 'Package Order Item ID.', 'wiaas' ),
'type' => 'integer', 'type' => 'integer',
'sanitize_callback' => 'absint', 'sanitize_callback' => 'absint',
'required' => true
), ),
'document_key' => array( 'key' => array(
'description' => __( 'Unique key identifier for order document.', 'wiaas' ), 'description' => __( 'Unique key identifier for order document.', 'wiaas' ),
'type' => 'string', 'type' => 'string',
'sanitize_callback' => 'sanitize_key', 'sanitize_callback' => 'sanitize_key',
@@ -62,6 +57,29 @@ class Wiaas_Document_API {
) )
) )
) ); ) );
register_rest_route(self::$namespace, 'order/(?P<id>\d+)/document/(?P<key>[\w-]+)', array(
'args' => array(
'id' => array(
'description' => __( 'Order ID.', 'wiaas' ),
'type' => 'integer',
'sanitize_callback' => 'absint',
)
),
array(
'methods' => 'GET',
'permission_callback' => 'is_user_logged_in',
'callback' => array(__CLASS__, 'download_order_other_document'),
'args' => array(
'key' => array(
'description' => __( 'Unique key identifier for order document.', 'wiaas' ),
'type' => 'string',
'sanitize_callback' => 'sanitize_key',
'required' => true
),
)
)
));
} }
/** /**
@@ -76,14 +94,23 @@ class Wiaas_Document_API {
} }
/** /**
* Download order document * Download order item document
*
* @param WP_REST_Request $request * @param WP_REST_Request $request
*/ */
public static function download_order_document($request) { public static function download_order_item_document($request) {
Wiaas_Document_Download::download_order_item_document( Wiaas_Document_Download::download_order_item_document(
$request['id'], $request['id'],
$request['item_id'], $request['item_id'],
$request['type'], $request['key']);
$request['document_key']); }
/**
* Download order document
*
* @param WP_REST_Request $request
*/
public static function download_order_other_document($request) {
Wiaas_Document_Download::download_order_other_document($request['id'], $request['key']);
} }
} }

View File

@@ -681,19 +681,12 @@ class Wiaas_Order {
if (wiaas_is_order_item__standard_package($order_item)) { if (wiaas_is_order_item__standard_package($order_item)) {
$documents = wiaas_get_standard_package_order_item_documents($order, $product_line['id']); $documents = wiaas_get_standard_package_order_item_documents($order, $product_line['id']);
if (! empty($order_item['wiaas_delivery_documents'])) {
$documents = array_merge($documents, $order_item['wiaas_delivery_documents']);
}
$data['line_items'][$index] ['documents'] = $documents; $data['line_items'][$index] ['documents'] = $documents;
} }
} }
$order_delivery_documents = $order->get_meta('wiaas_delivery_documents', true); $data['documents'] = wiaas_get_order_other_documents($order->get_id());
$order_delivery_documents = empty($order_delivery_documents) ? array() : $order_delivery_documents;
$data['documents'] = $order_delivery_documents;
return $data; return $data;
} }

View File

@@ -96,7 +96,7 @@ class Wiaas_Order_Fields {
continue; continue;
} }
$bundle_item->update_meta_data('wiaas_installation_date', $new_value); $bundle_item->update_meta_data('_wiaas_installation_date', $new_value);
$bundle_item->save_meta_data(); $bundle_item->save_meta_data();
break; break;
@@ -121,7 +121,7 @@ class Wiaas_Order_Fields {
continue; continue;
} }
$bundle_documents = $bundle_item['wiaas_delivery_documents']; $bundle_documents = $bundle_item->get_meta('_wiaas_documents', true);
if (empty($bundle_documents)) { if (empty($bundle_documents)) {
$bundle_documents = array(); $bundle_documents = array();
} }
@@ -140,15 +140,20 @@ class Wiaas_Order_Fields {
foreach ($added_documents as $added_document) { foreach ($added_documents as $added_document) {
$info = pathinfo( $added_document ); $info = pathinfo( $added_document );
$dir = wp_upload_dir();
$relative_file_path = str_replace($dir['baseurl'] . '/', '', $added_document);
$bundle_documents[] = array( $bundle_documents[] = array(
'name' => $info['basename'], 'key' => wp_generate_uuid4(),
'name' => $info['filename'],
'extension' => $info['extension'], 'extension' => $info['extension'],
'version' => $relative_file_path,
'url' => $field->get_download_url( $added_document, true ), 'url' => $field->get_download_url( $added_document, true ),
'type' => $field->wiaasDocTypeFilter 'type' => $field->wiaasDocTypeFilter
); );
} }
$bundle_item->update_meta_data('wiaas_delivery_documents', $bundle_documents); $bundle_item->update_meta_data('_wiaas_documents', $bundle_documents);
$bundle_item->save_meta_data(); $bundle_item->save_meta_data();
break; break;
@@ -168,7 +173,7 @@ class Wiaas_Order_Fields {
$added_documents = $new_documents; $added_documents = $new_documents;
} }
$order_documents = $order->get_meta('wiaas_delivery_documents', true); $order_documents = $order->get_meta('_wiaas_other_documents', true);
if (empty($order_documents)) { if (empty($order_documents)) {
$order_documents = array(); $order_documents = array();
} }
@@ -176,15 +181,20 @@ class Wiaas_Order_Fields {
foreach ($added_documents as $added_document) { foreach ($added_documents as $added_document) {
$info = pathinfo( $added_document ); $info = pathinfo( $added_document );
$dir = wp_upload_dir();
$relative_file_path = str_replace($dir['baseurl'] . '/', '', $added_document);
$order_documents[] = array( $order_documents[] = array(
'name' => $info['basename'], 'key' => wp_generate_uuid4(),
'name' => $info['filename'],
'extension' => $info['extension'], 'extension' => $info['extension'],
'version' => $relative_file_path,
'url' => $field->get_download_url( $added_document, true ), 'url' => $field->get_download_url( $added_document, true ),
'type' => $field->wiaasDocTypeFilter 'type' => $field->wiaasDocTypeFilter
); );
} }
$order->update_meta_data('wiaas_delivery_documents', $order_documents); $order->update_meta_data('_wiaas_other_documents', $order_documents);
$order->save_meta_data(); $order->save_meta_data();
break; break;
@@ -216,7 +226,7 @@ class Wiaas_Order_Fields {
continue; continue;
} }
$bundle_item->update_meta_data('wiaas_installation', $selected_installation->get_id()); $bundle_item->update_meta_data('_wiaas_installation', $selected_installation->get_id());
$bundle_item->save_meta_data(); $bundle_item->save_meta_data();
} }
} }

View File

@@ -83,6 +83,49 @@ class Wiaas_Document_Download {
); );
} }
/**
* Download order other document (not binded to any bundle)
* @param int $order_id
* @param string $document_key
*/
public static function download_order_other_document($order_id, $document_key) {
$order = wc_get_order($order_id);
if (!$order) {
wp_die( __( 'Invalid Document Request.', 'wiaas' ), __( 'Download Error', 'wiaas' ), array( 'response' => 400 ) );
}
$order_other_documents = wiaas_get_order_other_documents($order_id);
$order_document = null;
foreach ($order_other_documents as $order_other_document) {
if ($order_other_document['key'] === $document_key) {
$order_document = $order_other_document;
break;
}
}
if (!isset($order_document)) {
wp_die( __( 'Invalid Document Request.', 'wiaas' ), __( 'Download Error', 'wiaas' ), array( 'response' => 400 ) );
}
$file_path = wiaas_get_document_version_path($order_document['version']);
error_log($file_path);
if (!file_exists($file_path)) {
wp_die( __( 'Document not found.', 'wiaas' ), __( 'Download Error', 'wiaas' ), array( 'response' => 404 ) );
}
WC_Download_Handler::download_file_force(
$file_path,
pathinfo( $file_path, PATHINFO_FILENAME ) . '.' . pathinfo( $file_path, PATHINFO_EXTENSION )
);
}
/** /**
* Download document related to order item * Download document related to order item
* *
@@ -91,7 +134,7 @@ class Wiaas_Document_Download {
* @param $type * @param $type
* @param $document_key * @param $document_key
*/ */
public static function download_order_item_document($order_id, $item_id, $type, $document_key) { public static function download_order_item_document($order_id, $item_id, $document_key) {
$order = wc_get_order($order_id); $order = wc_get_order($order_id);
if (!$order) { if (!$order) {
wp_die( __( 'Invalid Document Request.', 'wiaas' ), __( 'Download Error', 'wiaas' ), array( 'response' => 400 ) ); wp_die( __( 'Invalid Document Request.', 'wiaas' ), __( 'Download Error', 'wiaas' ), array( 'response' => 400 ) );
@@ -106,7 +149,7 @@ class Wiaas_Document_Download {
$order_document = null; $order_document = null;
foreach ($item_documents as $item_document) { foreach ($item_documents as $item_document) {
if ($item_document['key'] === $document_key && $item_document['type'] === $type) { if ($item_document['key'] === $document_key) {
$order_document = $item_document; $order_document = $item_document;
break; break;
} }

View File

@@ -26,6 +26,17 @@ function wiaas_documents_upload_dir() {
* @return string * @return string
*/ */
function wiaas_get_document_version_path($version) { function wiaas_get_document_version_path($version) {
// documents uploaded with gravity forms have relevant path to form entry upload folder
if (strpos($version, 'gravity_forms') !== false) {
$wp_uploads = wp_upload_dir();
$wp_uploads_dir = $wp_uploads['basedir'];
return $wp_uploads_dir . '/' . $version;
}
return wiaas_documents_upload_dir() . '/' . $version; return wiaas_documents_upload_dir() . '/' . $version;
} }
@@ -182,7 +193,7 @@ function wiaas_get_standard_package_order_item_documents($order, $package_item_i
return array_map(function($doc) { return array_map(function($doc) {
// append document extension and name information // append document extension and name information
$doc['extension'] = wiaas_get_doc_version_extension($doc['version']); $doc['extension'] = isset($doc['extension']) ? $doc['extension'] : wiaas_get_doc_version_extension($doc['version']);
$doc['name'] = isset($doc['name']) ? $doc['name'] : wiaas_get_doc_version_filename($doc['version']); $doc['name'] = isset($doc['name']) ? $doc['name'] : wiaas_get_doc_version_filename($doc['version']);
return $doc; return $doc;
@@ -222,4 +233,20 @@ function wiaas_get_order_item_documents($order_item, $doc_type = null) {
} }
return $filtered_documents; return $filtered_documents;
}
/**
* Retrieve order other documents (not binded to any order item)
*
* @param int $order_id
*
* @return array|mixed
*/
function wiaas_get_order_other_documents($order_id) {
$order = wc_get_order($order_id);
$documents = $order->get_meta('_wiaas_other_documents', true);
return empty($documents) ? array() : $documents;
} }

View File

@@ -3,8 +3,18 @@ import {connect} from 'react-redux';
import OrderDocumentsGroup from './OrderDocumentsGroup.jsx'; import OrderDocumentsGroup from './OrderDocumentsGroup.jsx';
import {orderTexts} from '../../../constants/ordersConstants'; import {orderTexts} from '../../../constants/ordersConstants';
import WiaasBox from "../../../mainComponents/box/WiaasBox"; import WiaasBox from "../../../mainComponents/box/WiaasBox";
import {API_SERVER} from "../../../config";
import FileDownloader from "../../../helpers/FileDownloader";
const fileHandler = new FileDownloader();
class OrderDocuments extends Component { class OrderDocuments extends Component {
downloadDocument(orderId, document){
const fileUrl = `${API_SERVER}/wp-json/wiaas/order/${orderId}/document/${document.key}`;
fileHandler.download(fileUrl, `${document.name}.${document.extension}`);
}
render() { render() {
const {orderInfo} = this.props; const {orderInfo} = this.props;
@@ -23,14 +33,13 @@ class OrderDocuments extends Component {
<WiaasBox mainTitle={orderTexts.labels.OTHER_DOCS}> <WiaasBox mainTitle={orderTexts.labels.OTHER_DOCS}>
{ {
orderInfo.documents.map((document, index) => ( orderInfo.documents.map((document, index) => (
<a className="document-link-big" key={'order-document-' + index} download href={document.url}> <a id={'document-' + document.key} key={'order-document-' + document.key}>
<span className="document-link"> <div onClick={() => {this.downloadDocument(orderInfo.id, document)}} className="document-link-big">
<i className={`fa fa-4x fa-${document.icon}`} aria-hidden="true"></i> <i className={`fa fa-4x fa-${document.icon}`} aria-hidden="true"></i>
<div> <div>
{document.name} {document.name}
</div> </div>
</span> </div></a>
</a>
)) ))
} }
</WiaasBox> </WiaasBox>

View File

@@ -13,7 +13,7 @@ class OrderDocumentsGroup extends Component {
} }
downloadDocument(orderId, itemId, document){ downloadDocument(orderId, itemId, document){
const fileUrl = `${API_SERVER}/wp-json/wiaas/documents/order/${orderId}/${document.type}?item_id=${itemId}&document_key=${document.key}`; const fileUrl = `${API_SERVER}/wp-json/wiaas/order/${orderId}/item/${itemId}/document/${document.key}`;
fileHandler.download(fileUrl, `${document.name}.${document.extension}`); fileHandler.download(fileUrl, `${document.name}.${document.extension}`);
} }
@@ -28,20 +28,6 @@ class OrderDocumentsGroup extends Component {
<WiaasBox mainTitle={documentsGroup.name}> <WiaasBox mainTitle={documentsGroup.name}>
{ {
documentsGroup.documents.map((document, index) => { documentsGroup.documents.map((document, index) => {
if (document.url) {
return (
<a key={'order-document-' + index} download href={document.url}>
<div className="document-link" className="document-link-big">
<i className={`fa fa-4x fa-${document.icon}`} aria-hidden="true"></i>
<div>
{document.name}
</div>
</div>
</a>
);
}
return ( return (
<a id={'document-' + document.key} key={'order-document-' + document.key}> <a id={'document-' + document.key} key={'order-document-' + document.key}>
<div onClick={() => {this.downloadDocument(orderId, documentsGroup.orderItemId, document)}} className="document-link-big"> <div onClick={() => {this.downloadDocument(orderId, documentsGroup.orderItemId, document)}} className="document-link-big">