152 lines
5.5 KiB
Plaintext
152 lines
5.5 KiB
Plaintext
@model int
|
|
@inject IPictureService pictureService
|
|
@inject MediaSettings mediaSettings
|
|
|
|
@using Nop.Core.Domain.Media
|
|
@using Nop.Services.Media
|
|
|
|
@{
|
|
// Identifiers
|
|
var random = CommonHelper.GenerateRandomInteger();
|
|
var clientId = $"picture{random}";
|
|
var elementId = $"{clientId}element";
|
|
var imageId = $"{clientId}image";
|
|
|
|
// Constants
|
|
const int pictureSize = 100;
|
|
|
|
var allowedMimeTypes = new List<string> { MimeTypes.ImagePng, MimeTypes.ImageBmp, MimeTypes.ImageGif, MimeTypes.ImageJpeg, MimeTypes.ImagePJpeg, MimeTypes.ImageTiff, MimeTypes.ImageWebp };
|
|
if (mediaSettings.AllowSVGUploads)
|
|
allowedMimeTypes.Add(MimeTypes.ImageSvg);
|
|
|
|
var picture = await pictureService.GetPictureByIdAsync(Model);
|
|
var files = new List<object>();
|
|
|
|
if (picture != null)
|
|
{
|
|
var pictureSource = $"{picture.SeoFilename}.{await pictureService.GetFileExtensionFromMimeTypeAsync(picture.MimeType)}";
|
|
files.Add(new
|
|
{
|
|
source = pictureSource,
|
|
options = new
|
|
{
|
|
type = "local",
|
|
file = new
|
|
{
|
|
name = pictureSource,
|
|
size = (await pictureService.GetPictureBinaryByPictureIdAsync(picture.Id))?.BinaryData?.Length,
|
|
type = picture.MimeType
|
|
},
|
|
metadata = new
|
|
{
|
|
url = await pictureService.GetPictureUrlAsync(Model, showDefaultPicture: false)
|
|
}
|
|
},
|
|
});
|
|
}
|
|
}
|
|
|
|
<noscript>
|
|
<p>Please enable JavaScript to use file uploader.</p>
|
|
</noscript>
|
|
<input type="hidden" asp-for="@Model"/>
|
|
|
|
<div id="@(elementId)" class="filepond"></div>
|
|
<div class="upload-picture-block">
|
|
<div class="picture-container">
|
|
<div class="uploaded-image">
|
|
<img id="@(imageId)" src="@await pictureService.GetPictureUrlAsync(Model, pictureSize)" width="@(pictureSize)" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@* register CSS and JS *@
|
|
<link rel="stylesheet" href="~/lib_npm/filepond/filepond.min.css"/>
|
|
<link rel="stylesheet" href="~/lib_npm/filepond-plugin-get-file/filepond-plugin-get-file.min.css"/>
|
|
<script asp-exclude-from-bundle="true" src="~/lib_npm/filepond/filepond.min.js" asp-location="Footer"></script>
|
|
<script asp-exclude-from-bundle="true"
|
|
src="~/lib_npm/filepond-plugin-file-validate-type/filepond-plugin-file-validate-type.min.js"
|
|
asp-location="Footer"></script>
|
|
<script asp-exclude-from-bundle="true" src="~/lib_npm/filepond-plugin-get-file/filepond-plugin-get-file.min.js"
|
|
asp-location="Footer"></script>
|
|
|
|
<script asp-location="Footer">
|
|
|
|
$(async function () {
|
|
|
|
// Register the plugins
|
|
FilePond.registerPlugin(FilePondPluginFileValidateType, FilePondPluginGetFile);
|
|
const allowedExtensions = @Html.Raw(Json.Serialize(allowedMimeTypes));
|
|
|
|
const $modelEl = $('#@Html.IdForModel()');
|
|
const $imageEl = $('#@imageId');
|
|
const $removeEl = $('#@clientId');
|
|
|
|
function resetImageToDefault() {
|
|
$modelEl.val('0');
|
|
$imageEl.attr("src", '@await pictureService.GetDefaultPictureUrlAsync(pictureSize)');
|
|
}
|
|
|
|
const serverConfig = {
|
|
process: (fieldName, file, metadata, load, error, progress, abort, transfer, options) => {
|
|
const formData = new FormData();
|
|
formData.append(fieldName, file, file.name);
|
|
|
|
const request = new XMLHttpRequest();
|
|
request.open('POST', '@Url.Content("~/Admin/Picture/AsyncUpload")');
|
|
|
|
request.upload.onprogress = (e) => {
|
|
progress(e.lengthComputable, e.loaded, e.total);
|
|
};
|
|
|
|
request.onload = function () {
|
|
const commonError = '@T("Common.Error")';
|
|
if (request.status < 200 || request.status >= 300) {
|
|
error(commonError);
|
|
return;
|
|
}
|
|
|
|
const response = JSON.parse(request.responseText);
|
|
|
|
if (response.success) {
|
|
load(request.responseText);
|
|
$imageEl.attr("src", response.imageUrl);
|
|
$modelEl.val(response.pictureId);
|
|
} else {
|
|
error(response.message || commonError);
|
|
}
|
|
};
|
|
|
|
request.send(formData);
|
|
},
|
|
remove: (source, load, error) => {
|
|
resetImageToDefault();
|
|
load();
|
|
},
|
|
revert: (uniqueFileId, load, error) => {
|
|
resetImageToDefault();
|
|
load();
|
|
},
|
|
};
|
|
|
|
// Create a FilePond instance
|
|
const filePondInstance = FilePond.create(document.querySelector('#@elementId'), {
|
|
credits: false,
|
|
allowMultiple: false,
|
|
maxFiles: 1,
|
|
allowDownloadByUrl: true,
|
|
server: serverConfig,
|
|
labelFileProcessingError: (err) => err.body,
|
|
acceptedFileTypes: allowedExtensions,
|
|
files: @Json.Serialize(files),
|
|
labelIdle: '@T("Common.FileUploader.DropFiles") / <span class="filepond--label-action">@T("Common.FileUploader.Browse")</span>',
|
|
labelFileProcessing: '@T("Common.FileUploader.Processing")'
|
|
});
|
|
|
|
$removeEl.on('click', function (e) {
|
|
resetImageToDefault();
|
|
filePondInstance.removeFiles();
|
|
$(this).hide();
|
|
});
|
|
});
|
|
</script> |