Skip to content

Commit e204c5b

Browse files
nielslyngsoemadsrasmussenPaul Johnson
authored
Media Previews (#11888)
Co-authored-by: Niels Lyngsø <[email protected]> Co-authored-by: Mads Rasmussen <[email protected]> Co-authored-by: Paul Johnson <[email protected]>
1 parent 029a261 commit e204c5b

29 files changed

+539
-210
lines changed

.github/config/codeql-config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ paths:
55

66
paths-ignore:
77
- '**/node_modules'
8+
- 'src/Umbraco.Web.UI/wwwroot'

.github/workflows/codeql-analysis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ jobs:
2222
with:
2323
config-file: ./.github/config/codeql-config.yml
2424

25-
- name: Build
26-
run: dotnet build umbraco-netcore-only.sln # also runs npm build
25+
- name: dotnet build
26+
run: dotnet build umbraco-netcore-only.sln
2727

2828
- name: Perform CodeQL Analysis
2929
uses: github/codeql-action/analyze@v1

src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ function dependencies() {
134134
"./node_modules/angular-messages/angular-messages.min.js.map"
135135
],
136136
"base": "./node_modules/angular-messages"
137-
},
137+
},
138138
{
139139
"name": "angular-mocks",
140140
"src": ["./node_modules/angular-mocks/angular-mocks.js"],
@@ -285,11 +285,11 @@ function dependencies() {
285285
// add streams for node modules
286286
nodeModules.forEach(module => {
287287
var task = gulp.src(module.src, { base: module.base, allowEmpty: true });
288-
288+
289289
_.forEach(config.roots, function(root){
290290
task = task.pipe(gulp.dest(root + config.targets.lib + "/" + module.name))
291291
});
292-
292+
293293
stream.add(task);
294294
});
295295

@@ -299,12 +299,12 @@ function dependencies() {
299299
_.forEach(config.roots, function(root){
300300
libTask = libTask.pipe(gulp.dest(root + config.targets.lib))
301301
});
302-
302+
303303
stream.add(libTask);
304304

305305
//Copies all static assets into /root / assets folder
306306
//css, fonts and image files
307-
307+
308308
var assetsTask = gulp.src(config.sources.globs.assets, { allowEmpty: true });
309309
assetsTask = assetsTask.pipe(imagemin([
310310
imagemin.gifsicle({interlaced: true}),
@@ -321,8 +321,8 @@ function dependencies() {
321321
_.forEach(config.roots, function(root){
322322
assetsTask = assetsTask.pipe(gulp.dest(root + config.targets.assets));
323323
});
324-
325-
324+
325+
326326
stream.add(assetsTask);
327327

328328
// Copies all the less files related to the preview into their folder
@@ -342,13 +342,13 @@ function dependencies() {
342342
configTask = configTask.pipe(gulp.dest(root + config.targets.views + "/propertyeditors/grid/config"));
343343
});
344344
stream.add(configTask);
345-
345+
346346
var dashboardTask = gulp.src("src/views/dashboard/default/*.jpg", { allowEmpty: true });
347347
_.forEach(config.roots, function(root){
348348
dashboardTask = dashboardTask .pipe(gulp.dest(root + config.targets.views + "/dashboard/default"));
349349
});
350350
stream.add(dashboardTask);
351-
351+
352352
return stream;
353353
};
354354

src/Umbraco.Web.UI.Client/gulpfile.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ const coreBuild = parallel(dependencies, js, less, views);
3131
// ***********************************************************
3232

3333
exports.build = series(coreBuild, testUnit);
34+
exports.buildDev = series(setDevelopmentMode, coreBuild);
35+
3436
exports.coreBuild = coreBuild;
3537
exports.dev = series(setDevelopmentMode, coreBuild, runUnitTestServer, watchTask);
3638
exports.watch = series(watchTask);

src/Umbraco.Web.UI.Client/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"e2e": "gulp testE2e",
88
"build": "gulp build",
99
"build:skip-tests": "gulp coreBuild",
10+
"build:dev": "gulp buildDev",
1011
"dev": "gulp dev",
1112
"fastdev": "gulp fastdev",
1213
"watch": "gulp watch"

src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,11 @@
117117
vm.files = _.map(files, function (file) {
118118
var f = {
119119
fileName: file,
120+
fileSrc: file,
120121
isImage: mediaHelper.detectIfImageByExtension(file),
121122
extension: getExtension(file)
122123
};
123124

124-
f.fileSrc = getThumbnail(f);
125-
126125
return f;
127126
});
128127

@@ -190,21 +189,6 @@
190189
}
191190
}
192191

193-
function getThumbnail(file) {
194-
195-
if (file.extension === 'svg') {
196-
return file.fileName;
197-
}
198-
199-
if (!file.isImage) {
200-
return null;
201-
}
202-
203-
var thumbnailUrl = mediaHelper.getThumbnailFromPath(file.fileName);
204-
205-
return thumbnailUrl;
206-
}
207-
208192
function getExtension(fileName) {
209193
var extension = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length);
210194
return extension.toLowerCase();
@@ -238,7 +222,8 @@
238222
isImage: isImage,
239223
extension: extension,
240224
fileName: files[i].name,
241-
isClientSide: true
225+
isClientSide: true,
226+
fileData: files[i]
242227
};
243228

244229
// Save the file object to the files collection
@@ -247,6 +232,7 @@
247232
//special check for a comma in the name
248233
newVal += files[i].name.split(',').join('-') + ",";
249234

235+
// TODO: I would love to remove this part. But I'm affright it would be breaking if removed. Its not used by File upload anymore as each preview handles the client-side data on their own.
250236
if (isImage || extension === "svg") {
251237

252238
var deferred = $q.defer();
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/**
2+
* @ngdoc service
3+
* @name umbraco.services.mediaPreview
4+
* @description A service providing views used for dealing with previewing files.
5+
*
6+
* ##usage
7+
* The service allows for registering and retrieving the view for one or more file extensions.
8+
*
9+
* You can register your own custom view in this way:
10+
*
11+
* <pre>
12+
* angular.module('umbraco').run(['mediaPreview', function (mediaPreview) {
13+
* mediaPreview.registerPreview(['docx'], "app_plugins/My_PACKAGE/preview.html");
14+
* }]);
15+
* </pre>
16+
*
17+
* Here is a example of a preview template. (base on the audio-preview).
18+
*
19+
* <pre>
20+
* <audio ng-if="vm.clientSide" name="{{vm.name}}" controls>
21+
* <source ng-init="previewUrl = URL.createObjectURL(vm.clientSideData)" ng-src="{{previewUrl}}"/>
22+
* </audio>
23+
* <audio ng-if="!vm.clientSide" name="{{vm.name}}" controls>
24+
* <source ng-src="{{vm.source}}" />
25+
* </audio>
26+
* </pre>
27+
*
28+
* Notice that there often is a need to differentiate based on the file-data origin. In the state of the file still begin located locally its often needed to create an Object-URL for the data to be useable in HTML. As well you might want to provide links for the uploaded file when it is uploaded to the server. See 'vm.clientSide' and 'vm.clientSideData'.
29+
*
30+
**/
31+
function mediaPreview() {
32+
33+
const DEFAULT_FILE_PREVIEW = "views/components/media/umbfilepreview/umb-file-preview.html";
34+
35+
var _mediaPreviews = [];
36+
37+
function init(service) {
38+
service.registerPreview(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes.split(","), "views/components/media/umbimagepreview/umb-image-preview.html");
39+
service.registerPreview(["svg"], "views/components/media/umbimagepreview/umb-image-preview.html");
40+
service.registerPreview(["mp4", "mov", "webm", "ogv"], "views/components/media/umbvideopreview/umb-video-preview.html");
41+
service.registerPreview(["mp3", "weba", "oga", "opus"], "views/components/media/umbaudiopreview/umb-audio-preview.html");
42+
}
43+
44+
var service = {
45+
46+
/**
47+
* @ngdoc method
48+
* @name umbraco.services.mediaPreview#getMediaPreview
49+
* @methodOf umbraco.services.mediaPreview
50+
*
51+
* @param {string} fileExtension A string with the file extension, example: "pdf"
52+
*
53+
* @description
54+
* The registered view matching this file extensions will be returned.
55+
*
56+
*/
57+
getMediaPreview: function (fileExtension) {
58+
59+
fileExtension = fileExtension.toLowerCase();
60+
61+
var previewObject = _mediaPreviews.find((preview) => preview.fileExtensions.indexOf(fileExtension) !== -1);
62+
63+
if(previewObject !== undefined) {
64+
return previewObject.view;
65+
}
66+
67+
return DEFAULT_FILE_PREVIEW;
68+
},
69+
70+
/**
71+
* @ngdoc method
72+
* @name umbraco.services.mediaPreview#registerPreview
73+
* @methodOf umbraco.services.mediaPreview
74+
*
75+
* @param {array} fileExtensions An array of file extensions, example: ["pdf", "jpg"]
76+
* @param {array} view A URL to the view to be used for these file extensions.
77+
*
78+
* @description
79+
* The registered view will be used when file extensions match the given file.
80+
*
81+
*/
82+
registerPreview: function (fileExtensions, view) {
83+
_mediaPreviews.push({
84+
fileExtensions: fileExtensions.map(e => e.toLowerCase()),
85+
view: view
86+
})
87+
}
88+
89+
};
90+
91+
init(service);
92+
93+
return service;
94+
} angular.module('umbraco.services').factory('mediaPreview', mediaPreview);

src/Umbraco.Web.UI.Client/src/less/belle.less

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,11 @@
202202
@import "components/contextdialogs/umb-dialog-datatype-delete.less";
203203

204204
@import "components/umbemailmarketing.less";
205+
@import "../views/components/media/umbmediapreview/umb-media-preview.less";
206+
@import "../views/components/media/umbaudiopreview/umb-audio-preview.less";
207+
@import "../views/components/media/umbfilepreview/umb-file-preview.less";
208+
@import "../views/components/media/umbimagepreview/umb-image-preview.less";
209+
@import "../views/components/media/umbvideopreview/umb-video-preview.less";
205210

206211
// Editors
207212
@import "../views/common/infiniteeditors/rollback/rollback.less";

src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,8 @@
3838
border-color: @gray-1;
3939
}
4040
}
41+
42+
.umb-property-file-upload--actions {
43+
margin-top: 10px;
44+
}
4145
}

src/Umbraco.Web.UI.Client/src/less/property-editors.less

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -828,11 +828,15 @@
828828
.umb-fileupload {
829829
display: flex;
830830
flex-direction: column;
831+
padding: 20px;
832+
border: 1px solid @inputBorder;
833+
box-sizing: border-box;
834+
width: 100%;
835+
.umb-property-editor--limit-width();
831836
}
832837

833838
.umb-fileupload .preview {
834839
border-radius: 5px;
835-
border: 1px solid @gray-6;
836840
padding: 3px;
837841
background: @gray-9;
838842
float: left;

0 commit comments

Comments
 (0)