From 3fd1a2412ef8bd11faf9ed616143218229f6786e Mon Sep 17 00:00:00 2001 From: Sacha Greif Date: Fri, 15 Apr 2016 11:11:13 +0900 Subject: [PATCH] add settings edit form --- .meteor/versions | 2 +- CONTRIBUTING.md | 3 + .../lib/common/SettingsEditForm.jsx | 43 +++++++++ .../nova-base-components/lib/components.js | 1 + .../lib/users/UserMenu.jsx | 81 +++++++++++++---- packages/nova-settings/lib/collection.js | 88 +++++++++++++++---- packages/nova-settings/lib/init.js | 5 ++ packages/nova-settings/lib/methods.js | 3 + .../nova-settings/lib/server/publications.js | 8 ++ packages/nova-settings/package.js | 6 +- 10 files changed, 203 insertions(+), 37 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 packages/nova-base-components/lib/common/SettingsEditForm.jsx create mode 100644 packages/nova-settings/lib/init.js create mode 100644 packages/nova-settings/lib/methods.js diff --git a/.meteor/versions b/.meteor/versions index 3a9d2606e..95606f390 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -154,7 +154,7 @@ underscore@1.0.7 url@1.0.8 utilities:avatar@0.9.2 utilities:react-list-container@0.1.8 -utilities:smart-methods@0.1.3 +utilities:smart-methods@0.1.4 utilities:smart-publications@0.1.4 webapp@1.2.7 webapp-hashing@1.0.8 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..b5cc96024 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +Before starting on a new feature, please [check out the roadmap](https://trello.com/b/dwPR0LTz/nova-roadmap) and come check-in in the [Telescope Slack channel](http://slack.telescopeapp.org/). + +Also, all PRs should be made to the `devel` branch, not `master`. \ No newline at end of file diff --git a/packages/nova-base-components/lib/common/SettingsEditForm.jsx b/packages/nova-base-components/lib/common/SettingsEditForm.jsx new file mode 100644 index 000000000..9b5398bb8 --- /dev/null +++ b/packages/nova-base-components/lib/common/SettingsEditForm.jsx @@ -0,0 +1,43 @@ +import React, { PropTypes, Component } from 'react'; +import NovaForm from "meteor/nova:forms"; + +import SmartContainers from "meteor/utilities:react-list-container"; +const DocumentContainer = SmartContainers.DocumentContainer; + +import Core from "meteor/nova:core"; +const Messages = Core.Messages; + +class SettingsEditForm extends Component{ + + render() { + + return ( +
+ { + Messages.flash("Settings edited (please reload).", "success"); + }, + labelFunction: fieldName => Telescope.utils.getFieldLabel(fieldName, Telescope.settings.collection) + }} + /> +
+ ) + } +} + +SettingsEditForm.contextTypes = { + currentUser: React.PropTypes.object +}; + +module.exports = SettingsEditForm; +export default SettingsEditForm; \ No newline at end of file diff --git a/packages/nova-base-components/lib/components.js b/packages/nova-base-components/lib/components.js index d9eb56950..dc703124c 100644 --- a/packages/nova-base-components/lib/components.js +++ b/packages/nova-base-components/lib/components.js @@ -15,6 +15,7 @@ Telescope.registerComponent("AppLoading", require('./common/AppLoading Telescope.registerComponent("Error404", require('./common/Error404.jsx')); Telescope.registerComponent("Loading", require('./common/Loading.jsx')); Telescope.registerComponent("Vote", require('./common/Vote.jsx')); +Telescope.registerComponent("SettingsEditForm", require('./common/SettingsEditForm.jsx')); // posts diff --git a/packages/nova-base-components/lib/users/UserMenu.jsx b/packages/nova-base-components/lib/users/UserMenu.jsx index bf45fe06e..9583dd446 100644 --- a/packages/nova-base-components/lib/users/UserMenu.jsx +++ b/packages/nova-base-components/lib/users/UserMenu.jsx @@ -2,25 +2,74 @@ import React, { PropTypes, Component } from 'react'; import { Meteor } from 'meteor/meteor'; import { Accounts } from 'meteor/std:accounts-ui'; import Router from '../router.js'; -import { Dropdown, MenuItem } from 'react-bootstrap'; +import { Modal, Dropdown, MenuItem } from 'react-bootstrap'; +import Core from "meteor/nova:core"; +const ContextPasser = Core.ContextPasser; -const UserMenu = ({user}) => { +class UserMenu extends Component { - ({UserAvatar, UserName} = Telescope.components); + constructor() { + super(); + this.openModal = this.openModal.bind(this); + this.closeModal = this.closeModal.bind(this); + this.state = {modalOpen: false}; + } - return ( - - - -
{Users.getDisplayName(user)}
-
- - Profile - Edit Account - Meteor.logout(Accounts.ui._options.onSignedOutHook())}>Log Out - -
- ) + openModal() { + this.setState({modalOpen: true}); + } + + closeModal() { + this.setState({modalOpen: false}); + } + + renderSettingsModal() { + + const SettingsEditForm = Telescope.components.SettingsEditForm; + + return ( + + + Edit Settings + + + + + + + + ) + } + + render() { + + ({UserAvatar, UserName} = Telescope.components); + + const user = this.props.user; + + return ( +
+ + + +
{Users.getDisplayName(user)}
+
+ + Profile + Edit Account + {Users.is.admin(user) ? Settings : null} + Meteor.logout(Accounts.ui._options.onSignedOutHook())}>Log Out + +
+ {this.renderSettingsModal()} +
+ ) + } + +} + +UserMenu.propTypes = { + user: React.PropTypes.object } module.exports = UserMenu; diff --git a/packages/nova-settings/lib/collection.js b/packages/nova-settings/lib/collection.js index cb9c30c40..d1bf8e0ad 100644 --- a/packages/nova-settings/lib/collection.js +++ b/packages/nova-settings/lib/collection.js @@ -8,6 +8,8 @@ Telescope.settings.schema = new SimpleSchema({ title: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "01_general" } @@ -16,6 +18,8 @@ Telescope.settings.schema = new SimpleSchema({ type: String, optional: true, // regEx: SimpleSchema.RegEx.Url, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "01_general", type: "bootstrap-url", @@ -25,6 +29,8 @@ Telescope.settings.schema = new SimpleSchema({ tagline: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "01_general" } @@ -32,6 +38,8 @@ Telescope.settings.schema = new SimpleSchema({ description: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "01_general", rows: 5, @@ -41,6 +49,8 @@ Telescope.settings.schema = new SimpleSchema({ siteImage: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, regEx: SimpleSchema.RegEx.Url, autoform: { group: "01_general", @@ -50,6 +60,8 @@ Telescope.settings.schema = new SimpleSchema({ requireViewInvite: { type: Boolean, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: 'invites', leftLabel: 'Require View Invite' @@ -58,6 +70,8 @@ Telescope.settings.schema = new SimpleSchema({ requirePostInvite: { type: Boolean, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: 'invites', leftLabel: 'Require Post Invite' @@ -66,6 +80,8 @@ Telescope.settings.schema = new SimpleSchema({ requirePostsApproval: { type: Boolean, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "01_general", instructions: "Posts must be approved by admin", @@ -76,6 +92,8 @@ Telescope.settings.schema = new SimpleSchema({ type: String, optional: true, private: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "06_email", instructions: 'The address all outgoing emails will be sent from.', @@ -86,6 +104,8 @@ Telescope.settings.schema = new SimpleSchema({ type: String, optional: true, private: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "06_email", instructions: 'MAIL_URL environment variable (requires restart).', @@ -97,6 +117,8 @@ Telescope.settings.schema = new SimpleSchema({ optional: true, defaultValue: 30, private: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: '01_general', instructions: 'How often to recalculate scores, in seconds (default to 30)', @@ -107,6 +129,8 @@ Telescope.settings.schema = new SimpleSchema({ type: Number, optional: true, defaultValue: 30, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "02_posts", instructions: 'Minimum time between posts, in seconds (defaults to 30)' @@ -115,6 +139,8 @@ Telescope.settings.schema = new SimpleSchema({ RSSLinksPointTo: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "02_posts", options: [ @@ -127,6 +153,8 @@ Telescope.settings.schema = new SimpleSchema({ type: Number, optional: true, defaultValue: 15, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "03_comments", instructions: 'Minimum time between comments, in seconds (defaults to 15)' @@ -136,6 +164,8 @@ Telescope.settings.schema = new SimpleSchema({ type: Number, optional: true, defaultValue: 30, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "02_posts", instructions: 'Maximum number of posts a user can post in a day (default to 30).' @@ -145,6 +175,8 @@ Telescope.settings.schema = new SimpleSchema({ type: Number, defaultValue: 3, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: 'invites' } @@ -153,6 +185,8 @@ Telescope.settings.schema = new SimpleSchema({ type: Number, defaultValue: 10, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "02_posts" } @@ -160,6 +194,8 @@ Telescope.settings.schema = new SimpleSchema({ logoUrl: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "04_logo" } @@ -167,6 +203,8 @@ Telescope.settings.schema = new SimpleSchema({ logoHeight: { type: Number, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "04_logo" } @@ -174,6 +212,8 @@ Telescope.settings.schema = new SimpleSchema({ logoWidth: { type: Number, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "04_logo" } @@ -181,31 +221,37 @@ Telescope.settings.schema = new SimpleSchema({ faviconUrl: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "04_logo" } }, - language: { - type: String, - defaultValue: 'en', - optional: true, - autoform: { - group: "01_general", - instructions: 'The app\'s language. Defaults to English.', - options: function () { - var languages = _.map(TAPi18n.getLanguages(), function (item, key) { - return { - value: key, - label: item.name - }; - }); - return languages; - } - } - }, + // language: { + // type: String, + // defaultValue: 'en', + // optional: true, + // insertableIf: Users.is.admin, + // editableIf: Users.is.admin, + // autoform: { + // group: "01_general", + // instructions: 'The app\'s language. Defaults to English.', + // options: function () { + // var languages = _.map(TAPi18n.getLanguages(), function (item, key) { + // return { + // value: key, + // label: item.name + // }; + // }); + // return languages; + // } + // } + // }, twitterAccount: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "07_integrations" } @@ -213,6 +259,8 @@ Telescope.settings.schema = new SimpleSchema({ facebookPage: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "07_integrations" } @@ -220,6 +268,8 @@ Telescope.settings.schema = new SimpleSchema({ googleAnalyticsId: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, autoform: { group: "07_integrations" } @@ -227,6 +277,8 @@ Telescope.settings.schema = new SimpleSchema({ emailFooter: { type: String, optional: true, + insertableIf: Users.is.admin, + editableIf: Users.is.admin, private: true, autoform: { group: "06_email", diff --git a/packages/nova-settings/lib/init.js b/packages/nova-settings/lib/init.js new file mode 100644 index 000000000..ed2a4b28b --- /dev/null +++ b/packages/nova-settings/lib/init.js @@ -0,0 +1,5 @@ +Meteor.startup(function () { + if (Telescope.settings.collection.find().count() === 0) { + Telescope.settings.collection.insert({}); + } +}); \ No newline at end of file diff --git a/packages/nova-settings/lib/methods.js b/packages/nova-settings/lib/methods.js new file mode 100644 index 000000000..fa9381d82 --- /dev/null +++ b/packages/nova-settings/lib/methods.js @@ -0,0 +1,3 @@ +Telescope.settings.collection.smartMethods({ + editName: "settings.edit" +}); \ No newline at end of file diff --git a/packages/nova-settings/lib/server/publications.js b/packages/nova-settings/lib/server/publications.js index 0946765f8..0e4203ff1 100644 --- a/packages/nova-settings/lib/server/publications.js +++ b/packages/nova-settings/lib/server/publications.js @@ -14,3 +14,11 @@ Meteor.publish('settings', function() { return Telescope.settings.collection.find({}, options); }); + +Meteor.publish('settings.admin', function() { + if (Users.is.adminById(this.userId)) { + return Telescope.settings.collection.find({}, {}); + } else { + return []; + } +}); diff --git a/packages/nova-settings/package.js b/packages/nova-settings/package.js index 7ce1ba957..a0420f8ee 100644 --- a/packages/nova-settings/package.js +++ b/packages/nova-settings/package.js @@ -6,19 +6,21 @@ Package.describe({ }); Package.onUse(function(api) { - var both = ['server', 'client']; api.versionsFrom(['METEOR@1.0']); api.use([ 'nova:lib@0.26.0-nova', + 'nova:users@0.26.0-nova' // 'nova:i18n@0.26.0-nova' ]); api.addFiles([ 'lib/collection.js', + 'lib/init.js', + 'lib/methods.js', // 'package-tap.i18n' - ], both); + ], ['server', 'client']); api.addFiles([ 'lib/server/publications.js',