JavaScript utilities
Note
ckanext-files does not provide stable CKAN JS modules at the moment. Try creating your own widgets and share with us your examples or requirements. We'll consider creating and including widgets into ckanext-files if they are generic enough for majority of the users.
ckanext-files registers few utilities inside CKAN JS namespace to help with building UI components.
First group of utilities is registered inside CKAN Sandbox. Inside CKAN JS
modules it's accessible as this.sandbox. If you are writing code outside of
JS modules, Sandbox can be initialized via call to ckan.sandbox()
const sandbox = ckan.sandbox()
When files plugin loaded, sandbox contains files attribute with two
members:
upload: high-level helper for uploding files.makeUploader: factory for uploader-objects that gives more control over upload process.
The simplest way to upload the file is using upload helper.
await sandbox.files.upload(
new File(["file content"], "name.txt", {type: "text/plain"}),
)
This function uploads file to default storage via files_file_create
action. Extra parameters for API call can be passed using second argument of
upload helper. Use an object with requestParams key. Value of this key will
be added to standard API request parameters. For example, if you want to use
storage with name memory and field with value custom:
await sandbox.files.upload(
new File(["file content"], "name.txt", {type: "text/plain"}),
{requestParams: {storage: "memory", field: "custom"}}
)
If you need more control over upload, you can create an uploader and
interact with it directly, instead of using upload helper.
Uploader is an object that uploads file to server. It extends base uploader,
which defines standard interface for this object. Uploader perfroms all the API
calls internally and returns uploaded file details. Out of the box you can use
Standard and Multipart uploaders. Standard uses files_file_create API
action and specializes on normal uploads. Multipart relies on
files_multipart_* actions and can be used to pause and continue upload.
To create uploader instance, pass its name as a string to makeUploader. And
then you can call upload method of the uploader to perform the actual
upload. This method requires two arguments:
- the file object
- object with additional parameters of API request, the same as
requestParamsfrom example above. If you want to use default parameters, pass an empty object. If you want to usememorystorage, pass{storage: "memory"}, etc.
const uploader = sandbox.files.makeUploader("Standard")
await uploader.upload(new File(["file content"], "name.txt", {type: "text/plain"}), {})
One of the reasons to use manually created uploader is progress
tracking. Uploader supports event subscriptions via
uploader.addEventListener(event, callback) and here's the list of possible
upload events:
start: file upload started. Event hasdetailproperty with object that contains uploaded file asfile.multipartid: multipart upload initialized. Event hasdetailproperty with object that contains uploaded file asfileand ID of multipart upload asid.progress: another chunk of file was transferred to server. Event hasdetailproperty with object that contains uploaded file asfile, number of loaded bytes asloadedand total number of bytes that must be transferred astotal.finish: file upload successfully finished. Event hasdetailproperty with object that contains uploaded file asfileand file details from API response asresult.fail: file upload failed. Event hasdetailproperty with object that contains uploaded file asfileand object with CKAN validation errors asreasons.error: error unrelated to validation happened during upload, like call to non-existing action. Event hasdetailproperty with object that contains uploaded file asfileand error asmessage.
If you want to use upload helper with customized uploader, there are two ways
to do it.
- pass
adapterproperty with uploader name inside second argument ofuploadhelper:await sandbox.files.upload(new File(...), {adapter: "Multipart"}) - pass
uploaderproperty with uploader instance inside second argument ofuploadhelper:const uploader = sandbox.files.makeUploader("Multipart") await sandbox.files.upload(new File(...), {uploader})
The second group of ckanext-files utilities is available as
ckan.CKANEXT_FILES object. This object mainly serves as extension and
configuration point for sandbox.files.
ckan.CKANEXT_FILES.adapters is a collection of all classes that can be used
to initialize uploader. It contains Standard, Multipart and Base
classes. Standard and Multipart can be used as is, while Base must be
extended by your custom uploader class. Add your custom uploader classes to
adapters, to make them available application-wide:
class MyUploader extends Base { ... }
ckan.CKANEXT_FILES.adapters["My"] = MyUploader;
await sandbox.files.upload(new File(...), {adapter: "My"})
ckan.CKANEXT_FILES.defaultSettings contain the object with default settings
available as this.settings inside any uploader. You can change the name of
the storage used by all uploaders using this object. Note, changes will apply
only to uploaders initialized after modification.
ckan.CKANEXT_FILES.defaultSettings.storage = "memory"