commit ea7e9f7e100db9e5ffda644296b543802039f503 Author: Jan Schulz-Hofen Date: Sun Sep 11 17:49:41 2011 +0200 * generate project identifier automatically via javascript * let users know that identifiers may not start with a number diff --git a/app/views/projects/_form.rhtml b/app/views/projects/_form.rhtml index 57b7fbb..772f826 100644 --- a/app/views/projects/_form.rhtml +++ b/app/views/projects/_form.rhtml @@ -11,6 +11,7 @@

<%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %>

<%= f.text_field :identifier, :required => true, :size => 60, :disabled => @project.identifier_frozen? %> <% unless @project.identifier_frozen? %> +<%= javascript_tag "observeProjectIdentifier(#{Project::IDENTIFIER_MAX_LENGTH});observeProjectName(#{Project::IDENTIFIER_MAX_LENGTH});" %>
<%= l(:text_length_between, :min => 1, :max => Project::IDENTIFIER_MAX_LENGTH) %> <%= l(:text_project_identifier_info) %> <% end %>

<%= f.text_field :homepage, :size => 60 %>

diff --git a/config/locales/de.yml b/config/locales/de.yml index 03e050c..cd99fe2 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -869,7 +869,7 @@ de: text_tip_issue_begin_day: Aufgabe, die an diesem Tag beginnt text_tip_issue_end_day: Aufgabe, die an diesem Tag endet text_tip_issue_begin_end_day: Aufgabe, die an diesem Tag beginnt und endet - text_project_identifier_info: 'Kleinbuchstaben (a-z), Ziffern und Bindestriche erlaubt.
Einmal gespeichert, kann die Kennung nicht mehr geändert werden.' + text_project_identifier_info: 'Kleinbuchstaben (a-z), Ziffern und Bindestriche erlaubt, muss mit einem Kleinbuchstaben beginnen.
Einmal gespeichert, kann die Kennung nicht mehr geändert werden.' text_caracters_maximum: "Max. %{count} Zeichen." text_caracters_minimum: "Muss mindestens %{count} Zeichen lang sein." text_length_between: "Länge zwischen %{min} und %{max} Zeichen." diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 0ac37b2..9fe7309 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -879,7 +879,7 @@ en-GB: text_tip_issue_begin_day: task beginning this day text_tip_issue_end_day: task ending this day text_tip_issue_begin_end_day: task beginning and ending this day - text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.
Once saved, the identifier cannot be changed.' + text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed, must start with a lower case letter.
Once saved, the identifier cannot be changed.' text_caracters_maximum: "%{count} characters maximum." text_caracters_minimum: "Must be at least %{count} characters long." text_length_between: "Length between %{min} and %{max} characters." diff --git a/config/locales/en.yml b/config/locales/en.yml index c69ab0d..a8fc36f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -895,7 +895,7 @@ en: text_tip_issue_begin_day: issue beginning this day text_tip_issue_end_day: issue ending this day text_tip_issue_begin_end_day: issue beginning and ending this day - text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.
Once saved, the identifier cannot be changed.' + text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed, must start with a lower case letter.
Once saved, the identifier cannot be changed.' text_caracters_maximum: "%{count} characters maximum." text_caracters_minimum: "Must be at least %{count} characters long." text_length_between: "Length between %{min} and %{max} characters." diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 18119ad..90e84b2 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -867,7 +867,7 @@ fr: text_tip_issue_begin_day: tâche commençant ce jour text_tip_issue_end_day: tâche finissant ce jour text_tip_issue_begin_end_day: tâche commençant et finissant ce jour - text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres et tirets sont autorisés.
Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' + text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres et tirets sont autorisés, doit commencer par une minuscule.
Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' text_caracters_maximum: "%{count} caractères maximum." text_caracters_minimum: "%{count} caractères minimum." text_length_between: "Longueur comprise entre %{min} et %{max} caractères." diff --git a/public/javascripts/application.js b/public/javascripts/application.js index fdaadc9..dcbca4a 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -243,6 +243,45 @@ function randomKey(size) { return key; } +// Automatic project identifier generation +var projectIdentifierLocked = false; + +function generateProjectIdentifier(identifierMaxLength) { + var identifier = $('project_name').getValue() // project name + identifier = identifier.replace(/ä/g,'ae'); // umlauts + identifier = identifier.replace(/ö/g,'oe'); // umlauts + identifier = identifier.replace(/ü/g,'ue'); // umlauts + identifier = identifier.replace(/Ä/g,'Ae'); // umlauts + identifier = identifier.replace(/Ö/g,'Oe'); // umlauts + identifier = identifier.replace(/Ü/g,'Ue'); // umlauts + identifier = identifier.replace(/ß/g,'ss'); // umlauts + identifier = identifier.replace(/[^a-z0-9]+/gi, '-'); // non-alphanumeric => dash + identifier = identifier.replace(/^[-\d]*|-*$/g, ''); // remove dashes and numbers at beginning and dashes at end + identifier = identifier.toLowerCase(); // to lower + identifier = identifier.substr(0,identifierMaxLength); // max characters + return identifier; +} + +function observeProjectName(identifierMaxLength) { + var f = function() { + if(!projectIdentifierLocked) { + $('project_identifier').setValue(generateProjectIdentifier(identifierMaxLength)); + } + }; + Event.observe('project_name', 'keyup', f); +} + +function observeProjectIdentifier(identifierMaxLength) { + var f = function() { + if($('project_identifier').getValue() != '' && $('project_identifier').getValue() != generateProjectIdentifier(identifierMaxLength)) { + projectIdentifierLocked = true; + } else { + projectIdentifierLocked = false; + } + }; + Event.observe('project_identifier', 'keyup', f); +} + function observeParentIssueField(url) { new Ajax.Autocompleter('issue_parent_issue_id', 'parent_issue_candidates',