diff --git a/lib/classes/databox/field.php b/lib/classes/databox/field.php index 944b8d04df..fdcfeed475 100644 --- a/lib/classes/databox/field.php +++ b/lib/classes/databox/field.php @@ -970,8 +970,9 @@ class databox_field implements cache_cacheableInterface $row = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); - if ($row) - $sorter = (int) $row['sorter']; + if ($row) { + $sorter = max(1, (int) $row['sorter']); + } $sql = "INSERT INTO metadatas_structure (`id`, `name`, `src`, `readonly`, `indexable`, `type`, `tbranch`, diff --git a/templates/web/admin/fields/templates.html.twig b/templates/web/admin/fields/templates.html.twig index 56f71ed4bf..f7fbeac9c5 100644 --- a/templates/web/admin/fields/templates.html.twig +++ b/templates/web/admin/fields/templates.html.twig @@ -4,7 +4,7 @@ @@ -248,7 +248,7 @@ - <%= position + 1 %> + <%= position %> diff --git a/www/scripts/apps/admin/fields/app.js b/www/scripts/apps/admin/fields/app.js index 64e039fe2f..0f03583149 100644 --- a/www/scripts/apps/admin/fields/app.js +++ b/www/scripts/apps/admin/fields/app.js @@ -24,12 +24,13 @@ define([ DcFieldsCollection, FieldListView, SaveView, FieldErrorView, ErrorManager) { var initialize = function() { AdminFieldApp = { - $window : $(window), - $scope : $("#admin-field-app"), - $top : $(".row-top", this.$scope), - $bottom : $(".row-bottom", this.$scope), - $leftBlock : $(".left-block", this.$bottom), - $rightBlock : $(".right-block", this.$bottom), + $window : $(window), + $scope : $("#admin-field-app"), + $top : $(".row-top", this.$scope), + $bottom : $(".row-bottom", this.$scope), + $leftBlock : $(".left-block", this.$bottom), + $rightBlock : $(".right-block", this.$bottom), + fieldsToDelete : [], resizeListBlock: function () { var listBlock = $(".list-block", AdminFieldApp.$leftBlock); listBlock.height(AdminFieldApp.$window.height() - listBlock.offset().top - 10); @@ -92,7 +93,9 @@ define([ AdminFieldApp.$window.trigger("resize"); // click on first item list - _.first(AdminFieldApp.fieldListView.itemViews).clickAction().animate(); + if (AdminFieldApp.fieldListView.itemViews.length > 0 ) { + _.first(AdminFieldApp.fieldListView.itemViews).clickAction().animate(); + } } ); }; diff --git a/www/scripts/apps/admin/fields/views/create.js b/www/scripts/apps/admin/fields/views/create.js index 33eda3a399..0e34e43575 100644 --- a/www/scripts/apps/admin/fields/views/create.js +++ b/www/scripts/apps/admin/fields/views/create.js @@ -122,10 +122,7 @@ define([ "label_fr" : $("#new-label_fr", this.$el).val(), "label_de" : $("#new-label_de", this.$el).val(), "label_nl" : $("#new-label_nl", this.$el).val(), - "multi": $("#new-multivalued", this.$el).is(":checked"), - "sorter": AdminFieldApp.fieldsCollection.max(function(model) { - return model.get("sorter"); - }).get("sorter") + 1 + "multi": $("#new-multivalued", this.$el).is(":checked") }); field.save(null, { diff --git a/www/scripts/apps/admin/fields/views/edit.js b/www/scripts/apps/admin/fields/views/edit.js index b0f0bdff0c..04e5480492 100644 --- a/www/scripts/apps/admin/fields/views/edit.js +++ b/www/scripts/apps/admin/fields/views/edit.js @@ -183,23 +183,10 @@ define([ modalView.render(); modalView.on("modal:confirm", function() { - self.model.destroy({ - success: function(model, response) { - AdminFieldApp.fieldListView.collection.remove(self.model); - self._selectModelView(index); - - new AlertView({alert: "info", message: i18n.t("deleted_success", { - postProcess: "sprintf", - sprintf: [model.get("name")] - }) - }).render(); - }, - error: function(xhr, textStatus, errorThrown) { - new AlertView({ - alert: "error", message: '' !== xhr.responseText ? xhr.responseText : i18n.t("something_wrong") - }).render(); - } - }); + AdminFieldApp.fieldsToDelete.push(self.model); + AdminFieldApp.fieldListView.collection.remove(self.model); + self._selectModelView(index); + AdminFieldApp.saveView.updateStateButton(); }); return this; diff --git a/www/scripts/apps/admin/fields/views/list.js b/www/scripts/apps/admin/fields/views/list.js index 10b54efe5c..6a911e5d9b 100644 --- a/www/scripts/apps/admin/fields/views/list.js +++ b/www/scripts/apps/admin/fields/views/list.js @@ -30,6 +30,7 @@ define([ // rerender whenever there is a change on the collection this.collection.bind("reset", this.render, this); this.collection.bind("add", this.render, this); + this.collection.bind("remove", this._onRemove, this); this.collection.bind("remove", this.render, this); AdminFieldApp.errorManager.on('add-error', function(error) { @@ -112,15 +113,27 @@ define([ return this; }, + _onRemove : function (model) { + var models = []; + this.collection.each(function(m) { + if (m.get("sorter") > model.get("sorter")) { + m.set("sorter", m.get("sorter") - 1); + } + + models.push(m); + }); + + this.collection.reset(models); + }, updateSortAction: function(event, model, ui) { var newPosition = ui.item.index(); this.collection.remove(model, {silent: true}); this.collection.each(function (model, index) { var ordinal = index; - if (index >= newPosition) ordinal += 1; + if (index >= newPosition) ordinal += 2; else ordinal += 1; model.set({'sorter': ordinal}, {silent: true}); }); - model.set({'sorter': newPosition}, {silent: true}); + model.set({'sorter': newPosition + 1}, {silent: true}); this.collection.add(model, {at: newPosition}); this.itemViews[0].animate(Math.abs(ui.firstItemPosition)); diff --git a/www/scripts/apps/admin/fields/views/save.js b/www/scripts/apps/admin/fields/views/save.js index 6645f123f1..e258fefaf7 100644 --- a/www/scripts/apps/admin/fields/views/save.js +++ b/www/scripts/apps/admin/fields/views/save.js @@ -37,24 +37,41 @@ define([ if (this._isModelDesync()) { this._loadingState(true); - AdminFieldApp.fieldsCollection.save({ - success: function(fields) { - // reset collection with new one - AdminFieldApp.fieldsCollection.reset(fields); + $.when.apply($, _.map(AdminFieldApp.fieldsToDelete, function(m){ + return m.destroy({ + success: function(model, response) { + AdminFieldApp.fieldsToDelete = _.filter(AdminFieldApp.fieldsToDelete, function(m){ + return model.get("id") !== m.get("id"); + }); + }, + error: function(xhr, textStatus, errorThrown) { + new AlertView({ + alert: "error", message: '' !== xhr.responseText ? xhr.responseText : i18n.t("something_wrong") + }).render(); + } + }); + })).done( + function() { + AdminFieldApp.fieldsCollection.save({ + success: function(fields) { + // reset collection with new one + AdminFieldApp.fieldsCollection.reset(fields); - new AlertView({ - alert: "success", - message: i18n.t("fields_save") - }).render(); - }, - error: function(xhr, textStatus, errorThrown) { - new AlertView({ - alert: "error", message: '' !== xhr.responseText ? xhr.responseText : i18n.t("something_wrong") - }).render(); + new AlertView({ + alert: "success", + message: i18n.t("fields_save") + }).render(); + }, + error: function(xhr, textStatus, errorThrown) { + new AlertView({ + alert: "error", message: '' !== xhr.responseText ? xhr.responseText : i18n.t("something_wrong") + }).render(); + } + }).done(function() { + self._loadingState(false); + }); } - }).done(function() { - self._loadingState(false); - }); + ); } return this; diff --git a/www/skins/admin/css/fields.css b/www/skins/admin/css/fields.css index d79351d789..a6d7541734 100644 --- a/www/skins/admin/css/fields.css +++ b/www/skins/admin/css/fields.css @@ -53,6 +53,7 @@ #admin-field-app #collection-fields li table { table-layout: fixed; width: 100%; + height: 100%; } #admin-field-app #collection-fields li .field-name { @@ -221,6 +222,10 @@ font-weight: bold } +#admin-field-app .save-all{ + padding: 15px; +} + #admin-field-app .overlay { zoom: 1; filter: alpha(opacity=50);