forked from zulip/zulip
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathattachments_ui.js
143 lines (121 loc) · 4.49 KB
/
attachments_ui.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
var attachments_ui = (function () {
var exports = {};
var attachments;
function delete_attachments(attachment) {
var status = $('#delete-upload-status');
channel.del({
url: '/json/attachments/' + attachment,
idempotent: true,
error: function (xhr) {
ui_report.error(i18n.t("Failed"), xhr, status);
},
success: function () {
ui_report.success(i18n.t("Attachment deleted"), status);
},
});
}
function bytes_to_size(bytes, kb_with_1024_bytes) {
if (kb_with_1024_bytes === undefined) {
kb_with_1024_bytes = false;
}
var kb_size = kb_with_1024_bytes ? 1024 : 1000;
var sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
if (bytes === 0) {
return '0 B';
}
var i = parseInt(Math.floor(Math.log(bytes) / Math.log(kb_size)), 10);
var size = Math.round(bytes / Math.pow(kb_size, i));
if (i > 0 && size < 10) {
size = Math.round(bytes / Math.pow(kb_size, i) * 10) / 10;
}
return size + ' ' + sizes[i];
}
function render_attachments_ui() {
var uploaded_files_table = $("#uploaded_files_table").expectOne();
var $search_input = $("#upload_file_search");
var list = list_render.create(uploaded_files_table, attachments, {
name: "uploaded-files-list",
modifier: function (attachment) {
return templates.render("uploaded_files_list", { attachment: attachment });
},
filter: {
element: $search_input,
callback: function (item, value) {
return item.name.toLocaleLowerCase().indexOf(value) >= 0;
},
onupdate: function () {
ui.reset_scrollbar(uploaded_files_table.closest(".progressive-table-wrapper"));
},
},
parent_container: $('#attachments-settings').expectOne(),
}).init();
list.sort('numeric', 'create_time');
list.add_sort_function("mentioned-in", function (a, b) {
var a_m = a.messages[0];
var b_m = b.messages[0];
if (!a_m) { return 1; }
if (!b_m) { return -1; }
if (a_m.id > b_m.id) {
return 1;
} else if (a_m.id === b_m.id) {
return 0;
}
return -1;
});
ui.reset_scrollbar(uploaded_files_table.closest(".progressive-table-wrapper"));
}
function format_attachment_data(new_attachments) {
_.each(new_attachments, function (attachment) {
var time = new XDate(attachment.create_time);
attachment.create_time_str = timerender.render_now(time).time_str;
attachment.size_str = bytes_to_size(attachment.size);
});
}
exports.update_attachments = function (event) {
if (attachments === undefined) {
// If we haven't fetched attachment data yet, there's nothing to do.
return;
}
if (event.op === 'remove' || event.op === 'update') {
attachments = attachments.filter(function (a) {
return a.id !== event.attachment.id;
});
}
if (event.op === 'add' || event.op === 'update') {
format_attachment_data([event.attachment]);
attachments.push(event.attachment);
}
// TODO: This is inefficient and we should be able to do some sort
// of incremental list_render update instead.
render_attachments_ui();
};
exports.set_up_attachments = function () {
// The settings page must be rendered before this function gets called.
var uploaded_files_table = $("#uploaded_files_table").expectOne();
var status = $('#delete-upload-status');
loading.make_indicator($('#attachments_loading_indicator'), {text: 'Loading...'});
ui.set_up_scrollbar(uploaded_files_table.closest(".progressive-table-wrapper"));
$('#uploaded_files_table').on('click', '.remove-attachment', function (e) {
delete_attachments($(e.target).closest(".uploaded_file_row").attr('data-attachment-id'));
});
channel.get({
url: "/json/attachments",
idempotent: true,
success: function (data) {
loading.destroy_indicator($('#attachments_loading_indicator'));
format_attachment_data(data.attachments);
attachments = data.attachments;
render_attachments_ui();
},
error: function (xhr) {
loading.destroy_indicator($('#attachments_loading_indicator'));
ui_report.error(i18n.t("Failed"), xhr, status);
},
});
};
return exports;
}());
if (typeof module !== 'undefined') {
module.exports = attachments_ui;
}
window.attachments_ui = attachments_ui;