Created
September 21, 2012 23:44
-
-
Save eduardolundgren/3764544 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var L = A.Lang, | |
| isArray = L.isArray, | |
| ARROW = 'arrow', | |
| BODY = 'body', | |
| BODY_CONTENT = 'bodyContent', | |
| BOUNDING_BOX = 'boundingBox', | |
| CANCEL = 'cancel', | |
| CLICK = 'click', | |
| CONSTRAIN = 'constrain', | |
| DATE = 'date', | |
| DATE_FORMAT = 'dateFormat', | |
| DELETE = 'delete', | |
| DESCRIPTION = 'description', | |
| EVENT = 'event', | |
| FOOTER_CONTENT = 'footerContent', | |
| FORM = 'form', | |
| HEADER = 'header', | |
| OFFSET_HEIGHT = 'offsetHeight', | |
| OFFSET_WIDTH = 'offsetWidth', | |
| OVERLAY_OFFSET = 'overlayOffset', | |
| REPEATED = 'repeated', | |
| RENDERED = 'rendered', | |
| RIGHT = 'right', | |
| SAVE = 'save', | |
| SCHEDULER_CHANGE = 'schedulerChange', | |
| SHADOW = 'shadow', | |
| STRINGS = 'strings', | |
| TL = 'tl', | |
| TOOLBAR = 'toolbar', | |
| SUBMIT = 'submit', | |
| VALUE = 'value', | |
| VISIBLE_CHANGE = 'visibleChange', | |
| WIDTH = 'width', | |
| EV_SCHEDULER_EVENT_RECORDER_CANCEL = 'cancel', | |
| EV_SCHEDULER_EVENT_RECORDER_DELETE = 'delete', | |
| EV_SCHEDULER_EVENT_RECORDER_EDIT = 'edit', | |
| EV_SCHEDULER_EVENT_RECORDER_SAVE = 'save', | |
| _serialize = A.IO.prototype._serialize, | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY), | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_ARROW = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY, ARROW), | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_ARROW_SHADOW = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY, ARROW, SHADOW), | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_ARROW_RIGHT = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY, ARROW, RIGHT), | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_BODY = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY, BODY), | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_CONTENT = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY, CONTENT), | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_DATE = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY, DATE), | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_FORM = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY, FORM), | |
| CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_HEADER = getCN(SCHEDULER, EVENT, RECORDER, OVERLAY, HEADER), | |
| TPL_OVERLAY_BODY_CONTENT = new A.Template( | |
| '<div class="', CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_ARROW_SHADOW, ' ', CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_ARROW, '"></div>', | |
| '<div class="', CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_ARROW, '"></div>', | |
| '<input type="hidden" name="startDate" value="{startDate}" />', | |
| '<input type="hidden" name="endDate" value="{endDate}" />', | |
| '<div class="', CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_HEADER, '">', | |
| '<input class="', CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_CONTENT, '" name="content" value="{content}" />', | |
| '</div>', | |
| '<div class="', CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_BODY, '">', | |
| '<label class="', CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_DATE, '">{date}</label>', | |
| '</div>' | |
| ), | |
| TPL_OVERLAY_FORM = '<form class="' + CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_FORM + '" id="schedulerEventRecorderForm"></form>'; | |
| var SchedulerEventRecorder = A.Component.create({ | |
| NAME: SCHEDULER_EVENT_RECORDER, | |
| ATTRS: { | |
| allDay: { | |
| value: false | |
| }, | |
| content: { | |
| value: _EMPTY_STR | |
| }, | |
| duration: { | |
| value: 60 | |
| }, | |
| dateFormat: { | |
| validator: isString, | |
| value: '%a, %B %d,' | |
| }, | |
| event: { | |
| }, | |
| eventClass: { | |
| valueFn: function() { | |
| return A.SchedulerEvent; | |
| } | |
| }, | |
| strings: { | |
| value: {}, | |
| setter: function(val) { | |
| return A.merge( | |
| { | |
| 'delete': 'Delete', | |
| 'description-hint': 'e.g., Dinner at Brian\'s', | |
| cancel: 'Cancel', | |
| description: 'Description', | |
| edit: 'Edit', | |
| save: 'Save', | |
| when: 'When' | |
| }, | |
| val || {} | |
| ); | |
| }, | |
| validator: isObject | |
| }, | |
| overlay: { | |
| validator: isObject, | |
| value: { | |
| constrain: null, | |
| visible: false, | |
| width: 300, | |
| zIndex: 500 | |
| } | |
| }, | |
| // See #2530972 | |
| overlayOffset: { | |
| value: [15, -38], | |
| validator: isArray | |
| }, | |
| template: { | |
| value: TPL_OVERLAY_BODY_CONTENT | |
| }, | |
| toolbar: { | |
| setter: function(val) { | |
| var instance = this; | |
| var strings = instance.get(STRINGS); | |
| return A.merge({ | |
| children: [ | |
| { | |
| handler: A.bind(instance._handleSaveEvent, instance), | |
| label: strings[SAVE] | |
| }, | |
| { | |
| handler: A.bind(instance._handleCancelEvent, instance), | |
| label: strings[CANCEL] | |
| }, | |
| { | |
| handler: A.bind(instance._handleDeleteEvent, instance), | |
| label: strings[DELETE] | |
| } | |
| ] | |
| }, val || {}); | |
| }, | |
| validator: isObject, | |
| value: {} | |
| } | |
| }, | |
| EXTENDS: A.SchedulerEvent, | |
| prototype: { | |
| initializer: function() { | |
| var instance = this; | |
| instance.get(NODE).addClass(CSS_SCHEDULER_EVENT_RECORDER); | |
| instance.publish(EV_SCHEDULER_EVENT_RECORDER_CANCEL, { | |
| defaultFn: instance._defCancelEventFn | |
| }); | |
| instance.publish(EV_SCHEDULER_EVENT_RECORDER_DELETE, { | |
| defaultFn: instance._defDeleteEventFn | |
| }); | |
| instance.publish(EV_SCHEDULER_EVENT_RECORDER_EDIT, { | |
| defaultFn: instance._defEditEventFn | |
| }); | |
| instance.publish(EV_SCHEDULER_EVENT_RECORDER_SAVE, { | |
| defaultFn: instance._defSaveEventFn | |
| }); | |
| instance.after(SCHEDULER_CHANGE, instance._afterSchedulerChange); | |
| instance[OVERLAY] = new A.Overlay(instance.get(OVERLAY)); | |
| instance[TOOLBAR] = new A.Toolbar(instance.get(TOOLBAR)); | |
| }, | |
| _afterSchedulerChange: function(event) { | |
| var instance = this; | |
| var scheduler = event.newVal; | |
| var schedulerBB = scheduler.get(BOUNDING_BOX); | |
| instance[OVERLAY].set(CONSTRAIN, schedulerBB); | |
| schedulerBB.delegate(CLICK, A.bind(instance._onClickSchedulerEvent, instance), _DOT + CSS_SCHEDULER_EVENT); | |
| }, | |
| _defCancelEventFn: function(event) { | |
| var instance = this; | |
| instance.get(NODE).remove(); | |
| instance.hideOverlay(); | |
| }, | |
| _defDeleteEventFn: function(event) { | |
| var instance = this; | |
| var scheduler = instance.get(SCHEDULER); | |
| scheduler.removeEvent(instance.get(EVENT)); | |
| instance.hideOverlay(); | |
| scheduler.syncEventsUI(); | |
| }, | |
| _defEditEventFn: function(event) { | |
| var instance = this; | |
| var scheduler = instance.get(SCHEDULER); | |
| instance.hideOverlay(); | |
| scheduler.syncEventsUI(); | |
| }, | |
| _defSaveEventFn: function(event) { | |
| var instance = this; | |
| var scheduler = instance.get(SCHEDULER); | |
| scheduler.addEvent(event.newSchedulerEvent); | |
| instance.hideOverlay(); | |
| scheduler.syncEventsUI(); | |
| }, | |
| _handleCancelEvent: function(event) { | |
| var instance = this; | |
| instance.fire(EV_SCHEDULER_EVENT_RECORDER_CANCEL); | |
| event.preventDefault(); | |
| }, | |
| _handleDeleteEvent: function(event) { | |
| var instance = this; | |
| instance.fire(EV_SCHEDULER_EVENT_RECORDER_DELETE, { | |
| schedulerEvent: instance.get(EVENT) | |
| }); | |
| event.preventDefault(); | |
| }, | |
| _handleSaveEvent: function(event) { | |
| var instance = this; | |
| instance.fire( | |
| instance.get(EVENT) ? EV_SCHEDULER_EVENT_RECORDER_EDIT : EV_SCHEDULER_EVENT_RECORDER_SAVE, | |
| { | |
| newSchedulerEvent: instance.getEventCopy() | |
| } | |
| ); | |
| event.preventDefault(); | |
| }, | |
| _onClickSchedulerEvent: function(event) { | |
| var instance = this; | |
| var evt = event.currentTarget.getData(SCHEDULER_EVENT); | |
| if (evt) { | |
| instance.set(EVENT, evt); | |
| instance.showOverlay([event.pageX, event.pageY]); | |
| instance.get(NODE).remove(); | |
| } | |
| }, | |
| _onOverlayVisibleChange: function(event) { | |
| var instance = this; | |
| if (event.newVal) { | |
| instance.populateForm(); | |
| if (!instance.get(EVENT)) { | |
| var overlayBB = instance[OVERLAY].get(BOUNDING_BOX); | |
| var contentNode = overlayBB.one(_DOT + CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_CONTENT); | |
| setTimeout(function() { | |
| contentNode.selectText(); | |
| }, 0); | |
| } | |
| } | |
| else { | |
| instance.set(EVENT, null); | |
| instance.get(NODE).remove(); | |
| } | |
| }, | |
| _onSubmitForm: function(event) { | |
| var instance = this; | |
| instance._handleSaveEvent(event); | |
| }, | |
| _renderOverlay: function() { | |
| var instance = this; | |
| var strings = instance.get(STRINGS); | |
| instance[OVERLAY].render(); | |
| instance[TOOLBAR].render(); | |
| var overlayBB = instance[OVERLAY].get(BOUNDING_BOX); | |
| overlayBB.addClass(CSS_SCHEDULER_EVENT_RECORDER_OVERLAY); | |
| instance[OVERLAY].set(FOOTER_CONTENT, instance[TOOLBAR].get(BOUNDING_BOX)); | |
| instance[OVERLAY].on(VISIBLE_CHANGE, A.bind(instance._onOverlayVisibleChange, instance)); | |
| instance.formNode = A.Node.create(TPL_OVERLAY_FORM); | |
| instance[OVERLAY].set(BODY_CONTENT, instance.formNode); | |
| instance.formNode.on(SUBMIT, A.bind(instance._onSubmitForm, instance)); | |
| }, | |
| getEventCopy: function() { | |
| var instance = this; | |
| var newEvt = instance.get(EVENT); | |
| if (!newEvt) { | |
| newEvt = new (instance.get(EVENT_CLASS))({ | |
| allDay: instance.get(ALL_DAY), | |
| endDate: instance.get(END_DATE), | |
| scheduler: instance.get(SCHEDULER), | |
| startDate: instance.get(START_DATE) | |
| }); | |
| // copying propagatable attrs | |
| newEvt.copyPropagateAttrValues(instance, { content: true }); | |
| } | |
| var values = instance.serializeForm(); | |
| newEvt.set(CONTENT, values[CONTENT]); | |
| newEvt.set(REPEATED, values[REPEATED]); | |
| return newEvt; | |
| }, | |
| getFormattedDate: function() { | |
| var instance = this; | |
| var dateFormat = instance.get(DATE_FORMAT); | |
| var evt = (instance.get(EVENT) || instance); | |
| var endDate = evt.get(END_DATE); | |
| var scheduler = evt.get(SCHEDULER); | |
| var startDate = evt.get(START_DATE); | |
| var fmtHourFn = (scheduler.get(ACTIVE_VIEW).get(ISO_TIME) ? DateMath.toIsoTimeString : DateMath.toUsTimeString); | |
| return [ evt._formatDate(startDate, dateFormat), fmtHourFn(startDate), _DASH, fmtHourFn(endDate) ].join(_SPACE); | |
| }, | |
| getTemplateData: function() { | |
| var instance = this; | |
| var strings = instance.get(STRINGS); | |
| var evt = (instance.get(EVENT) || instance); | |
| return { | |
| content: evt.get(CONTENT) || strings['description-hint'], | |
| date: instance.getFormattedDate(), | |
| endDate: evt.get(END_DATE).getTime(), | |
| repeated: evt.get(REPEATED), | |
| startDate: evt.get(START_DATE).getTime() | |
| }; | |
| }, | |
| hideOverlay: function() { | |
| var instance = this; | |
| instance[OVERLAY].hide(); | |
| }, | |
| populateForm: function() { | |
| var instance = this; | |
| instance.formNode.setContent( | |
| instance.get(TEMPLATE).parse(instance.getTemplateData()) | |
| ); | |
| }, | |
| serializeForm: function() { | |
| var instance = this; | |
| return A.QueryString.parse(_serialize(instance.formNode.getDOM())); | |
| }, | |
| showOverlay: function(xy, offset) { | |
| var instance = this, | |
| constrain = instance[OVERLAY].get(CONSTRAIN), | |
| overlayOffset = instance.get(OVERLAY_OFFSET), | |
| defaultXY = xy.concat([]), | |
| overlayBB = instance[OVERLAY].get(BOUNDING_BOX), | |
| overlayBBOffsetWidth = overlayBB.get(OFFSET_WIDTH); | |
| if (!instance[OVERLAY].get(RENDERED)) { | |
| instance._renderOverlay(); | |
| } | |
| instance[OVERLAY].show(); | |
| if (!xy) { | |
| var eventNode = (instance.get(EVENT) || instance).get(NODE); | |
| var titleNode = eventNode.one(_DOT + CSS_SCHEDULER_EVENT_TITLE); | |
| offset = [overlayOffset[0] + titleNode.get(OFFSET_WIDTH), overlayOffset[1] + titleNode.get(OFFSET_HEIGHT) / 2]; | |
| xy = titleNode.getXY(); | |
| } | |
| offset = offset || overlayOffset; | |
| xy[0] += offset[0]; | |
| xy[1] += offset[1]; | |
| var arrows = overlayBB.all(_DOT + CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_ARROW), | |
| arrowY = 0, | |
| firstArrow = arrows.item(0), | |
| arrowHalfHeight = (firstArrow.get(OFFSET_HEIGHT)/2); | |
| if ((xy[0] + overlayBBOffsetWidth) >= constrain.get(OFFSET_WIDTH)) { | |
| arrows.addClass(CSS_SCHEDULER_EVENT_RECORDER_OVERLAY_ARROW_RIGHT); | |
| xy[0] -= overlayBBOffsetWidth + firstArrow.get(OFFSET_WIDTH); | |
| } | |
| instance[OVERLAY].set('xy', xy); | |
| var reachMaxHeight = (defaultXY[1] >= ((constrain.get(OFFSET_HEIGHT) + constrain.getY()) - arrowHalfHeight)) ? true : false; | |
| if (reachMaxHeight) { | |
| arrows.setY((overlayBB.getY() + overlayBB.get(OFFSET_HEIGHT)) - firstArrow.get(OFFSET_HEIGHT)); | |
| } | |
| else { | |
| arrows.setY(defaultXY[1] - arrowHalfHeight); | |
| } | |
| } | |
| } | |
| }); | |
| A.SchedulerEventRecorder = SchedulerEventRecorder; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment