Uses existing file upload mechanism with slightly modified UI to upload the file.
Then there's new CSV parsing code to parse the CSV and import it as a new notebook.
Still need a few more unit tests before this feature can be considered complete.
* Added a fixed list of startup links.
* When link in list is clicked, open corresponding note editor.
* When a startup note is added/deleted, update the list.
Still much more work to do on this before it's complete.
made the header that's on the product pages present at the top of the wiki
page as well. Still need to make links bold when viewing certain pages
(help, contact, etc).
* new toolbar button for attaching a file
* button opens new Upload_pulldown() for uploading a file
* began controller.Notebooks.upload_file() to process the upload
* Modified Wiki.js to include invite_id parameter when necessary.
* Increased storage quota (and price) for premium rate plan.
* Added a note displayed when redeeming an invite, with links to signup and login.
* Fixed Invite.sql_update() to have SQL params in proper order.
* Fixed bug where email addresses containing "-" were considered invalid.
* Made UI for inviting other people to your notebook.
* Tweaked the rate plans and added a new one.
browser-specific CSS hack and looked crappy. Those elements that are still
rounded are now implemented with nice smooth images instead.
Also changed downloaded HTML generation to specify sans-serif for the font.
the client. Previously, the main page would load as mostly blank, then the
client would immediately issue two async json calls to load the user and
notebook data, including startup notes. Now, the main page loads with the note
data actually as part of the page. If JavaScript is off, then you see all the
notes displayed, including startup notes and any designated note. If
JavaScript is on, then those "static" notes are instantly hidden and their
contents are loaded into iframes for editing/display.
The real upshot is that Luminotes in read-only mode is now more useful when
JavaScript is off, and actually displays notes and their contents. This is
very useful for search engine indexing.
Updated all Python unit tests. Still have to get to JavaScript unit tests,
what few their are.
* Each model.User now has a current storage bytes and a rate plan.
* model.User.to_dict() updated accordingly.
* Minor Scheduler.add() change to bail of the given thread is None.
* controller.Users.current() returns current user's rate plan details.
* controller.Users.update_storage() now takes an optional callback.
* Various methods in controller.Notebooks responsible for calling controller.Users.update_storage().
* Added rate plan details to config/Common.py.
* Added quota utilization colors to style.css.
* Implemented quota utilization calculation and display in Wiki.js.
Still to-do: Return updated storage bytes where appropriate in controller.Notebook and update the
client accordingly.
* model.Note has a deleted_from member to indicate the notebook id it was deleted from (if any)
* controller.Notebooks sets the deleted_from member and makes all deleted notes startup notes in the trash
* new controller.Notebooks.undelete_note() method
* split up the idea of UI messages into errors and informational messages, with separate CSS
* updated Editor and Wiki UI code to deal with new deleted_from variable
* added "undelete" button when viewing a deleted note, and "delete" changes to "delete forever"
* added a "trash" link to the notebook links
* reorganized responsibilities for displaying notebook/user links among Wiki.populate() and Wiki.display_user()
* when deleting messages in a notebook with a trash, displaying "The note has been moved to the trash"...
with a working undo button!
* tweaked focusing logic in display_search_results(), which has been renamed to display_loaded_notes()