[libreport] Improve Use Experience in Anaconda

Jakub Filak jfilak at fedoraproject.org
Thu May 1 09:11:21 UTC 2014


commit 96251e822de2a9f8348f4f441783b917da3d7a50
Author: Jakub Filak <jfilak at redhat.com>
Date:   Wed Apr 30 16:39:05 2014 +0200

    Improve Use Experience in Anaconda

 ...rder-workflows-according-to-their-priorit.patch |  262 ++++++++++++++++++++
 ...ine-priorities-for-the-existing-workflows.patch |  163 ++++++++++++
 ...nfusing-label-for-upload-data-in-Anaconda.patch |   41 +++
 ...ve-the-advanced-options-to-the-advanced-s.patch |   89 +++++++
 0007-hide-Don-t-store-password-checkbox.patch      |   34 +++
 ...ctoring-unify-event-configuration-dialogs.patch |  158 ++++++++++++
 ...ove-the-intermediate-configuration-dialog.patch |  178 +++++++++++++
 ...load-more-descriptive-message-about-missi.patch |   32 +++
 libreport.spec                                     |   13 +-
 9 files changed, 969 insertions(+), 1 deletions(-)
---
diff --git a/0003-Worklflow-order-workflows-according-to-their-priorit.patch b/0003-Worklflow-order-workflows-according-to-their-priorit.patch
new file mode 100644
index 0000000..8d0df7c
--- /dev/null
+++ b/0003-Worklflow-order-workflows-according-to-their-priorit.patch
@@ -0,0 +1,262 @@
+From 27a2c75409c7abae68c4ad3af99d8e90927af803 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 13:57:05 +0200
+Subject: [LIBREPORT PATCH 03/10] Worklflow: order workflows according to their
+ priority
+
+Higher number -> higher priority -> more visible place in UI
+
+Introduce 'priority' element in XML workflow definition:
+    - child of 'workflow' element
+    - the type is signed integer
+    - optional value, if not present, 0 is used
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+
+mmilata: fix DTD in manual page
+---
+ doc/report-gtk.txt            |  8 +++++++-
+ src/cli/cli-report.c          | 32 ++++++++++++++++++--------------
+ src/gui-wizard-gtk/wizard.c   | 10 ++++++----
+ src/include/workflow.h        | 10 ++++++++++
+ src/lib/workflow.c            | 21 +++++++++++++++++++++
+ src/lib/workflow_xml_parser.c | 20 +++++++++++++++++++-
+ 6 files changed, 81 insertions(+), 20 deletions(-)
+
+diff --git a/doc/report-gtk.txt b/doc/report-gtk.txt
+index e7611de..f39c77c 100644
+--- a/doc/report-gtk.txt
++++ b/doc/report-gtk.txt
+@@ -64,11 +64,12 @@ These configuration files are placed in /usr/share/libreport/workflows.
+ Each file has XML formatting with the following DTD:
+ 
+ ------------
+-<!ELEMENT workflow    (name+,description+,events*)>
++<!ELEMENT workflow    (name+,description+,priority?,events*)>
+ <!ELEMENT name        (#PCDATA)>
+ <!ATTLIST name         xml:lang CDATA #IMPLIED>
+ <!ELEMENT description (#PCDATA)>
+ <!ATTLIST description  xml:lang CDATA #IMPLIED>
++<!ELEMENT priority =  (#PCDATA)>
+ <!ELEMENT events =    (event)+>
+ <!ELEMENT event =     (#PCDATA)>
+ ------------
+@@ -79,6 +80,10 @@ name::
+ description::
+    User visible description
+ 
++priority::
++   Priority of the workflow. Higher number means a more visible place in UI.
++   If not provided, 0 is used. The value is signed integer.
++
+ events::
+    List of executed events
+ 
+@@ -98,6 +103,7 @@ Simple reporting work flow
+   <name xml:lang="cs">Příklad</name>
+   <description xml:lang="en">Example description</description>
+   <description xml:lang="cs">Příklad popisu</description>
++  <priority>10</priority>
+   <evetns>
+      <event>analyze_example</event>
+      <event>collect_example</event>
+diff --git a/src/cli/cli-report.c b/src/cli/cli-report.c
+index 68baa8b..9cc7613 100644
+--- a/src/cli/cli-report.c
++++ b/src/cli/cli-report.c
+@@ -824,32 +824,36 @@ int run_event_chain(const char *dump_dir_name, GList *chain, int interactive)
+ 
+ static workflow_t *select_workflow(GHashTable *workflows)
+ {
+-    GHashTableIter iter;
+-    gpointer key = NULL;
+-    workflow_t *value = NULL;
++    GList *wf_list = g_hash_table_get_values(workflows);
+ 
+-    g_hash_table_iter_init(&iter, workflows);
+-
+-    if (!g_hash_table_iter_next(&iter, &key, (gpointer *)&value))
++    if (wf_list == NULL)
+     {
+         error_msg("No workflow suitable for this problem was found!");
+         return NULL;
+     }
+ 
+-    if (g_hash_table_size(workflows) == 1)
++    const guint wf_cnt = g_list_length(wf_list);
++    if (wf_cnt == 1)
+     {
+-        log_notice("autoselected workflow: '%s'", (char *)key);
+-        return value;
++        workflow_t *wf_selected = (workflow_t *)wf_list->data;
++        log_notice("autoselected workflow: '%s'", (char *)wf_get_name(wf_selected));
++        g_list_free(wf_list);
++        return wf_selected;
+     }
+ 
+-    workflow_t *help_wf_array[g_hash_table_size(workflows)];
++    wf_list = g_list_sort(wf_list, (GCompareFunc)wf_priority_compare);
++
++    workflow_t *help_wf_array[wf_cnt];
+     unsigned count = 0;
+-    do
++
++    for(GList *wf_iter = wf_list; wf_iter; wf_iter = g_list_next(wf_iter))
+     {
+-        help_wf_array[count] = value;
+-        printf("%d %s\n  %s\n\n", ++count, wf_get_screen_name(value), wf_get_description(value));
++        workflow_t *wf = (workflow_t *)wf_iter->data;
++        help_wf_array[count] = wf;
++        printf("%d %s\n  %s\n\n", ++count, wf_get_screen_name(wf), wf_get_description(wf));
+     }
+-    while (g_hash_table_iter_next(&iter, &key, (gpointer *)&value));
++
++    g_list_free(wf_list);
+ 
+     const unsigned picked = choose_number_from_range(1, count, _("Select a workflow to run: "));
+     return help_wf_array[picked - 1];
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index 82bdf3e..e6f6ee7 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -2736,10 +2736,12 @@ static void add_workflow_buttons(GtkBox *box, GHashTable *workflows, GCallback f
+                         list_possible_events_glist(g_dump_dir_name, "workflow"),
+                         WORKFLOWS_DIR);
+ 
+-    GList *keys = g_hash_table_get_keys(workflow_table);
+-    while(keys)
++    GList *wf_list = g_hash_table_get_values(workflow_table);
++    wf_list = g_list_sort(wf_list, (GCompareFunc)wf_priority_compare);
++
++    for (GList *wf_iter = wf_list; wf_iter; wf_iter = g_list_next(wf_iter))
+     {
+-        workflow_t *w = g_hash_table_lookup(workflow_table, keys->data);
++        workflow_t *w = (workflow_t *)wf_iter->data;
+         char *btn_label = xasprintf("<b>%s</b>\n%s", wf_get_screen_name(w), wf_get_description(w));
+         GtkWidget *button = gtk_button_new_with_label(btn_label);
+         GList *children = gtk_container_get_children(GTK_CONTAINER(button));
+@@ -2756,9 +2758,9 @@ static void add_workflow_buttons(GtkBox *box, GHashTable *workflows, GCallback f
+         free(btn_label);
+         g_signal_connect(button, "clicked", func, w);
+         gtk_box_pack_start(box, button, true, false, 2);
+-        keys = g_list_next(keys);
+     }
+ 
++    g_list_free(wf_list);
+ }
+ 
+ static char *setup_next_processed_event(GList **events_list)
+diff --git a/src/include/workflow.h b/src/include/workflow.h
+index 66bbdaf..d79708e 100644
+--- a/src/include/workflow.h
++++ b/src/include/workflow.h
+@@ -39,11 +39,21 @@ GList *wf_get_event_names(workflow_t *w);
+ const char *wf_get_screen_name(workflow_t *w);
+ const char *wf_get_description(workflow_t *w);
+ const char *wf_get_long_desc(workflow_t *w);
++int wf_get_priority(workflow_t *w);
+ 
+ void wf_set_screen_name(workflow_t *w, const char* screen_name);
+ void wf_set_description(workflow_t *w, const char* description);
+ void wf_set_long_desc(workflow_t *w, const char* long_desc);
+ void wf_add_event(workflow_t *w, event_config_t *ec);
++void wf_set_priority(workflow_t *w, int priority);
++
++/*
++ * Returns a negative integer if the first value comes before the second, 0 if
++ * they are equal, or a positive integer if the first value comes after the
++ * second.
++ */
++int wf_priority_compare(const workflow_t *first, const workflow_t *second);
++
+ GHashTable *load_workflow_config_data_from_list(GList *wf_names, const char *path);
+ 
+ #endif
+diff --git a/src/lib/workflow.c b/src/lib/workflow.c
+index 52ad924..c6eedf4 100644
+--- a/src/lib/workflow.c
++++ b/src/lib/workflow.c
+@@ -24,6 +24,7 @@
+ struct workflow
+ {
+     config_item_info_t *info;
++    int priority; // direct correlation: higher number -> higher priority
+ 
+     GList *events; //list of event_option_t
+ };
+@@ -193,6 +194,11 @@ const char *wf_get_long_desc(workflow_t *w)
+     return ci_get_long_desc(workflow_get_config_info(w));
+ }
+ 
++int wf_get_priority(workflow_t *w)
++{
++    return w->priority;
++}
++
+ void wf_set_screen_name(workflow_t *w, const char* screen_name)
+ {
+     ci_set_screen_name(workflow_get_config_info(w), screen_name);
+@@ -213,3 +219,18 @@ void wf_add_event(workflow_t *w, event_config_t *ec)
+     w->events = g_list_append(w->events, ec);
+     log_info("added to ev list: '%s'", ec_get_screen_name(ec));
+ }
++
++void wf_set_priority(workflow_t *w, int priority)
++{
++    w->priority = priority;
++}
++
++/*
++ * Returns a negative integer if the first value comes before the second, 0 if
++ * they are equal, or a positive integer if the first value comes after the
++ * second.
++ */
++int wf_priority_compare(const workflow_t *first, const workflow_t *second)
++{
++    return second->priority - first->priority;
++}
+diff --git a/src/lib/workflow_xml_parser.c b/src/lib/workflow_xml_parser.c
+index 0efc733..f216c18 100644
+--- a/src/lib/workflow_xml_parser.c
++++ b/src/lib/workflow_xml_parser.c
+@@ -26,6 +26,7 @@
+ #define EVENT_ELEMENT           "event"
+ #define DESCRIPTION_ELEMENT     "description"
+ #define NAME_ELEMENT            "name"
++#define PRIORITY_ELEMENT        "priority"
+ 
+ static void start_element(GMarkupParseContext *context,
+                   const gchar *element_name,
+@@ -134,9 +135,26 @@ static void text(GMarkupParseContext *context,
+                 }
+             }
+         }
+-
+     }
+ 
++    else if(strcmp(inner_element, PRIORITY_ELEMENT) == 0)
++    {
++        log_debug("workflow priority:'%s'", text);
++
++        char *end = NULL;
++        long long val = strtoll(text, &end, 10);
++
++        if (text == end || end[0] != '\0'
++            || (errno == ERANGE && (val == LLONG_MAX || val == LLONG_MIN))
++            || (val > INT_MAX || val < INT_MIN)
++            || (errno != 0 && val == 0))
++        {
++            error_msg("Workflow's priority is not a number in range <%d,%d>", INT_MIN, INT_MAX);
++            return;
++        }
++
++        wf_set_priority(workflow, (int)val);
++    }
+ }
+ 
+   // Called for strings that should be re-saved verbatim in this same
+-- 
+1.8.3.1
+
diff --git a/0004-define-priorities-for-the-existing-workflows.patch b/0004-define-priorities-for-the-existing-workflows.patch
new file mode 100644
index 0000000..f50c006
--- /dev/null
+++ b/0004-define-priorities-for-the-existing-workflows.patch
@@ -0,0 +1,163 @@
+From b3f6d615ce53310bd05622492357cc06c7e875c6 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 14:00:14 +0200
+Subject: [LIBREPORT PATCH 04/10] define priorities for the existing workflows
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/workflows/workflow_AnacondaFedora.xml.in       | 1 +
+ src/workflows/workflow_AnacondaRHEL.xml.in         | 1 +
+ src/workflows/workflow_AnacondaRHELBugzilla.xml.in | 1 +
+ src/workflows/workflow_RHELCCpp.xml.in             | 1 +
+ src/workflows/workflow_RHELJava.xml.in             | 1 +
+ src/workflows/workflow_RHELKerneloops.xml.in       | 1 +
+ src/workflows/workflow_RHELLibreport.xml.in        | 1 +
+ src/workflows/workflow_RHELPython.xml.in           | 1 +
+ src/workflows/workflow_RHELvmcore.xml.in           | 1 +
+ src/workflows/workflow_RHELxorg.xml.in             | 1 +
+ src/workflows/workflow_Upload.xml.in               | 3 ++-
+ 11 files changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/src/workflows/workflow_AnacondaFedora.xml.in b/src/workflows/workflow_AnacondaFedora.xml.in
+index 6322d9a..5deab24 100644
+--- a/src/workflows/workflow_AnacondaFedora.xml.in
++++ b/src/workflows/workflow_AnacondaFedora.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report a bug to Fedora maintainers</_name>
+     <_description>Process the report using the Fedora infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>report_Bugzilla</event>
+diff --git a/src/workflows/workflow_AnacondaRHEL.xml.in b/src/workflows/workflow_AnacondaRHEL.xml.in
+index 4400546..ef4f658 100644
+--- a/src/workflows/workflow_AnacondaRHEL.xml.in
++++ b/src/workflows/workflow_AnacondaRHEL.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report a bug to Red Hat Customer Portal</_name>
+     <_description>Process the report using the Red Hat infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>report_RHTSupport</event>
+diff --git a/src/workflows/workflow_AnacondaRHELBugzilla.xml.in b/src/workflows/workflow_AnacondaRHELBugzilla.xml.in
+index fd7853f..e2f8b57 100644
+--- a/src/workflows/workflow_AnacondaRHELBugzilla.xml.in
++++ b/src/workflows/workflow_AnacondaRHELBugzilla.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report a bug to Red Hat Bugzilla</_name>
+     <_description>Process the report using the Red Hat infrastructure</_description>
++    <priority>98</priority>
+ 
+     <events>
+         <event>report_Bugzilla</event>
+diff --git a/src/workflows/workflow_RHELCCpp.xml.in b/src/workflows/workflow_RHELCCpp.xml.in
+index 4d0251a..a6df6eb 100644
+--- a/src/workflows/workflow_RHELCCpp.xml.in
++++ b/src/workflows/workflow_RHELCCpp.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report to Red Hat Customer Portal</_name>
+     <_description>Process the C/C++ crash using the Red Hat infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELJava.xml.in b/src/workflows/workflow_RHELJava.xml.in
+index 23ef0cb..2adc4b7 100644
+--- a/src/workflows/workflow_RHELJava.xml.in
++++ b/src/workflows/workflow_RHELJava.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report to Red Hat Customer Portal</_name>
+     <_description>Process the Java exception using the Red Hat infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELKerneloops.xml.in b/src/workflows/workflow_RHELKerneloops.xml.in
+index 941a898..d8d3b18 100644
+--- a/src/workflows/workflow_RHELKerneloops.xml.in
++++ b/src/workflows/workflow_RHELKerneloops.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report to Red Hat Customer Portal</_name>
+     <_description>Process the kerneloops using the Red Hat infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELLibreport.xml.in b/src/workflows/workflow_RHELLibreport.xml.in
+index b8b4f04..e76bf13 100644
+--- a/src/workflows/workflow_RHELLibreport.xml.in
++++ b/src/workflows/workflow_RHELLibreport.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report to Red Hat Customer Portal</_name>
+     <_description>Process the problem using the Red Hat infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>report_RHTSupport</event>
+diff --git a/src/workflows/workflow_RHELPython.xml.in b/src/workflows/workflow_RHELPython.xml.in
+index ee1c4e7..15a8978 100644
+--- a/src/workflows/workflow_RHELPython.xml.in
++++ b/src/workflows/workflow_RHELPython.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report to Red Hat Customer Portal</_name>
+     <_description>Process the python exception using the Red Hat infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELvmcore.xml.in b/src/workflows/workflow_RHELvmcore.xml.in
+index f2a775d..3984129 100644
+--- a/src/workflows/workflow_RHELvmcore.xml.in
++++ b/src/workflows/workflow_RHELvmcore.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report to Red Hat Customer Portal</_name>
+     <_description>Process the kernel crash using the Red Hat infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>collect_*</event>
+diff --git a/src/workflows/workflow_RHELxorg.xml.in b/src/workflows/workflow_RHELxorg.xml.in
+index 13697b9..55cd88d 100644
+--- a/src/workflows/workflow_RHELxorg.xml.in
++++ b/src/workflows/workflow_RHELxorg.xml.in
+@@ -2,6 +2,7 @@
+ <workflow>
+     <_name>Report to Red Hat Customer Portal</_name>
+     <_description>Process the X Server problem using the Red Hat infrastructure</_description>
++    <priority>99</priority>
+ 
+     <events>
+         <event>report_RHTSupport</event>
+diff --git a/src/workflows/workflow_Upload.xml.in b/src/workflows/workflow_Upload.xml.in
+index 3965f99..7f22cb8 100644
+--- a/src/workflows/workflow_Upload.xml.in
++++ b/src/workflows/workflow_Upload.xml.in
+@@ -2,10 +2,11 @@
+ <workflow>
+     <_name>Upload the problem data to a server</_name>
+     <_description>Analyze the problem locally and upload the data via scp or ftp</_description>
++    <priority>-99</priority>
+ 
+     <events>
+         <event>collect_*</event>
+         <event>analyze_CCpp</event>
+         <event>report_Uploader</event>
+     </events>
+-</workflow>
+\ No newline at end of file
++</workflow>
+-- 
+1.8.3.1
+
diff --git a/0005-less-confusing-label-for-upload-data-in-Anaconda.patch b/0005-less-confusing-label-for-upload-data-in-Anaconda.patch
new file mode 100644
index 0000000..4e81122
--- /dev/null
+++ b/0005-less-confusing-label-for-upload-data-in-Anaconda.patch
@@ -0,0 +1,41 @@
+From 5f83c373c89a0e91a75a53184ce896426385293c Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 14:30:51 +0200
+Subject: [LIBREPORT PATCH 05/10] less confusing label for 'upload data' in
+ Anaconda
+
+Because 'Upload the problem data' might evoke the automatic bug creation
+in the Bugzilla.
+
+We know that users (an me as well) read fast and do not read the entire
+sentences. Hence the first words of a button's label must express the
+purpose of that button.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/workflows/workflow_AnacondaUpload.xml.in | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/workflows/workflow_AnacondaUpload.xml.in b/src/workflows/workflow_AnacondaUpload.xml.in
+index a98a536..541c898 100644
+--- a/src/workflows/workflow_AnacondaUpload.xml.in
++++ b/src/workflows/workflow_AnacondaUpload.xml.in
+@@ -1,9 +1,9 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <workflow>
+-    <_name>Upload the problem data to a server</_name>
+-    <_description>Analyze the problem locally and upload the data via scp or ftp</_description>
++    <_name>Export the problem data for manual reporting</_name>
++    <_description>Upload the data via scp or ftp to a remote destination</_description>
+ 
+     <events>
+         <event>report_Uploader</event>
+     </events>
+-</workflow>
+\ No newline at end of file
++</workflow>
+-- 
+1.8.3.1
+
diff --git a/0006-Bugzilla-move-the-advanced-options-to-the-advanced-s.patch b/0006-Bugzilla-move-the-advanced-options-to-the-advanced-s.patch
new file mode 100644
index 0000000..a54b6dd
--- /dev/null
+++ b/0006-Bugzilla-move-the-advanced-options-to-the-advanced-s.patch
@@ -0,0 +1,89 @@
+From c02413504497dc1477fade9495ea26281d463b52 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 14:42:42 +0200
+Subject: [LIBREPORT PATCH 06/10] Bugzilla: move the advanced options to the
+ advanced section
+
+Keep only login and password fields in the configuration dialogue.
+
+URL is not changed often enough to be the first field in the
+configuration dialogue. Normal users do not changed neither URL option
+nor SSL Verify option.
+
+Private ticket option should also not been checked by default. The
+reporting user might request to restrict access to a bug report during
+the reporting process.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/plugins/report_Bugzilla.xml.in | 34 +++++++++++++++++-----------------
+ 1 file changed, 17 insertions(+), 17 deletions(-)
+
+diff --git a/src/plugins/report_Bugzilla.xml.in b/src/plugins/report_Bugzilla.xml.in
+index 79f2bcd..7fc596e 100644
+--- a/src/plugins/report_Bugzilla.xml.in
++++ b/src/plugins/report_Bugzilla.xml.in
+@@ -12,34 +12,29 @@
+     <gui-review-elements>yes</gui-review-elements>
+ 
+     <options>
+-        <option type="text" name="Bugzilla_BugzillaURL">
+-            <_label>Bugzilla URL</_label>
+-            <allow-empty>no</allow-empty>
+-            <_description>Address of Bugzilla server</_description>
+-            <default-value>https://bugzilla.redhat.com</default-value>
+-            <_note-html>You can create bugzilla.redhat.com account &lt;a href="https://bugzilla.redhat.com/createaccount.cgi"&gt;here&lt;/a&gt;</_note-html>
+-        </option>
+         <option type="text" name="Bugzilla_Login">
+             <_label>User name</_label>
+             <allow-empty>no</allow-empty>
+             <_description>Bugzilla account user name</_description>
++            <_note-html>You can create bugzilla.redhat.com account &lt;a href="https://bugzilla.redhat.com/createaccount.cgi"&gt;here&lt;/a&gt;</_note-html>
+         </option>
+         <option type="password" name="Bugzilla_Password">
+             <_label>Password</_label>
+             <allow-empty>no</allow-empty>
+             <_description>Bugzilla account password</_description>
+         </option>
+-        <option type="bool" name="Bugzilla_SSLVerify">
+-            <_label>Verify SSL</_label>
+-            <_description>Check SSL key validity</_description>
+-            <default-value>yes</default-value>
+-        </option>
+-        <option type="bool" name="Bugzilla_CreatePrivate">
+-            <_label>Restrict access</_label>
+-            <_description>Restrict access to the created bugzilla ticket allowing only users from specified groups to view it (see advanced settings for more details)</_description>
+-            <default-value>no</default-value>
+-        </option>
+         <advanced-options>
++            <option type="text" name="Bugzilla_BugzillaURL">
++                <_label>Bugzilla URL</_label>
++                <allow-empty>no</allow-empty>
++                <_description>Address of Bugzilla server</_description>
++                <default-value>https://bugzilla.redhat.com</default-value>
++            </option>
++            <option type="bool" name="Bugzilla_SSLVerify">
++                <_label>Verify SSL</_label>
++                <_description>Check SSL key validity</_description>
++                <default-value>yes</default-value>
++            </option>
+             <option type="text" name="Bugzilla_Product">
+                 <_label>Bugzilla product</_label>
+                 <allow-empty>yes</allow-empty>
+@@ -60,6 +55,11 @@
+                 <allow-empty>yes</allow-empty>
+                 <_note-html>Sets the proxy server to use for HTTPS</_note-html>
+             </option>
++            <option type="bool" name="Bugzilla_CreatePrivate">
++                <_label>Restrict access</_label>
++                <_description>Restrict access to the created bugzilla ticket allowing only users from specified groups to view it (see advanced settings for more details)</_description>
++                <default-value>no</default-value>
++            </option>
+             <option type="text" name="Bugzilla_PrivateGroups">
+                 <_label>Groups</_label>
+                 <allow-empty>yes</allow-empty>
+-- 
+1.8.3.1
+
diff --git a/0007-hide-Don-t-store-password-checkbox.patch b/0007-hide-Don-t-store-password-checkbox.patch
new file mode 100644
index 0000000..b66f9fe
--- /dev/null
+++ b/0007-hide-Don-t-store-password-checkbox.patch
@@ -0,0 +1,34 @@
+From 2bca7670971b25bf83605b89469e9b8195e73860 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Mon, 28 Apr 2014 15:49:26 +0200
+Subject: [LIBREPORT PATCH 07/10] hide "Don't store password" checkbox
+
+Show the checkbox only if the options can be stored. For example, it does
+not make sense to show this checkbox when in Anaconda.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gtk-helpers/event_config_dialog.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/src/gtk-helpers/event_config_dialog.c b/src/gtk-helpers/event_config_dialog.c
+index 1ed5196..ff3e38b 100644
+--- a/src/gtk-helpers/event_config_dialog.c
++++ b/src/gtk-helpers/event_config_dialog.c
+@@ -237,7 +237,10 @@ config_dialog_t *create_event_config_dialog_content(event_config_t *event, GtkWi
+     g_list_foreach(event->options, &add_option_to_table, option_table);
+ 
+     /* if there is at least one password option, add checkbox to disable storing passwords */
+-    if (has_password_option)
++    /* if the user storage is not available nothing is to be stored, so it is not necessary
++     * to bother with an extra checkbox about storing passwords */
++    if (is_event_config_user_storage_available()
++            && has_password_option)
+     {
+         unsigned last_row = add_one_row_to_grid(GTK_GRID(option_table));
+         GtkWidget *pass_store_cb = gtk_check_button_new_with_label(_("Don't store passwords"));
+-- 
+1.8.3.1
+
diff --git a/0008-refactoring-unify-event-configuration-dialogs.patch b/0008-refactoring-unify-event-configuration-dialogs.patch
new file mode 100644
index 0000000..7955439
--- /dev/null
+++ b/0008-refactoring-unify-event-configuration-dialogs.patch
@@ -0,0 +1,158 @@
+From c134783d5c9fc8ba6691408ce9b3015ab368ad16 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 29 Apr 2014 09:49:23 +0200
+Subject: [LIBREPORT PATCH 08/10] refactoring: unify event configuration
+ dialogs
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gtk-helpers/config_dialog.c          | 40 ++++++++++++++-----------
+ src/gtk-helpers/event_config_dialog.c    | 51 +++-----------------------------
+ src/gtk-helpers/internal_libreport_gtk.h |  1 +
+ 3 files changed, 28 insertions(+), 64 deletions(-)
+
+diff --git a/src/gtk-helpers/config_dialog.c b/src/gtk-helpers/config_dialog.c
+index 6cc4be9..6de08e3 100644
+--- a/src/gtk-helpers/config_dialog.c
++++ b/src/gtk-helpers/config_dialog.c
+@@ -83,6 +83,28 @@ gpointer cdialog_get_data(config_dialog_t *cdialog)
+     return cdialog->data;
+ }
+ 
++int cdialog_run(config_dialog_t *cdialog, const char *name)
++{
++    if (cdialog == NULL || cdialog->dialog == NULL)
++    {
++        log("There is no configurable option for: '%s'", name);
++        return GTK_RESPONSE_REJECT;
++    }
++
++    const int result = gtk_dialog_run(GTK_DIALOG(cdialog->dialog));
++    if (result == GTK_RESPONSE_APPLY)
++    {
++        if (cdialog->save_data)
++            cdialog->save_data(cdialog->data, name);
++    }
++    else if (result == GTK_RESPONSE_CANCEL)
++        log_notice("Cancelling on user request");
++
++    gtk_widget_hide(GTK_WIDGET(cdialog->dialog));
++
++    return result;
++}
++
+ static const void *get_column_value_from_row(GtkTreeView *treeview, int column, int type)
+ {
+     GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+@@ -246,23 +268,7 @@ static void on_configure_cb(GtkWidget *btn, gpointer user_data)
+     config_dialog_t *cdialog = (config_dialog_t *)get_column_value_from_row(tv, CONFIG_DIALOG, TYPE_POINTER);
+     const char *name = (const char *)get_column_value_from_row(tv, COLUMN_NAME, TYPE_STR);
+ 
+-
+-    if (cdialog == NULL || cdialog->dialog == NULL)
+-    {
+-        log("There is no configurable option for: '%s'", name);
+-        return;
+-    }
+-
+-    int result = gtk_dialog_run(GTK_DIALOG(cdialog->dialog));
+-    if (result == GTK_RESPONSE_APPLY)
+-    {
+-        if (cdialog->save_data)
+-            cdialog->save_data(cdialog->data, name);
+-    }
+-    else if (result == GTK_RESPONSE_CANCEL)
+-        log_notice("Cancelling on user request");
+-
+-    gtk_widget_hide(GTK_WIDGET(cdialog->dialog));
++    cdialog_run(cdialog, name);
+ }
+ 
+ static void on_close_cb(GtkWidget *btn, gpointer config_list_w)
+diff --git a/src/gtk-helpers/event_config_dialog.c b/src/gtk-helpers/event_config_dialog.c
+index ff3e38b..655abb6 100644
+--- a/src/gtk-helpers/event_config_dialog.c
++++ b/src/gtk-helpers/event_config_dialog.c
+@@ -319,7 +319,7 @@ config_dialog_t *create_event_config_dialog(const char *event_name, GtkWindow *p
+     if (parent_window != NULL)
+     {
+         gtk_window_set_icon_name(GTK_WINDOW(dialog),
+-        gtk_window_get_icon_name(parent_window));
++                                 gtk_window_get_icon_name(parent_window));
+     }
+ 
+     GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+@@ -349,53 +349,10 @@ int show_event_config_dialog(const char *event_name, GtkWindow *parent)
+ {
+     INITIALIZE_LIBREPORT();
+ 
+-    event_config_t *event = get_event_config(event_name);
+-
+-    GtkWindow *parent_window = parent ? parent : g_event_list_window;
+-
+-    GtkWidget *dialog = gtk_dialog_new_with_buttons(
+-                        /*title:*/ec_get_screen_name(event) ? ec_get_screen_name(event) : event_name,
+-                        parent_window,
+-                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+-                        _("_Cancel"),
+-                        GTK_RESPONSE_CANCEL,
+-                        _("_OK"),
+-                        GTK_RESPONSE_APPLY,
+-                        NULL);
+-
+-    /* Allow resize?
+-     * W/o resize, e.g. upload configuration hint looks awfully
+-     * line wrapped.
+-     * With resize, there are some somewhat not nice effects:
+-     * for one, opening an expander will enlarge window,
+-     * but won't contract it back when expander is closed.
+-     */
+-    gtk_window_set_resizable(GTK_WINDOW(dialog), true);
+-    gtk_window_set_default_size(GTK_WINDOW(dialog), 450, -1);
++    config_dialog_t *dialog = create_event_config_dialog(event_name, parent);
++    const int result = cdialog_run(dialog, event_name);
++    free(dialog);
+ 
+-    if (parent_window != NULL)
+-    {
+-        gtk_window_set_icon_name(GTK_WINDOW(dialog),
+-                gtk_window_get_icon_name(parent_window));
+-    }
+-
+-    GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+-    content = cdialog_get_widget(create_event_config_dialog_content(event, content));
+-
+-    gtk_widget_show_all(content);
+-
+-    int result = gtk_dialog_run(GTK_DIALOG(dialog));
+-    if (result == GTK_RESPONSE_APPLY)
+-    {
+-        dehydrate_config_dialog(g_option_list);
+-        const char *const store_passwords_s = get_user_setting("store_passwords");
+-        save_event_config_data_to_user_storage(event_name,
+-                                               get_event_config(event_name),
+-                                               !(store_passwords_s && !strcmp(store_passwords_s, "no")));
+-    }
+-    //else if (result == GTK_RESPONSE_CANCEL)
+-    //    log("log");
+-    gtk_widget_destroy(dialog);
+     return result;
+ }
+ 
+diff --git a/src/gtk-helpers/internal_libreport_gtk.h b/src/gtk-helpers/internal_libreport_gtk.h
+index dc1ef31..f8f1c13 100644
+--- a/src/gtk-helpers/internal_libreport_gtk.h
++++ b/src/gtk-helpers/internal_libreport_gtk.h
+@@ -80,6 +80,7 @@ void load_workflow_config_data_from_user_storage(GHashTable *workflows);
+ void cdialog_set_widget(config_dialog_t *cdialog, GtkWidget *widget);
+ GtkWidget *cdialog_get_widget(config_dialog_t *cdialog);
+ gpointer cdialog_get_data(config_dialog_t *cdialog);
++int cdialog_run(config_dialog_t *cdialog, const char *name);
+ 
+ void dehydrate_config_dialog(GList *option_widgets);
+ 
+-- 
+1.8.3.1
+
diff --git a/0009-GUI-remove-the-intermediate-configuration-dialog.patch b/0009-GUI-remove-the-intermediate-configuration-dialog.patch
new file mode 100644
index 0000000..072036f
--- /dev/null
+++ b/0009-GUI-remove-the-intermediate-configuration-dialog.patch
@@ -0,0 +1,178 @@
+From 3767a3665339aaf6da005f4ac8ba7e1091f5fd7f Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 29 Apr 2014 12:43:27 +0200
+Subject: [LIBREPORT PATCH 09/10] GUI: remove the intermediate configuration
+ dialog
+
+Get rid of the dialog stating that something is not configured properly
+and show the configuration dialog instead.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/gtk-helpers/event_config_dialog.c    |  7 +++-
+ src/gtk-helpers/workflow_config_dialog.c |  7 +++-
+ src/gui-wizard-gtk/wizard.c              | 72 +++-----------------------------
+ 3 files changed, 17 insertions(+), 69 deletions(-)
+
+diff --git a/src/gtk-helpers/event_config_dialog.c b/src/gtk-helpers/event_config_dialog.c
+index 655abb6..0c65f80 100644
+--- a/src/gtk-helpers/event_config_dialog.c
++++ b/src/gtk-helpers/event_config_dialog.c
+@@ -299,8 +299,11 @@ config_dialog_t *create_event_config_dialog(const char *event_name, GtkWindow *p
+ 
+     GtkWindow *parent_window = parent ? parent : g_event_list_window;
+ 
++    char *window_title = xasprintf("%s - Reporting Configuration",
++            ec_get_screen_name(event) ? ec_get_screen_name(event) : event_name);
++
+     GtkWidget *dialog = gtk_dialog_new_with_buttons(
+-                        /*title:*/ec_get_screen_name(event) ? ec_get_screen_name(event) : event_name,
++                        window_title,
+                         parent_window,
+                         GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                         _("_Cancel"),
+@@ -309,6 +312,8 @@ config_dialog_t *create_event_config_dialog(const char *event_name, GtkWindow *p
+                         GTK_RESPONSE_APPLY,
+                         NULL);
+ 
++    free(window_title);
++
+     /* Allow resize?
+      * W/o resize, e.g. upload configuration hint looks awfully
+      * line wrapped.
+diff --git a/src/gtk-helpers/workflow_config_dialog.c b/src/gtk-helpers/workflow_config_dialog.c
+index 7c399e4..e6e48c9 100644
+--- a/src/gtk-helpers/workflow_config_dialog.c
++++ b/src/gtk-helpers/workflow_config_dialog.c
+@@ -71,8 +71,11 @@ config_dialog_t *create_workflow_config_dialog(const char *workflow_name, GtkWin
+ 
+     GtkWindow *parent_window = parent ? parent : g_parent_window;
+ 
++    char *window_title = xasprintf("%s - Reporting Configuration",
++            wf_get_screen_name(workflow) ? wf_get_screen_name(workflow) : workflow_name);
++
+     GtkWidget *dialog = gtk_dialog_new_with_buttons(
+-                        /*title:*/ wf_get_screen_name(workflow) ? wf_get_screen_name(workflow) : workflow_name,
++                        window_title,
+                         parent_window,
+                         GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                         _("_Cancel"),
+@@ -81,6 +84,8 @@ config_dialog_t *create_workflow_config_dialog(const char *workflow_name, GtkWin
+                         GTK_RESPONSE_APPLY,
+                         NULL);
+ 
++    free(window_title);
++
+     gtk_window_set_resizable(GTK_WINDOW(dialog), true);
+     gtk_window_set_default_size(GTK_WINDOW(dialog), 450, 450);
+ 
+diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
+index e6f6ee7..8895d0e 100644
+--- a/src/gui-wizard-gtk/wizard.c
++++ b/src/gui-wizard-gtk/wizard.c
+@@ -289,59 +289,6 @@ static void remove_child_widget(GtkWidget *widget, gpointer unused)
+     gtk_widget_destroy(widget);
+ }
+ 
+-static void on_configure_event_cb(GtkWidget *button, gpointer user_data)
+-{
+-    char *event_name = (char *)user_data;
+-    if (event_name != NULL)
+-    {
+-        int result = show_event_config_dialog(event_name, GTK_WINDOW(g_top_most_window));
+-        if (result == GTK_RESPONSE_APPLY)
+-        {
+-            GHashTable *errors = validate_event(event_name);
+-            if (errors == NULL)
+-            {
+-                gtk_widget_destroy(g_top_most_window);
+-                g_top_most_window = NULL;
+-            }
+-        }
+-    }
+-}
+-
+-static void show_event_opt_error_dialog(const char *event_name)
+-{
+-    event_config_t *ec = get_event_config(event_name);
+-    char *message = xasprintf(_("%s is not properly configured. You can configure it now or provide the required information later.\n\n"
+-                              "Read more about the configuration at: https://fedorahosted.org/abrt/wiki/AbrtConfiguration"),
+-                               ec_get_screen_name(ec));
+-    char *markup_message = xasprintf(_("<b>%s</b> is not properly configured. You can configure it now or provide the required information later.\n\n"
+-                              "<a href=\"https://fedorahosted.org/abrt/wiki/AbrtConfiguration\">Read more about the configuration</a>"),
+-                               ec_get_screen_name(ec));
+-    GtkWidget *wrong_settings = g_top_most_window = gtk_message_dialog_new(GTK_WINDOW(g_wnd_assistant),
+-        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+-        GTK_MESSAGE_WARNING,
+-        GTK_BUTTONS_CLOSE,
+-        message);
+-
+-    gtk_window_set_transient_for(GTK_WINDOW(wrong_settings), GTK_WINDOW(g_wnd_assistant));
+-    gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(wrong_settings),
+-                                    markup_message);
+-    free(message);
+-    free(markup_message);
+-
+-    GtkWidget *act_area = gtk_dialog_get_content_area(GTK_DIALOG(wrong_settings));
+-    char * conf_btn_lbl = xasprintf(_("Con_figure %s"), ec_get_screen_name(ec));
+-    GtkWidget *configure_event_btn = gtk_button_new_with_mnemonic(conf_btn_lbl);
+-    g_signal_connect(configure_event_btn, "clicked", G_CALLBACK(on_configure_event_cb), (gpointer)event_name);
+-    free(conf_btn_lbl);
+-
+-    gtk_box_pack_start(GTK_BOX(act_area), configure_event_btn, false, false, 0);
+-    gtk_widget_show(configure_event_btn);
+-
+-
+-    gtk_dialog_run(GTK_DIALOG(wrong_settings));
+-    if (g_top_most_window)
+-        gtk_widget_destroy(wrong_settings);
+-}
+ 
+ static void update_window_title(void)
+ {
+@@ -906,16 +853,14 @@ static gint find_by_button(gconstpointer a, gconstpointer button)
+     return (evdata->toggle_button != button);
+ }
+ 
+-static int check_event_config(const char *event_name)
++static void check_event_config(const char *event_name)
+ {
+     GHashTable *errors = validate_event(event_name);
+     if (errors != NULL)
+     {
+         g_hash_table_unref(errors);
+-        show_event_opt_error_dialog(event_name);
+-        return 1;
++        show_event_config_dialog(event_name, GTK_WINDOW(g_top_most_window));
+     }
+-    return 0;
+ }
+ 
+ static void event_rb_was_toggled(GtkButton *button, gpointer user_data)
+@@ -2850,18 +2795,11 @@ static gint select_next_page_no(gint current_page_no, gpointer data)
+                 goto again;
+             }
+ 
+-            /* must set g_event_selected otherwise if the event was not
+-             * configured the reporting process will be terminated even if a
+-             * user configured the event on report-gtk's demand from
+-             * check_event_config() function
+-             */
+             g_event_selected = event;
+ 
+-            if (check_event_config(g_event_selected) != 0)
+-            {
+-                /* don't know what is the difference between this <<< */
+-                goto again;
+-            }
++            /* Notify a user that some configuration options miss values, but */
++            /* don't force him to provide them. */
++            check_event_config(g_event_selected);
+ 
+             /* >>> and this but this is clearer
+              * because it does exactly the same thing
+-- 
+1.8.3.1
+
diff --git a/0010-reporter-upload-more-descriptive-message-about-missi.patch b/0010-reporter-upload-more-descriptive-message-about-missi.patch
new file mode 100644
index 0000000..aea31be
--- /dev/null
+++ b/0010-reporter-upload-more-descriptive-message-about-missi.patch
@@ -0,0 +1,32 @@
+From 369b1791e3fff5ea16cdf1fe9ba5c374af7faa43 Mon Sep 17 00:00:00 2001
+From: Jakub Filak <jfilak at redhat.com>
+Date: Tue, 29 Apr 2014 13:24:29 +0200
+Subject: [LIBREPORT PATCH 10/10] reporter-upload: more descriptive message
+ about missing URL
+
+Only one line is possible. Hopefully, this message is better than the
+previous one.
+
+Related to #259
+
+Signed-off-by: Jakub Filak <jfilak at redhat.com>
+---
+ src/plugins/reporter-upload.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/plugins/reporter-upload.c b/src/plugins/reporter-upload.c
+index b903aa1..1ef38e7 100644
+--- a/src/plugins/reporter-upload.c
++++ b/src/plugins/reporter-upload.c
+@@ -58,7 +58,7 @@ static int create_and_upload_archive(
+     const char* opt = getenv("Upload_URL");
+     if (!opt)
+         opt = get_map_string_item_or_empty(settings, "URL");
+-    char *url = opt[0] != '\0' ? xstrdup(opt) : ask_url(_("Upload URL is not provided by configuration. Please enter upload URL:"));
++    char *url = opt[0] != '\0' ? xstrdup(opt) : ask_url(_("Please enter a URL (scp, ftp, etc.) where the problem data is to be exported:"));
+ 
+     /* Create a child gzip which will compress the data */
+     /* SELinux guys are not happy with /tmp, using /var/run/abrt */
+-- 
+1.8.3.1
+
diff --git a/libreport.spec b/libreport.spec
index de3a767..8da2fa4 100644
--- a/libreport.spec
+++ b/libreport.spec
@@ -7,7 +7,7 @@
 Summary: Generic library for reporting various problems
 Name: libreport
 Version: 2.2.2
-Release: 2%{?dist}
+Release: 3%{?dist}
 License: GPLv2+
 Group: System Environment/Libraries
 URL: https://fedorahosted.org/abrt/
@@ -16,6 +16,14 @@ Source1: autogen.sh
 
 Patch01: 0001-Bugzilla-pass-Bugzilla_token-in-all-relevant-XML-RPC.patch
 Patch02: 0002-Bugzilla-session-parameters-for-XML-RPC-calls.patch
+Patch03: 0003-Worklflow-order-workflows-according-to-their-priorit.patch
+Patch04: 0004-define-priorities-for-the-existing-workflows.patch
+Patch05: 0005-less-confusing-label-for-upload-data-in-Anaconda.patch
+Patch06: 0006-Bugzilla-move-the-advanced-options-to-the-advanced-s.patch
+Patch07: 0007-hide-Don-t-store-password-checkbox.patch
+Patch08: 0008-refactoring-unify-event-configuration-dialogs.patch
+Patch09: 0009-GUI-remove-the-intermediate-configuration-dialog.patch
+Patch10: 0010-reporter-upload-more-descriptive-message-about-missi.patch
 
 # git is need for '%%autosetup -S git' which automatically applies all the
 # patches above. Please, be aware that the patches must be generated
@@ -654,6 +662,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 
 
 %changelog
+* Wed Apr 30 2014 Jakub Filak <jfilak at redhat.com> - 2.2.2-3
+- improve User Experience in Anaconda
+
 * Thu Apr 24 2014 Jakub Filak <jfilak at redhat.com> - 2.2.2-2
 - Bugzilla: pass Bugzilla_token in every XML RPC call
 


More information about the scm-commits mailing list