PageRenderTime 24ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/freemix/exhibit/static/exhibit/js/views/record-pager.js

https://github.com/pombredanne/freemix
JavaScript | 156 lines | 130 code | 18 blank | 8 comment | 9 complexity | 3cac904f7c41aeacb4f46a5be4477a1e MD5 | raw file
  1. /*global jQuery */
  2. (function($, Freemix) {
  3. // Set the record number.
  4. function setCurrentRecord(model, record_num) {
  5. model.getContent().data("record_num", record_num);
  6. return record_num;
  7. }
  8. function getCurrentRecord(model) {
  9. var record_num = model.getContent().data("record_num");
  10. if (!record_num) {
  11. record_num = setCurrentRecord(model, 0);
  12. }
  13. return record_num;
  14. }
  15. function nextRecord(model) {
  16. var next = getCurrentRecord(model) + 1;
  17. next = next % Freemix.exhibit.database.getAllItemsCount();
  18. setCurrentRecord(model, next);
  19. }
  20. function previousRecord(model) {
  21. var previous = getCurrentRecord(model) - 1;
  22. if (previous < 0) {
  23. previous = Freemix.exhibit.database.getAllItemsCount() - 1;
  24. }
  25. setCurrentRecord(model, previous);
  26. }
  27. function populateRecordDisplay(model) {
  28. var content = model.getContent();
  29. // Set the record counters.
  30. var record_num = getCurrentRecord(model);
  31. var database = Freemix.exhibit.database;
  32. var num_records = database.getAllItemsCount();
  33. var recordIds = database.getAllItems();
  34. var id = recordIds.toArray()[record_num];
  35. var record = database.getItem(id);
  36. content.find("#current-record").html(record_num + 1);
  37. content.find("#record-count").html(num_records);
  38. $("tr.property-row", content).each(function() {
  39. var row = $(this);
  40. renderProperty(model, row);
  41. });
  42. model.getContent().trigger("display-record", [record]);
  43. }
  44. function renderProperty(model, row) {
  45. var record_num = getCurrentRecord(model);
  46. var database = Freemix.exhibit.database;
  47. var recordIds = database.getAllItems();
  48. var id = recordIds.toArray()[record_num];
  49. var metadata = row.data("metadata");
  50. var value = database.getObjects(id, metadata.property).toArray();
  51. var property = Freemix.property.propertyList[metadata.property];
  52. var result = property.getValueHtml(value);
  53. row.find(".value").empty().append(result);
  54. }
  55. function deriveLabel(metadata) {
  56. return Freemix.property.propertyList[metadata.property].label();
  57. }
  58. function createRow(model, metadata, table, row_callback) {
  59. var row = $("<tr class='property-row'></tr>").data("metadata", metadata).hide();
  60. table.append(row);
  61. $("<td class='visible'></td>").appendTo(row).createChildCheck({
  62. checked: metadata.hidden !== true,
  63. change: function() {
  64. if ($(this).is(":checked")) {
  65. metadata.hidden = undefined;
  66. } else {
  67. metadata.hidden = true;
  68. }
  69. }
  70. });
  71. $("<td class='name'></td>").append("<span>" + deriveLabel(metadata) + "</span>").appendTo(row);
  72. $("<td class='value'></td>").appendTo(row);
  73. if (row_callback) {
  74. row_callback(row, model, metadata);
  75. }
  76. try {
  77. // Firefox 3.6+ (and others?) will display improperly
  78. // if this is set to 'block'. This should get fixed in
  79. // jQuery some day so .show() does The Right Thing.
  80. row.css('display', 'table-row');
  81. } catch (ex) {
  82. // Older browsers don't understand that value, so use 'block' if
  83. // they barf.
  84. row.show();
  85. }
  86. }
  87. $.fn.recordPager = function(row_callback) {
  88. return this.each(function() {
  89. var model= $(this).data("model");
  90. var root = model.getContent();
  91. var table = root.find(".record-box .property-list-table tbody");
  92. table.empty();
  93. $.each(model.config.metadata, function(index, metadata) {
  94. if (Freemix.property.propertyList[metadata.property]) {
  95. createRow(model, metadata, table, row_callback);
  96. }
  97. });
  98. $.each(Freemix.property.enabledProperties(),
  99. function(name, property) {
  100. var metadata = $.grep(model.config.metadata, function(p) {
  101. return p.property == name;
  102. });
  103. if (metadata.length <= 0) {
  104. metadata = {
  105. property: name
  106. };
  107. model.config.metadata.push(metadata);
  108. createRow(model, metadata, table, row_callback);
  109. }
  110. });
  111. table.disableSelection().sortable({
  112. update: function(event, ui) {
  113. var metadata = model.config.metadata;
  114. metadata.length = 0;
  115. $.each(ui.item.get(0).parentNode.childNodes,
  116. function(index, row) {
  117. var data = $(row).data("metadata");
  118. if (data) {
  119. metadata.push(data);
  120. }
  121. });
  122. },
  123. axis: 'y'
  124. });
  125. root.find(".left-record-button").button().click(function() {
  126. previousRecord(model);
  127. populateRecordDisplay(model);
  128. });
  129. root.find(".right-record-button").button().click(function() {
  130. nextRecord(model);
  131. populateRecordDisplay(model);
  132. }).parent().buttonset();
  133. root.find(".right-record-button").addClass("ui-corner-right");
  134. root.find(".left-record-button").addClass("ui-corner-left");
  135. populateRecordDisplay(model);
  136. });
  137. };
  138. })(window.Freemix.jQuery, window.Freemix);