Commit 3fa5fc29ea7ab4747f55ee28ba9428b03abe9c89
Edit bookmarks
Josiah Witt committed on 12/9/2017, 2:43:26 PMParent: 653e7d95783fcb22649a1ce70a47fc0deb571e3f
Files changed
bookmark/async/save.js | changed |
bookmark/html/bookmark.mcss | changed |
bookmark/html/notes.js | changed |
bookmark/html/render.js | changed |
bookmark/html/tags.js | changed |
bookmark/html/tags.mcss | changed |
bookmark/html/notes.mcss | added |
bookmark/html/tagsBar.js | added |
bookmark/html/tagsBar.mcss | added |
bookmark/page/bookmarks.js | changed |
bookmark/async/save.js | ||
---|---|---|
@@ -8,9 +8,13 @@ | ||
8 | 8 … | }) |
9 | 9 … | |
10 | 10 … | exports.create = function(api) { |
11 | 11 … | return nest('bookmark.async.save', function(data, cb) { |
12 | - const { messageId, recps, notes, tags } = data | |
12 … | + const { messageId, notes, tags } = data | |
13 … | + var recps = data.recps | |
14 … | + if (recps && recps.length === 0) { | |
15 … | + recps = null | |
16 … | + } | |
13 | 17 … | api.sbot.async.publish({ |
14 | 18 … | type: 'about', |
15 | 19 … | about: messageId, |
16 | 20 … | recps, |
bookmark/html/bookmark.mcss | ||
---|---|---|
@@ -31,12 +31,26 @@ | ||
31 | 31 … | } |
32 | 32 … | |
33 | 33 … | section.actions { |
34 | 34 … | position: absolute |
35 | - right: .5rem | |
35 … | + right: 3.1rem | |
36 | 36 … | top: 1.5rem |
37 | 37 … | font-size: .9rem |
38 | 38 … | } |
39 … | + | |
40 … | + button.edit { | |
41 … | + position: absolute | |
42 … | + right: 0 | |
43 … | + top: 1.5rem | |
44 … | + font-size: .63rem | |
45 … | + } | |
46 … | + | |
47 … | + button.save { | |
48 … | + position: absolute | |
49 … | + right: 4.1rem | |
50 … | + top: 1.5rem | |
51 … | + font-size: .63rem | |
52 … | + } | |
39 | 53 … | } |
40 | 54 … | |
41 | 55 … | Saved { |
42 | 56 … | padding: 1rem .5rem 1rem 6rem |
bookmark/html/notes.js | ||
---|---|---|
@@ -9,9 +9,9 @@ | ||
9 | 9 … | |
10 | 10 … | exports.create = (api) => { |
11 | 11 … | return nest('bookmark.html.notes', notes) |
12 | 12 … | |
13 | - function notes ({ notes, isEditing, onUpdate }) { | |
13 … | + function notes(notes, isEditing, onUpdate) { | |
14 | 14 … | const markdown = api.message.html.markdown |
15 | 15 … | const input = h( |
16 | 16 … | 'textarea', |
17 | 17 … | { |
bookmark/html/render.js | ||
---|---|---|
@@ -1,14 +1,16 @@ | ||
1 | -const { h, Value, when, computed, map } = require('mutant') | |
1 … | +const { h, Struct, Value, when, computed, map } = require('mutant') | |
2 | 2 … | const nest = require('depnest') |
3 | 3 … | const ref = require('ssb-ref') |
4 | 4 … | |
5 | 5 … | exports.needs = nest({ |
6 | 6 … | 'about.html.avatar': 'first', |
7 | 7 … | 'bookmark.obs.bookmark': 'first', |
8 … | + 'bookmark.obs.struct': 'first', | |
8 | 9 … | 'bookmark.html': { |
9 | 10 … | action: 'map', |
10 | - tag: 'first' | |
11 … | + notes: 'first', | |
12 … | + tags: 'first' | |
11 | 13 … | }, |
12 | 14 … | 'message.html': { |
13 | 15 … | author: 'first', |
14 | 16 … | link: 'first', |
@@ -19,15 +21,25 @@ | ||
19 | 21 … | |
20 | 22 … | exports.gives = nest('bookmark.html.render') |
21 | 23 … | |
22 | 24 … | exports.create = function(api) { |
25 … | + | |
23 | 26 … | return nest({ |
24 | 27 … | 'bookmark.html.render': renderBookmark |
25 | 28 … | }) |
26 | 29 … | |
27 | 30 … | function renderBookmark(msg, { pageId } = {}) { |
28 | 31 … | const id = api.keys.sync.id() |
29 | 32 … | const bookmark = api.bookmark.obs.bookmark(msg.key, id) |
33 … | + const edited = api.bookmark.obs.struct() | |
34 … | + for (var i in bookmark.recps()) { | |
35 … | + edited.recps.add(bookmark.recps()[i]) | |
36 … | + } | |
37 … | + for (var i in bookmark.tags()) { | |
38 … | + edited.tags.add(bookmark.tags()[i]) | |
39 … | + } | |
40 … | + edited.notes.set(bookmark.notes()) | |
41 … | + const isEditing = Value(false) | |
30 | 42 … | |
31 | 43 … | const content = [ |
32 | 44 … | h('Saved', [ |
33 | 45 … | h('section.avatar', {}, api.about.html.avatar(msg.value.author)), |
@@ -36,35 +48,61 @@ | ||
36 | 48 … | h('section.content', {}, messageContent(msg)), |
37 | 49 … | ]) |
38 | 50 … | ] |
39 | 51 … | |
52 … | + const editToggle = h('button.edit', { | |
53 … | + 'ev-click': () => isEditing.set(!isEditing()) | |
54 … | + }, when(isEditing, 'Cancel', 'Edit')) | |
55 … | + | |
56 … | + const saveButton = when(isEditing, | |
57 … | + h('button.save', { | |
58 … | + 'ev-click': () => { | |
59 … | + edited.save(msg.key) | |
60 … | + isEditing.set(false) | |
61 … | + } | |
62 … | + }, 'Save'), | |
63 … | + null | |
64 … | + ) | |
65 … | + | |
40 | 66 … | return h( |
41 | 67 … | 'Bookmark', |
42 | 68 … | { attributes: { tabindex: '0' } }, |
43 | 69 … | [ |
44 | - h('section.message', {}, content), | |
45 | - h('section.tags', map(bookmark.tags, tag => api.bookmark.html.tag(tag))), | |
46 | - h('section.notes', computed([bookmark.notes], messageNotes)), | |
47 | - h('section.actions', {}, api.bookmark.html.action(msg.key)) | |
70 … | + h('section.message', content), | |
71 … | + h('section.tags', | |
72 … | + api.bookmark.html.tags( | |
73 … | + bookmark.tags, | |
74 … | + isEditing, | |
75 … | + tags => { | |
76 … | + edited.tags.clear() | |
77 … | + const toAdd = tags.split(',').map(t => t.trim()) | |
78 … | + for(var i in toAdd) { | |
79 … | + edited.tags.add(toAdd[i]) | |
80 … | + } | |
81 … | + } | |
82 … | + ) | |
83 … | + ), | |
84 … | + h('section.notes', [ | |
85 … | + h('h4', 'Notes'), | |
86 … | + api.bookmark.html.notes( | |
87 … | + bookmark.notes, | |
88 … | + isEditing, | |
89 … | + notes => edited.notes.set(notes) | |
90 … | + ) | |
91 … | + ]), | |
92 … | + h('section.actions', when(isEditing, null, api.bookmark.html.action(msg.key))), | |
93 … | + editToggle, | |
94 … | + saveButton | |
48 | 95 … | ] |
49 | 96 … | ) |
50 | 97 … | } |
51 | 98 … | |
52 | - function messageContent (data) { | |
99 … | + function messageContent(data) { | |
53 | 100 … | if (!data.value.content || !data.value.content.text) return |
54 | 101 … | return h('div', {}, api.message.html.markdown(data.value.content)) |
55 | 102 … | } |
56 | 103 … | |
57 | - function messageTitle (data) { | |
104 … | + function messageTitle(data) { | |
58 | 105 … | var root = data.value.content && data.value.content.root |
59 | 106 … | return !root ? null : h('span', ['re: ', api.message.html.link(root)]) |
60 | 107 … | } |
61 | - | |
62 | - function messageNotes (data) { | |
63 | - console.log(data) | |
64 | - if (!data) return | |
65 | - return h('div', {}, [ | |
66 | - h('h4', 'Notes'), | |
67 | - api.message.html.markdown(data) | |
68 | - ]) | |
69 | - } | |
70 | 108 … | } |
bookmark/html/tags.js | ||
---|---|---|
@@ -1,6 +1,6 @@ | ||
1 | 1 … | |
2 | -var { h, map } = require('mutant') | |
2 … | +var { h, map, when } = require('mutant') | |
3 | 3 … | var nest = require('depnest') |
4 | 4 … | |
5 | 5 … | exports.needs = nest({ |
6 | 6 … | 'bookmark.html.tag': 'first' |
@@ -8,17 +8,17 @@ | ||
8 | 8 … | |
9 | 9 … | exports.gives = nest('bookmark.html.tags') |
10 | 10 … | |
11 | 11 … | exports.create = (api) => { |
12 | - return nest('bookmark.html.tags', tags => | |
13 | - h('Tags', [ | |
14 | - h('h2', 'Tags'), | |
15 | - h('div.default', [ | |
16 | - api.bookmark.html.tag("Reading List"), | |
17 | - api.bookmark.html.tag("Read"), | |
18 | - api.bookmark.html.tag("Favourites"), | |
19 | - api.bookmark.html.tag("Archived") | |
20 | - ]), | |
21 | - h('div', map(tags, tag => api.bookmark.html.tag(tag))) | |
22 | - ]) | |
12 … | + return nest('bookmark.html.tags', (tags, isEditing, onUpdate) => | |
13 … | + h('Tags', | |
14 … | + when(isEditing, | |
15 … | + h('input', { | |
16 … | + placeholder: 'message tags (comma separated)', | |
17 … | + 'ev-keyup': e => onUpdate(e.target.value), | |
18 … | + value: tags().join(",") | |
19 … | + }), | |
20 … | + map(tags, tag => api.bookmark.html.tag(tag)) | |
21 … | + ) | |
22 … | + ) | |
23 | 23 … | ) |
24 | 24 … | } |
bookmark/html/tags.mcss | ||
---|---|---|
@@ -1,7 +1,11 @@ | ||
1 | 1 … | Tags { |
2 | - border-bottom: 1px solid gray | |
2 … | + | |
3 … | + input { | |
4 … | + border: 1px solid gray | |
5 … | + padding: .6rem | |
6 … | + font-size: .9rem | |
7 … | + box-sizing: border-box | |
8 … | + width: 50% | |
9 … | + } | |
3 | 10 … | |
4 | - div { | |
5 | - margin-bottom: 1.5rem | |
6 | - } | |
7 | 11 … | } |
bookmark/html/notes.mcss | ||
---|---|---|
@@ -1,0 +1,11 @@ | ||
1 … | +Notes { | |
2 … | + textarea { | |
3 … | + width: 100% | |
4 … | + border: 1px solid gray | |
5 … | + padding: .6rem | |
6 … | + font-size: .9rem | |
7 … | + resize: none | |
8 … | + margin: 10px 0 | |
9 … | + box-sizing: border-box | |
10 … | + } | |
11 … | +} |
bookmark/html/tagsBar.js | ||
---|---|---|
@@ -1,0 +1,24 @@ | ||
1 … | + | |
2 … | +var { h, map } = require('mutant') | |
3 … | +var nest = require('depnest') | |
4 … | + | |
5 … | +exports.needs = nest({ | |
6 … | + 'bookmark.html.tag': 'first' | |
7 … | +}) | |
8 … | + | |
9 … | +exports.gives = nest('bookmark.html.tagsBar') | |
10 … | + | |
11 … | +exports.create = (api) => { | |
12 … | + return nest('bookmark.html.tagsBar', tags => | |
13 … | + h('TagsBar', [ | |
14 … | + h('h2', 'Tags'), | |
15 … | + h('div.default', [ | |
16 … | + api.bookmark.html.tag("Reading List"), | |
17 … | + api.bookmark.html.tag("Read"), | |
18 … | + api.bookmark.html.tag("Favourites"), | |
19 … | + api.bookmark.html.tag("Archived") | |
20 … | + ]), | |
21 … | + h('div', map(tags, tag => api.bookmark.html.tag(tag))) | |
22 … | + ]) | |
23 … | + ) | |
24 … | +} |
bookmark/html/tagsBar.mcss | ||
---|---|---|
@@ -1,0 +1,7 @@ | ||
1 … | +TagsBar { | |
2 … | + border-bottom: 1px solid gray | |
3 … | + | |
4 … | + div { | |
5 … | + margin-bottom: 1.5rem | |
6 … | + } | |
7 … | +} |
bookmark/page/bookmarks.js | ||
---|---|---|
@@ -21,9 +21,9 @@ | ||
21 | 21 … | }, |
22 | 22 … | 'bookmark.html': { |
23 | 23 … | save: 'first', |
24 | 24 … | render: 'first', |
25 | - tags: 'first' | |
25 … | + tagsBar: 'first' | |
26 | 26 … | }, |
27 | 27 … | 'keys.sync.id': 'first', |
28 | 28 … | 'sbot.async.get': 'first' |
29 | 29 … | }) |
@@ -46,17 +46,17 @@ | ||
46 | 46 … | const tag = path['tag'] || 'Reading List' |
47 | 47 … | |
48 | 48 … | const creator = api.bookmark.html.save({}) |
49 | 49 … | const defaultTags = [ 'Reading List', 'Read', 'Favourites', 'Archived' ] |
50 | - const tagSelector = api.bookmark.html.tags( | |
50 … | + const tagsBar = api.bookmark.html.tagsBar( | |
51 | 51 … | computed( |
52 | 52 … | [api.bookmark.obs.tagsFrom(id)], |
53 | 53 … | tags => tags.filter(t => defaultTags.indexOf(t) < 0) |
54 | 54 … | ) |
55 | 55 … | ) |
56 | 56 … | const currentTag = h('h2', tag) |
57 | 57 … | const { container, content } = api.app.html.scroller({ |
58 | - prepend: [ creator, tagSelector, currentTag ] | |
58 … | + prepend: [ creator, tagsBar, currentTag ] | |
59 | 59 … | }) |
60 | 60 … | |
61 | 61 … | pull( |
62 | 62 … | api.bookmark.pull.find(), |
@@ -67,13 +67,11 @@ | ||
67 | 67 … | |
68 | 68 … | for (const msg in index[id]['tags'][tag]) { |
69 | 69 … | // Hide 'Archived' messages unless viewing 'Archived' tag |
70 | 70 … | // Hide 'Read' messages from 'Reading List' tag |
71 | - const isArchived = archived[msg] | |
72 | - const isRead = read[msg] | |
73 | - if (tag !== 'Archived' && isArchived) continue | |
74 | - else if (tag === 'Reading List' && isRead) continue | |
75 | - else { | |
71 … | + if (tag !== 'Archived' && archived[msg]) continue | |
72 … | + else if (tag === 'Reading List' && read[msg]) continue | |
73 … | + else if (index[id]['tags'][tag][msg]) { | |
76 | 74 … | msgs.push({ |
77 | 75 … | key: msg, |
78 | 76 … | value: { |
79 | 77 … | content: {}, |
Built with git-ssb-web