Pflichtenhefte: Funktion Abschnitte/Funktionsblöcke neu nummerieren
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 3 Nov 2014 15:36:18 +0000 (16:36 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 5 Nov 2014 08:11:19 +0000 (09:11 +0100)
SL/Controller/RequirementSpec.pm
css/requirement_spec.css
image/format-list-ordered.png [new file with mode: 0644]
js/locale/de.js
js/requirement_spec.js
locale/de/all

index f762b97..d88ec8f 100644 (file)
@@ -265,6 +265,33 @@ sub action_paste_template {
   $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
 #
index f4c4cd4..1237133 100644 (file)
@@ -50,6 +50,7 @@ table.rs_input_field input, table.rs_input_field select {
 .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 */
diff --git a/image/format-list-ordered.png b/image/format-list-ordered.png
new file mode 100644 (file)
index 0000000..3ee1ea7
Binary files /dev/null and b/image/format-list-ordered.png differ
index a382fd9..34be75d 100644 (file)
@@ -27,6 +27,7 @@ namespace("kivi").setupLocale({
 "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?",
@@ -40,12 +41,15 @@ namespace("kivi").setupLocale({
 "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",
@@ -71,6 +75,7 @@ namespace("kivi").setupLocale({
 "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"
 });
index b4e9cd9..cc2f332 100644 (file)
@@ -413,6 +413,47 @@ ns.init_function_block_keypress_events = function(form_id) {
     .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 -------------------------------
 // -------------------------------------------------------------------------
@@ -829,6 +870,8 @@ ns.create_context_menus = function(is_template) {
       // , 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({
@@ -848,6 +891,8 @@ ns.create_context_menus = function(is_template) {
       , 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 }
     };
 
index 195c189..76b703b 100755 (executable)
@@ -834,6 +834,7 @@ $self->{texts} = {
   '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.',
@@ -1927,6 +1928,7 @@ $self->{texts} = {
   '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!',
@@ -1962,6 +1964,7 @@ $self->{texts} = {
   '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',