diff options
Diffstat (limited to 'web-ui/app/js/page')
| -rw-r--r-- | web-ui/app/js/page/default.js | 146 | ||||
| -rw-r--r-- | web-ui/app/js/page/events.js | 222 | ||||
| -rw-r--r-- | web-ui/app/js/page/logout.js | 43 | ||||
| -rw-r--r-- | web-ui/app/js/page/logout_shortcut.js | 33 | ||||
| -rw-r--r-- | web-ui/app/js/page/pane_contract_expand.js | 51 | ||||
| -rw-r--r-- | web-ui/app/js/page/pix_logo.js | 62 | ||||
| -rw-r--r-- | web-ui/app/js/page/router.js | 71 | ||||
| -rw-r--r-- | web-ui/app/js/page/router/url_params.js | 57 | ||||
| -rw-r--r-- | web-ui/app/js/page/unread_count_title.js | 53 | ||||
| -rw-r--r-- | web-ui/app/js/page/version.js | 41 | 
10 files changed, 779 insertions, 0 deletions
diff --git a/web-ui/app/js/page/default.js b/web-ui/app/js/page/default.js new file mode 100644 index 00000000..ecaedfd8 --- /dev/null +++ b/web-ui/app/js/page/default.js @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2014 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ +define( +  [ +    'mail_view/ui/compose_box', +    'mail_list_actions/ui/mail_list_actions', +    'user_alerts/ui/user_alerts', +    'mail_list/ui/mail_list', +    'mail_view/ui/no_message_selected_pane', +    'mail_view/ui/no_mails_available_pane', +    'mail_view/ui/mail_view', +    'mail_view/ui/mail_actions', +    'mail_view/ui/reply_section', +    'mail_view/data/mail_sender', +    'services/mail_service', +    'services/delete_service', +    'services/recover_service', +    'tags/ui/tag_list', +    'tags/data/tags', +    'page/router', +    'dispatchers/right_pane_dispatcher', +    'dispatchers/middle_pane_dispatcher', +    'dispatchers/left_pane_dispatcher', +    'search/search_trigger', +    'search/results_highlighter', +    'foundation/off_canvas', +    'page/pane_contract_expand', +    'views/i18n', +    'views/recipientListFormatter', +    'flight/lib/logger', +    'user_settings/data/user_settings', +    'user_settings/ui/user_settings_icon', +    'page/logout', +    'page/logout_shortcut', +    'feedback/feedback_trigger', +    'mail_view/ui/feedback_box', +    'mail_view/data/feedback_sender', +    'page/version', +    'page/unread_count_title', +    'page/pix_logo', +    'helpers/browser' +  ], + +  function ( +    composeBox, +    mailListActions, +    userAlerts, +    mailList, +    noMessageSelectedPane, +    noMailsAvailablePane, +    mailView, +    mailViewActions, +    replyButton, +    mailSender, +    mailService, +    deleteService, +    recoverService, +    tagList, +    tags, +    router, +    rightPaneDispatcher, +    middlePaneDispatcher, +    leftPaneDispatcher, +    searchTrigger, +    resultsHighlighter, +    offCanvas, +    paneContractExpand, +    viewI18n, +    recipientListFormatter, +    withLogging, +    userSettings, +    userSettingsIcon, +    logout, +    logoutShortcut, +    feedback, +    feedbackBox, +    feedbackSender, +    version, +    unreadCountTitle, +    pixLogo, +    browser) { + +    'use strict'; +    function initialize(path) { +      viewI18n.init(path + '/assets/'); +      viewI18n.loaded(function() { +        paneContractExpand.attachTo(document); + +        userAlerts.attachTo('#user-alerts'); + +        mailList.attachTo('#mail-list'); +        mailListActions.attachTo('#list-actions'); + +        searchTrigger.attachTo('#search-trigger'); +        resultsHighlighter.attachTo(document); + +        mailSender.attachTo(document); + +        mailService.attachTo(document); +        deleteService.attachTo(document); +        recoverService.attachTo(document); + +        tags.attachTo(document); +        tagList.attachTo('#tag-list'); + +        router.attachTo(document); + +        rightPaneDispatcher.attachTo(document); +        middlePaneDispatcher.attachTo(document); +        leftPaneDispatcher.attachTo(document); + +        offCanvas.attachTo(document); +        userSettings.attachTo(document); +        userSettingsIcon.attachTo('#user-settings-icon'); +        logout.attachTo('#logout'); +        logoutShortcut.attachTo('#logout-shortcut'); +        version.attachTo('.version'); + +        feedback.attachTo('#feedback'); +        feedbackSender.attachTo(document); + +        unreadCountTitle.attachTo(document); + +        pixLogo.attachTo(document); + +        $.ajaxSetup({headers: {'X-XSRF-TOKEN': browser.getCookie('XSRF-TOKEN')}}); +      }); +    } + +    return initialize; +  } +); diff --git a/web-ui/app/js/page/events.js b/web-ui/app/js/page/events.js new file mode 100644 index 00000000..68a6aad1 --- /dev/null +++ b/web-ui/app/js/page/events.js @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2014 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ +define(function () { +  'use strict'; + +  var events = { +    router: { +      pushState: 'router:pushState' +    }, +    ui: { +      sendbutton: { +        enable: 'ui:sendbutton:enable' +      }, +      middlePane: { +        expand: 'ui:middlePane:expand', +        contract: 'ui:middlePane:contract' +      }, +      userAlerts: { +        displayMessage: 'ui:userAlerts:displayMessage' +      }, +      tag: { +        selected: 'ui:tagSelected', +        select: 'ui:tagSelect', +      }, +      tags: { +        loaded: 'ui:tagsLoaded' +      }, +      tagList: { +        load: 'ui:tagList:load' +      }, +      mails: { +        refresh: 'ui:mails:refresh', +        fetchByTag: 'ui:mails:fetchByTag', +        cleanSelected: 'ui:mails:cleanSelected', +        checkAll: 'ui:mails:checkAll', +        uncheckAll: 'ui:mails:uncheckAll', +        hasMailsChecked: 'ui:mails:hasMailsChecked' +      }, +      mail: { +        open: 'ui:mail:open', +        updateSelected: 'ui:mail:updateSelected', +        delete: 'ui:mail:delete', +        deleteMany: 'ui:mail:deleteMany', +        recoverMany: 'ui:mail:recoverMany', +        archiveMany: 'ui:mail:archiveMany', +        wantChecked: 'ui:mail:wantChecked', +        hereChecked: 'ui:mail:hereChecked', +        checked: 'ui:mail:checked', +        discard: 'ui:mail:discard', +        unchecked: 'ui:mail:unchecked', +        changedSinceLastSave: 'ui:mail:changedSinceLastSave', +        send: 'ui:mail:send', +        recipientsUpdated: 'ui:mail:recipientsUpdated' +      }, +      page: { +        previous: 'ui:page:previous', +        next: 'ui:page:next', +        changed: 'ui:page:changed', +        spinLogo: 'ui:page:spinLogo', +        stopSpinningLogo: 'ui:page:stopSpinningLogo' +      }, +      composeBox: { +        newMessage: 'ui:composeBox:newMessage', +        newReply: 'ui:composeBox:newReply', +        trashReply: 'ui:composeBox:trashReply', +        requestCancelReply: 'ui:composeBox:requestCancelReply' +      }, +      replyBox: { +        showReply: 'ui:replyBox:showReply', +        showReplyAll: 'ui:replyBox:showReplyAll', +        showReplyContainer: 'ui:replyBox:showReplyContainer', +      }, +      recipients: { +        entered: 'ui:recipients:entered', +        enteredInvalid: 'ui:recipients:enteredInvalid', +        updated: 'ui:recipients:updated', +        editRecipient: 'ui:recipients:editRecipient', +        deleteRecipient: 'ui:recipients:deleteRecipient', +        deleteLast: 'ui:recipients:deleteLast', +        selectLast: 'ui:recipients:selectLast', +        unselectAll: 'ui:recipients:unselectAll', +        addressesExist: 'ui:recipients:addressesExist', +        inputFieldHasCharacters: 'ui:recipients:inputFieldHasCharacters', +        inputFieldIsEmpty: 'ui:recipients:inputFieldIsEmpty', +        doCompleteInput: 'ui:recipients:doCompleteInput', +        doCompleteRecipients: 'ui:recipients:doCompleteRecipients', +        clickToEdit: 'ui:recipients:clickToEdit' +      }, +      userSettingsBox: { +        toggle: 'ui:userSettingsBox:toggle' +      } +    }, +    search: { +      perform: 'search:perform', +      results: 'search:results', +      empty: 'search:empty', +      highlightResults: 'search:highlightResults', +      resetHighlight: 'search:resetHighlight' +    }, +    feedback: { +      submit: 'feedback:submit', +      submitted: 'feedback:submitted' +    }, +    userSettings: { +      here: 'userSettings:here', +      getInfo: 'userSettings:getInfo', +      destroyPopup: 'userSettings:destroyPopup' +    }, +    mail: { +      here: 'mail:here', +      want: 'mail:want', +      display: 'mail:display', +      highlightMailContent: 'mail:highlightMailContent', +      send: 'mail:send', +      send_failed: 'mail:send_failed', +      sent: 'mail:sent', +      read: 'mail:read', +      unread: 'mail:unread', +      delete: 'mail:delete', +      deleteMany: 'mail:deleteMany', +      archiveMany: 'mail:archiveMany', +      recoverMany: 'mail:recoverMany', +      deleted: 'mail:deleted', +      saveDraft: 'draft:save', +      draftSaved: 'draft:saved', +      draftReply: { +        want: 'mail:draftReply:want', +        here: 'mail:draftReply:here', +        notFound: 'mail:draftReply:notFound' +      }, +      notFound: 'mail:notFound', +      save: 'mail:saved', +      tags: { +        update: 'mail:tags:update', +        updated: 'mail:tags:updated' +      }, +      uploadedAttachment: 'mail:uploaded:attachment', +      uploadingAttachment: 'mail:uploading:attachment', +      startUploadAttachment: 'mail:start:upload:attachment', +      failedUploadAttachment: 'mail:failed:upload:attachment', +      appendAttachment: 'mail:append:attachment', +      resetAttachments: 'mail:reset:attachments', +      removeAttachment: 'mail:remove:attachment' +    }, +    mails: { +      available: 'mails:available', +      availableForRefresh: 'mails:available:refresh', +      teardown: 'mails:teardown' +    }, +    tags: { +      want: 'tags:want', +      received: 'tags:received', +      teardown: 'tags:teardown', +      shortcuts: { +        teardown: 'tags:shortcuts:teardown' +      } +    }, +    route: { +      toUrl: 'route:toUrl' +    }, + +    components: { +      composeBox: { +        open: 'components:composeBox:open', +        close: 'components:composeBox:close' +      }, +      mailPane: { +        open: 'components:mailPane:open', +        close: 'components:mailPane:close' +      }, +      mailView: { +        show: 'components:mailView:show', +        close: 'components:mailView:close' +      }, +      replySection: { +        initialize: 'components:replySection:initialize', +        close: 'components:replySection:close' +      }, +      noMessageSelectedPane: { +        open: 'components:noMessageSelectedPane:open', +        close: 'components:noMessageSelectedPane:close' +      } +    }, + +    dispatchers: { +      rightPane: { +        openComposeBox: 'dispatchers:rightPane:openComposeBox', +        openFeedbackBox: 'dispatchers:rightPane:openFeedbackBox', +        openNoMessageSelected: 'dispatchers:rightPane:openNoMessageSelected', +        openNoMessageSelectedWithoutPushState: 'dispatchers:rightPane:openNoMessageSelectedWithoutPushState', +        refreshMailList: 'dispatchers:rightPane:refreshMailList', +        openDraft: 'dispatchers:rightPane:openDraft', +        selectTag: 'dispatchers:rightPane:selectTag', +        clear: 'dispatchers:rightPane:clear' +      }, +      middlePane: { +        refreshMailList: 'dispatchers:middlePane:refreshMailList', +        cleanSelected: 'dispatchers:middlePane:unselect', +        resetScroll: 'dispatchers:middlePane:resetScroll' +      }, +      tags: { +        refreshTagList: 'dispatchers:tag:refresh' +      } +    } +  }; + +  return events; +}); diff --git a/web-ui/app/js/page/logout.js b/web-ui/app/js/page/logout.js new file mode 100644 index 00000000..81b57db2 --- /dev/null +++ b/web-ui/app/js/page/logout.js @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2014 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ +define(['flight/lib/component', 'features', 'views/templates', 'helpers/browser'], + function (defineComponent, features, templates, browser) { +  'use strict'; + +  return defineComponent(function () { + +    this.defaultAttrs({form: '#logout-form'}); + +    this.render = function () { +      var logoutHTML = templates.page.logout({ logout_url: features.getLogoutUrl(), +       csrf_token: browser.getCookie('XSRF-TOKEN')}); +      this.$node.html(logoutHTML); +    }; + +    this.logout = function(){ +      this.select('form').submit(); +    }; + +    this.after('initialize', function () { +      if (features.isLogoutEnabled()) { +	      this.render(); +	      this.on(this.$node, 'click', this.logout); +      } +    }); + +  }); +}); diff --git a/web-ui/app/js/page/logout_shortcut.js b/web-ui/app/js/page/logout_shortcut.js new file mode 100644 index 00000000..10a69c7d --- /dev/null +++ b/web-ui/app/js/page/logout_shortcut.js @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2014 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ +define(['flight/lib/component', 'features', 'views/templates'], function (defineComponent, features, templates) { +  'use strict'; + +  return defineComponent(function () { +  +    this.render = function () { +      if (features.isLogoutEnabled()) { +        var logoutShortcutHTML = templates.page.logoutShortcut(); +        this.$node.html(logoutShortcutHTML); +      } +    }; + +    this.after('initialize', function () { +	    this.render(); +    }); +  }); +}); diff --git a/web-ui/app/js/page/pane_contract_expand.js b/web-ui/app/js/page/pane_contract_expand.js new file mode 100644 index 00000000..9bb435c4 --- /dev/null +++ b/web-ui/app/js/page/pane_contract_expand.js @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ + +define(['flight/lib/component', 'page/events'], function (describeComponent, events) { +  'use strict'; + +  return describeComponent(paneContractExpand); + +  function paneContractExpand() { +    this.defaultAttrs({ +      RIGHT_PANE_EXPAND_CLASSES: 'small-7 medium-7 large-7 columns', +      RIGHT_PANE_CONTRACT_CLASSES: 'small-7 medium-4 large-4 columns', +      MIDDLE_PANE_EXPAND_CLASSES: 'small-5 medium-8 large-8 columns no-padding', +      MIDDLE_PANE_CONTRACT_CLASSES: 'small-5 medium-5 large-5 columns no-padding' +    }); + +    this.expandMiddlePaneContractRightPane = function () { +      $('#middle-pane-container').attr('class', this.attr.MIDDLE_PANE_EXPAND_CLASSES); +      $('#right-pane').attr('class', this.attr.RIGHT_PANE_CONTRACT_CLASSES); +    }; + +    this.contractMiddlePaneExpandRightPane = function () { +      $('#middle-pane-container').attr('class', this.attr.MIDDLE_PANE_CONTRACT_CLASSES); +      $('#right-pane').attr('class', this.attr.RIGHT_PANE_EXPAND_CLASSES); +    }; + +    this.after('initialize', function () { +      this.on(document, events.ui.mail.open, this.contractMiddlePaneExpandRightPane); +      this.on(document, events.dispatchers.rightPane.openComposeBox, this.contractMiddlePaneExpandRightPane); +      this.on(document, events.dispatchers.rightPane.openDraft, this.contractMiddlePaneExpandRightPane); +      this.on(document, events.dispatchers.rightPane.openFeedbackBox, this.contractMiddlePaneExpandRightPane); +      this.on(document, events.dispatchers.rightPane.openNoMessageSelected, this.expandMiddlePaneContractRightPane); +      this.expandMiddlePaneContractRightPane(); +    }); + +  } +}); diff --git a/web-ui/app/js/page/pix_logo.js b/web-ui/app/js/page/pix_logo.js new file mode 100644 index 00000000..ad17f3be --- /dev/null +++ b/web-ui/app/js/page/pix_logo.js @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ +define( +  [ +    'flight/lib/component', +    'page/events' +  ], + +  function(defineComponent, events) { +    'use strict'; + +    return defineComponent(pixLogo); + +    function pixLogo() { +      this.turnAnimationOn = function () { +        $('.logo-part-animation-off').attr('class', 'logo-part-animation-on'); +      }; + +      this.turnAnimationOff = function () { +        setTimeout(function(){ +          $('.logo-part-animation-on').attr('class', 'logo-part-animation-off'); +        }, 600); +      }; + +      this.triggerSpinLogo = function (ev, data) { +        this.trigger(document, events.ui.page.spinLogo); +      }; + +      this.triggerStopSpinningLogo = function(ev, data) { +        this.trigger(document, events.ui.page.stopSpinningLogo); +      }; + +      this.after('initialize', function () { +        this.on(document, events.ui.page.spinLogo, this.turnAnimationOn); +        this.on(document, events.ui.page.stopSpinningLogo, this.turnAnimationOff); + +        this.on(document, events.ui.tag.select, this.triggerSpinLogo); +        this.on(document, events.mails.available, this.triggerStopSpinningLogo); +        this.on(document, events.mail.saveDraft, this.triggerSpinLogo); +        this.on(document, events.mail.draftSaved, this.triggerStopSpinningLogo); +        this.on(document, events.ui.mail.open, this.triggerSpinLogo); +        this.on(document, events.dispatchers.rightPane.openDraft, this.triggerSpinLogo); +        this.on(document, events.search.perform, this.triggerSpinLogo); +        this.on(document, events.mail.want, this.triggerStopSpinningLogo); +      }); +    } +  } +); diff --git a/web-ui/app/js/page/router.js b/web-ui/app/js/page/router.js new file mode 100644 index 00000000..ce0d7d04 --- /dev/null +++ b/web-ui/app/js/page/router.js @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2014 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ +define(['flight/lib/component', 'page/events', 'page/router/url_params'], function (defineComponent, events, urlParams) { +  'use strict'; + +  return defineComponent(function () { +    this.defaultAttrs({ +      history: window.history +    }); + +    function createHash(data) { +      var hash = '/#/' + data.tag; +      if (!_.isUndefined(data.mailIdent)) { +        hash += '/mail/' + data.mailIdent; +      } +      return hash; +    } + +    function createState(data, previousState) { +      return { +        tag: data.tag || (previousState && previousState.tag) || urlParams.defaultTag(), +        mailIdent: data.mailIdent, +        query: data.query, +        isDisplayNoMessageSelected: !!data.isDisplayNoMessageSelected +      }; +    } + +    this.pushState = function (ev, data) { +      if (!data.fromPopState) { +        var nextState = createState(data, this.attr.history.state); +        this.attr.history.pushState(nextState, '', createHash(nextState)); +      } +    }; + +    this.popState = function (ev) { +      var state = ev.state || {}; + +      this.trigger(document, events.ui.tag.select, { +        tag: state.tag || urlParams.getTag(), +        mailIdent: state.mailIdent, +        fromPopState: true +      }); + +      if (ev.state.isDisplayNoMessageSelected) { +        this.trigger(document, events.dispatchers.rightPane.openNoMessageSelectedWithoutPushState); +      } +    }; + +    this.after('initialize', function () { +      this.on(document, events.router.pushState, this.pushState); +      this.on(document, events.ui.tag.select, this.pushState); +      this.on(document, events.search.perform, this.pushState); +      this.on(document, events.search.empty, this.pushState); +      window.onpopstate = this.popState.bind(this); +    }); +  }); +}); diff --git a/web-ui/app/js/page/router/url_params.js b/web-ui/app/js/page/router/url_params.js new file mode 100644 index 00000000..4fa11c6d --- /dev/null +++ b/web-ui/app/js/page/router/url_params.js @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2014 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ +define([], function () { +  'use strict'; + +  function defaultTag() { +    return 'inbox'; +  } + +  function getDocumentHash() { +    return document.location.hash.replace(/\/$/, ''); +  } + +  function hashTag(hash) { +    if (hasMailIdent(hash)) { +      return /\/(.+)\/mail\/[-\w]+$/.exec(getDocumentHash())[1]; +    } +    return hash.substring(2); +  } + + +  function getTag() { +    if (document.location.hash !== '') { +      return hashTag(getDocumentHash()); +    } +    return defaultTag(); +  } + +  function hasMailIdent() { +    return getDocumentHash().match(/mail\/[-\w]+$/); +  } + +  function getMailIdent() { +    return /mail\/([-\w]+)$/.exec(getDocumentHash())[1]; +  } + +  return { +    getTag: getTag, +    hasMailIdent: hasMailIdent, +    getMailIdent: getMailIdent, +    defaultTag: defaultTag +  }; +}); diff --git a/web-ui/app/js/page/unread_count_title.js b/web-ui/app/js/page/unread_count_title.js new file mode 100644 index 00000000..89dcd47d --- /dev/null +++ b/web-ui/app/js/page/unread_count_title.js @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2015 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ + + +define( +  [ +    'flight/lib/component', +    'page/events', +  ], + +  function (defineComponent, events) { +    'use strict'; + +    return defineComponent(function () { +      this.getTitleText = function () { +        return document.title; +      }; + +      this.updateCount = function (ev, data) { +        var unread = data.mails.filter(function (mail) { +            return mail.status.indexOf('read') === -1; +        }).length; + +        var tag = this.toTitleCase(data.tag); +        var counter = unread > 0 ? ' (' + unread + ') - ' : ' - '; +        document.title = tag + counter  + this.rawTitle; +      }; + +      this.toTitleCase = function (str) { +        return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); }); +      }; + +      this.after('initialize', function () { +        this.rawTitle = document.title; +        this.on(document, events.mails.available, this.updateCount); +      }); + +    }); +}); diff --git a/web-ui/app/js/page/version.js b/web-ui/app/js/page/version.js new file mode 100644 index 00000000..9fd5e629 --- /dev/null +++ b/web-ui/app/js/page/version.js @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ +define(['flight/lib/component', 'views/templates', 'helpers/view_helper'], function (defineComponent, templates, viewHelper) { +  'use strict'; + +  return defineComponent(function () { +      this.defaultAttrs({ +        'sinceDate': '#version-date' +      }); +     +    this.render = function () { +        this.$node.html(templates.page.version()); +        this.renderCommitDate(); +    }; + +    this.renderCommitDate = function(){ +      var since = this.select('sinceDate').attr('data-since'), +        commitDate = viewHelper.sinceDate(since); +      this.select('sinceDate').html(commitDate + ' ago'); +    }; + +    this.after('initialize', function () { +      this.render(); +    }); + +  }); +});  | 
