viewmodel.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. define(['durandal/app', 'durandal/composition', 'plugins/http',
  2. 'jquery', 'knockout', 'knockout.mapping',
  3. 'perfect.scrollbar',
  4. './renameModal', './newItemModal'],
  5. function(app, composition,http, $, ko, ko_mapping, perfectScrollbar, RenameModal, NewItemModal) {
  6. ko.mapping = ko_mapping;
  7. ko.bindingHandlers['let'] = {
  8. 'init': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
  9. // Make a modified binding context, with extra properties, and apply it to descendant elements
  10. var innerContext = bindingContext.extend(valueAccessor());
  11. ko.applyBindingsToDescendants(innerContext, element);
  12. return { controlsDescendantBindings: true };
  13. }
  14. };
  15. ko.virtualElements.allowedBindings['let'] = true;
  16. var ctor = function() {},
  17. selected = ko.observable(),
  18. showContextMenu = ko.observable(),
  19. copied = ko.observable(undefined),
  20. folder = ko.observable(ko.mapping.fromJS({children: []})),
  21. scrollable = $('#filebrowser');
  22. ctor.prototype.attached = function() {
  23. showContextMenu(false);
  24. $('#filebrowser').perfectScrollbar();
  25. };
  26. ctor.prototype.activate = function(settings) {
  27. this.settings = settings;
  28. this.selected = selected;
  29. this.folder = folder;
  30. this.showContextMenu = showContextMenu;
  31. this.hasSelectedFolder = ko.computed(function() {
  32. return selected() != undefined && selected().type === 'folder';
  33. });
  34. this.hasCopied = ko.computed( function() {
  35. return copied() !== undefined;
  36. });
  37. };
  38. ctor.prototype.open = function(object,event) {
  39. console.log('Opening', object);
  40. if( object.type() === 'folder' ) {
  41. var id = object.uuid(),
  42. checkbox = $('input[type=checkbox][id=' + id + ']');
  43. checkbox.prop('checked', !checkbox.prop('checked'));
  44. $('#icon_folder_' + id).toggleClass('fa-folder-o').toggleClass('fa-folder-open-o');
  45. $('#filebrowser').perfectScrollbar('update');
  46. } else {
  47. var type = object.extra();
  48. http.get(object.path()).then(function(response) {
  49. app.trigger('filebrowser:open_file', {
  50. type: type,
  51. content: response
  52. });
  53. });
  54. }
  55. };
  56. ctor.prototype.select = function(object, event) {
  57. $('li > span.select').removeClass('select');
  58. $(event.target).toggleClass('select');
  59. selected( ko.mapping.fromJS(object) );
  60. };
  61. /** Context Menu **/
  62. ctor.prototype.openContextMenu = function(object, event) {
  63. // Position du menu, calculer la pos pour eviter sortie du viewport
  64. var posX = event.pageX,
  65. posY = event.pageY,
  66. windowWidth = $(window).width(),
  67. windowHeight = $(window).height(),
  68. contextMenu = $('#fileBrowserContextMenu'),
  69. menuWidth = contextMenu.width(),
  70. menuHeight = contextMenu.height();
  71. posX = Math.min(posX, windowWidth - menuWidth - 15);
  72. posY = Math.min(posY, windowHeight - menuHeight - 10);
  73. // affichage
  74. contextMenu.css({
  75. left : posX + 'px',
  76. top : posY + 'px'
  77. });
  78. showContextMenu(true);
  79. };
  80. ctor.prototype.openRenamePopup = function(ctor, event) {
  81. RenameModal.show(ctor.selected().name()).then(function(response) {
  82. if( response !== undefined ) {
  83. ctor.selected().name(response);
  84. }
  85. });
  86. };
  87. ctor.prototype.openDeletePopup = function(ctor, event) {
  88. app.showMessage(
  89. 'Are you sure you want to delete this ' +
  90. (ctor.selected().is_folder ? ' folder and all its content' : 'file') + '?',
  91. 'Delete ' + ctor.selected().name(), [ { text: "Yes", value: "yes" }, { text: "No", value: "no" }]).then( function( dialogResult ) {
  92. if( dialogResult === 'yes' ) {
  93. console.log('Deleting', ctor.selected().name());
  94. }
  95. });
  96. };
  97. ctor.prototype.copy = function(ctor, event) {
  98. console.log('Copied', ctor.selected().name());
  99. copied( ctor.selected() );
  100. };
  101. ctor.prototype.paste = function(ctor, event) {
  102. if( copied() !== undefined ) {
  103. console.log('Paste', copied().name(), 'into', ctor.selected().name());
  104. copied( undefined );
  105. }
  106. };
  107. ctor.prototype.newItem = function(ctor, event) {
  108. NewItemModal.show().then(function(response) {
  109. if( response !== undefined ) {
  110. console.log('New item : ' + response.type + ' - ' + response.name );
  111. }
  112. });
  113. };
  114. $(document).on('click', function() {
  115. showContextMenu(false);
  116. });
  117. /** End of Context Menu */
  118. http.get('/data/filesystem.json').then(function(response) {
  119. folder(ko.mapping.fromJS(response));
  120. $('#filebrowser').perfectScrollbar('update');
  121. });
  122. return ctor;
  123. });