$self->invalidate_version->render($self);
}
+sub action_renumber_sections {
+ my ($self) = @_;
+
+ my %numbers = map { ($_ => 1) } qw(section function_block);
+ my %formats = map { my $method = "${_}_number_format"; ($_ => $self->requirement_spec->type->$method) } qw(section function_block);
+ my @items = @{ $self->requirement_spec->sections_sorted };
+
+ $self->requirement_spec->db->with_transaction(sub {
+ while (@items) {
+ my $item = shift @items;
+ my $type = $item->parent_id ? 'function_block' : 'section';
+
+ $item->update_attributes(fb_number => SL::PrefixedNumber->new(number => $formats{$type} || 0)->set_to($numbers{$type}));
+
+ $numbers{$type}++;
+
+ unshift @items, @{ $item->children_sorted };
+ }
+
+ $self->requirement_spec->invalidate_version unless $self->requirement_spec->is_template;
+
+ 1;
+ });
+
+ $self->redirect_to(action => 'show', id => $self->requirement_spec->id);
+}
+
#
# filters
#
.context-menu-item.icon-pdf { background-image: url("../image/application-pdf.png"); }
.context-menu-item.icon-add-picture { background-image: url("../image/add-picture.png"); }
.context-menu-item.icon-download { background-image: url("../image/download.png"); }
+.context-menu-item.icon-renumber { background-image: url("../image/format-list-ordered.png"); }
/* ------------------------------------------------------------ */
/* Sections & function blocks */
"Delete requirement spec":"Pflichtenheft löschen",
"Delete template":"Vorlage löschen",
"Delete text block":"Textblock löschen",
+"Do you really want do continue?":"Wollen Sie wirklich fortfahren?",
"Do you really want to cancel?":"Wollen Sie wirklich abbrechen?",
"Do you really want to revert to this version?":"Wollen Sie wirklich auf diese Version zurücksetzen?",
"Do you want to set the account number \"#1\" to \"#2\" and the name \"#3\" to \"#4\"?":"Soll die Kontonummer \"#1\" zu \"#2\" und den Name \"#3\" zu \"#4\" geändert werden?",
"Function block actions":"Funktionsblockaktionen",
"If you switch to a different tab without saving you will lose the data you've entered in the current tab.":"Wenn Sie auf einen anderen Tab wechseln, ohne vorher zu speichern, so gehen die im aktuellen Tab eingegebenen Daten verloren.",
"Map":"Karte",
+"No":"Nein",
"Part picker":"Artikelauswahl",
"Paste":"Einfügen",
"Paste template":"Vorlage einfügen",
"Project link actions":"Projektverknüpfungs-Aktionen",
"Quotations/Orders actions":"Aktionen für Angebote/Aufträge",
+"Re-numbering all sections and function blocks in the order they are currently shown cannot be undone.":"Das Neu-Nummerieren aller Abschnitte und Funktionsblöcke kann nicht rückgängig gemacht werden.",
"Remove article":"Artikel entfernen",
+"Renumber sections and function blocks":"Abschnitte/Funktionsblöcke neu nummerieren",
"Requirement spec actions":"Pflichtenheftaktionen",
"Requirement spec template actions":"Pflichtenheftvorlagen-Aktionen",
"Revert to version":"Auf Version zurücksetzen",
"Update":"Erneuern",
"Update quotation/order":"Auftrag/Angebot aktualisieren",
"Version actions":"Aktionen für Versionen",
+"Yes":"Ja",
"flat-rate position":"Pauschalposition",
"time and effort based position":"Aufwandsposition"
});
.bind('keypress', 'shift+return', function(event) { return ns.submit_function_block.apply(this, [ event, true ]); });
};
+ns.renumber_callback = function(accepted) {
+ console.log(accepted ? "yay :)" : "oh no :(");
+ if (!accepted)
+ return;
+
+ $.ajax({
+ url: 'controller.pl?action=RequirementSpec/renumber_sections',
+ type: 'post',
+ data: { id: $('#requirement_spec_id').val() },
+ success: kivi.eval_json_result
+ });
+};
+
+ns.renumber = function(opt) {
+ $('#rs-dialog-confirm').remove();
+
+ var text1 = kivi.t8('Re-numbering all sections and function blocks in the order they are currently shown cannot be undone.');
+ var text2 = kivi.t8('Do you really want do continue?');
+ var $dialog = $('<div id="rs-dialog-confirm"><p>' + text1 + '</p><p>' + text2 + '</p></div>').hide().appendTo('body');
+ var buttons = {};
+
+ buttons[kivi.t8('Yes')] = function() {
+ $(this).dialog('close');
+ ns.renumber_callback(true);
+ };
+
+ buttons[kivi.t8('No')] = function() {
+ $(this).dialog('close');
+ ns.renumber_callback(false);
+ };
+
+ $dialog.dialog({
+ resizable: false
+ , modal: true
+ , title: kivi.t8('Are you sure?')
+ , height: 250
+ , width: 400
+ , buttons: buttons
+ });
+};
+
// -------------------------------------------------------------------------
// ------------------------------- templates -------------------------------
// -------------------------------------------------------------------------
// , sep99: "---------"
, copy_reqspec: { name: kivi.t8('Copy template'), icon: "copy", callback: kivi.requirement_spec.copy_reqspec }
, delete_reqspec: { name: kivi.t8('Delete template'), icon: "delete", callback: kivi.requirement_spec.delete_reqspec }
+ , sep_paste_template: "---------"
+ , renumber: { name: kivi.t8('Renumber sections and function blocks'), icon: "renumber", callback: kivi.requirement_spec.renumber }
};
$.contextMenu({
, copy_reqspec: { name: kivi.t8('Copy requirement spec'), icon: "copy", callback: kivi.requirement_spec.copy_reqspec }
, delete_reqspec: { name: kivi.t8('Delete requirement spec'), icon: "delete", callback: kivi.requirement_spec.delete_reqspec }
, sep_paste_template: "---------"
+ , renumber: { name: kivi.t8('Renumber sections and function blocks'), icon: "renumber", callback: kivi.requirement_spec.renumber }
+ , sep_paste_template: "---------"
, paste_template: { name: kivi.t8('Paste template'), icon: "paste", callback: kivi.requirement_spec.paste_template }
};
'Do not link to a project.' => 'Nicht mit einem Projekt verknüpfen.',
'Do not modify this position' => 'Diese Position nicht verändern',
'Do not set default buchungsgruppe' => 'Nie Standardbuchungsgruppe setzen',
+ 'Do you really want do continue?' => 'Wollen Sie wirklich fortfahren?',
'Do you really want to cancel?' => 'Wollen Sie wirklich abbrechen?',
'Do you really want to close the following SEPA exports? No payment will be recorded for bank collections that haven\'t been marked as executed yet.' => 'Wollen Sie wirklich die folgenden SEPA-Exporte abschließen? Für Überweisungen, die noch nicht gebucht wurden, werden dann keine Zahlungen verbucht.',
'Do you really want to close the following SEPA exports? No payment will be recorded for bank transfers that haven\'t been marked as executed yet.' => 'Wollen Sie wirklich die folgenden SEPA-Exporte abschließen? Für Überweisungen, die noch nicht gebucht wurden, werden dann keine Zahlungen verbucht.',
'RFQs' => 'Preisanfragen',
'ROP' => 'Mindestlagerbestand',
'Ranges of numbers' => 'Nummernkreise',
+ 'Re-numbering all sections and function blocks in the order they are currently shown cannot be undone.' => 'Das Neu-Nummerieren aller Abschnitte und Funktionsblöcke kann nicht rückgängig gemacht werden.',
'Re-run analysis' => 'Analyse wiederholen',
'Receipt' => 'Zahlungseingang',
'Receipt posted!' => 'Beleg gebucht!',
'Removed spoolfiles!' => 'Druckdateien entfernt!',
'Removed text blocks: #1' => 'Entfernte Textblöcke: #1',
'Removing marked entries from queue ...' => 'Markierte Einträge werden von der Warteschlange entfernt ...',
+ 'Renumber sections and function blocks' => 'Abschnitte/Funktionsblöcke neu nummerieren',
'Replace the orphaned currencies by other not orphaned currencies. To do so, please delete the currency in the textfields above and replace it by another currency. You could loose or change unintentionally exchangerates. Go on very carefully since you could destroy transactions.' => 'Ersetze die Währungen durch andere gültige Währungen. Wenn Sie sich hierfür entscheiden, ersetzen Sie bitte alle Währungen, die oben angegeben sind, durch Währungen, die in Ihrem System ordnungsgemäß eingetragen sind. Alle eingetragenen Wechselkurse für die verwaiste Währung werden dabei gelöscht. Bitte gehen Sie sehr vorsichtig vor, denn die betroffenen Buchungen können unter Umständen kaputt gehen.',
'Report Positions' => 'Berichte',
'Report about warehouse contents' => 'Lagerbestand anzeigen',