plone.app.event/thet-js-init: improve

Johannes Raggam <jenkins-z4DKO/[email protected]>
Newsgroups gmane.comp.web.zope.plone.cvs
Message-ID <[email protected]>
Repository: plone.app.event
Branch: refs/heads/thet-js-init
Date: 2017-07-13T14:58:03+02:00
Author: Johannes Raggam (thet) <[email protected]>
Commit: https://github.com/plone/plone.app.event/commit/e7f306b77c34087ad40037ac9bc561ceb447ed76

improve

Files changed:
M CHANGES.rst
M plone/app/event/browser/resources/event.js

diff --git a/CHANGES.rst b/CHANGES.rst
index 88a7613b..fb65ed13 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -14,8 +14,8 @@ New features:
 
 Bug fixes:
 
-- In the plone.app.event JavaScript initialization, explicitly wait until pickadate has been initialized and all DOM elements are found.
-  Fixes a problem, where the time part wasn't hidden on open end events.
+- Improve the JavaScript to wait for the PickADate pattern to be initialized.
+  Follow better JS practices.
   [thet]
 
 
diff --git a/plone/app/event/browser/resources/event.js b/plone/app/event/browser/resources/event.js
index 6f5747a9..0f5219fd 100644
--- a/plone/app/event/browser/resources/event.js
+++ b/plone/app/event/browser/resources/event.js
@@ -2,260 +2,261 @@
 /* globals require */
 
 (function($) {
-  var start_end_delta = 1 / 24; // Delta in days
 
-  function getDateTime(datetimewidget) {
-    var date, time, datetime, set_time;
-    date = $('input[name="_submit"]:first', datetimewidget).prop('value');
-    if (!date) {
-      return;
-    }
-    date = date.split('-');
-    time = $('input[name="_submit"]:last', datetimewidget).prop('value');
-    if (!time) {
-      // can happen with optional start/end dates without default values.
-      set_time = true;
-      time = '00:00';
-    }
-    time = time.split(':');
+  var eventedit = {
 
-    // We can't just parse the ``date + 'T' + time`` string, because of
-    // Chromium bug: https://code.google.com/p/chromium/issues/detail?id=145198
-    // When passing date and time components, the passed date/time is
-    // interpreted as local time and not UTC.
-    datetime = new Date(
-      parseInt(date[0], 10),
-      parseInt(date[1], 10) - 1, // you know, javascript's month index starts with 0
-      parseInt(date[2], 10),
-      parseInt(time[0], 10),
-      parseInt(time[1], 10)
-    );
-    if (set_time) {
-      // we have a date but no time?! set it.
-      $('.pattern-pickadate-time', datetimewidget)
-        .pickatime('picker')
-        .set('select', datetime);
-    }
-    return datetime;
-  }
+    start_end_delta: 1 / 24, // Delta in days
 
-  function initStartEndDelta(start_container, end_container) {
-    var start_datetime = getDateTime(start_container);
-    var end_datetime = getDateTime(end_container);
+    // DOM ELEMENTS
+    $start_input: undefined,
+    $start_container: undefined,
+    $pickadate_starttime: undefined,
+    $end_input: undefined,
+    $end_container: undefined,
+    $pickadate_endtime: undefined,
+    $whole_day_input: undefined,
+    $open_end_input: undefined,
 
-    if (!start_datetime || !end_datetime) {
-      return;
-    }
+    get_dom_element: function (sel, $container) {
+      /* Try to get the DOM element from a selector and return it or return undefined.
+       * */
+      var $el;
+      if ($container) {
+        $el = $(sel, $container);
+      } else {
+        $el = $(sel);
+      }
+      return $el.length ? $el : undefined;
+    },
 
-    // delta in days
-    start_end_delta = (end_datetime - start_datetime) / 1000 / 60;
-  }
+    getDateTime: function (datetimewidget) {
+      var date, time, datetime, set_time;
+      date = $('input[name="_submit"]:first', datetimewidget).prop('value');
+      if (!date) {
+        return;
+      }
+      date = date.split('-');
+      time = $('input[name="_submit"]:last', datetimewidget).prop('value');
+      if (!time) {
+        // can happen with optional start/end dates without default values.
+        set_time = true;
+        time = '00:00';
+      }
+      time = time.split(':');
 
-  function updateEndDate(start_container, end_container) {
-    var start_date = getDateTime(start_container);
-    if (!start_date) {
-      return;
-    }
+      // We can't just parse the ``date + 'T' + time`` string, because of
+      // Chromium bug: https://code.google.com/p/chromium/issues/detail?id=145198
+      // When passing date and time components, the passed date/time is
+      // interpreted as local time and not UTC.
+      datetime = new Date(
+        parseInt(date[0], 10),
+        parseInt(date[1], 10) - 1, // you know, javascript's month index starts with 0
+        parseInt(date[2], 10),
+        parseInt(time[0], 10),
+        parseInt(time[1], 10)
+      );
+      if (set_time) {
+        // we have a date but no time?! set it.
+        $('.pattern-pickadate-time', datetimewidget)
+          .pickatime('picker')
+          .set('select', datetime);
+      }
+      return datetime;
+    },
 
-    var new_end_date = new Date(start_date);
-    new_end_date.setMinutes(start_date.getMinutes() + start_end_delta);
+    initStartEndDelta: function (start_container, end_container) {
+      var start_datetime = this.getDateTime(start_container);
+      var end_datetime = this.getDateTime(end_container);
 
-    $('.pattern-pickadate-date', end_container)
-      .pickadate('picker')
-      .set('select', new_end_date);
-    $('.pattern-pickadate-time', end_container)
-      .pickatime('picker')
-      .set('select', new_end_date);
-  }
+      if (!start_datetime || !end_datetime) {
+        return;
+      }
 
-  function validateEndDate(start_container, end_container) {
-    var start_datetime = getDateTime(start_container);
-    var end_datetime = getDateTime(end_container);
-    if (!start_datetime || !end_datetime) {
-      return;
-    }
+      // delta in days
+      start_end_delta = (end_datetime - start_datetime) / 1000 / 60;
+    },
 
-    if (end_datetime < start_datetime) {
-      start_container.addClass('error');
-    } else {
-      end_container.removeClass('error');
-    }
-  }
+    updateEndDate: function (start_container, end_container) {
+      var start_date = this.getDateTime(start_container);
+      if (!start_date) {
+        return;
+      }
 
-  function show_hide_widget(widget, hide, fade) {
-    var $widget = $(widget);
-    if (hide === true) {
-      if (fade === true) {
-        $widget.fadeOut();
-      } else {
-        $widget.hide();
+      var new_end_date = new Date(start_date);
+      new_end_date.setMinutes(start_date.getMinutes() + start_end_delta);
+
+      $('.pattern-pickadate-date', end_container)
+        .pickadate('picker')
+        .set('select', new_end_date);
+      $('.pattern-pickadate-time', end_container)
+        .pickatime('picker')
+        .set('select', new_end_date);
+    },
+
+    validateEndDate: function (start_container, end_container) {
+      var start_datetime = this.getDateTime(start_container);
+      var end_datetime = this.getDateTime(end_container);
+      if (!start_datetime || !end_datetime) {
+        return;
       }
-    } else {
-      if (fade === true) {
-        $widget.fadeIn();
+
+      if (end_datetime < start_datetime) {
+        start_container.addClass('error');
       } else {
-        $widget.show();
+        end_container.removeClass('error');
       }
-    }
-  }
+    },
 
-  function event_listing_calendar_init(cal) {
-    // Dateinput selector for event_listing view
-    if ($().dateinput && cal.length > 0) {
-      var get_req_param, val;
-      get_req_param = function(name) {
-        // http://stackoverflow.com/questions/831030/how-to-get-get-request-parameters-in-javascript
-        if (
-          name ===
-          new RegExp('[?&]' + encodeURIComponent(name) + '=([^&]*)').exec(
-            window.location.search
-          )
-        ) {
-          return decodeURIComponent(name[1]);
+    show_hide_widget: function (widget, hide, fade) {
+      var $widget = $(widget);
+      if (hide === true) {
+        if (fade === true) {
+          $widget.fadeOut();
+        } else {
+          $widget.hide();
         }
-      };
-      // Preselect current date, if exists
-      val = get_req_param('date');
-      if (val === undefined) {
-        val = new Date();
       } else {
-        val = new Date(val);
+        if (fade === true) {
+          $widget.fadeIn();
+        } else {
+          $widget.show();
+        }
       }
-      cal
-        .dateinput({
-          selectors: true,
-          trigger: true,
-          format: 'yyyy-mm-dd',
-          yearRange: [-10, 10],
-          firstDay: 1,
-          value: val,
-          change: function() {
-            var value = this.getValue('yyyy-mm-dd');
-            window.location.href = 'event_listing?mode=day&date=' + value;
+    },
+
+    event_listing_calendar_init: function (cal) {
+      // Dateinput selector for event_listing view
+      if ($().dateinput && cal.length > 0) {
+        var get_req_param, val;
+        get_req_param = function(name) {
+          // http://stackoverflow.com/questions/831030/how-to-get-get-request-parameters-in-javascript
+          if (
+            name ===
+            new RegExp('[?&]' + encodeURIComponent(name) + '=([^&]*)').exec(
+              window.location.search
+            )
+          ) {
+            return decodeURIComponent(name[1]);
           }
-        })
-        .unbind('change')
-        .bind('onShow', function() {
-          var trigger_offset = $(this).next().offset();
-          $(this).data('dateinput').getCalendar().offset({
-            top: trigger_offset.top + 20,
-            left: trigger_offset.left
+        };
+        // Preselect current date, if exists
+        val = get_req_param('date');
+        if (val === undefined) {
+          val = new Date();
+        } else {
+          val = new Date(val);
+        }
+        cal
+          .dateinput({
+            selectors: true,
+            trigger: true,
+            format: 'yyyy-mm-dd',
+            yearRange: [-10, 10],
+            firstDay: 1,
+            value: val,
+            change: function() {
+              var value = this.getValue('yyyy-mm-dd');
+              window.location.href = 'event_listing?mode=day&date=' + value;
+            }
+          })
+          .unbind('change')
+          .bind('onShow', function() {
+            var trigger_offset = $(this).next().offset();
+            $(this).data('dateinput').getCalendar().offset({
+              top: trigger_offset.top + 20,
+              left: trigger_offset.left
+            });
           });
-        });
-    }
-  }
+      }
+    },
 
-  function initilize_event(
-    $start_input,
-    $start_container,
-    $pickadate_starttime,
-    $end_input,
-    $end_container,
-    $pickadate_endtime,
-    $whole_day_input,
-    $open_end_input
-  ) {
+    initilize_event: function () {
 
-    // WHOLE DAY INIT
-    if ($whole_day_input.length > 0) {
-      $whole_day_input.bind('change', function(e) {
-        show_hide_widget($pickadate_starttime, e.target.checked, true);
-        show_hide_widget($pickadate_endtime, e.target.checked, true);
-      });
-      show_hide_widget(
-        $pickadate_starttime,
-        $whole_day_input.get(0).checked,
-        false
-      );
-      show_hide_widget(
-        $pickadate_endtime,
-        $whole_day_input.get(0).checked,
-        false
-      );
-    }
+      var $start_container = this.$start_container,
+          $end_container = this.$end_container,
+          $pickadate_starttime = this.$pickadate_starttime,
+          $pickadate_endtime = this.$pickadate_endtime,
+          $open_end_input = this.$open_end_input,
+          $whole_day_input = this.$whole_day_input;
 
-    // OPEN END INIT
-    if ($open_end_input.length > 0) {
-      $open_end_input.bind('change', function(e) {
-        show_hide_widget($end_container, e.target.checked, true);
-      });
-      show_hide_widget($end_container, $open_end_input.get(0).checked, false);
-    }
+      // WHOLE DAY INIT
+      if ($whole_day_input.length > 0) {
+        $whole_day_input.bind('change', function(e) {
+          this.show_hide_widget($pickadate_starttime, e.target.checked, true);
+          this.show_hide_widget($pickadate_endtime, e.target.checked, true);
+        }.bind(this));
+        this.show_hide_widget(
+          $pickadate_starttime,
+          $whole_day_input.get(0).checked,
+          false
+        );
+        this.show_hide_widget(
+          $pickadate_endtime,
+          $whole_day_input.get(0).checked,
+          false
+        );
+      }
 
-    // START/END SETTING/VALIDATION
-    $start_container.each(function() {
-      $(this).on('focus', '.picker__input', function() {
-        initStartEndDelta($start_container, $end_container);
-      });
-      $(this).on('change', '.picker__input', function() {
-        updateEndDate($start_container, $end_container);
-      });
-    });
-    $end_container.each(function() {
-      $(this).on('focus', '.picker__input', function() {
-        initStartEndDelta($start_container, $end_container);
-      });
-      $(this).on('change', '.picker__input', function() {
-        validateEndDate($start_container, $end_container);
-      });
-    });
+      // OPEN END INIT
+      if ($open_end_input.length > 0) {
+        $open_end_input.bind('change', function(e) {
+          this.show_hide_widget($end_container, e.target.checked, true);
+        }.bind(this));
+        this.show_hide_widget($end_container, $open_end_input.get(0).checked, false);
+      }
 
-    // EVENT LISTING CALENDAR POPUP
-    event_listing_calendar_init($('#event_listing_calendar'));
-  }
+      // START/END SETTING/VALIDATION
+      $start_container.on('focus', '.picker__input', function() {
+        this.initStartEndDelta($start_container, $end_container);
+      }.bind(this));
+      $start_container.on('change', '.picker__input', function() {
+        this.updateEndDate($start_container, $end_container);
+      }.bind(this));
+      
+      $end_container.on('focus', '.picker__input', function() {
+        this.initStartEndDelta($start_container, $end_container);
+      }.bind(this));
+      $end_container.on('change', '.picker__input', function() {
+        this.validateEndDate($start_container, $end_container);
+      }.bind(this));
 
-  function get_dom_element(sel) {
-    /* Try to get the DOM element from a selector and return it or return undefined.
-         * */
-    var $el = $(sel);
-    return $el.length ? $el : undefined;
-  }
+    },
+  
+  };
 
   $(document).ready(function() {
-    // Initialize necessary DOM elements and wait until all are foumd.
-    var $start_input,
-        $start_container,
-        $pickadate_starttime,
-        $end_input,
-        $end_container,
-        $pickadate_endtime,
-        $whole_day_input,
-        $open_end_input;
 
-    var interval = setInterval(function() {
-      $start_input = !$start_input && get_dom_element('form input.event_start');
-      $start_container = !$start_container && $start_input && $start_input.closest('div');
-      $pickadate_starttime = $pickadate_starttime && $start_container && get_dom_element('.pattern-pickadate-time-wrapper', $start_container);
+    eventedit.$start_input = eventedit.get_dom_element('form input.event_start');
+    if (!eventedit.$start_input) {
+      // Not an event edit form.
+      return;
+    }
+    eventedit.$end_input = eventedit.get_dom_element('form input.event_end');
+    if (!eventedit.$end_input) {
+      // Not an event edit form.
+      return;
+    }
 
-      $end_input = !$end_input && get_dom_element('form input.event_end');
-      $end_container = !$end_container && $end_input && $end_input.closest('div');
-      $pickadate_endtime = !$pickadate_endtime && $end_container && $('.pattern-pickadate-time-wrapper', $end_container);
+    eventedit.$start_container = eventedit.$start_input.closest('div');
+    eventedit.$end_container   = eventedit.$end_input.closest('div');
+    eventedit.$whole_day_input = eventedit.get_dom_element('form input.event_whole_day');
+    eventedit.$open_end_input  = eventedit.get_dom_element('form input.event_open_end');
 
-      $whole_day_input = !$whole_day_input && get_dom_element('form input.event_whole_day');
-      $open_end_input = !$open_end_input && get_dom_element('form input.event_open_end');
+    var interval = setInterval(function() {
+      eventedit.$pickadate_starttime = !eventedit.$pickadate_starttime && eventedit.get_dom_element('.pattern-pickadate-time-wrapper', eventedit.$start_container);
+      eventedit.$pickadate_endtime   = !eventedit.$pickadate_endtime   && eventedit.get_dom_element('.pattern-pickadate-time-wrapper', eventedit.$end_container);
 
       if (
-        $start_input &&
-        $start_container &&
-        $pickadate_starttime &&
-        $end_input &&
-        $end_container &&
-        $pickadate_endtime &&
-        $whole_day_input &&
-        $open_end_input
+        eventedit.$pickadate_starttime &&
+        eventedit.$pickadate_endtime
       ) {
         clearInterval(interval);
-        initilize_event(
-          $start_input,
-          $start_container,
-          $pickadate_starttime,
-          $end_input,
-          $end_container,
-          $pickadate_endtime,
-          $whole_day_input,
-          $open_end_input
-        );
+        eventedit.initilize_event();
       }
     }, 100);
+
+    // EVENT LISTING CALENDAR POPUP
+    eventedit.event_listing_calendar_init($('#event_listing_calendar'));
+
   });
 })(jQuery);



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.