mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-24 23:48:13 -05:00
Merge pull request #4804 from jaswilli/issue-4539
Connect Navigation page to live data
This commit is contained in:
commit
3982e0f871
5 changed files with 120 additions and 19 deletions
|
@ -1,23 +1,114 @@
|
||||||
var NavigationController = Ember.Controller.extend(Ember.Evented, {
|
var NavigationController,
|
||||||
|
NavItem;
|
||||||
|
|
||||||
navigationJSON: Ember.computed('model.navigation', function () {
|
NavItem = Ember.Object.extend({
|
||||||
var navJSON = JSON.parse(this.get('model.navigation') || {}),
|
label: '',
|
||||||
lastNavItem = navJSON[navJSON.length - 1];
|
url: '',
|
||||||
lastNavItem.last = true; // Set a 'last' property on the last nav item, only used in the template
|
|
||||||
return navJSON;
|
isBlank: Ember.computed('label', 'url', function () {
|
||||||
|
return Ember.isBlank(this.get('label')) && Ember.isBlank(this.get('url'));
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
NavigationController = Ember.Controller.extend({
|
||||||
|
navigationItems: Ember.computed('model.navigation', function () {
|
||||||
|
var navItems,
|
||||||
|
lastItem;
|
||||||
|
|
||||||
|
try {
|
||||||
|
navItems = JSON.parse(this.get('model.navigation') || [{}]);
|
||||||
|
} catch (e) {
|
||||||
|
navItems = [{}];
|
||||||
|
}
|
||||||
|
|
||||||
|
navItems = navItems.map(function (item) {
|
||||||
|
return NavItem.create(item);
|
||||||
|
});
|
||||||
|
|
||||||
|
lastItem = navItems.get('lastObject');
|
||||||
|
if (!lastItem || !lastItem.get('isBlank')) {
|
||||||
|
navItems.addObject(NavItem.create());
|
||||||
|
}
|
||||||
|
|
||||||
|
return navItems;
|
||||||
|
}),
|
||||||
|
|
||||||
|
navigationItemsObserver: Ember.observer('navigationItems.[]', function () {
|
||||||
|
var navItems = this.get('navigationItems');
|
||||||
|
|
||||||
|
navItems.forEach(function (item, index, items) {
|
||||||
|
if (index === (items.length - 1)) {
|
||||||
|
item.set('last', true);
|
||||||
|
} else {
|
||||||
|
item.set('last', false);
|
||||||
|
}
|
||||||
|
});
|
||||||
}),
|
}),
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
addItem: function () {
|
addItem: function () {
|
||||||
// Add a new item
|
var navItems = this.get('navigationItems'),
|
||||||
|
lastItem = navItems.get('lastObject');
|
||||||
|
|
||||||
|
if (lastItem && !lastItem.get('isBlank')) {
|
||||||
|
navItems.addObject(NavItem.create());
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteItem: function () {
|
deleteItem: function (item) {
|
||||||
// Delete navItem which should be a function param like: `deleteItem: function(navItem) {`
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.get('navigationItems').removeObject(item);
|
||||||
},
|
},
|
||||||
|
|
||||||
save: function () {
|
save: function () {
|
||||||
// Save everything
|
var self = this,
|
||||||
|
navSetting,
|
||||||
|
blogUrl = this.get('config').blogUrl,
|
||||||
|
blogUrlRegex = new RegExp('^' + blogUrl + '(.*)', 'i'),
|
||||||
|
match;
|
||||||
|
|
||||||
|
navSetting = this.get('navigationItems').map(function (item) {
|
||||||
|
var label,
|
||||||
|
url;
|
||||||
|
|
||||||
|
if (!item || item.get('isBlank')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
label = item.get('label').trim();
|
||||||
|
url = item.get('url').trim();
|
||||||
|
|
||||||
|
match = url.match(blogUrlRegex);
|
||||||
|
|
||||||
|
if (match) {
|
||||||
|
if (match[1] === '') {
|
||||||
|
url = '/';
|
||||||
|
} else {
|
||||||
|
url = match[1];
|
||||||
|
}
|
||||||
|
} else if (!validator.isURL(url) && url !== '' && url[0] !== '/') {
|
||||||
|
url = '/' + url;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {label: label, url: url};
|
||||||
|
}).compact();
|
||||||
|
|
||||||
|
this.set('model.navigation', JSON.stringify(navSetting));
|
||||||
|
|
||||||
|
// trigger change event because even if the final JSON is unchanged
|
||||||
|
// we need to have navigationItems recomputed.
|
||||||
|
this.get('model').notifyPropertyChange('navigation');
|
||||||
|
|
||||||
|
this.notifications.closePassive();
|
||||||
|
|
||||||
|
this.get('model').save().then(function () {
|
||||||
|
self.notifications.showSuccess('Navigation items saved.');
|
||||||
|
}).catch(function (err) {
|
||||||
|
self.notifications.showErrors(err);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -19,8 +19,10 @@ var NavigationRoute = AuthenticatedRoute.extend(CurrentUserSettings, {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
setupController: function (controller, model) {
|
actions: {
|
||||||
this._super(controller, model);
|
save: function () {
|
||||||
|
this.get('controller').send('save');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -9,26 +9,26 @@
|
||||||
<section class="content settings-navigation">
|
<section class="content settings-navigation">
|
||||||
<form id="settings-navigation" novalidate="novalidate">
|
<form id="settings-navigation" novalidate="novalidate">
|
||||||
|
|
||||||
{{#each navItem in navigationJSON}}
|
{{#each navItem in navigationItems}}
|
||||||
<div class="navigation-item">
|
<div class="navigation-item">
|
||||||
<button type="button" class="navigation-item-drag-handle icon-grab">
|
<button type="button" class="navigation-item-drag-handle icon-grab">
|
||||||
<span class="hidden">Reorder</span>
|
<span class="hidden">Reorder</span>
|
||||||
</button>
|
</button>
|
||||||
<div class="navigation-inputs">
|
<div class="navigation-inputs">
|
||||||
<span class="navigation-item-label">
|
<span class="navigation-item-label">
|
||||||
<input type="text" {{bind-attr value=navItem.label}} placeholder="Label">
|
{{gh-trim-focus-input focus=navItem.last placeholder="Label" value=navItem.label}}
|
||||||
</span>
|
</span>
|
||||||
<span class="navigation-item-url">
|
<span class="navigation-item-url">
|
||||||
<input type="text" {{bind-attr value=navItem.url}} placeholder="http://my-ghost-blog.com/">
|
{{gh-trim-focus-input focus=false placeholder="http://my-ghost-blog.com/" value=navItem.url}}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="navigation-item-action">
|
<span class="navigation-item-action">
|
||||||
{{#if navItem.last}}
|
{{#if navItem.last}}
|
||||||
<button type="button" class="add-navigation-link icon-add" {{action 'addItem'}}>
|
<button type="button" class="add-navigation-link icon-add" {{action "addItem"}}>
|
||||||
<span class="hidden">Add</span>
|
<span class="hidden">Add</span>
|
||||||
</button>
|
</button>
|
||||||
{{else}}
|
{{else}}
|
||||||
<button type="button" class="navigation-delete icon-trash" {{action 'deleteItem' navItem}}>
|
<button type="button" class="navigation-delete icon-trash" {{action "deleteItem" navItem}}>
|
||||||
<span class="hidden">Delete</span>
|
<span class="hidden">Delete</span>
|
||||||
</button>
|
</button>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
import BaseView from 'ghost/views/settings/content-base';
|
import BaseView from 'ghost/views/settings/content-base';
|
||||||
|
|
||||||
var SettingsNavigationView = BaseView.extend();
|
var SettingsNavigationView = BaseView.extend({
|
||||||
|
keyPress: function (event) {
|
||||||
|
// + character
|
||||||
|
if (event.keyCode === 43) {
|
||||||
|
event.preventDefault();
|
||||||
|
this.get('controller').send('addItem');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
export default SettingsNavigationView;
|
export default SettingsNavigationView;
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
"defaultValue": "{}"
|
"defaultValue": "{}"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"defaultValue": "[{\"id\": 1, \"label\":\"Home\", \"url\":\"http://my-ghost-blog.com/\"},{\"id\": 2, \"label\":\"About\", \"url\":\"http://my-ghost-blog.com/about/\"},{\"id\": 3, \"label\":\"Links\", \"url\":\"http://my-ghost-blog.com/links/\"},{\"id\": 4, \"label\":\"External\", \"url\":\"https://ghost.org\"}]"
|
"defaultValue": "[{\"label\":\"Home\", \"url\":\"/\"}]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"theme": {
|
"theme": {
|
||||||
|
|
Loading…
Add table
Reference in a new issue