Skip to content

Commit 32b6cb8

Browse files
committed
add memo reload button
1 parent 8c9d26d commit 32b6cb8

File tree

2 files changed

+148
-157
lines changed

2 files changed

+148
-157
lines changed

R/mod_memo.R

Lines changed: 65 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,38 @@ mod_memo_ui <- function(id) {
1111
ns <- NS(id)
1212
fluidRow(
1313
div(
14-
style = "display: flex; align-items: flex-start; margin-left: 30px;",
14+
style = "display: flex; align-items: flex-start; justify-content: space-between; width: 100%;",
1515
div(
16-
style = "min-width: 40vh;",
17-
mod_memo_editor_ui(ns("memo_main_editor"))
16+
style = "display: flex; align-items: flex-start; margin-left: 30px;",
17+
div(
18+
style = "min-width: 40vh;",
19+
mod_memo_editor_ui(ns("memo_main_editor"))
20+
),
21+
div(
22+
style = "display: flex; align-items: center; margin-left: 10px;",
23+
actionButton(
24+
ns("pin"),
25+
"",
26+
title = "Pin memo",
27+
icon = icon("thumbtack"),
28+
class = "pinned"
29+
)
30+
)
1831
),
1932
div(
20-
style = "display: flex; align-items: center; margin-left: 10px;", # Use flexbox for alignment
33+
style = "margin-right: 30px;",
2134
actionButton(
22-
ns("pin"),
23-
"",
24-
title = "Pin memo",
25-
icon = icon("thumbtack"),
26-
class = "pinned"
27-
),
35+
ns("reload_memo_table"),
36+
NULL,
37+
icon = icon("sync")
38+
)
2839
)
2940
),
3041
hr(),
3142
fluidRow(
3243
style = "margin-left: 30px;",
33-
div(
34-
style = "width: 60vw;",
35-
DT::dataTableOutput(ns("memo"))
36-
)
44+
div(style = "width: 60vw;", DT::dataTableOutput(ns("memo")))
3745
)
38-
# downloadButton(ns("export_memo"), label = "Export memos") %>%
39-
# tagAppendAttributes(style = "display: inline-block; float: right", class = "scrollable80")
4046
)
4147
}
4248

@@ -46,17 +52,17 @@ mod_memo_ui <- function(id) {
4652
mod_memo_server <- function(id, glob) {
4753
moduleServer(id, function(input, output, session) {
4854
ns <- session$ns
49-
loc <- reactiveValues()
50-
loc$memo_observer <- 0
55+
loc <- reactiveValues(memo_observer = 0)
56+
5157
mod_memo_editor_server("memo_main_editor", glob, type = "free_memo")
58+
5259
observeEvent(glob$active_project, {
5360
loc$memo_observer <- loc$memo_observer + 1
5461
})
55-
## Observe free_memo_edit_click ----
62+
5663
observeEvent(input$text_memo_click, {
57-
req(input$text_memo_click)
58-
req(glob$free_memo_observer > 0)
59-
loc$memo_id <- parse_memo_id(input$text_memo_click) # grab the active memo id for this module
64+
req(input$text_memo_click, glob$free_memo_observer > 0)
65+
loc$memo_id <- parse_memo_id(input$text_memo_click)
6066
golem::invoke_js(
6167
"updateEditorInput",
6268
list(
@@ -71,155 +77,57 @@ mod_memo_server <- function(id, glob) {
7177
})
7278

7379
observeEvent(
74-
c(loc$memo_observer, glob$memo_segment_observer, glob$free_memo_observer),
80+
c(
81+
loc$memo_observer,
82+
glob$memo_segment_observer,
83+
glob$free_memo_observer,
84+
input$reload_memo_table
85+
),
7586
{
7687
output$memo <- DT::renderDataTable({
77-
if (isTruthy(glob$active_project)) {
78-
memo_table <- list_memo_records(glob$pool, glob$active_project)
79-
if (glob$user$data$memo_other_view == 0 && nrow(memo_table) > 0) {
80-
memo_table <- memo_table %>%
81-
dplyr::filter(user_id == glob$user$user_id)
82-
}
83-
req(nrow(memo_table) > 0)
84-
memos_segments_map <- dplyr::tbl(
85-
glob$pool,
86-
"memos_segments_map"
87-
) %>%
88-
dplyr::filter(memo_id %in% !!memo_table$memo_id) %>%
89-
dplyr::collect()
90-
segment_df <- dplyr::tbl(glob$pool, "segments") %>%
91-
dplyr::select(segment_id, doc_id, segment_text) %>%
92-
dplyr::filter(
93-
.data$segment_id %in% !!memos_segments_map$segment_id
94-
) %>%
95-
dplyr::collect()
96-
documents_df <- dplyr::tbl(glob$pool, "documents") %>%
97-
dplyr::select(doc_id, doc_name) %>%
98-
dplyr::filter(.data$doc_id %in% !!segment_df$doc_id) %>%
99-
dplyr::collect()
100-
user_df <- dplyr::tbl(glob$pool, "users") %>%
101-
dplyr::filter(.data$user_id %in% !!memo_table$user_id) %>%
102-
dplyr::select(user_id, user_name, user_login) %>%
103-
dplyr::collect()
104-
loc$enriched_memo_table <- memo_table %>%
105-
dplyr::left_join(
106-
memos_segments_map,
107-
by = "memo_id"
108-
) %>%
109-
dplyr::left_join(
110-
segment_df,
111-
by = "segment_id"
112-
) %>%
113-
dplyr::left_join(
114-
documents_df,
115-
by = "doc_id"
116-
) %>%
117-
dplyr::left_join(
118-
user_df,
119-
by = "user_id"
120-
) %>%
121-
dplyr::mutate(
122-
memo_title = memo_link(
123-
ns("text_memo_click"),
124-
memo_id,
125-
memo_name
126-
),
127-
memo_type = purrr::map2_chr(
128-
doc_id,
129-
segment_id,
130-
memo_segment_link
131-
)
132-
) %>%
133-
dplyr::arrange(dplyr::desc(memo_id)) %>%
134-
dplyr::select(
135-
memo_id,
136-
memo_title,
137-
memo_type,
138-
doc_name,
139-
memo_text,
140-
segment_text,
141-
user_name,
142-
user_id
143-
)
144-
145-
DT::datatable(
146-
loc$enriched_memo_table,
147-
rownames = FALSE,
148-
width = "100%",
149-
colnames = c(
150-
"ID" = "memo_id",
151-
"Title" = "memo_title",
152-
"Type" = "memo_type",
153-
"Document" = "doc_name",
154-
"Creator" = "user_name",
155-
"Creator ID" = "user_id"
156-
),
157-
filter = "top",
158-
escape = FALSE,
159-
extensions = c("Buttons"),
160-
options = dt_memo_options(),
161-
class = "display",
162-
selection = "none"
88+
req(glob$active_project)
89+
memo_table <- list_memo_records(glob$pool, glob$active_project)
90+
if (glob$user$data$memo_other_view == 0) {
91+
memo_table <- dplyr::filter(
92+
memo_table,
93+
user_id == glob$user$user_id
16394
)
16495
}
96+
req(nrow(memo_table) > 0)
97+
98+
enriched_memo_table <- enrich_memo_table(memo_table, glob$pool, ns)
99+
loc$enriched_memo_table <- enriched_memo_table
100+
101+
DT::datatable(
102+
enriched_memo_table,
103+
rownames = FALSE,
104+
width = "100%",
105+
colnames = c(
106+
"ID" = "memo_id",
107+
"Title" = "memo_title",
108+
"Type" = "memo_type",
109+
"Document" = "doc_name",
110+
"Creator" = "user_name",
111+
"Creator ID" = "user_id"
112+
),
113+
filter = "top",
114+
escape = FALSE,
115+
extensions = c("Buttons"),
116+
options = dt_memo_options(),
117+
class = "display",
118+
selection = "none"
119+
)
165120
})
166121
}
167122
)
168123

169-
# pin ----
170124
observeEvent(input$pin, {
171125
req(loc$memo_id)
172-
pin_id <- paste0("pin_id-", loc$memo_id)
173-
pinned_text <- read_memo_by_id(
174-
glob$pool,
175-
glob$active_project,
176-
loc$memo_id
177-
) %>%
178-
dplyr::pull(memo_text)
179-
180-
insertUI(
181-
selector = "div.content-wrapper",
182-
where = "afterBegin",
183-
div(
184-
id = pin_id,
185-
class = "pinned_memo",
186-
div(
187-
id = "pin_header",
188-
class = "pin_header",
189-
icon("thumbtack"),
190-
div(
191-
class = "unpin",
192-
actionButton(
193-
paste0("unpin_", pin_id),
194-
"",
195-
icon("xmark"),
196-
class = "unpin_btn",
197-
`data-id` = pin_id,
198-
onclick = "Shiny.setInputValue('memo_ui_1-unpin', this.dataset.id, {priority: 'event'})"
199-
)
200-
),
201-
),
202-
div(class = "inner_pin", pinned_text),
203-
div(id = "resize_handle", class = "resizer")
204-
)
205-
)
206-
golem::invoke_js("makeDraggable", list(id = pin_id))
126+
pin_memo(loc$memo_id, glob$pool, glob$active_project, ns)
207127
})
208128

209-
# unpin -----
210129
observeEvent(input$unpin, {
211130
removeUI(paste0("#", input$unpin))
212131
})
213-
214-
# # Memo export ----
215-
# output$export_memo <- downloadHandler(
216-
# filename = function() {
217-
# "requal_memo_export.csv"
218-
# },
219-
# content = function(file) {
220-
# memos <- export_memos(glob$pool, glob$active_project)
221-
# utils::write.csv(memos, file)
222-
# }
223-
# )
224132
})
225133
}

R/mod_memo_utils_memo.R

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,86 @@ memo_segment_link <- function(segment_document_id, segment_id) {
222222
"Free"
223223
}
224224
}
225+
226+
227+
# Helper function to enrich memo table
228+
enrich_memo_table <- function(memo_table, pool, ns) {
229+
memos_segments_map <- dplyr::tbl(pool, "memos_segments_map") %>%
230+
dplyr::filter(memo_id %in% !!memo_table$memo_id) %>%
231+
dplyr::collect()
232+
233+
segment_df <- dplyr::tbl(pool, "segments") %>%
234+
dplyr::select(segment_id, doc_id, segment_text) %>%
235+
dplyr::filter(segment_id %in% !!memos_segments_map$segment_id) %>%
236+
dplyr::collect()
237+
238+
documents_df <- dplyr::tbl(pool, "documents") %>%
239+
dplyr::select(doc_id, doc_name) %>%
240+
dplyr::filter(doc_id %in% !!segment_df$doc_id) %>%
241+
dplyr::collect()
242+
243+
user_df <- dplyr::tbl(pool, "users") %>%
244+
dplyr::filter(user_id %in% !!memo_table$user_id) %>%
245+
dplyr::select(user_id, user_name, user_login) %>%
246+
dplyr::collect()
247+
248+
memo_table %>%
249+
dplyr::left_join(memos_segments_map, by = "memo_id") %>%
250+
dplyr::left_join(segment_df, by = "segment_id") %>%
251+
dplyr::left_join(documents_df, by = "doc_id") %>%
252+
dplyr::left_join(user_df, by = "user_id") %>%
253+
dplyr::mutate(
254+
memo_title = memo_link(ns("text_memo_click"), memo_id, memo_name),
255+
memo_type = purrr::map2_chr(doc_id, segment_id, memo_segment_link)
256+
) %>%
257+
dplyr::arrange(dplyr::desc(memo_id)) %>%
258+
dplyr::select(
259+
memo_id,
260+
memo_title,
261+
memo_type,
262+
doc_name,
263+
memo_text,
264+
segment_text,
265+
user_name,
266+
user_id
267+
)
268+
}
269+
270+
# Helper function to pin a memo
271+
pin_memo <- function(memo_id, pool, active_project, ns) {
272+
pin_id <- paste0("pin_id-", memo_id)
273+
pinned_text <- read_memo_by_id(pool, active_project, memo_id) %>%
274+
dplyr::pull(memo_text)
275+
276+
insertUI(
277+
selector = "div.content-wrapper",
278+
where = "afterBegin",
279+
div(
280+
id = pin_id,
281+
class = "pinned_memo",
282+
div(
283+
id = "pin_header",
284+
class = "pin_header",
285+
icon("thumbtack"),
286+
div(
287+
class = "unpin",
288+
actionButton(
289+
paste0("unpin_", pin_id),
290+
"",
291+
icon("xmark"),
292+
class = "unpin_btn",
293+
`data-id` = pin_id,
294+
onclick = paste0(
295+
"Shiny.setInputValue('",
296+
ns("unpin"),
297+
"', this.dataset.id, {priority: 'event'})"
298+
)
299+
)
300+
)
301+
),
302+
div(class = "inner_pin", pinned_text),
303+
div(id = "resize_handle", class = "resizer")
304+
)
305+
)
306+
golem::invoke_js("makeDraggable", list(id = pin_id))
307+
}

0 commit comments

Comments
 (0)