View | Details | Raw Unified | Return to bug 41199
Collapse All | Expand All

(-)a/installer/data/mysql/atomicupdate/bug_41199_add_labels_to_advsearch.pl (+17 lines)
Line 0 Link Here
1
use Modern::Perl;
2
use Koha::Installer::Output qw(say_warning say_success say_info);
3
4
return {
5
    bug_number  => "41199",
6
    description => "Add a way to enable/disable search input field labels",
7
    up          => sub {
8
        my ($args) = @_;
9
        my ( $dbh, $out ) = @$args{qw(dbh out)};
10
11
        $dbh->do(
12
            q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('OPACShowLabelsForSearchInputs','0',NULL,'If enabled, show labels beside each input field related to search inputs','YesNo')}
13
        );
14
15
        say_success( $out, "Added new system preference 'OPACShowLabelsForSearchInputs'" );
16
    },
17
};
(-)a/installer/data/mysql/mandatory/sysprefs.sql (+1 lines)
Lines 576-581 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
576
('OPACShibOnly','0',NULL,'If ON enables shibboleth only authentication for the opac','YesNo'),
576
('OPACShibOnly','0',NULL,'If ON enables shibboleth only authentication for the opac','YesNo'),
577
('OPACShowCheckoutName','0',NULL,'Displays in the OPAC the name of patron who has checked out the material. WARNING: Most sites should leave this off. It is intended for corporate or special sites which need to track who has the item.','YesNo'),
577
('OPACShowCheckoutName','0',NULL,'Displays in the OPAC the name of patron who has checked out the material. WARNING: Most sites should leave this off. It is intended for corporate or special sites which need to track who has the item.','YesNo'),
578
('OPACShowHoldQueueDetails','none','none|priority|holds|holds_priority','Show holds details in OPAC','Choice'),
578
('OPACShowHoldQueueDetails','none','none|priority|holds|holds_priority','Show holds details in OPAC','Choice'),
579
('OPACShowLabelsForSearchInputs', '0', NULL, 'If enabled, show labels beside each input field related to search inputs', 'YesNo'),
579
('OPACShowLibraries', '1', NULL, 'If enabled, a "Libraries" link appears in the OPAC pointing to a page with library information', 'YesNo'),
580
('OPACShowLibraries', '1', NULL, 'If enabled, a "Libraries" link appears in the OPAC pointing to a page with library information', 'YesNo'),
580
('OPACShowMusicalInscripts','0',NULL,'Display musical inscripts on the OPAC record details page when available.','YesNo'),
581
('OPACShowMusicalInscripts','0',NULL,'Display musical inscripts on the OPAC record details page when available.','YesNo'),
581
('OPACShowOpenURL', '0', NULL, 'Enable display of OpenURL links in OPAC search results and detail page', 'YesNo'),
582
('OPACShowOpenURL', '0', NULL, 'Enable display of OpenURL links in OPAC search results and detail page', 'YesNo'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref (+8 lines)
Lines 42-47 OPAC: Link Here
42
                  0: Disable
42
                  0: Disable
43
            - "Koha OPAC as public. Private OPAC requires authentication before accessing the OPAC. "
43
            - "Koha OPAC as public. Private OPAC requires authentication before accessing the OPAC. "
44
            - 'Note: This does not affect the public API, see the <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=RESTPublicAnonymousRequests">RESTPublicAnonymousRequests</a> to control the API.'
44
            - 'Note: This does not affect the public API, see the <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=RESTPublicAnonymousRequests">RESTPublicAnonymousRequests</a> to control the API.'
45
46
        -
47
            - pref: OPACShowLabelsForSearchInputs
48
              choices:
49
                  1: "Show"
50
                  0: "Don't show"
51
            - "labels beside each of the search input fields."
52
45
        -
53
        -
46
            - pref: OPACShowLibraries
54
            - pref: OPACShowLibraries
47
              choices:
55
              choices:
(-)a/koha-tmpl/opac-tmpl/bootstrap/css/src/_responsive.scss (-6 lines)
Lines 221-232 Link Here
221
221
222
@media only screen and ( max-width: 700px ) {
222
@media only screen and ( max-width: 700px ) {
223
    /* Screens below 700 pixels wide */
223
    /* Screens below 700 pixels wide */
224
    #opac-main-search {
225
        label {
226
            display: none;
227
        }
228
    }
229
230
    #logo {
224
    #logo {
231
        background: transparent url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 13 13'><g><g><path d='M2.2 6.6V13h2.83V8.9H8.2V13h2.83V6.6z'/><path d='M13.23 6.64H0L6.6 0z'/></g></g></svg>" ) no-repeat;
225
        background: transparent url( "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 13 13'><g><g><path d='M2.2 6.6V13h2.83V8.9H8.2V13h2.83V6.6z'/><path d='M13.23 6.64H0L6.6 0z'/></g></g></svg>" ) no-repeat;
232
        margin: 14px;
226
        margin: 14px;
(-)a/koha-tmpl/opac-tmpl/bootstrap/css/src/opac.scss (+7 lines)
Lines 235-240 th { Link Here
235
#advsearches,
235
#advsearches,
236
#booleansearch {
236
#booleansearch {
237
    label {
237
    label {
238
        color: #727272;
239
        display: block;
240
        font-size: 110%;
241
        font-weight: bold;
242
    }
243
244
    label[for^="search-field_"] {
238
        display: inline;
245
        display: inline;
239
    }
246
    }
240
}
247
}
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/includes/masthead.inc (-21 / +38 lines)
Lines 17-22 Link Here
17
[% SET CookieConsentBar = AdditionalContents.get( location => "CookieConsentBar", lang => lang, library => branchcode || default_branch ) %]
17
[% SET CookieConsentBar = AdditionalContents.get( location => "CookieConsentBar", lang => lang, library => branchcode || default_branch ) %]
18
[% SET CookieConsentPopup = AdditionalContents.get( location => "CookieConsentPopup", lang => lang, library => branchcode || default_branch ) %]
18
[% SET CookieConsentPopup = AdditionalContents.get( location => "CookieConsentPopup", lang => lang, library => branchcode || default_branch ) %]
19
[% SET AllPublicBranches = Branches.all(  search_params => { public => 1 }, selected => opac_name ) %]
19
[% SET AllPublicBranches = Branches.all(  search_params => { public => 1 }, selected => opac_name ) %]
20
[% SET ShowLabelsForSearchInputs = Koha.Preference('OPACShowLabelsForSearchInputs') %]
20
21
21
<button id="scrolltocontent">Skip to main content</button>
22
<button id="scrolltocontent">Skip to main content</button>
22
<!-- prettier-ignore-start -->
23
<!-- prettier-ignore-start -->
Lines 235-241 Link Here
235
                            <form name="searchform" method="get" action="/cgi-bin/koha/opac-search.pl" id="searchform">
236
                            <form name="searchform" method="get" action="/cgi-bin/koha/opac-search.pl" id="searchform">
236
                                <div class="row gx-2">
237
                                <div class="row gx-2">
237
                                    <div class="col-sm-auto order-2 order-sm-2">
238
                                    <div class="col-sm-auto order-2 order-sm-2">
238
                                        <label for="masthead_search" class="visually-hidden">Search the catalog by:</label>
239
                                        [% IF ( ShowLabelsForSearchInputs ) %]
240
                                            <label for="masthead_search">Search catalog by:</label>
241
                                        [% ELSE %]
242
                                            <label for="masthead_search" class="visually-hidden">Search catalog by:</label>
243
                                        [% END %]
239
                                        <select name="idx" id="masthead_search" class="form-select">
244
                                        <select name="idx" id="masthead_search" class="form-select">
240
                                            [% IF ( ms_kw ) %]
245
                                            [% IF ( ms_kw ) %]
241
                                                <option selected="selected" value="" data-placeholder="[% t("Search the catalog") | html %]">Library catalog</option>
246
                                                <option selected="selected" value="" data-placeholder="[% t("Search the catalog") | html %]">Library catalog</option>
Lines 243-288 Link Here
243
                                                <option value="" data-placeholder="[% t("Search the catalog") | html %]">Library catalog</option>
248
                                                <option value="" data-placeholder="[% t("Search the catalog") | html %]">Library catalog</option>
244
                                            [% END # /ms_kw %]
249
                                            [% END # /ms_kw %]
245
                                            [% IF ( ms_ti ) %]
250
                                            [% IF ( ms_ti ) %]
246
                                                <option selected="selected" value="ti" data-placeholder="[% t("Search the catalog by title") | html %]">Title</option>
251
                                                <option selected="selected" value="ti" data-placeholder="[% t("Search catalog by title") | html %]">Title</option>
247
                                            [% ELSE %]
252
                                            [% ELSE %]
248
                                                <option value="ti" data-placeholder="[% t("Search the catalog by title") | html %]">Title</option>
253
                                                <option value="ti" data-placeholder="[% t("Search catalog by title") | html %]">Title</option>
249
                                            [% END # /ms_ti %]
254
                                            [% END # /ms_ti %]
250
                                            [% IF ( ms_au ) %]
255
                                            [% IF ( ms_au ) %]
251
                                                <option selected="selected" value="au" data-placeholder="[% t("Search the catalog by author") | html %]">Author</option>
256
                                                <option selected="selected" value="au" data-placeholder="[% t("Search catalog by author") | html %]">Author</option>
252
                                            [% ELSE %]
257
                                            [% ELSE %]
253
                                                <option value="au" data-placeholder="[% t("Search the catalog by author") | html %]">Author</option>
258
                                                <option value="au" data-placeholder="[% t("Search catalog by author") | html %]">Author</option>
254
                                            [% END # /ms_au %]
259
                                            [% END # /ms_au %]
255
                                            [% IF ( ms_su ) %]
260
                                            [% IF ( ms_su ) %]
256
                                                <option selected="selected" value="su" data-placeholder="[% t("Search the catalog by subject") | html %]">Subject</option>
261
                                                <option selected="selected" value="su" data-placeholder="[% t("Search catalog by subject") | html %]">Subject</option>
257
                                            [% ELSE %]
262
                                            [% ELSE %]
258
                                                <option value="su" data-placeholder="[% t("Search the catalog by subject") | html %]">Subject</option>
263
                                                <option value="su" data-placeholder="[% t("Search catalog by subject") | html %]">Subject</option>
259
                                            [% END # /ms_su %]
264
                                            [% END # /ms_su %]
260
                                            [% IF ( ms_nb ) %]
265
                                            [% IF ( ms_nb ) %]
261
                                                <option selected="selected" value="nb" data-placeholder="[% t("Search the catalog by ISBN") | html %]">ISBN</option>
266
                                                <option selected="selected" value="nb" data-placeholder="[% t("Search catalog by ISBN") | html %]">ISBN</option>
262
                                            [% ELSE %]
267
                                            [% ELSE %]
263
                                                <option value="nb" data-placeholder="[% t("Search the catalog by ISBN") | html %]">ISBN</option>
268
                                                <option value="nb" data-placeholder="[% t("Search catalog by ISBN") | html %]">ISBN</option>
264
                                            [% END # /ms_nb %]
269
                                            [% END # /ms_nb %]
265
                                            [% IF ( ms_ns ) %]
270
                                            [% IF ( ms_ns ) %]
266
                                                <option selected="selected" value="ns" data-placeholder="[% t("Search the catalog by ISSN") | html %]">ISSN</option>
271
                                                <option selected="selected" value="ns" data-placeholder="[% t("Search catalog by ISSN") | html %]">ISSN</option>
267
                                            [% ELSE %]
272
                                            [% ELSE %]
268
                                                <option value="ns" data-placeholder="[% t("Search the catalog by ISSN") | html %]">ISSN</option>
273
                                                <option value="ns" data-placeholder="[% t("Search catalog by ISSN") | html %]">ISSN</option>
269
                                            [% END # /ms_ns %]
274
                                            [% END # /ms_ns %]
270
                                            [% IF ( ms_se ) %]
275
                                            [% IF ( ms_se ) %]
271
                                                <option selected="selected" value="se" data-placeholder="[% t("Search the catalog by series") | html %]">Series</option>
276
                                                <option selected="selected" value="se" data-placeholder="[% t("Search catalog by series") | html %]">Series</option>
272
                                            [% ELSE %]
277
                                            [% ELSE %]
273
                                                <option value="se" data-placeholder="[% t("Search the catalog by series") | html %]">Series</option>
278
                                                <option value="se" data-placeholder="[% t("Search catalog by series") | html %]">Series</option>
274
                                            [% END # /ms_se %]
279
                                            [% END # /ms_se %]
275
                                            [% IF ( Koha.Preference('OPACNumbersPreferPhrase') ) %]
280
                                            [% IF ( Koha.Preference('OPACNumbersPreferPhrase') ) %]
276
                                                [% IF ( ms_callnumcommaphr ) %]
281
                                                [% IF ( ms_callnumcommaphr ) %]
277
                                                    <option selected="selected" value="callnum,phr" data-placeholder="[% t("Search the catalog by call number") | html %]">Call number</option>
282
                                                    <option selected="selected" value="callnum,phr" data-placeholder="[% t("Search catalog by call number") | html %]">Call number</option>
278
                                                [% ELSE %]
283
                                                [% ELSE %]
279
                                                    <option value="callnum,phr" data-placeholder="[% t("Search the catalog by call number") | html %]">Call number</option>
284
                                                    <option value="callnum,phr" data-placeholder="[% t("Search catalog by call number") | html %]">Call number</option>
280
                                                [% END #/ms_callnumcommaphr %]
285
                                                [% END #/ms_callnumcommaphr %]
281
                                            [% ELSE %]
286
                                            [% ELSE %]
282
                                                [% IF ( ms_callnum ) %]
287
                                                [% IF ( ms_callnum ) %]
283
                                                    <option selected="selected" value="callnum" data-placeholder="[% t("Search the catalog by call number") | html %]">Call number</option>
288
                                                    <option selected="selected" value="callnum" data-placeholder="[% t("Search catalog by call number") | html %]">Call number</option>
284
                                                [% ELSE %]
289
                                                [% ELSE %]
285
                                                    <option value="callnum" data-placeholder="[% t("Search the catalog by call number") | html %]">Call number</option>
290
                                                    <option value="callnum" data-placeholder="[% t("Search catalog by call number") | html %]">Call number</option>
286
                                                [% END # /ms_callnum %]
291
                                                [% END # /ms_callnum %]
287
                                            [% END # /IF OPACNumbersPreferPhrase %]
292
                                            [% END # /IF OPACNumbersPreferPhrase %]
288
                                        </select>
293
                                        </select>
Lines 291-297 Link Here
291
296
292
                                    <div class="col order-4 order-sm-3">
297
                                    <div class="col order-4 order-sm-3">
293
                                        [% IF ( !Koha.Preference( 'OpacAddMastheadLibraryPulldown' ) == 1 && mylibraryfirst ) %]
298
                                        [% IF ( !Koha.Preference( 'OpacAddMastheadLibraryPulldown' ) == 1 && mylibraryfirst ) %]
294
                                            <label for="translControl1" class="visually-hidden">Search the catalog in [% Branches.GetName( mylibraryfirst ) | html %]</label>
299
                                            [% IF ( ShowLabelsForSearchInputs ) %]
300
                                                <label for="translControl1">Search the catalog in [% Branches.GetName( mylibraryfirst ) | html %]</label>
301
                                            [% ELSE %]
302
                                                <label for="translControl1" class="visually-hidden">Search the catalog in [% Branches.GetName( mylibraryfirst ) | html %]</label>
303
                                            [% END %]
295
                                            <input
304
                                            <input
296
                                                type="text"
305
                                                type="text"
297
                                                class="transl1 form-control form-control-filtered"
306
                                                class="transl1 form-control form-control-filtered"
Lines 304-310 Link Here
304
                                                placeholder="Search the catalog"
313
                                                placeholder="Search the catalog"
305
                                            /><span id="translControl"></span>
314
                                            /><span id="translControl"></span>
306
                                        [% ELSE %]
315
                                        [% ELSE %]
307
                                            <label for="translControl1" class="visually-hidden">Search the catalog</label>
316
                                            [% IF ( ShowLabelsForSearchInputs ) %]
317
                                                <label for="translControl1">Search the catalog</label>
318
                                            [% ELSE %]
319
                                                <label for="translControl1" class="visually-hidden">Search the catalog</label>
320
                                            [% END %]
308
                                            <input type="text" class="transl1 form-control" id="translControl1" name="q" value="[% ms_value | html %]" placeholder="Search the catalog" /><span id="translControl"></span>
321
                                            <input type="text" class="transl1 form-control" id="translControl1" name="q" value="[% ms_value | html %]" placeholder="Search the catalog" /><span id="translControl"></span>
309
                                        [% END # /ms_value %]
322
                                        [% END # /ms_value %]
310
                                    </div>
323
                                    </div>
Lines 312-318 Link Here
312
325
313
                                    [% IF ( Koha.Preference( 'OpacAddMastheadLibraryPulldown' ) == 1 && AllPublicBranches.size > 1 ) %]
326
                                    [% IF ( Koha.Preference( 'OpacAddMastheadLibraryPulldown' ) == 1 && AllPublicBranches.size > 1 ) %]
314
                                        <div class="col-sm col-md-3 col-lg-2 order-3 order-sm-4">
327
                                        <div class="col-sm col-md-3 col-lg-2 order-3 order-sm-4">
315
                                            <label for="select_library" class="visually-hidden">Search the catalog in:</label>
328
                                            [% IF ( ShowLabelsForSearchInputs ) %]
329
                                                <label for="select_library">Search catalog in:</label>
330
                                            [% ELSE %]
331
                                                <label for="select_library" class="visually-hidden">Search catalog in:</label>
332
                                            [% END %]
316
                                            <select name="limit" id="select_library" class="form-select">
333
                                            <select name="limit" id="select_library" class="form-select">
317
                                                <option value="">All libraries</option>
334
                                                <option value="">All libraries</option>
318
335
Lines 364-370 Link Here
364
                                        [% END # / opac_limit_override %]
381
                                        [% END # / opac_limit_override %]
365
                                    [% END # / OpacAddMastheadLibraryPulldown %]
382
                                    [% END # / OpacAddMastheadLibraryPulldown %]
366
383
367
                                    <div class="order-5 col-sm-auto">
384
                                    <div class="order-5 col-sm-auto align-content-end">
368
                                        <button type="submit" id="searchsubmit" class="btn btn-primary" title="Search" aria-label="Search">
385
                                        <button type="submit" id="searchsubmit" class="btn btn-primary" title="Search" aria-label="Search">
369
                                            <i class="fa fa-search" aria-hidden="true"></i>
386
                                            <i class="fa fa-search" aria-hidden="true"></i>
370
                                        </button>
387
                                        </button>
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-advsearch.tt (-5 / +16 lines)
Lines 33-38 Link Here
33
[% INCLUDE 'bodytag.inc' bodyid='advsearch' bodyclass='scrollto' %]
33
[% INCLUDE 'bodytag.inc' bodyid='advsearch' bodyclass='scrollto' %]
34
[% INCLUDE 'masthead.inc' %]
34
[% INCLUDE 'masthead.inc' %]
35
[% SET AllPublicBranches = Branches.all( selected => opac_name, search_params => { public => 1 } ) %]
35
[% SET AllPublicBranches = Branches.all( selected => opac_name, search_params => { public => 1 } ) %]
36
[% SET ShowLabelsForSearchInputs = Koha.Preference('OPACShowLabelsForSearchInputs') %]
36
37
37
<form id="advsearch_form" action="/cgi-bin/koha/opac-search.pl" method="get">
38
<form id="advsearch_form" action="/cgi-bin/koha/opac-search.pl" method="get">
38
    <input type="hidden" name="advsearch" value="1" />
39
    <input type="hidden" name="advsearch" value="1" />
Lines 57-63 Link Here
57
                                    <div class="search-term-row">
58
                                    <div class="search-term-row">
58
                                        <div class="search-term-input">
59
                                        <div class="search-term-input">
59
                                            [% IF ( expanded_options ) %]
60
                                            [% IF ( expanded_options ) %]
60
                                                <select name="op" class="form-select">
61
                                                [% IF ( ShowLabelsForSearchInputs ) %]
62
                                                    <label for="op_[% loop.index | html %]">Combine with</label>
63
                                                [% END %]
64
                                                <select name="op" id="op_[% loop.index | html %]" class="form-select">
61
                                                    <option value="AND" selected="selected">and</option>
65
                                                    <option value="AND" selected="selected">and</option>
62
                                                    <option value="OR">or</option>
66
                                                    <option value="OR">or</option>
63
                                                    <option value="NOT">not</option>
67
                                                    <option value="NOT">not</option>
Lines 75-81 Link Here
75
                                        <!-- .search-term-input -->
79
                                        <!-- .search-term-input -->
76
80
77
                                        <div class="search-term-input">
81
                                        <div class="search-term-input">
78
                                            <select class="form-select" name="idx" aria-label="Choose search type for field [% loop.index + 1 | html %]" id="search-field_[% loop.index | html %]">
82
                                            [% IF ( ShowLabelsForSearchInputs ) %]
83
                                                <label for="idx_[% loop.index | html %]">Search in</label>
84
                                            [% END %]
85
                                            <select class="form-select" name="idx" id="idx_[% loop.index | html %]" aria-label="Choose search type for field [% loop.index + 1 | html %]" id="search-field_[% loop.index | html %]">
79
                                                <option value="kw" data-placeholder="Search by keyword">Keyword</option>
86
                                                <option value="kw" data-placeholder="Search by keyword">Keyword</option>
80
                                                [% IF ( expanded_options ) %]
87
                                                [% IF ( expanded_options ) %]
81
                                                    <option value="kw,phr" data-placeholder="Search by keyword phrase">&nbsp;&nbsp;&nbsp;&nbsp; Keyword phrase</option>
88
                                                    <option value="kw,phr" data-placeholder="Search by keyword phrase">&nbsp;&nbsp;&nbsp;&nbsp; Keyword phrase</option>
Lines 131-141 Link Here
131
                                        </div>
138
                                        </div>
132
                                        <!-- .search-term-input -->
139
                                        <!-- .search-term-input -->
133
                                        <div class="search-term-input">
140
                                        <div class="search-term-input">
134
                                            <input class="form-control" type="text" name="q" aria-label="Enter field [% loop.index + 1 | html %] search terms" value="" placeholder="" />
141
                                            [% IF ( ShowLabelsForSearchInputs ) %]
142
                                                <label for="q_[% loop.index | html %]">Enter search here</label>
143
                                            [% END %]
144
                                            <input class="form-control" type="text" name="q" id="q_[% loop.index | html %]" aria-label="Enter field [% loop.index + 1 | html %] search terms" value="" placeholder="" />
135
                                        </div>
145
                                        </div>
136
                                        <!-- .search-term-input -->
146
                                        <!-- .search-term-input -->
137
                                        [% IF ( expanded_options ) %]
147
                                        [% IF ( expanded_options ) %]
138
                                            <div class="search-term-input">
148
                                            <div class="search-term-input">
149
                                                <label>&nbsp;</label>
139
                                                <a class="ButtonPlus" title="Add another field" href="#">
150
                                                <a class="ButtonPlus" title="Add another field" href="#">
140
                                                    <i class="fa fa-plus-square" aria-hidden="true"></i>
151
                                                    <i class="fa fa-plus-square" aria-hidden="true"></i>
141
                                                </a>
152
                                                </a>
Lines 553-559 Link Here
553
                $("#advsearches li:first a").tab("show");
564
                $("#advsearches li:first a").tab("show");
554
            }
565
            }
555
566
556
            $('.search-term-row .search-term-input select[name="op"]').first().prop("disabled",true).hide();
567
            $('.search-term-row .search-term-input label[for^="op_"]').first().prop("disabled",true).hide();
568
            $('.search-term-row .search-term-input select#op_0').prop("disabled",true).hide();
557
569
558
            [% IF ( ReturnToSearch ) %]
570
            [% IF ( ReturnToSearch ) %]
559
                if (form_serialized = JSON.parse( Cookies.get("form_serialized") ) ) {
571
                if (form_serialized = JSON.parse( Cookies.get("form_serialized") ) ) {
560
- 

Return to bug 41199