koco-xyz
Version:
Dialogs for displaying, choosing, and editing images provided in scoop idiom.
337 lines (254 loc) • 10.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _cloudinaryImageEditor = require('text!./cloudinary-image-editor.html');
var _cloudinaryImageEditor2 = _interopRequireDefault(_cloudinaryImageEditor);
var _knockout = require('knockout');
var _knockout2 = _interopRequireDefault(_knockout);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _imageUtilities = require('image-utilities');
var _imageUtilities2 = _interopRequireDefault(_imageUtilities);
var _mappingUtilities = require('mapping-utilities');
var _mappingUtilities2 = _interopRequireDefault(_mappingUtilities);
var _disposer = require('disposer');
var _disposer2 = _interopRequireDefault(_disposer);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var CloudinaryImagePicker = function CloudinaryImagePicker(params /*, componentInfo*/) {
var self = this;
self.defaultWidthTransformation = 300;
self.koDisposer = new _disposer2.default();
//TODO: Load from server (API)
self.dimensionConfigsForKnownRatios = [{
ratio: '4:3',
dimensions: ['80x60', '100x75', '180x135', '300x225'],
defaultWidthTransformation: 300
}, {
ratio: '16:9',
dimensions: ['64x36', '98x55', '112x63', '135x76', '160x90', '205x115', '240x135', '300x169', '310x174', '352x198', '420x236', '480x270', '635x357'],
defaultWidthTransformation: 635
}];
self.observableSelectedImage = params.selectedImage;
self.selectedImage = _mappingUtilities2.default.toJS(params.selectedImage);
self.selectedConcreteImage = _mappingUtilities2.default.toJS(params.selectedConcreteImage);
var ratios = getRatios(self.selectedImage);
self.ratios = _knockout2.default.observableArray(ratios);
var ratioId;
var widthTransformation = null;
if (self.selectedConcreteImage) {
ratioId = self.selectedConcreteImage.dimensionRatio;
widthTransformation = _imageUtilities2.default.getWidthTransformationFromCloudinaryUrl(self.selectedConcreteImage.mediaLink.href);
} else {
ratioId = ratios[0].id;
}
self.ratio = _knockout2.default.observable(ratioId);
var dimensionConfigs = getDimensionConfigsForCurrentRatio(ratioId, self.dimensionConfigsForKnownRatios);
self.selectedConcreteImage = getTransformedConcreteImage(self, params, dimensionConfigs, widthTransformation);
params.selectedConcreteImage(self.selectedConcreteImage);
self.widthObservable = function (initialValue) {
var _actual = _knockout2.default.observable(initialValue);
var result = _knockout2.default.pureComputed({
read: function read() {
return _actual();
},
write: function write(newValue) {
var parsed = parseFloat(newValue);
var previous = _actual();
if (isNaN(parsed) || parsed < 0 || parsed > self.sourceConcreteImg.width) {
//_actual.valueHasMutated();
_actual.notifySubscribers(previous);
//self.width.valueHasMutated();
} else {
_actual(parsed);
}
}
}).extend({
notify: 'always'
});
result.valueHasMutated = function () {
_actual.valueHasMutated();
};
self.koDisposer.add(result);
return result;
};
self.width = self.widthObservable(self.selectedConcreteImage.width);
self.height = _knockout2.default.observable(self.selectedConcreteImage.height);
self.dimensions = _knockout2.default.observableArray();
self.dimension = _knockout2.default.observable();
var ratioHasChanged = true;
var ignoreRatioModification = false;
var ignoreDimensionModification = false;
updateDimensionsInfo(self, dimensionConfigs);
self.koDisposer.add(self.dimension.subscribe(function () {
if (ignoreDimensionModification) {
ignoreDimensionModification = false;
} else {
var selectedDimension = self.dimension();
var dimension = getDimensionFromString(selectedDimension, 'x');
if (dimension) {
self.width(dimension.width);
}
}
}));
self.koDisposer.add(self.width.subscribe(function () {
var width = self.width();
ratioId = self.ratio();
dimensionConfigs = getDimensionConfigsForCurrentRatio(ratioId, self.dimensionConfigsForKnownRatios);
self.selectedConcreteImage = getTransformedConcreteImage(self, params, dimensionConfigs, width);
self.height(self.selectedConcreteImage.height);
ignoreDimensionModification = true;
updateDimensionsInfo(self, dimensionConfigs);
params.selectedConcreteImage(self.selectedConcreteImage);
}));
self.koDisposer.add(params.$raw.selectedImage.subscribe(function () {
self.selectedImage = _mappingUtilities2.default.toJS(params.selectedImage);
var currentRatio = self.ratio();
ratios = getRatios(self.selectedImage);
if (_lodash2.default.any(ratios, function (rat) {
return rat.id == currentRatio;
})) {
ratioHasChanged = false;
self.ratios(ratios);
self.ratio.valueHasMutated();
} else {
ignoreRatioModification = true;
self.ratios(ratios);
self.ratio(ratios[0].id);
}
}));
self.koDisposer.add(self.ratio.subscribe(function () {
if (ignoreRatioModification) {
ignoreRatioModification = false;
} else {
ratioId = self.ratio();
if (ratioHasChanged) {
dimensionConfigs = getDimensionConfigsForCurrentRatio(ratioId, self.dimensionConfigsForKnownRatios);
self.selectedConcreteImage = getTransformedConcreteImage(self, params, dimensionConfigs);
if (self.width() == self.selectedConcreteImage.width) {
self.width.valueHasMutated();
} else {
self.width(self.selectedConcreteImage.width);
}
} else {
ratioHasChanged = true;
self.width.valueHasMutated();
}
}
}));
return self;
};
function updateDimensionsInfo(self, dimensionConfigs) {
var dimensions = dimensionConfigs.dimensions;
var dimensionId = getDimensionIdFromWidthAndHeight(dimensions, self.selectedConcreteImage.width, self.selectedConcreteImage.height);
if (dimensionId == 'custom') {
dimensions.push({
id: 'custom',
name: 'dimension personnalisée'
});
}
self.dimensions(dimensions);
self.dimension(dimensionId);
}
function getTransformedConcreteImage(self, args, dimensionConfigs, widthTransformation) {
self.sourceConcreteImg = _imageUtilities2.default.getConcreteImage(self.selectedImage, {
preferedRatio: dimensionConfigs.ratio,
defaultToClosestDimension: false
});
if (!widthTransformation) {
widthTransformation = dimensionConfigs.defaultWidthTransformation || self.defaultWidthTransformation;
}
var href = _imageUtilities2.default.updateCloudinaryUrlWidthTransformation(self.sourceConcreteImg.mediaLink.href, widthTransformation);
var height = getHeightFromWidthAndRatio(widthTransformation, dimensionConfigs.ratio);
return {
dimensionRatio: dimensionConfigs.ratio,
mediaLink: {
href: href
},
width: widthTransformation,
height: height
};
}
function getDimensionIdFromWidthAndHeight(dimensions, width, height) {
if (dimensions.length) {
var dimId = width + 'x' + height;
var dimension = _lodash2.default.find(dimensions, function (dim) {
return dim.id == dimId;
});
if (dimension) {
return dimension.id;
} else {
return 'custom';
}
}
return '';
}
function getRatios(conceptualImage) {
var ratios = [];
if (conceptualImage && conceptualImage.concreteImages && conceptualImage.concreteImages.length) {
for (var i = 0; i < conceptualImage.concreteImages.length; i++) {
var concreteImage = conceptualImage.concreteImages[i];
ratios.push({
name: concreteImage.dimensionRatio,
id: concreteImage.dimensionRatio
});
}
}
return ratios;
}
function getDimensionConfigsForCurrentRatio(ratio, dimensionConfigsForKnownRatios) {
var dimensionConfigsForCurrentRatio = _lodash2.default.find(dimensionConfigsForKnownRatios, function (dimensionConfigsForKnownRatio) {
return dimensionConfigsForKnownRatio.ratio == ratio;
});
var dimensions = [];
var defaultWidthTransformation = '';
if (dimensionConfigsForCurrentRatio) {
dimensions = dimensionConfigsForCurrentRatio.dimensions;
defaultWidthTransformation = dimensionConfigsForCurrentRatio.defaultWidthTransformation;
}
var result = {
dimensions: _lodash2.default.map(dimensions, function (dimension) {
return {
id: dimension,
name: dimension
};
}),
defaultWidthTransformation: defaultWidthTransformation,
ratio: ratio
};
//result.dimensions.push({ id: 'custom', name: 'dimension personnalisée' });
return result;
}
function getHeightFromWidthAndRatio(width, ratio) {
var dimension = getDimensionFromString(ratio, ':');
if (dimension) {
var height = width * dimension.height / dimension.width;
return Math.round(height);
}
return null;
}
function getDimensionFromString(string, separator) {
if (!string || string == 'custom') {
return null;
}
var x = string.split(separator);
if (x.length && x[0] && x[1]) {
return {
width: parseInt(x[0]),
height: parseInt(x[1])
};
}
return null;
}
CloudinaryImagePicker.prototype.dispose = function () {
var self = this;
self.koDisposer.dispose();
};
exports.default = {
viewModel: {
createViewModel: function createViewModel(params, componentInfo) {
return new CloudinaryImagePicker(params, componentInfo);
}
},
template: _cloudinaryImageEditor2.default
};