Skip to content

Commit

Permalink
classic: Don't always force visible edit buttons
Browse files Browse the repository at this point in the history
If you're viewing a TiddlyWiki Classic site isn't your own, or is
your own but you're not logged in, previously the edit buttons would
be shown regardless of the value of the chkHttpReadOnly "advanced
options" cookie.

Now, the chkHttpReadOnly value will be respected, unless the site
owner is currently logged in.

The way it works is to inject a shadow tiddler with content set to
either 'yes' or 'no', then read the value of that tiddler in the
upload plugin. This is similar to the TiddlyWiki5 method, except in
TiddlyWiki5 the tiddler used is '$:/status/IsLoggedIn'.

Closes issue #326.
  • Loading branch information
simonbaird committed Apr 21, 2024
1 parent b3bac75 commit c521106
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 25 deletions.
49 changes: 28 additions & 21 deletions rails/lib/th_file.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,18 @@ def strip_external_core_url_prefix
self
end

def apply_tw5_mods(site_name, for_download: false, local_core: false, use_put_saver: false, is_logged_in: false)
# Determine if we think the user could potentially make changes and save back
# to Tiddlyhost. (Becomes the content of a TiddlyHostIsLoggedIn tiddler for
# Classic a and $:/status/IsLoggedIn tiddler for TW5.)
def status_is_logged_in(is_logged_in: false, for_download: false)
if is_logged_in && !for_download
'yes'
else
'no'
end
end

def apply_tw5_mods(site_name, for_download:, local_core:, use_put_saver:, is_logged_in:)
upload_url = if for_download || use_put_saver
# Clear $:/UploadURL for downloads so the save button in the downloaded
# file will not try to use upload.js. It should use another save
Expand All @@ -72,17 +83,6 @@ def apply_tw5_mods(site_name, for_download: false, local_core: false, use_put_sa
Settings.subdomain_site_url(site_name)
end

if !for_download && is_logged_in
# Provide a way for TiddlyWiki files to detect when
# they're being viewed by their owner
status_is_logged_in = 'yes'

else
# The readonly plugin might user this to hide tiddler edit buttons, etc.
status_is_logged_in = 'no'

end

write_tiddlers({
# TiddlyWiki will POST to this url using code in core/modules/savers/upload.js
'$:/UploadURL' => upload_url,
Expand All @@ -93,7 +93,7 @@ def apply_tw5_mods(site_name, for_download: false, local_core: false, use_put_sa
'$:/UploadWithUrlOnly' => 'yes',

# Provide a way for TiddlyWikis to detect when they're able to be saved
'$:/status/IsLoggedIn' => status_is_logged_in,
'$:/status/IsLoggedIn' => status_is_logged_in(is_logged_in:, for_download:),
})

# Since every save uploads the entire TiddlyWiki I want to discourage
Expand All @@ -115,7 +115,7 @@ def apply_tw5_mods(site_name, for_download: false, local_core: false, use_put_sa
end
end

def apply_classic_mods(site_name)
def apply_classic_mods(site_name, for_download:, is_logged_in:)
# We don't want to hard code the site url in the plugin, but we also don't
# want to hard code the domain name and port etc since they're different
# in different environments. This is clever way to deal with that.
Expand All @@ -129,24 +129,31 @@ def apply_classic_mods(site_name)
}
})

# This could be a regular tiddler, but let's make it a shadow tiddler just to be cool.
# Will be clickable when viewing the plugin since we used 'TiddlyHost' as the modifier above.
# (I'm using camel case intentionally here despite the usual spelling of Tiddlyhost.)
write_shadow_tiddlers({
# This could be a regular tiddler, but let's make it a shadow tiddler just to be cool.
# Will be clickable when viewing the plugin since we used 'TiddlyHost' as the modifier above.
# (I'm using camel case intentionally here despite the usual spelling of Tiddlyhost.)
'TiddlyHost' => {
text: "[[Tiddlyhost|#{Settings.main_site_url}]] is a hosting service for ~TiddlyWiki.",
modifier: 'TiddlyHost',
}
},

# If we set this to 'no' then the ThostUploadPlugin will configure TiddlyWiki to
# render in readonly mode, i.e. without the new tiddler or edit buttons showing
# Todo: What about when it's downloaded..?
'TiddlyHostIsLoggedIn' => {
text: status_is_logged_in(is_logged_in:, for_download:),
modifier: 'TiddlyHost',
},
})
end

def apply_tiddlyhost_mods(site_name, for_download: false, local_core: false, use_put_saver: false, is_logged_in: false)
if is_tw5?
apply_tw5_mods(site_name,
for_download: for_download, local_core: local_core, use_put_saver: use_put_saver, is_logged_in: is_logged_in)
apply_tw5_mods(site_name, for_download:, local_core:, use_put_saver:, is_logged_in:)

elsif is_classic?
apply_classic_mods(site_name)
apply_classic_mods(site_name, for_download:, is_logged_in:)

else # FeatherWiki
# No hackery for FeatherWiki currently
Expand Down
9 changes: 5 additions & 4 deletions rails/tw_content/plugins/thost_upload_plugin.js.erb
Original file line number Diff line number Diff line change
Expand Up @@ -192,10 +192,11 @@ bidix.initOption('txtThostSiteName','<%= site_name %>');
// Tiddlyhost stuff
//

// So you can see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false;
window.showBackstage = true;
if (config.shadowTiddlers.TiddlyHostIsLoggedIn == "yes") {
// If user is logged in to Tiddlyhost then disregard the value of
// the chkHttpReadOnly cookie and always show the edit buttons
config.options.chkHttpReadOnly = false
}

// Add 'upload to tiddlyhost' button
config.shadowTiddlers.SideBarOptions = config.shadowTiddlers.SideBarOptions
Expand Down

0 comments on commit c521106

Please sign in to comment.