From 16a16a67b7dd606bfa196ef02f3b651d9849ce19 Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Wed, 12 Feb 2020 20:12:03 +0100 Subject: [PATCH 1/3] Integrated browser resources from senaite.lims --- bika/lims/monkey/__init__.py | 2 + bika/lims/monkey/add_senaite_site.py | 57 ++ bika/lims/monkey/configure.zcml | 7 + bika/lims/monkey/overlayhelpers.js | 674 +++++++++++++++++++ bika/lims/skins/bika/favicon.ico | Bin 1150 -> 5430 bytes bika/lims/skins/bika/global_statusmessage.pt | 38 ++ bika/lims/skins/bika/login_form.cpt | 281 ++++++++ bika/lims/skins/bika/login_form.cpt.metadata | 11 + bika/lims/skins/bika/logo.png | Bin 6042 -> 20816 bytes bika/lims/skins/bika/logo_print.png | Bin 4753 -> 6227 bytes 10 files changed, 1070 insertions(+) create mode 100644 bika/lims/monkey/add_senaite_site.py create mode 100644 bika/lims/monkey/overlayhelpers.js create mode 100644 bika/lims/skins/bika/global_statusmessage.pt create mode 100644 bika/lims/skins/bika/login_form.cpt create mode 100644 bika/lims/skins/bika/login_form.cpt.metadata diff --git a/bika/lims/monkey/__init__.py b/bika/lims/monkey/__init__.py index b54d2c0984..41a69c01d3 100644 --- a/bika/lims/monkey/__init__.py +++ b/bika/lims/monkey/__init__.py @@ -17,3 +17,5 @@ # # Copyright 2018-2020 by it's authors. # Some rights reserved, see README and LICENSE. + +import add_senaite_site # noqa diff --git a/bika/lims/monkey/add_senaite_site.py b/bika/lims/monkey/add_senaite_site.py new file mode 100644 index 0000000000..6d2c5b25bd --- /dev/null +++ b/bika/lims/monkey/add_senaite_site.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.LIMS. +# +# SENAITE.LIMS is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2019 by it's authors. +# Some rights reserved, see README and LICENSE. + +from OFS.ObjectManager import ObjectManager + +ADD_SENAITE_SITE = """ + + + + + + +
+ + +
+
+""" + +main = ObjectManager.manage_main +orig = main.read() +pos = orig.find('') + + +# Add in our button html at the right position +new = orig[:pos] + ADD_SENAITE_SITE + orig[pos:] + +# Modify the manage_main +main.edited_source = new +main._v_cooked = main.cook() diff --git a/bika/lims/monkey/configure.zcml b/bika/lims/monkey/configure.zcml index d071918756..9bc64bdfba 100644 --- a/bika/lims/monkey/configure.zcml +++ b/bika/lims/monkey/configure.zcml @@ -8,6 +8,13 @@ xmlns:monkey="http://namespaces.plone.org/monkey" i18n_domain="senaite.core"> + + + '); + + content.data('pbo', pbo); + + // if a width option is specified, set it on the overlay div, + // computing against the window width if a % was specified. + if (pbw) { + if (pbw.indexOf('%') > 0) { + content.width(parseInt(pbw, 10) / 100 * $(window).width()); + } else { + content.width(pbw); + } + } + + // add the target element at the end of the body. + content.appendTo($("body")); + + return content; + }; + + + /****** + pb.image_click + click handler for image loads + ******/ + pb.image_click = function (event) { + var ethis, content, api, img, el, pbo; + + ethis = $(this); + pbo = ethis.data('pbo'); + + // find target container + content = $(ethis.attr('rel')); + if (!content.length) { + content = pb.create_content_div(pbo); + content.overlay(pbo.config); + } + api = content.overlay(); + + // is the image loaded yet? + if (content.find('img').length === 0) { + // load the image. + if (pbo.src) { + pb.spinner.show(); + + // create the image and stuff it + // into our target + img = new Image(); + img.src = pbo.src; + el = $(img); + content.append(el.addClass('pb-image')); + + // Now, we'll cause the overlay to + // load when the image is loaded. + el.load(function () { + pb.spinner.hide(); + api.load(); + }); + + } + } else { + api.load(); + } + + return false; + }; + + + /****** + pb.fi_focus + First-input focus inside $ selection. + ******/ + pb.fi_focus = function (jqo) { + if (! jqo.find("form div.error :input:first").focus().length) { + jqo.find("form :input:visible:first").focus(); + } + }; + + + /****** + pb.ajax_error_recover + jQuery's ajax load function does not load error responses. + This routine returns the cooked error response. + ******/ + pb.ajax_error_recover = function (responseText, selector) { + var tcontent = $('
').append( + responseText.replace(//gi, "")); + return selector ? tcontent.find(selector) : tcontent; + }; + + + /****** + pb.add_ajax_load + Adds a hidden ajax_load input to form + ******/ + pb.add_ajax_load = function (form) { + if (form.find('input[name=ajax_load]').length === 0) { + form.prepend($('')); + } + }; + + /****** + pb.prep_ajax_form + Set up form with ajaxForm, including success and error handlers. + ******/ + pb.prep_ajax_form = function (form) { + var ajax_parent = form.closest('.pb-ajax'), + data_parent = ajax_parent.closest('.overlay-ajax'), + pbo = data_parent.data('pbo'), + formtarget = pbo.formselector, + closeselector = pbo.closeselector, + beforepost = pbo.beforepost, + afterpost = pbo.afterpost, + noform = pbo.noform, + api = data_parent.overlay(), + selector = pbo.selector, + options = {}; + + options.beforeSerialize = function () { + pb.spinner.show(); + }; + + if (beforepost) { + options.beforeSubmit = function (arr, form, options) { + return beforepost(form, arr, options); + }; + } + options.success = function (responseText, statusText, xhr, form) { + $(document).trigger('formOverlayStart', [this, responseText, statusText, xhr, form]); + // success comes in many forms, some of which are errors; + // + + var el, myform, success, target, scripts = [], filteredResponseText; + + success = statusText === "success" || statusText === "notmodified"; + + if (! success) { + // The responseText parameter is actually xhr + responseText = responseText.responseText; + } + // strip inline script tags + filteredResponseText = responseText.replace(//gi, ""); + + // create a div containing the optionally filtered response + el = $('
').append( + selector ? + // a lesson learned from the jQuery source: $(responseText) + // will not work well unless responseText is well-formed; + // appending to a div is more robust, and automagically + // removes the html/head/body outer tagging. + $('
').append(filteredResponseText).find(selector) + : + filteredResponseText + ); + + // afterpost callback + if (success && afterpost) { + afterpost(el, data_parent); + } + + myform = el.find(formtarget); + if (success && myform.length) { + ajax_parent.empty().append(el); + + // execute inline scripts + + // try { + // // jQuery 1.7 + // $.buildFragment([responseText], [document], scripts); + // } catch (e) { + // // jQuery 1.9 + // $.buildFragment([responseText], document, scripts); + // } + + if (scripts.length) { + $.each(scripts, function() { + $.globalEval( this.text || this.textContent || this.innerHTML || "" ); + }); + } + + // This may be a complex form. + if ($.fn.ploneTabInit) { + el.ploneTabInit(); + } + pb.fi_focus(ajax_parent); + + pb.add_ajax_load(myform); + // attach submit handler with the same options + myform.ajaxForm(options); + + // attach close to element id'd by closeselector + if (closeselector) { + el.find(closeselector).click(function (event) { + api.close(); + return false; + }); + } + $(document).trigger('formOverlayLoadSuccess', [this, myform, api, pb, ajax_parent]); + } else { + // there's no form in our new content or there's been an error + if (success) { + if (typeof noform === "function") { + // get action from callback + noform = noform(el, pbo); + } + } else { + noform = statusText; + } + + + switch (noform) { + case 'close': + api.close(); + break; + case 'reload': + api.close(); + pb.spinner.show(); + // location.reload results in a repost + // dialog in some browsers; very unlikely to + // be what we want. + location.replace(location.href); + break; + case 'redirect': + api.close(); + pb.spinner.show(); + target = pbo.redirect; + if (typeof target === "function") { + // get target from callback + target = target(el, responseText, pbo); + } + location.replace(target); + break; + default: + if (el.children()) { + // show what we've got + ajax_parent.empty().append(el); + } else { + api.close(); + } + break; + } + $(document).trigger('formOverlayLoadFailure', [this, myform, api, pb, ajax_parent, noform]); + } + pb.spinner.hide(); + }; + // error and success callbacks are the same + options.error = options.success; + + pb.add_ajax_load(form); + form.ajaxForm(options); + }; + + + /****** + pb.ajax_click + Click handler for ajax sources. The job of this routine + is to do the ajax load of the overlay element, then + call the JQT overlay loader. + ******/ + pb.ajax_click = function (event) { + var ethis = $(this), + pbo, + content, + api, + src, + el, + selector, + formtarget, + closeselector, + sep, + scripts = [], + e; + + e = $.Event(); + e.type = "beforeAjaxClickHandled"; + $(document).trigger(e, [this, event]); + if (e.isDefaultPrevented()) { return false; } + + pbo = ethis.data('pbo'); + + content = pb.create_content_div(pbo, ethis); + // pbo.config.top = $(window).height() * 0.1 - ethis.offsetParent().offset().top; + content.overlay(pbo.config, ethis); + api = content.overlay(); + src = pbo.src; + selector = pbo.selector; + formtarget = pbo.formselector; + closeselector = pbo.closeselector; + + pb.spinner.show(); + + // prevent double click warning for this form + $(this).find("input.submitting").removeClass('submitting'); + + el = $('div.pb-ajax', content); + if (el.length === 0) { + el = $('
'); + content.append(el); + } + if (api.getConf().fixed) { + // don't let it be over 75% of the viewport's height + el.css('max-height', Math.floor($(window).height() * 0.75)); + } + + // affix a random query argument to prevent + // loading from browser cache + sep = (src.indexOf('?') >= 0) ? '&': '?'; + src += sep + "ajax_load=" + (new Date().getTime()); + + // add selector, if any + if (selector) { + src += ' ' + selector; + } + + // set up callback to be used whenever new contents are loaded + // into the overlay, to prepare links and forms to stay within + // the overlay + el[0].handle_load_inside_overlay = function(responseText, errorText) { + var ele, target; + ele = $(this); + + if (errorText === 'error') { + ele.append(pb.ajax_error_recover(responseText, selector)); + } else if (!responseText.length) { + ele.append(ajax_noresponse_message || 'No response from server.'); + } + + // a non-semantic div here will make sure we can + // do enough formatting. + ele.wrapInner('
'); + + // add the submit handler if we've a formtarget + if (formtarget) { + target = ele.find(formtarget); + if (target.length > 0) { + pb.prep_ajax_form(target); + } + } + + // if a closeselector has been specified, tie it to the overlay's + // close method via closure + if (closeselector) { + ele.find(closeselector).click(function (event) { + api.close(); + return false; + }); + } + + // execute inline scripts + // try { + // // jQuery 1.7 + // $.buildFragment([responseText], [document], scripts); + // } catch (e) { + // // jQuery 1.9 + // debugger + // $.buildFragment([responseText], document, scripts); + // } + + if (scripts.length) { + $.each(scripts, function() { + $.globalEval( this.text || this.textContent || this.innerHTML || "" ); + }); + } + + // This may be a complex form. + if ($.fn.ploneTabInit) { + ele.ploneTabInit(); + } + + // remove element on close so that it doesn't congest the DOM + api.onClose = function () { + content.remove(); + }; + $(document).trigger('loadInsideOverlay', [this, responseText, errorText, api]); + }; + + // and load the div + var data = null; + var form = $(pbo.source.context); + var method = form.attr('method'); + if (method && method.toLowerCase() == 'post') { + data = form.serializeArray(); + } + // load will do a POST instead of GET if data is not null + el.load(src, data, function (responseText, errorText) { + // post-process the overlay contents + el[0].handle_load_inside_overlay.apply(this, [responseText, errorText]); + + // Now, it's all ready to display; hide the + // spinner and call JQT overlay load. + pb.spinner.hide(); + api.load(); + + return true; + }); + + // don't do the default action + return false; + }; + + + /****** + pb.iframe + onBeforeLoad handler for iframe overlays. + + Note that the spinner is handled a little differently + so that we can keep it displayed while the iframe's + content is loading. + ******/ + pb.iframe = function () { + var content, pbo; + + pb.spinner.show(); + + content = this.getOverlay(); + pbo = this.getTrigger().data('pbo'); + + if (content.find('iframe').length === 0 && pbo.src) { + content.append( + ' +
+ + + + +
+
+ + Forgot your password? + +

+ If you have forgotten your password, + + we can send you a new one. +

+
+ +
+ + New user? + + +

+ If you do not have an account here, head over to the + + + registration form. +

+ +
+
+ + +
+ + + + diff --git a/bika/lims/skins/bika/login_form.cpt.metadata b/bika/lims/skins/bika/login_form.cpt.metadata new file mode 100644 index 0000000000..1c6a68f5cf --- /dev/null +++ b/bika/lims/skins/bika/login_form.cpt.metadata @@ -0,0 +1,11 @@ +[default] +title=Sign in +border=None + +[validators] +validators=login_form_validate + +[actions] +action.success=traverse_to:string:logged_in +action.failure=redirect_to:string:login_form +action.failure_page=traverse_to:string:login_failed diff --git a/bika/lims/skins/bika/logo.png b/bika/lims/skins/bika/logo.png index 20cd2641d34d4c9888ac7b8792289d26484e137c..31569bd8fb63393a7ed969b27b8694b4d20efdab 100644 GIT binary patch literal 20816 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 W(yZWq>gO$+L#M-7`%+s%;{O4j+bMSd delta 5071 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 diff --git a/bika/lims/skins/bika/logo_print.png b/bika/lims/skins/bika/logo_print.png index 85a672173868033c939aa1bb0cf9024af4b61b5e..d0987df385ca376c517ab031ced27fda78efd3b4 100644 GIT binary patch delta 5251 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 delta 3769 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 Date: Wed, 12 Feb 2020 20:17:27 +0100 Subject: [PATCH 2/3] Changelog updated --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index 4851a0d7ac..6a18fa9aa6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,6 +7,7 @@ Changelog **Added** +- #1534 Integrate browser resources from senaite.lims - #1529 Moved contentmenu provider into core - #1523 Moved Installation Screens into core - #1520 JavaScripts/CSS Integration and Cleanup From 6f459eadbc6de7675c6d71a1ba59d26470836a84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puiggen=C3=A9?= Date: Wed, 12 Feb 2020 21:41:35 +0100 Subject: [PATCH 3/3] Bad code header --- bika/lims/monkey/add_senaite_site.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bika/lims/monkey/add_senaite_site.py b/bika/lims/monkey/add_senaite_site.py index 6d2c5b25bd..c8a9a35c31 100644 --- a/bika/lims/monkey/add_senaite_site.py +++ b/bika/lims/monkey/add_senaite_site.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # -# This file is part of SENAITE.LIMS. +# This file is part of SENAITE.CORE. # -# SENAITE.LIMS is free software: you can redistribute it and/or modify it under +# SENAITE.CORE is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation, version 2. # @@ -15,7 +15,7 @@ # this program; if not, write to the Free Software Foundation, Inc., 51 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # -# Copyright 2018-2019 by it's authors. +# Copyright 2018-2020 by it's authors. # Some rights reserved, see README and LICENSE. from OFS.ObjectManager import ObjectManager