diff --git a/Gruntfile.js b/Gruntfile.js index 26f4f4da..bdc97718 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -191,6 +191,7 @@ module.exports = function(grunt) { _: 'underscore/underscore-min.js', zepto: 'zepto/zepto.min.js', jquery: 'zepto/zepto.min.js', + hbs: 'handlebars/runtime.js', kdbxweb: 'kdbxweb/dist/kdbxweb.js', dropbox: 'dropbox/lib/dropbox.min.js', baron: 'baron/baron.min.js', @@ -201,7 +202,7 @@ module.exports = function(grunt) { }, module: { loaders: [ - { test: /\.html$/, loader: StringReplacePlugin.replace('ejs', { replacements: [{ + { test: /\.hbs$/, loader: StringReplacePlugin.replace('handlebars-loader', { replacements: [{ pattern: /\r?\n\s*/g, replacement: function() { return '\n'; } }]})}, @@ -254,7 +255,7 @@ module.exports = function(grunt) { debounceDelay: 500 }, scripts: { - files: ['app/scripts/**/*.js', 'app/templates/**/*.html'], + files: ['app/scripts/**/*.js', 'app/templates/**/*.hbs'], tasks: ['webpack'] }, styles: { diff --git a/app/scripts/app.js b/app/scripts/app.js index 87919020..c4800925 100644 --- a/app/scripts/app.js +++ b/app/scripts/app.js @@ -10,12 +10,12 @@ var AppModel = require('./models/app-model'), ThemeChanger = require('./util/theme-changer'); $(function() { - require('./mixins/view'); - if (location.href.indexOf('state=') >= 0) { DropboxLink.receive(); return; } + require('./mixins/view'); + require('./helpers'); KeyHandler.init(); IdleTracker.init(); diff --git a/app/scripts/helpers/cmp.js b/app/scripts/helpers/cmp.js new file mode 100644 index 00000000..373a43d2 --- /dev/null +++ b/app/scripts/helpers/cmp.js @@ -0,0 +1,30 @@ +'use strict'; + +var Handlebars = require('hbs'); + +Handlebars.registerHelper('cmp', function(lvalue, rvalue, op, options) { + var cond; + switch (op) { + case '<': + cond = lvalue < rvalue; + break; + case '>': + cond = lvalue > rvalue; + break; + case '>=': + cond = lvalue >= rvalue; + break; + case '<=': + cond = lvalue <= rvalue; + break; + case '===': + case '==': + cond = lvalue === rvalue; + break; + case '!==': + case '!=': + cond = lvalue !== rvalue; + break; + } + return cond ? options.fn(this) : options.inverse(this); +}); diff --git a/app/scripts/helpers/ifemptyoreq.js b/app/scripts/helpers/ifemptyoreq.js new file mode 100644 index 00000000..67d63852 --- /dev/null +++ b/app/scripts/helpers/ifemptyoreq.js @@ -0,0 +1,7 @@ +'use strict'; + +var Handlebars = require('hbs'); + +Handlebars.registerHelper('ifemptyoreq', function(lvalue, rvalue, options) { + return !lvalue || lvalue === rvalue ? options.fn(this) : options.inverse(this); +}); diff --git a/app/scripts/helpers/ifeq.js b/app/scripts/helpers/ifeq.js new file mode 100644 index 00000000..0b1463f5 --- /dev/null +++ b/app/scripts/helpers/ifeq.js @@ -0,0 +1,7 @@ +'use strict'; + +var Handlebars = require('hbs'); + +Handlebars.registerHelper('ifeq', function(lvalue, rvalue, options) { + return lvalue === rvalue ? options.fn(this) : options.inverse(this); +}); diff --git a/app/scripts/helpers/ifneq.js b/app/scripts/helpers/ifneq.js new file mode 100644 index 00000000..5f22729d --- /dev/null +++ b/app/scripts/helpers/ifneq.js @@ -0,0 +1,7 @@ +'use strict'; + +var Handlebars = require('hbs'); + +Handlebars.registerHelper('ifneq', function(lvalue, rvalue, options) { + return lvalue !== rvalue ? options.fn(this) : options.inverse(this); +}); diff --git a/app/scripts/helpers/index.js b/app/scripts/helpers/index.js new file mode 100644 index 00000000..2538b1dc --- /dev/null +++ b/app/scripts/helpers/index.js @@ -0,0 +1,6 @@ +'use strict'; + +require('./cmp'); +require('./ifeq'); +require('./ifneq'); +require('./ifemptyoreq'); diff --git a/app/scripts/views/app-view.js b/app/scripts/views/app-view.js index fbc23ba5..f6979077 100644 --- a/app/scripts/views/app-view.js +++ b/app/scripts/views/app-view.js @@ -22,7 +22,7 @@ var Backbone = require('backbone'), var AppView = Backbone.View.extend({ el: 'body', - template: require('templates/app.html'), + template: require('templates/app.hbs'), events: { 'contextmenu': 'contextmenu', diff --git a/app/scripts/views/details/details-attachment-view.js b/app/scripts/views/details/details-attachment-view.js index 1c0dda44..8a55759d 100644 --- a/app/scripts/views/details/details-attachment-view.js +++ b/app/scripts/views/details/details-attachment-view.js @@ -5,7 +5,7 @@ var Backbone = require('backbone'), FeatureDetector = require('../../util/feature-detector'); var DetailsAttachmentView = Backbone.View.extend({ - template: require('templates/details/details-attachment.html'), + template: require('templates/details/details-attachment.hbs'), events: { }, diff --git a/app/scripts/views/details/details-history-view.js b/app/scripts/views/details/details-history-view.js index a74edd14..8493096f 100644 --- a/app/scripts/views/details/details-history-view.js +++ b/app/scripts/views/details/details-history-view.js @@ -9,7 +9,7 @@ var Backbone = require('backbone'), FieldViewReadOnlyRaw = require('../fields/field-view-read-only-raw'); var DetailsHistoryView = Backbone.View.extend({ - template: require('templates/details/details-history.html'), + template: require('templates/details/details-history.hbs'), events: { 'click .details__history-close': 'closeHistory', diff --git a/app/scripts/views/details/details-view.js b/app/scripts/views/details/details-view.js index 3219b631..cdcdfab4 100644 --- a/app/scripts/views/details/details-view.js +++ b/app/scripts/views/details/details-view.js @@ -23,9 +23,9 @@ var Backbone = require('backbone'), kdbxweb = require('kdbxweb'); var DetailsView = Backbone.View.extend({ - template: require('templates/details/details.html'), - emptyTemplate: require('templates/details/details-empty.html'), - groupTemplate: require('templates/details/details-group.html'), + template: require('templates/details/details.hbs'), + emptyTemplate: require('templates/details/details-empty.hbs'), + groupTemplate: require('templates/details/details-group.hbs'), fieldViews: null, views: null, diff --git a/app/scripts/views/dropdown-view.js b/app/scripts/views/dropdown-view.js index 203cfb6f..8bb1c57a 100644 --- a/app/scripts/views/dropdown-view.js +++ b/app/scripts/views/dropdown-view.js @@ -3,7 +3,7 @@ var Backbone = require('backbone'); var DropdownView = Backbone.View.extend({ - template: require('templates/dropdown.html'), + template: require('templates/dropdown.hbs'), events: { 'click .dropdown__item': 'itemClick' diff --git a/app/scripts/views/fields/field-view.js b/app/scripts/views/fields/field-view.js index b2a1f674..4ba004e7 100644 --- a/app/scripts/views/fields/field-view.js +++ b/app/scripts/views/fields/field-view.js @@ -5,7 +5,7 @@ var Backbone = require('backbone'), CopyPaste = require('../../comp/copy-paste'); var FieldView = Backbone.View.extend({ - template: require('templates/details/field.html'), + template: require('templates/details/field.hbs'), events: { 'click .details__field-label': 'fieldLabelClick', diff --git a/app/scripts/views/footer-view.js b/app/scripts/views/footer-view.js index 409a8d33..49e10bec 100644 --- a/app/scripts/views/footer-view.js +++ b/app/scripts/views/footer-view.js @@ -7,7 +7,7 @@ var Backbone = require('backbone'), UpdateModel = require('../models/update-model'); var FooterView = Backbone.View.extend({ - template: require('templates/footer.html'), + template: require('templates/footer.hbs'), events: { 'click .footer__db-item': 'showFile', diff --git a/app/scripts/views/generator-view.js b/app/scripts/views/generator-view.js index 668da440..62a46169 100644 --- a/app/scripts/views/generator-view.js +++ b/app/scripts/views/generator-view.js @@ -11,7 +11,7 @@ var DefaultGenOpts = { var GeneratorView = Backbone.View.extend({ el: 'body', - template: require('templates/generator.html'), + template: require('templates/generator.hbs'), events: { 'click': 'click', diff --git a/app/scripts/views/grp-view.js b/app/scripts/views/grp-view.js index c8eafe31..0b163946 100644 --- a/app/scripts/views/grp-view.js +++ b/app/scripts/views/grp-view.js @@ -6,7 +6,7 @@ var Backbone = require('backbone'), baron = require('baron'); var GrpView = Backbone.View.extend({ - template: require('templates/grp.html'), + template: require('templates/grp.hbs'), events: { 'click .grp__icon': 'showIconsSelect', diff --git a/app/scripts/views/icon-select-view.js b/app/scripts/views/icon-select-view.js index d18d085c..7be076fb 100644 --- a/app/scripts/views/icon-select-view.js +++ b/app/scripts/views/icon-select-view.js @@ -8,7 +8,7 @@ var Backbone = require('backbone'), var logger = new Logger('icon-select-view'); var IconSelectView = Backbone.View.extend({ - template: require('templates/icon-select.html'), + template: require('templates/icon-select.hbs'), events: { 'click .icon-select__icon': 'iconClick', diff --git a/app/scripts/views/list-search-view.js b/app/scripts/views/list-search-view.js index 45c9b603..6f0e5529 100644 --- a/app/scripts/views/list-search-view.js +++ b/app/scripts/views/list-search-view.js @@ -7,7 +7,7 @@ var Backbone = require('backbone'), FeatureDetector = require('../util/feature-detector'); var ListSearchView = Backbone.View.extend({ - template: require('templates/list-search.html'), + template: require('templates/list-search.hbs'), events: { 'keydown .list__search-field': 'inputKeyDown', diff --git a/app/scripts/views/list-view.js b/app/scripts/views/list-view.js index 3557ab0f..bd1dbc87 100644 --- a/app/scripts/views/list-view.js +++ b/app/scripts/views/list-view.js @@ -10,8 +10,8 @@ var Backbone = require('backbone'), baron = require('baron'); var ListView = Backbone.View.extend({ - template: require('templates/list.html'), - emptyTemplate: require('templates/list-empty.html'), + template: require('templates/list.hbs'), + emptyTemplate: require('templates/list-empty.hbs'), events: { 'click .list__item': 'itemClick', @@ -84,7 +84,7 @@ var ListView = Backbone.View.extend({ getItemsTemplate: function() { if (this.model.settings.get('tableView')) { - return require('templates/list-table.html'); + return require('templates/list-table.hbs'); } else { return this.renderPlainItems; } @@ -96,9 +96,9 @@ var ListView = Backbone.View.extend({ getItemTemplate: function() { if (this.model.settings.get('tableView')) { - return require('templates/list-item-table.html'); + return require('templates/list-item-table.hbs'); } else { - return require('templates/list-item-short.html'); + return require('templates/list-item-short.hbs'); } }, diff --git a/app/scripts/views/menu/menu-item-view.js b/app/scripts/views/menu/menu-item-view.js index e24be358..d4eeb782 100644 --- a/app/scripts/views/menu/menu-item-view.js +++ b/app/scripts/views/menu/menu-item-view.js @@ -7,7 +7,7 @@ var Backbone = require('backbone'), DragDropInfo = require('../../comp/drag-drop-info'); var MenuItemView = Backbone.View.extend({ - template: require('templates/menu/menu-item.html'), + template: require('templates/menu/menu-item.hbs'), events: { 'mouseover': 'mouseover', diff --git a/app/scripts/views/menu/menu-section-view.js b/app/scripts/views/menu/menu-section-view.js index a76eb4f8..a3a930f9 100644 --- a/app/scripts/views/menu/menu-section-view.js +++ b/app/scripts/views/menu/menu-section-view.js @@ -8,7 +8,7 @@ var Backbone = require('backbone'), baron = require('baron'); var MenuSectionView = Backbone.View.extend({ - template: require('templates/menu/menu-section.html'), + template: require('templates/menu/menu-section.hbs'), events: {}, diff --git a/app/scripts/views/menu/menu-view.js b/app/scripts/views/menu/menu-view.js index c4ebaa2f..74740390 100644 --- a/app/scripts/views/menu/menu-view.js +++ b/app/scripts/views/menu/menu-view.js @@ -7,7 +7,7 @@ var Backbone = require('backbone'), AppSettingsModel = require('../../models/app-settings-model'); var MenuView = Backbone.View.extend({ - template: require('templates/menu/menu.html'), + template: require('templates/menu/menu.hbs'), events: {}, diff --git a/app/scripts/views/modal-view.js b/app/scripts/views/modal-view.js index 3d20ffc1..787e9a85 100644 --- a/app/scripts/views/modal-view.js +++ b/app/scripts/views/modal-view.js @@ -7,7 +7,7 @@ var Backbone = require('backbone'), var ModalView = Backbone.View.extend({ el: 'body', - template: require('templates/modal.html'), + template: require('templates/modal.hbs'), events: { 'click .modal__buttons button': 'buttonClick', diff --git a/app/scripts/views/open-view.js b/app/scripts/views/open-view.js index 8dd1a1a4..5ca1b8de 100644 --- a/app/scripts/views/open-view.js +++ b/app/scripts/views/open-view.js @@ -10,7 +10,7 @@ var Backbone = require('backbone'), var logger = new Logger('open-view'); var OpenView = Backbone.View.extend({ - template: require('templates/open.html'), + template: require('templates/open.hbs'), events: { 'change .open__file-ctrl': 'fileSelected', diff --git a/app/scripts/views/settings/settings-about-view.js b/app/scripts/views/settings/settings-about-view.js index ac7152a0..fd4e9324 100644 --- a/app/scripts/views/settings/settings-about-view.js +++ b/app/scripts/views/settings/settings-about-view.js @@ -5,7 +5,7 @@ var Backbone = require('backbone'), Links = require('../../const/links'); var SettingsAboutView = Backbone.View.extend({ - template: require('templates/settings/settings-about.html'), + template: require('templates/settings/settings-about.hbs'), render: function() { this.renderTemplate({ diff --git a/app/scripts/views/settings/settings-file-view.js b/app/scripts/views/settings/settings-file-view.js index 0c0755e6..300aee04 100644 --- a/app/scripts/views/settings/settings-file-view.js +++ b/app/scripts/views/settings/settings-file-view.js @@ -13,7 +13,7 @@ var Backbone = require('backbone'), FileSaver = require('filesaver'); var SettingsAboutView = Backbone.View.extend({ - template: require('templates/settings/settings-file.html'), + template: require('templates/settings/settings-file.hbs'), events: { 'click .settings__file-button-save-default': 'saveDefault', diff --git a/app/scripts/views/settings/settings-general-view.js b/app/scripts/views/settings/settings-general-view.js index a6e61c35..6b2be206 100644 --- a/app/scripts/views/settings/settings-general-view.js +++ b/app/scripts/views/settings/settings-general-view.js @@ -11,7 +11,7 @@ var Backbone = require('backbone'), Links = require('../../const/links'); var SettingsGeneralView = Backbone.View.extend({ - template: require('templates/settings/settings-general.html'), + template: require('templates/settings/settings-general.hbs'), events: { 'change .settings__general-theme': 'changeTheme', @@ -43,6 +43,9 @@ var SettingsGeneralView = Backbone.View.extend({ }, render: function() { + var updateReady = UpdateModel.instance.get('updateStatus') === 'ready', + updateFound = UpdateModel.instance.get('updateStatus') === 'found', + updateManual = UpdateModel.instance.get('updateManual'); this.renderTemplate({ themes: this.allThemes, activeTheme: AppSettingsModel.instance.get('theme'), @@ -61,9 +64,11 @@ var SettingsGeneralView = Backbone.View.extend({ autoUpdate: Updater.getAutoUpdateType(), updateInProgress: Updater.updateInProgress(), updateInfo: this.getUpdateInfo(), - updateReady: UpdateModel.instance.get('updateStatus') === 'ready', - updateFound: UpdateModel.instance.get('updateStatus') === 'found', - updateManual: UpdateModel.instance.get('updateManual'), + updateWaitingReload: updateReady && !Launcher, + showUpdateBlock: Launcher && !updateManual, + updateReady: updateReady, + updateFound: updateFound, + updateManual: updateManual, releaseNotesLink: Links.ReleaseNotes, colorfulIcons: AppSettingsModel.instance.get('colorfulIcons') }); diff --git a/app/scripts/views/settings/settings-help-view.js b/app/scripts/views/settings/settings-help-view.js index dac1efe0..d104aec3 100644 --- a/app/scripts/views/settings/settings-help-view.js +++ b/app/scripts/views/settings/settings-help-view.js @@ -5,7 +5,7 @@ var Backbone = require('backbone'), Links = require('../../const/links'); var SettingsHelpView = Backbone.View.extend({ - template: require('templates/settings/settings-help.html'), + template: require('templates/settings/settings-help.hbs'), render: function() { var appInfo = 'KeeWeb v' + RuntimeInfo.version + ' (' + RuntimeInfo.commit + ', ' + RuntimeInfo.buildDate + ')\n' + diff --git a/app/scripts/views/settings/settings-shortcuts-view.js b/app/scripts/views/settings/settings-shortcuts-view.js index 0599783a..ba46b210 100644 --- a/app/scripts/views/settings/settings-shortcuts-view.js +++ b/app/scripts/views/settings/settings-shortcuts-view.js @@ -4,7 +4,7 @@ var Backbone = require('backbone'), FeatureDetector = require('../../util/feature-detector'); var SettingsShortcutsView = Backbone.View.extend({ - template: require('templates/settings/settings-shortcuts.html'), + template: require('templates/settings/settings-shortcuts.hbs'), render: function() { this.renderTemplate({ diff --git a/app/scripts/views/settings/settings-view.js b/app/scripts/views/settings/settings-view.js index 5ada9004..bf1da8f1 100644 --- a/app/scripts/views/settings/settings-view.js +++ b/app/scripts/views/settings/settings-view.js @@ -7,7 +7,7 @@ var Backbone = require('backbone'), baron = require('baron'); var SettingsView = Backbone.View.extend({ - template: require('templates/settings/settings.html'), + template: require('templates/settings/settings.hbs'), views: null, diff --git a/app/templates/app.html b/app/templates/app.hbs similarity index 100% rename from app/templates/app.html rename to app/templates/app.hbs diff --git a/app/templates/details/details-attachment.html b/app/templates/details/details-attachment.hbs similarity index 100% rename from app/templates/details/details-attachment.html rename to app/templates/details/details-attachment.hbs diff --git a/app/templates/details/details-empty.html b/app/templates/details/details-empty.hbs similarity index 100% rename from app/templates/details/details-empty.html rename to app/templates/details/details-empty.hbs diff --git a/app/templates/details/details-group.html b/app/templates/details/details-group.hbs similarity index 100% rename from app/templates/details/details-group.html rename to app/templates/details/details-group.hbs diff --git a/app/templates/details/details-history.html b/app/templates/details/details-history.hbs similarity index 100% rename from app/templates/details/details-history.html rename to app/templates/details/details-history.hbs diff --git a/app/templates/details/details.html b/app/templates/details/details.hbs similarity index 62% rename from app/templates/details/details.html rename to app/templates/details/details.hbs index cbe87763..97b1bd88 100644 --- a/app/templates/details/details.html +++ b/app/templates/details/details.hbs @@ -13,12 +13,12 @@ -
This is an open-source app created by Antelle and licensed under - MIT. - The source code and issues are on GitHub .
+ MIT. + The source code and issues are on GitHub .This app is built with these awesome tools:
File path: <%- path %>
- <% } else if (storage === 'dropbox') { %> -This file is opened from Dropbox.
- <% } %> - <% } else { %> +File path: {{path}}
{{/ifeq}} + {{#ifeq storage 'dropbox'}}This file is opened from Dropbox.
{{/ifeq}} + {{else}}This file is stored in internal app storage.
- <% if (!supportFiles) { %> -Want to work seamlessly with local files? Download a desktop app
- <% } %> - <% } %> + {{#unless supportFiles}} +Want to work seamlessly with local files? Download a desktop app
+ {{/unless}} + {{/if}} - <% if (storage) { %> + {{#if storage}}If something goes wrong, please, open an issue on GitHub +
If something goes wrong, please, open an issue on GitHub or contact a developer directly.
App information:
-<%= appInfo %>+
{{appInfo}}