koco-xyz
Version:
Dialogs for displaying, choosing, and editing images provided in scoop idiom.
137 lines (103 loc) • 4.26 kB
JavaScript
import template from 'text!./concrete-image-editor.html';
import ko from 'knockout';
import $ from 'jquery';
import _ from 'lodash';
import imageUtilities from 'image-utilities';
import koMappingUtilities from 'mapping-utilities';
import KoDisposer from 'disposer';
/*
args :
{
conceptualImage: observable conceptualImage
concreteImage: observable concreteImage,
dimensionRatios: ['16:9','4:3'] limiter pour les nouvelles
}
*/
var ConcreteImagesPickerViewModel = function(params, componentInfo) {
var self = this;
self.params = params;
var selectedImage = koMappingUtilities.toJS(self.params.selectedImage);
var selectedConcreteImage = koMappingUtilities.toJS(self.params.selectedConcreteImage);
var options = buildOptions(selectedImage);
self.options = ko.observableArray(options);
if (!selectedConcreteImage) {
//Attention: 2 type de DefaultConcreteImage (1 pour les previews de scoop et celui ci pour le default concrete image...)
//en ce moment on est chanceux, c'est la meme taille qui est utilisée par défaut mais il faudra ajuster si ca change
selectedConcreteImage = imageUtilities.getDefaultConcreteImage(selectedImage);
}
var selectedOption = getConcreteImageHref(selectedConcreteImage);
self.selectedOption = ko.observable(selectedOption);
self.params.selectedConcreteImage(selectedConcreteImage);
self.koDisposer = new KoDisposer();
self.koDisposer.add(self.selectedOption.subscribe(function(newValue) {
selectedOption = newValue;
var concreteImage = null;
if (selectedOption) {
concreteImage = _.find(selectedImage.concreteImages, function(c) {
return c.mediaLink.href == selectedOption;
});
}
self.params.selectedConcreteImage(concreteImage || null);
}));
self.koDisposer.add(self.params.$raw.selectedImage.subscribe(function() {
selectedImage = koMappingUtilities.toJS(self.params.selectedImage);
options = buildOptions(selectedImage);
self.options(options);
selectedConcreteImage = imageUtilities.getDefaultConcreteImage(selectedImage);
selectedOption = getConcreteImageHref(selectedConcreteImage);
self.selectedOption(selectedOption);
self.params.selectedConcreteImage(selectedConcreteImage);
}));
};
ConcreteImagesPickerViewModel.prototype.dispose = function() {
var self = this;
self.koDisposer.dispose();
};
function getConcreteImageHref(selectedConcreteImage) {
var selectedOption = '';
if (selectedConcreteImage && selectedConcreteImage.mediaLink && selectedConcreteImage.mediaLink.href) {
selectedOption = selectedConcreteImage.mediaLink.href;
}
return selectedOption;
}
function buildOptions(selectedImage) {
var options = [];
if (selectedImage && selectedImage.concreteImages && selectedImage.concreteImages.length) {
for (var i = 0; i < selectedImage.concreteImages.length; i++) {
var concreteImage = selectedImage.concreteImages[i];
var group = _.find(options, function(g) {
return g.ratio === concreteImage.dimensionRatio;
});
if (!group) {
var ratio = 'ratio inconnu';
if (concreteImage.dimensionRatio && concreteImage.dimensionRatio != 'unknown') {
ratio = concreteImage.dimensionRatio;
}
group = new Group(ratio, []);
options.push(group);
}
group.dimensions.push(new Option(concreteImage));
}
}
return options;
}
function Group(ratio, dimensions) {
this.ratio = ratio;
this.dimensions = dimensions;
}
function Option(concreteImage) {
if (concreteImage.width && concreteImage.height) {
this.name = concreteImage.width + 'x' + concreteImage.height;
} else {
this.name = 'dimension inconnue';
}
this.id = concreteImage.mediaLink.href;
}
export default {
viewModel: {
createViewModel: function(params, componentInfo) {
return new ConcreteImagesPickerViewModel(params, componentInfo);
}
},
template: template
};