parabolinc / parabol Goto Github PK
View Code? Open in Web Editor NEWFree online agile retrospective meeting tool
Home Page: https://www.parabol.co/
License: Other
Free online agile retrospective meeting tool
Home Page: https://www.parabol.co/
License: Other
After moving to inline styles, let's begin by implementing our new on-boarding/action meeting design as a MeetingLayout
container. After implementing, we can spec out additional components.
Placeholder for when the package goes stable (likely before June 1).
Upgrading this will hopefully put an end to manually reloading the client when in dev mode.
We could upgrade now, but meh, still in beta. Might as well wait for others to find the bugs & create documentation because learning how this thing works well enough to debug issues would take awhile.
gaearon/react-hot-loader#240
This is a chip-shot, one-pointer mission to clean up a few corners of our code base. This mission depends upon the resolution #44 as a prerequisite.
After the adoption of Meatier, the variable PROD
was introduced in a few places. Action has a global __PRODUCTION__
that is provided by its webpack configuration. Your mission, should you choose to accept it, is the following:
__PRODUCTION__
instead of PROD
docs/
called globals.md
that describes all of the globals from the webpack configuration (see webpack/webpack*.js
)On the current deployment to staging (http://action-staging.parabol.co) if you access a meeting route without being logged in (e.g. http://action-staging.parabol.co/meeting/c46c8ce7-9422-4102-af18-608aae5ca133), the application will fail mysteriously.
We'll need to begin by specing a generic login page, make certain to wrap all protected routes in a check to see if a user has authenticated, and redirect users first to the login page before proceeding.
Checklist:
#64 stripped -p from build:server
and build:client
. We'll reintroduce these flags in a build:deploy
.
Both for Falcor and Websockets API requests.
We're migrating Action's react containers and components to use inline styles (either Radium or react-look). The enhancement will give us the following advantages:
At the http://action-staging.parabol.co/ demo, there's some strange interactions with the forms. Below is a quick video showing what i mean.
For folks attending a meeting, show who's the facilitator. Allow facilitator to promote another to be the facilitator. Automatically promote another person to be the facilitator if the facilitator leaves the meeting.
Action, like any modern web application, we’ll need to send emails. Let’s make it happen!
User story: I log in, i begin editing a story, and my crappy internet connection fails. or my rickity old computer dies. Or my browser crashes. Or i hit refresh. In all 4 scenarios, the "componentWillUnmount" lifecycle trigger never happens, meaning I'm still in that list of "currentEditors". That means, I can't trust the client to take me off the currentEditors list, it has to come from the server when it receives an unsubscribe
. Then, i can take that socketId
and remove it from the recently unsubscribed channel. But, ultimately we want names, not ugly socketIds. So, since 1 username has many connections, we'll have to create a separate "Connections" table that links a connection to a userId or userName.
User story to explain: Jan is on her laptop & tablet. she is editing the same field from both (Jan is a freak). The activeLabel just shows "Jan" once. She realizes she's a freak, logs off her tablet & even though she's still editing on her laptop, it says she's no longer a currentEditor.
Time to get serious! Let's refactor what we have into a real welcome journey we can use.
Use Cashay!
Welcome
module, route, and containerWelcome
UserProfile
for user, navigate to step 2Team
for userFor reference:
Entities needed:
Items of note:
TeamMeeting
), and then break them apart in the GraphQL schema if need be.Team
later on depending on how hot queries get.This is a predecessor to #74 and mattkrick/cashay#27
After our move to Meatier, we've decided to eliminate bootstrap fully from the codebase. The old landing page (hosted at route /
) used a combination of bootstrap, tachyons, and custom SCSS to render.
Let's stub out a landing page that only depends on in-line styles. Let's not worry about final design aesthetic or marketing content, but rather establish the patterns for allowing us to develop these in the future.
piping is broken & i'm not sure why. When it auto-restarts, i get EADDRESSINUSE almost always. Also, it only worked in development, and we should be debugging server code in production.
This has been driving me nuts. Let's create an issue. I suspect it's because the SC worker process isn't exiting.
I want to track this down either via a git bisect and a test script or adding a hook on exit that looks at node's run queue.
After migrating to Meatier, nearly 200 linting errors were introduced, not surprisingly, since Meatier used the rules from xo.
To complete this mission, reduce the number of linting errors to 0. Please use the latest version of eslint
, >=v2.7.0
.
OSX 10.11.4
v5.10.1
3.8.6
rethinkdb 2.2.5 (CLANG 7.0.2 (clang-700.1.81))
Before we integrate slack to propagate general notifications, collect project updates, or perform weekly ships we should consider sending out meeting alerts and helping folks add agenda items a la:
This mission will establish the basic pattern for unit testing all redux action creators and reducers. It’s especially vital to establish this pattern for mocking interactions with the Falcor API.
5 points ~ five to seven days
Show how many users and who's viewing a meeting.
Let's establish a pattern for how to unit test actual page loads. Let's use PhantomJS or similar.
/
Get Started
and pop-up the auth0Cashay is ready to test for subs, but before we support subs, we need to come up with a good pattern for sharing the auth token between socketCluster, cashay, redux, and localStorage/localForage/reduxNativeStorage.
Auth tokens are tricky beasts because they don't live in the database, although they do come from the server. I'm not sure whether it's considered local state or domain state because it can't be generated on the client, but it can be invalidated on the client (ie validate expiration). In our particular case, we don't need it to come from our GraphQL server, but in doing so, we establish a pattern that does not depend on auth0.
So, assuming the authToken comes from our GraphQL server, we have a few options:
redux-persist
transform, application-specific AuthEngine for socketCluster, and adding localOnly
option to cashay__CLIENT__
conditionals for SSR, the token is stored in 2 locations (redux, local state), requires application-specific logic to expire/refresh each location__CLIENT__
conditionals for SSR, authToken is handled outside of GraphQL, lots of code to rewrite when we switch to localForage
or reactive native storageredux-persist
transform, AuthEngine for socketCluster, authToken is handled outside of GraphQLThe options in bold are the ones that I think suck the least, but none are great.
@jordanh any strong feelings or possible alternatives?
Placeholder for now, we can work on user flow on Monday.
Refactor components to use @mattkrick's brand spanking new Cashay.
Original title: @Mentions in Meetings generate new notifications
@Matt
mention, I should get a notification saying I've been mentioned in a cardTBD:
No web application is complete without the ubiquitous favicon; help give Action a little more personality by integrating in our graphical assets.
1 point ~ less than a single day
It would be a stinky user experience of a user's JWT authentication token expired during a meeting. Instead we could:
It makes sense to keep team-based permissions out of the JWT to keep it lightweight, but we should add in some app-level permissions.
I'm proposing a rol
field inside the JWT (protocol is to keep a field limited to 3 chars). By default, it will not be included. But if it is, it could have the following values:
su
: superuser. can visit the /graphql
page and email templates that @ackernaut is setting up. Can query and mutate entities that do not belong to it. Given to parabol employees. Certain sensitive items, like the inviteToken
are still hidden via graphql & require direct DB access.By including this in the token, we don't have to hit the database to check for admin privileges on every single query. This is useful for a query like getTeamById
where we only want to return a value if the person is a member of that team OR if they are a parabol employee.
By using su
as the value, we save 2 characters compared to using true
, plus it allows us to add in more roles later, for instance, maybe certain employees can only view credit card info...
Estimated effort: 1 point (see CONTRIBUTING.md)
Let's allow team leaders to be able to invite their fellow team members!
Add Redis to stack tying socket.io rooms together. Test, test, test.
Cloud monitoring of our production infrastructure is essential. In past applications we used New Relic, but we're also open to trying Datadog.
5 points ~ five to seven days
Includes: team membership, projects, actions, history, etc. + pub/sub methods
We use auth0 for authentication. Action uses auth0's lock component to present the user with a sign-in dialog. We haven't styled it with Parabol & Action's brand colors.
In this mission, we'll update the component by configuring the CSS on auth0's dashboard.
First-pass for dokku staging/production configuration committed.
We've got an issue template now from Meatier, but we should iterate upon this template to make it easier for the community to jump into our development groove: mission creation -> spec (& bid) -> design (&bid) -> (assign &) build -> review -> merge
falcor-saddle is a dependency of Action's. It's the little Falcor router helper that greatly reduces the repetitive code we'd need to write to stitch Falcor and RethinkDB together. falcor-saddle is in need of a suite of unit tests, and, perhaps a few small fixes as those unit tests are created.
8 points ~ Less than two weeks
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.