1. 21 Sep, 2015 1 commit
    • Robert Knight's avatar
      Add make target to run karma tests with auto-watch enabled · 6d6a090c
      Robert Knight authored
      This provides a convenient way to start Karma tests and auto-run
      them when test files are changed.
      
      Because the test files are incorporated into a Browserify bundle
      by karma-browserify which watches files for changes via watchify(),
      we can turn off Karma's own watching of the test files.
      
      This fixes a problem where changing a test spec file would result
      in Karma running all the tests twice, once after the test spec file
      changed and then again afterwards due to the browserify bundle
      being updated a second or two after the test spec file changes.
      6d6a090c
  2. 17 Sep, 2015 4 commits
  3. 16 Sep, 2015 1 commit
  4. 15 Sep, 2015 8 commits
  5. 12 Sep, 2015 3 commits
  6. 11 Sep, 2015 4 commits
    • Randall Leeds's avatar
      Simplify the visible highlights state sync · d38b463d
      Randall Leeds authored
      Let each frame just emit the event locally and invoke its own local
      method in response to the RPC call. The widget, acting as the hub
      of the communication bridge, stops infinite RPC loop by only
      propagating the call when it would change the state.
      d38b463d
    • Randall Leeds's avatar
      Merge pull request #2487 from hypothesis/publish-to-a-group · 890447d8
      Randall Leeds authored
      Publish to a group
      890447d8
    • Sean Hammond's avatar
      Rename hashid -> id on the client-side · 8bc602cc
      Sean Hammond authored
      8bc602cc
    • Sean Hammond's avatar
      Enable publishing annotations to a group · 95512b68
      Sean Hammond authored
      Features
      ========
      
      1. If you have a group selected in the groups dropdown when you create
         an annotation, the annotation will be created in that group.
      
      2. Only users who are members of the group can see the group's
         annotations.
      
      3. An annotation can be separately set to public or private, whether it
         is in a group or not, using the separate visibility dropdown on the
         annotation card when creating or editing an annotation.
      
         Private means viewable by the user only, public means viewable by the
         group or by everyone if the annotation has no group. When in a group
         the group's name appears instead of "Public" in the user interface
         (and with a group icon instead of the public icon). So for example if
         I make an annotation in group Foobar I can set its visibility to Only
         Me or to Foobar.
      
      4. New icons and styles for all the group-related parts of the UI,
         should look the same as in Jake's mockups now.
      
      Implementation Notes
      ====================
      
      Auth
      ----
      
      - We add `"group:<hashid>"` principals to `request.effective_principals`
        for each group the user is a member of.
      
      - The existing `"group:admin"` and `"group:staff"` principals are
        renamed to `"group:__admin__"` and `"group:__staff__"` so that they
        never clash with group hashids (hashids never contain _'s).
      
      - A user may only create an annotation in group "x" if they are
        themselves a member of group "x". This is enforced by an ACL
        in `h.api.resources`.
      
      - Users may only view annotations in groups of which they are members.
        This is enforced by a query filter in search: `h.api.groups.search`.
      
      - In `h.api.groups.logic`: A reply's group is always set to that of its
        parent, server-side. It doesn't matter what the client sends.
      
      Search Filtering
      ----------------
      
      - Whether an annotation belongs to a group is recorded in a top-level
        `group` field in the annotation. The value of this field is the
        group's hashid.
      
        For example, it is currently possible to have a private annotation
        (visible only to the user who created it) within a group. This allows
        users to use the privacy controls for "drafting" group annotations and
        replies, only sharing them with the group when they're ready. It also
        allows users to keep private replies to group annotations.
      
        When the sidebar is focused on a group (not yet implemented), the
        search will filter the annotations to those that have the group's
        hashid in the group field, regardless of whether the annotation's
        permissions are private to the user or shared with the group.
      
      - The groups search filtering (`h.api.groups.search`) uses the top-level
        groups field to filter out annotations that belong to groups that the
        user isn't a member of.
      
      - Annotations that are public simply have a group field containing
        `__world__`.
      
      Client-Side
      -----------
      
      - `annotation.coffee` sets the group field on the annotation before
        saving it.
      
      - There's a new group-list-controller to handle the now more interactive
        groups dropdown.
      
      - And a group-service to share state about which group is currently
        focused with different parts of the code.
      
      Misc
      ----
      
      - `h.streamer`: Infinite scroll and live updates filter out annotations
        from groups the user isn't a member of, as well.
      
      - `h.api.search.transform`: the API adds group: '__world__' to any
        annotations without a group field before returning them to the
        client.
      95512b68
  7. 10 Sep, 2015 2 commits
  8. 29 Aug, 2015 1 commit
  9. 28 Aug, 2015 3 commits
  10. 25 Aug, 2015 10 commits
  11. 24 Aug, 2015 1 commit
    • Randall Leeds's avatar
      Move the dialogs into a content container · 11f04d4f
      Randall Leeds authored
      This fixes the dialogs to have the same space around them as the
      main content. It's a bit like re-introducing the #wrapper, but with
      a class this time that's re-used by the topbar for sizing its content.
      11f04d4f
  12. 20 Aug, 2015 2 commits
    • Randall Leeds's avatar
      Let the compass filter do the url rewrites · 446d5c15
      Randall Leeds authored
      This is a little bit confusing, but it is better this way. It's
      confusing because webassets doesn't set the compass image directory,
      so the paths still have an "images/" prefix. However, the cssrewrite
      filter uses the output URL from webassets and that will be an absolute
      URL at request time. The compass filter uses only the base URL from the
      environment configuration, which is relative. Letting compass do the
      rewriting therefore results in merged compass files having correct, but
      relative, paths regardless of whether the assets are generated at the
      command line or at request time. This should make it possible to pre-
      compile the assets before the first request without generating bad
      URLs, and to virtual host the application under multiple URLs.
      446d5c15
    • Randall Leeds's avatar
      Upgrade clean-css · 6d1dc9c1
      Randall Leeds authored
      In order to upgrade clean-css it is necessary to import the filter
      definition from the future version of webassets. This version takes
      extra arguments in the filter configuration, allowing us to disable
      the advanced optimizations that became the default in 3.0+ but that
      breaks some of our styles.
      6d1dc9c1