Show More
@@ -25,10 +25,10 var IPython = (function (IPython) { | |||
|
25 | 25 | this.add_buttons_group([ |
|
26 | 26 | { |
|
27 | 27 | id : 'save_b', |
|
28 | label : 'Save', | |
|
28 | label : 'Save Checkpoint', | |
|
29 | 29 | icon : 'ui-icon-disk', |
|
30 | 30 | callback : function () { |
|
31 |
IPython.notebook.save_ |
|
|
31 | IPython.notebook.save_checkpoint(); | |
|
32 | 32 | } |
|
33 | 33 | } |
|
34 | 34 | ]); |
@@ -84,6 +84,9 var IPython = (function (IPython) { | |||
|
84 | 84 | this.element.find('#save_notebook').click(function () { |
|
85 | 85 | IPython.notebook.save_notebook(); |
|
86 | 86 | }); |
|
87 | this.element.find('#save_checkpoint').click(function () { | |
|
88 | IPython.notebook.save_checkpoint(); | |
|
89 | }); | |
|
87 | 90 | this.element.find('#download_ipynb').click(function () { |
|
88 | 91 | var notebook_id = IPython.notebook.get_notebook_id(); |
|
89 | 92 | var url = that.baseProjectUrl() + 'notebooks/' + |
@@ -39,6 +39,8 var IPython = (function (IPython) { | |||
|
39 | 39 | this.paste_enabled = false; |
|
40 | 40 | this.dirty = false; |
|
41 | 41 | this.metadata = {}; |
|
42 | this._checkpoint_after_save = false; | |
|
43 | this.last_checkpoint = null; | |
|
42 | 44 | // single worksheet for now |
|
43 | 45 | this.worksheet_metadata = {}; |
|
44 | 46 | this.control_key_active = false; |
@@ -250,7 +252,7 var IPython = (function (IPython) { | |||
|
250 | 252 | return false; |
|
251 | 253 | } else if (event.which === 83 && that.control_key_active) { |
|
252 | 254 | // Save notebook = s |
|
253 |
that.save_ |
|
|
255 | that.save_checkpoint(); | |
|
254 | 256 | that.control_key_active = false; |
|
255 | 257 | return false; |
|
256 | 258 | } else if (event.which === 74 && that.control_key_active) { |
@@ -1574,7 +1576,7 var IPython = (function (IPython) { | |||
|
1574 | 1576 | var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id; |
|
1575 | 1577 | $.ajax(url, settings); |
|
1576 | 1578 | }; |
|
1577 | ||
|
1579 | ||
|
1578 | 1580 | /** |
|
1579 | 1581 | * Success callback for saving a notebook. |
|
1580 | 1582 | * |
@@ -1586,8 +1588,12 var IPython = (function (IPython) { | |||
|
1586 | 1588 | Notebook.prototype.save_notebook_success = function (data, status, xhr) { |
|
1587 | 1589 | this.dirty = false; |
|
1588 | 1590 | $([IPython.events]).trigger('notebook_saved.Notebook'); |
|
1591 | if (this._checkpoint_after_save) { | |
|
1592 | this.create_checkpoint(); | |
|
1593 | this._checkpoint_after_save = false; | |
|
1594 | }; | |
|
1589 | 1595 | }; |
|
1590 | ||
|
1596 | ||
|
1591 | 1597 | /** |
|
1592 | 1598 | * Failure callback for saving a notebook. |
|
1593 | 1599 | * |
@@ -1599,7 +1605,7 var IPython = (function (IPython) { | |||
|
1599 | 1605 | Notebook.prototype.save_notebook_error = function (xhr, status, error_msg) { |
|
1600 | 1606 | $([IPython.events]).trigger('notebook_save_failed.Notebook'); |
|
1601 | 1607 | }; |
|
1602 | ||
|
1608 | ||
|
1603 | 1609 | /** |
|
1604 | 1610 | * Request a notebook's data from the server. |
|
1605 | 1611 | * |
@@ -1731,6 +1737,226 var IPython = (function (IPython) { | |||
|
1731 | 1737 | } |
|
1732 | 1738 | } |
|
1733 | 1739 | |
|
1740 | /********************* checkpoint-related *********************/ | |
|
1741 | ||
|
1742 | /** | |
|
1743 | * Save the notebook then immediately create a checkpoint. | |
|
1744 | * | |
|
1745 | * @method save_checkpoint | |
|
1746 | */ | |
|
1747 | Notebook.prototype.save_checkpoint = function () { | |
|
1748 | this._checkpoint_after_save = true; | |
|
1749 | this.save_notebook(); | |
|
1750 | }; | |
|
1751 | ||
|
1752 | /** | |
|
1753 | * List checkpoints for this notebook. | |
|
1754 | * | |
|
1755 | * @method list_checkpoint | |
|
1756 | */ | |
|
1757 | Notebook.prototype.list_checkpoints = function () { | |
|
1758 | var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints'; | |
|
1759 | $.get(url).done( | |
|
1760 | $.proxy(this.list_checkpoints_success, this) | |
|
1761 | ).fail( | |
|
1762 | $.proxy(this.list_checkpoints_error, this) | |
|
1763 | ); | |
|
1764 | }; | |
|
1765 | ||
|
1766 | /** | |
|
1767 | * Success callback for listing checkpoints. | |
|
1768 | * | |
|
1769 | * @method list_checkpoint_success | |
|
1770 | * @param {Object} data JSON representation of a checkpoint | |
|
1771 | * @param {String} status Description of response status | |
|
1772 | * @param {jqXHR} xhr jQuery Ajax object | |
|
1773 | */ | |
|
1774 | Notebook.prototype.list_checkpoints_success = function (data, status, xhr) { | |
|
1775 | var data = $.parseJSON(data); | |
|
1776 | if (data.length) { | |
|
1777 | this.last_checkpoint = data[0]; | |
|
1778 | } else { | |
|
1779 | this.last_checkpoint = null; | |
|
1780 | } | |
|
1781 | $([IPython.events]).trigger('checkpoints_listed.Notebook', data); | |
|
1782 | }; | |
|
1783 | ||
|
1784 | /** | |
|
1785 | * Failure callback for listing a checkpoint. | |
|
1786 | * | |
|
1787 | * @method list_checkpoint_error | |
|
1788 | * @param {jqXHR} xhr jQuery Ajax object | |
|
1789 | * @param {String} status Description of response status | |
|
1790 | * @param {String} error_msg HTTP error message | |
|
1791 | */ | |
|
1792 | Notebook.prototype.list_checkpoints_error = function (xhr, status, error_msg) { | |
|
1793 | $([IPython.events]).trigger('list_checkpoints_failed.Notebook'); | |
|
1794 | }; | |
|
1795 | ||
|
1796 | /** | |
|
1797 | * Create a checkpoint of this notebook on the server from the most recent save. | |
|
1798 | * | |
|
1799 | * @method create_checkpoint | |
|
1800 | */ | |
|
1801 | Notebook.prototype.create_checkpoint = function () { | |
|
1802 | var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints'; | |
|
1803 | $.post(url).done( | |
|
1804 | $.proxy(this.create_checkpoint_success, this) | |
|
1805 | ).fail( | |
|
1806 | $.proxy(this.create_checkpoint_error, this) | |
|
1807 | ); | |
|
1808 | }; | |
|
1809 | ||
|
1810 | /** | |
|
1811 | * Success callback for creating a checkpoint. | |
|
1812 | * | |
|
1813 | * @method create_checkpoint_success | |
|
1814 | * @param {Object} data JSON representation of a checkpoint | |
|
1815 | * @param {String} status Description of response status | |
|
1816 | * @param {jqXHR} xhr jQuery Ajax object | |
|
1817 | */ | |
|
1818 | Notebook.prototype.create_checkpoint_success = function (data, status, xhr) { | |
|
1819 | var data = $.parseJSON(data); | |
|
1820 | this.last_checkpoint = data; | |
|
1821 | $([IPython.events]).trigger('checkpoint_created.Notebook', data); | |
|
1822 | }; | |
|
1823 | ||
|
1824 | /** | |
|
1825 | * Failure callback for creating a checkpoint. | |
|
1826 | * | |
|
1827 | * @method create_checkpoint_error | |
|
1828 | * @param {jqXHR} xhr jQuery Ajax object | |
|
1829 | * @param {String} status Description of response status | |
|
1830 | * @param {String} error_msg HTTP error message | |
|
1831 | */ | |
|
1832 | Notebook.prototype.create_checkpoint_error = function (xhr, status, error_msg) { | |
|
1833 | $([IPython.events]).trigger('checkpoint_failed.Notebook'); | |
|
1834 | }; | |
|
1835 | ||
|
1836 | Notebook.prototype.restore_checkpoint_dialog = function () { | |
|
1837 | var that = this; | |
|
1838 | var checkpoint = this.last_checkpoint; | |
|
1839 | if ( ! checkpoint ) { | |
|
1840 | console.log("restore dialog, but no checkpoint to restore to!"); | |
|
1841 | return; | |
|
1842 | } | |
|
1843 | var dialog = $('<div/>').append( | |
|
1844 | $('<p/>').text("Are you sure you want to revert the notebook to " + | |
|
1845 | "the latest checkpoint?" | |
|
1846 | ).append( | |
|
1847 | $("<strong/>").text( | |
|
1848 | " This cannot be undone." | |
|
1849 | ) | |
|
1850 | ) | |
|
1851 | ).append( | |
|
1852 | $('<p/>').text("The checkpoint was last updated at") | |
|
1853 | ).append( | |
|
1854 | $('<p/>').text(Date(checkpoint.last_modified)) | |
|
1855 | ); | |
|
1856 | ||
|
1857 | $(document).append(dialog); | |
|
1858 | ||
|
1859 | dialog.dialog({ | |
|
1860 | resizable: false, | |
|
1861 | modal: true, | |
|
1862 | title: "Revert notebook to checkpoint", | |
|
1863 | closeText: '', | |
|
1864 | buttons : { | |
|
1865 | "Revert": function () { | |
|
1866 | that.restore_checkpoint(checkpoint.checkpoint_id); | |
|
1867 | $(this).dialog('close'); | |
|
1868 | }, | |
|
1869 | "Cancel": function () { | |
|
1870 | $(this).dialog('close'); | |
|
1871 | } | |
|
1872 | }, | |
|
1873 | width: 400 | |
|
1874 | }); | |
|
1875 | } | |
|
1876 | ||
|
1877 | /** | |
|
1878 | * Restore the notebook to a checkpoint state. | |
|
1879 | * | |
|
1880 | * @method restore_checkpoint | |
|
1881 | * @param {String} checkpoint ID | |
|
1882 | */ | |
|
1883 | Notebook.prototype.restore_checkpoint = function (checkpoint) { | |
|
1884 | $([IPython.events]).trigger('notebook_restoring.Notebook', checkpoint); | |
|
1885 | var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints/' + checkpoint; | |
|
1886 | $.post(url).done( | |
|
1887 | $.proxy(this.restore_checkpoint_success, this) | |
|
1888 | ).fail( | |
|
1889 | $.proxy(this.restore_checkpoint_error, this) | |
|
1890 | ); | |
|
1891 | }; | |
|
1892 | ||
|
1893 | /** | |
|
1894 | * Success callback for restoring a notebook to a checkpoint. | |
|
1895 | * | |
|
1896 | * @method restore_checkpoint_success | |
|
1897 | * @param {Object} data (ignored, should be empty) | |
|
1898 | * @param {String} status Description of response status | |
|
1899 | * @param {jqXHR} xhr jQuery Ajax object | |
|
1900 | */ | |
|
1901 | Notebook.prototype.restore_checkpoint_success = function (data, status, xhr) { | |
|
1902 | $([IPython.events]).trigger('checkpoint_restored.Notebook'); | |
|
1903 | this.load_notebook(this.notebook_id); | |
|
1904 | }; | |
|
1905 | ||
|
1906 | /** | |
|
1907 | * Failure callback for restoring a notebook to a checkpoint. | |
|
1908 | * | |
|
1909 | * @method restore_checkpoint_error | |
|
1910 | * @param {jqXHR} xhr jQuery Ajax object | |
|
1911 | * @param {String} status Description of response status | |
|
1912 | * @param {String} error_msg HTTP error message | |
|
1913 | */ | |
|
1914 | Notebook.prototype.restore_checkpoint_error = function (xhr, status, error_msg) { | |
|
1915 | $([IPython.events]).trigger('checkpoint_restore_failed.Notebook'); | |
|
1916 | }; | |
|
1917 | ||
|
1918 | /** | |
|
1919 | * Delete a notebook checkpoint. | |
|
1920 | * | |
|
1921 | * @method delete_checkpoint | |
|
1922 | * @param {String} checkpoint ID | |
|
1923 | */ | |
|
1924 | Notebook.prototype.delete_checkpoint = function (checkpoint) { | |
|
1925 | $([IPython.events]).trigger('notebook_restoring.Notebook', checkpoint); | |
|
1926 | var url = this.baseProjectUrl() + 'notebooks/' + this.notebook_id + '/checkpoints/' + checkpoint; | |
|
1927 | $.ajax(url, { | |
|
1928 | type: 'DELETE', | |
|
1929 | success: $.proxy(this.delete_checkpoint_success, this), | |
|
1930 | error: $.proxy(this.delete_notebook_error,this) | |
|
1931 | }); | |
|
1932 | }; | |
|
1933 | ||
|
1934 | /** | |
|
1935 | * Success callback for deleting a notebook checkpoint | |
|
1936 | * | |
|
1937 | * @method delete_checkpoint_success | |
|
1938 | * @param {Object} data (ignored, should be empty) | |
|
1939 | * @param {String} status Description of response status | |
|
1940 | * @param {jqXHR} xhr jQuery Ajax object | |
|
1941 | */ | |
|
1942 | Notebook.prototype.delete_checkpoint_success = function (data, status, xhr) { | |
|
1943 | $([IPython.events]).trigger('checkpoint_deleted.Notebook', data); | |
|
1944 | this.load_notebook(this.notebook_id); | |
|
1945 | }; | |
|
1946 | ||
|
1947 | /** | |
|
1948 | * Failure callback for deleting a notebook checkpoint. | |
|
1949 | * | |
|
1950 | * @method delete_checkpoint_error | |
|
1951 | * @param {jqXHR} xhr jQuery Ajax object | |
|
1952 | * @param {String} status Description of response status | |
|
1953 | * @param {String} error_msg HTTP error message | |
|
1954 | */ | |
|
1955 | Notebook.prototype.delete_checkpoint_error = function (xhr, status, error_msg) { | |
|
1956 | $([IPython.events]).trigger('checkpoint_delete_failed.Notebook'); | |
|
1957 | }; | |
|
1958 | ||
|
1959 | ||
|
1734 | 1960 | IPython.Notebook = Notebook; |
|
1735 | 1961 | |
|
1736 | 1962 |
@@ -87,7 +87,7 var IPython = (function (IPython) { | |||
|
87 | 87 | ); |
|
88 | 88 | } else { |
|
89 | 89 | IPython.notebook.set_notebook_name(new_name); |
|
90 |
IPython.notebook.save_ |
|
|
90 | IPython.notebook.save_checkpoint(); | |
|
91 | 91 | $(this).dialog('close'); |
|
92 | 92 | } |
|
93 | 93 | }, |
@@ -57,6 +57,7 class="notebook_app" | |||
|
57 | 57 | <li id="copy_notebook"><a href="#">Make a Copy...</a></li> |
|
58 | 58 | <li id="rename_notebook"><a href="#">Rename...</a></li> |
|
59 | 59 | <li id="save_notebook"><a href="#">Save</a></li> |
|
60 | <li id="save_checkpoint"><a href="#">Save Checkpoint</a></li> | |
|
60 | 61 | <hr/> |
|
61 | 62 | <li><a href="#">Download as</a> |
|
62 | 63 | <ul> |
General Comments 0
You need to be logged in to leave comments.
Login now