diff --git a/modules/node/cms_node_module.e b/modules/node/cms_node_module.e index f3730b0..2031c83 100644 --- a/modules/node/cms_node_module.e +++ b/modules/node/cms_node_module.e @@ -280,7 +280,27 @@ feature -- Hooks end end - populate_recent_changes (a_changes: CMS_RECENT_CHANGE_CONTAINER; a_sources: LIST [READABLE_STRING_8]) + recent_changes_sources: detachable LIST [READABLE_STRING_8] + -- + local + lst: ARRAYED_LIST [READABLE_STRING_8] + do + if + attached node_api as l_node_api and then + attached l_node_api.content_types as l_types and then + not l_types.is_empty + then + create lst.make (l_types.count) + across + l_types as ic + loop + lst.force (ic.item.name) + end + Result := lst + end + end + + populate_recent_changes (a_changes: CMS_RECENT_CHANGE_CONTAINER; a_current_user: detachable CMS_USER) local params: CMS_DATA_QUERY_PARAMETERS ch: CMS_RECENT_CHANGE_ITEM @@ -288,43 +308,44 @@ feature -- Hooks l_info: STRING_8 l_src: detachable READABLE_STRING_8 l_nodes: ITERABLE [CMS_NODE] + l_date: detachable DATE_TIME do create params.make (0, a_changes.limit) if attached node_api as l_node_api then - across - l_node_api.content_types as ic - loop - a_sources.force (ic.item.name) - end l_src := a_changes.source - if attached a_changes.date as l_date then - l_nodes := l_node_api.recent_node_changes_before (params, l_date) - else - l_nodes := l_node_api.recent_node_changes_before (params, create {DATE_TIME}.make_now_utc) + l_date := a_changes.date + if l_date = Void then + create l_date.make_now_utc end + l_nodes := l_node_api.recent_node_changes_before (params, l_date) across l_nodes as ic loop n := ic.item if l_src = Void or else l_src.is_case_insensitive_equal_general (n.content_type) then - n := l_node_api.full_node (n) - create ch.make (n.content_type, create {CMS_LOCAL_LINK}.make (n.title, "node/" + n.id.out), n.modification_date) - if n.creation_date ~ n.modification_date then - l_info := "new" - if not n.is_published then - l_info.append (" (unpublished)") - end - else - if n.is_trashed then - l_info := "deleted" - else - l_info := "updated" + if l_node_api.has_permission_for_action_on_node ("view", n, a_current_user) then + n := l_node_api.full_node (n) + create ch.make (n.content_type, create {CMS_LOCAL_LINK}.make (n.title, "node/" + n.id.out), n.modification_date) + if n.creation_date ~ n.modification_date then + l_info := "new" if not n.is_published then l_info.append (" (unpublished)") end + else + if n.is_trashed then + l_info := "deleted" + else + l_info := "updated" + if not n.is_published then + l_info.append (" (unpublished)") + end + end end + ch.set_information (l_info) + ch.set_author (n.author) + a_changes.force (ch) + else + -- Forbidden + -- FIXME: provide a visual indication! end - ch.set_information (l_info) - ch.set_author (n.author) - a_changes.force (ch) end end end diff --git a/modules/node/node.ecf b/modules/node/node.ecf index 812d050..87508e6 100644 --- a/modules/node/node.ecf +++ b/modules/node/node.ecf @@ -13,6 +13,7 @@ + diff --git a/modules/recent_changes/cms_recent_change_item.e b/modules/recent_changes/cms_recent_change_item.e index 8b65e89..c17f77d 100644 --- a/modules/recent_changes/cms_recent_change_item.e +++ b/modules/recent_changes/cms_recent_change_item.e @@ -29,6 +29,10 @@ feature -- Access date: DATE_TIME -- Time of the event item. + author_name: detachable READABLE_STRING_32 + -- Optional author name. + -- It is possible to have author_name /= Void and author = Void. + author: detachable CMS_USER -- Optional author. @@ -41,10 +45,19 @@ feature -- Access feature -- Element change + set_author_name (n: like author_name) + -- Set `author_name' to `n'. + do + author_name := n + end + set_author (u: like author) -- Set `author' to `u'. do author := u + if u /= Void and author_name = Void then + set_author_name (u.name) + end end set_information (a_info: like information) diff --git a/modules/recent_changes/cms_recent_changes_hook.e b/modules/recent_changes/cms_recent_changes_hook.e index a44cbe5..bb47d64 100644 --- a/modules/recent_changes/cms_recent_changes_hook.e +++ b/modules/recent_changes/cms_recent_changes_hook.e @@ -11,9 +11,13 @@ inherit feature -- Invocation - populate_recent_changes (a_changes: CMS_RECENT_CHANGE_CONTAINER; a_sources: LIST [READABLE_STRING_8]) + recent_changes_sources: detachable LIST [READABLE_STRING_8] + -- Source provided by Current hook. + deferred + end + + populate_recent_changes (a_changes: CMS_RECENT_CHANGE_CONTAINER; a_current_user: detachable CMS_USER) -- Populate recent changes inside `a_changes' according to associated parameters. - -- Also provide sources of information. deferred end diff --git a/modules/recent_changes/cms_recent_changes_module.e b/modules/recent_changes/cms_recent_changes_module.e index 9578048..b67c4b2 100644 --- a/modules/recent_changes/cms_recent_changes_module.e +++ b/modules/recent_changes/cms_recent_changes_module.e @@ -58,25 +58,33 @@ feature -- Handler r: CMS_RESPONSE l_changes: CMS_RECENT_CHANGE_CONTAINER l_sources: ARRAYED_LIST [READABLE_STRING_8] - dt, prev_dt: detachable DATE + dt, prev_dt: detachable DATE_TIME + prev_info: detachable READABLE_STRING_8 ch: detachable CMS_RECENT_CHANGE_ITEM htdate: HTTP_DATE l_content: STRING l_form: CMS_FORM l_select: WSF_FORM_SELECT + l_size_field: WSF_FORM_NUMBER_INPUT + l_submit: WSF_FORM_SUBMIT_INPUT l_until_date: detachable DATE_TIME l_filter_source: detachable READABLE_STRING_8 l_size: NATURAL_32 l_query: STRING opt: WSF_FORM_SELECT_OPTION + l_user: detachable CMS_USER + i: INTEGER do if attached {WSF_STRING} req.query_parameter ("date") as p_until_date then create htdate.make_from_timestamp (p_until_date.value.to_integer_64) l_until_date := htdate.date_time -- l_until_date.second_add (-1) end - if attached {WSF_STRING} req.query_parameter ("filter") as p_filter then + if attached {WSF_STRING} req.query_parameter ("source") as p_filter then l_filter_source := p_filter.url_encoded_value + if l_filter_source.is_empty then + l_filter_source := Void + end end if attached {WSF_STRING} req.query_parameter ("size") as p_size then l_size := p_size.integer_value.to_natural_32 @@ -87,22 +95,33 @@ feature -- Handler create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api) if r.has_permission ("view recent changes") then + l_user := r.user create l_changes.make (l_size, l_until_date, l_filter_source) create l_content.make (1024) if attached r.hooks.subscribers ({CMS_RECENT_CHANGES_HOOK}) as lst then create l_sources.make (lst.count) + across lst as ic loop if attached {CMS_RECENT_CHANGES_HOOK} ic.item as h then - h.populate_recent_changes (l_changes, l_sources) + if attached h.recent_changes_sources as h_sources then + l_sources.append (h_sources) + if + l_filter_source = Void + or else across h_sources as h_ic some h_ic.item.is_case_insensitive_equal (l_filter_source) end + then + h.populate_recent_changes (l_changes, l_user) + end + end end end create l_form.make (req.percent_encoded_path_info, "recent-changes") + l_form.set_method_get create l_select.make ("source") l_select.set_label ("Sources") - create opt.make ("", "...") + create opt.make ("", "Any source") l_select.add_option (opt) across l_sources as ic @@ -114,12 +133,19 @@ feature -- Handler l_select.add_option (opt) end l_form.extend (l_select) + + create l_size_field.make_with_text ("size", l_size.out) + l_size_field.set_size (25) + l_size_field.set_label ("Items per page") + l_form.extend (l_size_field) + create l_submit.make_with_text ("op", "Filter") + l_form.extend (l_submit) l_form.extend_html_text ("
") l_form.append_to_html (create {CMS_TO_WSF_THEME}.make (r, r.theme), l_content) end l_changes.reverse_sort - l_content.append ("") + l_content.append ("
") l_content.append ("") l_content.append ("") l_content.append ("") @@ -135,20 +161,24 @@ feature -- Handler l_changes as ic loop ch := ic.item - dt := ch.date.date - if dt /~ prev_dt then + dt := ch.date + if prev_dt = Void or else dt.date /~ prev_dt.date then l_content.append ("") l_content.append ("") l_content.append ("") end - prev_dt := dt l_content.append ("") l_content.append ("") + l_content.append ("") l_content.append ("") l_content.append ("") l_content.append ("%N") + prev_dt := dt end l_content.append ("") l_content.append ("
Date
") - l_content.append (dt.formatted_out ("ddd, dd mmm yyyy")) + l_content.append (dt.date.formatted_out ("ddd, dd mmm yyyy")) l_content.append ("
") - create htdate.make_from_date_time (ch.date) - htdate.append_to_rfc1123_string (l_content) + if dt /~ prev_dt then + create htdate.make_from_date_time (dt) + htdate.append_to_rfc1123_string (l_content) + else + l_content.append ("''") + end l_content.append ("" + ch.source + "") l_content.append (r.link (ch.link.title, ch.link.location, Void)) @@ -156,14 +186,32 @@ feature -- Handler l_content.append ("") if attached ch.author as u then l_content.append (r.link (u.name, "user/" + u.id.out, Void)) + elseif attached ch.author_name as un then + l_content.append (r.html_encoded (un)) end l_content.append ("") - if attached ch.information as l_info then - l_content.append ("" + l_info + " ") + if attached ch.information as l_info and then not l_info.is_empty then + if prev_dt ~ dt and prev_info ~ l_info then + l_content.append ("''") + else + i := l_info.index_of ('%N', 1) + if i > 0 and i < l_info.count then + l_content.append (l_info.substring (1, i - 1)) + l_content.append ("") + l_content.append (l_info.substring (i, l_info.count)) + l_content.append ("") + else + l_content.append (l_info) + end + end + prev_info := l_info + else + prev_info := Void end l_content.append ("
%N")